diff --git a/README.md b/README.md index f816e739..e1cc08b4 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ **Tags:** uploads, amazon, s3, amazon s3, mirror, admin, media, cdn, cloudfront **Requires at least:** 4.6 **Tested up to:** 4.9 -**Stable tag:** 1.2.1 +**Stable tag:** 1.3 **License:** GPLv3 Copies files to Amazon S3 as they are uploaded to the Media Library. Optionally configure Amazon CloudFront for faster delivery. @@ -69,6 +69,23 @@ This version requires PHP 5.3.3+ and the Amazon Web Services plugin ## Changelog ## +### WP Offload S3 Lite 1.3 - 2018-02-20 ### +* [Release Summary Blog Post](https://deliciousbrains.com/wp-offload-s3-1-6-released/?utm_campaign=changelogs&utm_source=wordpress.org&utm_medium=free%2Bplugin%2Blisting) +* New: [Amazon Web Services plugin](https://wordpress.org/plugins/amazon-web-services/) is no longer required to run WP Offload S3 Lite +* New: Added [`as3cf_local_domains`](https://deliciousbrains.com/wp-offload-s3/doc/filtering-urls-for-multiple-domains/?utm_campaign=changelogs&utm_source=wordpress.org&utm_medium=free%2Bplugin%2Blisting) filter for when site content is updated through multiple domains +* Improvement: AWS keys can be set in new "Settings" tab if not defined in wp-config.php +* Improvement: Minor tweaks to settings page UI including right aligning tabs and consistent title across Lite and Pro plugins +* Improvement: cURL version, theme version and parent theme information added to diagnostics +* Bug fix: Incompatible with plugins that include AWS PHP SDK v3 +* Bug fix: Regenerate Thumbnails v3.0+ does not work with Remove Files From Server option +* Bug fix: "Warning: count(): Parameter must be an array or an object that implements Countable" error with PHP 7.2 +* Bug fix: Force HTTPS not being applied to non-srcset S3 URLs in pages served over HTTP +* Bug fix: Content URLs not filtered to S3 URLs if AWS keys not set +* Bug fix: URL preview can be coerced to display invalid URL +* Bug fix: Changes to upload made via `as3cf_object_meta` filter are not reflected in amazonS3_info records +* Bug fix: Settings link not showing in network admin plugins page +* Bug fix: License in composer.json fails Packagist validation + ### WP Offload S3 Lite 1.2.1 - 2017-11-20 ### * New: Compatibility with HTML Widget * New: Dismissible admin notice that WP Offload S3 Lite will soon require PHP 5.5+ diff --git a/assets/css/notice.css b/assets/css/notice.css index a7c1c7a6..25d6e91f 100644 --- a/assets/css/notice.css +++ b/assets/css/notice.css @@ -1 +1 @@ -.as3cf-notice p,.aws-compatibility-notice p{max-width:800px}.as3cf-license-notice p:not(.as3cf-before):before{display:none} +.as3cf-notice p,.as3cf-compatibility-notice p{max-width:800px}.as3cf-license-notice p:not(.as3cf-before):before{display:none}.as3cf-notice-warning{border-left-color:#ffba00} diff --git a/assets/css/styles.css b/assets/css/styles.css index aa562cf7..47f325ce 100644 --- a/assets/css/styles.css +++ b/assets/css/styles.css @@ -1 +1 @@ -.aws-main.wrap{position:relative}.aws-main.wrap>h1{float:left}.aws-main.wrap .as3cf-notice,.aws-main.wrap .as3cf-updated,.aws-main.wrap .as3cf-error{-webkit-box-sizing:border-box;box-sizing:border-box}.aws-main.wrap .as3cf-error.fatal{clear:both}.aws-main.wrap h2.nav-tab-wrapper{float:none;margin-bottom:15px;width:650px;margin-top:10px;padding:9px 0 0 5px}.aws-main.wrap h2.nav-tab-wrapper a.nav-tab-active{color:#464646;cursor:default}.aws-main.wrap h2.nav-tab-wrapper a:focus{-webkit-box-shadow:none;box-shadow:none}.aws-main.wrap .more-info{white-space:nowrap}.aws-main.wrap .error pre{background:#eaeaea;background:rgba(0,0,0,0.07);display:block;padding:10px 15px}.aws-main.wrap .error pre code{padding:0;background:none}.aws-main.wrap[data-tab="support"] .as3cf-notice,.aws-main.wrap[data-tab="support"] .error,.aws-main.wrap[data-tab="support"] .updated,.aws-main.wrap[data-tab="support"] .updated.show{display:none}.aws-main.wrap[data-tab="support"] .fatal .error,.aws-main.wrap[data-tab="support"] .as3cf-notice.important,.aws-main.wrap[data-tab="support"] .dbrains-api-down{display:block}.aws-main.wrap .as3cf-notice,.aws-main.wrap .error,.aws-main.wrap .updated{max-width:650px;margin-top:15px;-webkit-box-sizing:border-box;box-sizing:border-box}.aws-main.wrap .as3cf-updated{display:none}.aws-main.wrap .as3cf-updated.as3cf-notice,.aws-main.wrap .as3cf-updated.show{display:block}.as3cf-tab .as3cf-main-settings{display:none}.as3cf-tab .as3cf-bucket-container{display:block}.as3cf-tab.as3cf-has-bucket .as3cf-main-settings{display:block}.as3cf-tab.as3cf-has-bucket .as3cf-bucket-container{display:none}.as3cf-tab{display:none;position:relative;width:650px}.as3cf-tab .as3cf-main-settings p{font-size:13px}.as3cf-tab .as3cf-main-settings p a{color:#444}.as3cf-tab .object-prefix-desc em{white-space:nowrap}.as3cf-tab .as3cf-url-preview-wrap{background:#fff;text-align:center;padding:20px 0 0;max-width:650px;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.as3cf-tab .as3cf-url-preview-wrap .as3cf-url-preview{margin-top:10px;padding:0 20px 10px;overflow-x:scroll}.as3cf-tab .as3cf-url-preview-wrap span{color:#aaa;text-transform:uppercase;font-weight:bold}.as3cf-tab .as3cf-radio-group label{display:block;margin-bottom:10px}.as3cf-tab .as3cf-radio-group label.disabled,.as3cf-tab .as3cf-radio-group label.disabled p{color:#bbb;cursor:default}.as3cf-tab .as3cf-radio-group p{padding-left:25px;color:#6b6b6b;margin:0;font-size:12px}.as3cf-tab .as3cf-radio-group p.as3cf-setting{margin-top:5px}.as3cf-tab .as3cf-switch{position:relative;display:inline-block;padding:2px;overflow:hidden;border-radius:2px;-webkit-border-radius:2px;background-color:#d4d3d3;cursor:pointer}.as3cf-tab .as3cf-switch.on{background-color:#ade7b5}.as3cf-tab .as3cf-switch span{visibility:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;float:left;display:inline-block;height:100%;font-size:12px;line-height:20px;border-radius:2px;-webkit-border-radius:2px;font-weight:bold;padding:4px 8px;background:#fff;color:#8d8d8d;z-index:1}.as3cf-tab .as3cf-switch span.on{color:#82d78b}.as3cf-tab .as3cf-switch span.checked{visibility:visible}.as3cf-tab .as3cf-switch.disabled{cursor:default;background:#e6e6e6}.as3cf-tab .as3cf-switch.disabled span{background:#f1f1f1;color:#d6d6d6}.as3cf-tab .as3cf-switch input[type="checkbox"]{position:absolute !important;top:0;left:0;opacity:0;filter:alpha(opacity=0);z-index:-1}.as3cf-tab .as3cf-setting.hide{display:none}.as3cf-tab div.as3cf-setting{margin-top:4px}.as3cf-tab h3{font-weight:normal;text-transform:uppercase;margin:15px 0}.as3cf-tab .form-table{margin:0}.as3cf-tab .form-table tr.as3cf-border-bottom td{border-bottom:1px solid #ddd;padding:20px 0px}.as3cf-tab .form-table tr.as3cf-setting-title td{padding-bottom:0}.as3cf-tab .form-table tr.as3cf-setting-title:first-child td{padding-top:20px}.as3cf-tab .form-table tr td{padding:15px 0}.as3cf-tab .form-table tr td:first-child{vertical-align:top;min-width:120px}.as3cf-tab .form-table tr td .as3cf-notice:last-child{margin-bottom:0}.as3cf-tab .form-table tr td>p:first-child{margin-top:0}.as3cf-tab .form-table tr:first-of-type td{padding-top:5px}.as3cf-tab .form-table tr.as3cf-bucket-setting .as3cf-defined-in-config{float:none}.as3cf-tab .form-table h3{padding:0;margin:0}.as3cf-tab .form-table h4{margin:0}.as3cf-tab .as3cf-active-bucket{font-weight:bold;margin-right:10px}.as3cf-tab .as3cf-view-bucket{color:#444;text-decoration:none;margin-right:10px}.as3cf-tab .as3cf-view-bucket:hover,.as3cf-tab .as3cf-view-bucket:active{color:#00a0d2}.as3cf-tab .as3cf-view-bucket:focus{-webkit-box-shadow:none;box-shadow:none}.as3cf-tab .as3cf-view-bucket .dashicons-external{margin-top:-2px}.as3cf-tab .tooltip{position:relative;z-index:2;cursor:pointer}.as3cf-tab .tooltip:before,.as3cf-tab .tooltip:after{visibility:hidden;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;pointer-events:none}.as3cf-tab .tooltip:before{position:absolute;bottom:150%;left:50%;margin-bottom:5px;margin-left:-250px;padding:10px;width:500px;border-radius:3px;background-color:#000;background-color:rgba(51,51,51,0.9);color:#fff;content:attr(data-tooltip);text-align:center;font-size:14px;line-height:1.3}.as3cf-tab .tooltip:after{position:absolute;bottom:150%;left:50%;margin-left:-5px;width:0;border-top:5px solid #000;border-top:5px solid rgba(51,51,51,0.9);border-right:5px solid transparent;border-left:5px solid transparent;content:" ";font-size:0;line-height:0}.as3cf-tab .tooltip:hover:before,.as3cf-tab .tooltip:hover:after{visibility:visible;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1}.as3cf-tab .as3cf-defined-in-config{background:#ccc;color:#fff;padding:2px 5px;margin:0 0 5px 5px;float:right}.as3cf-tab .as3cf-defined-setting{color:#bbb}.as3cf-tab .as3cf-defined-setting label{cursor:default}.as3cf-tab .as3cf-defined-setting p .more-info a{color:#bbb}.as3cf-tab .as3cf-defined-setting .as3cf-radio-group p{color:#bbb}.as3cf-tab .as3cf-defined-setting .as3cf-notice{display:none !important}#tab-media{display:block}#tab-media .as3cf-main-settings{display:none}#tab-media .as3cf-bucket-container{display:block}#tab-media.as3cf-has-bucket .as3cf-main-settings{display:block}#tab-media.as3cf-has-bucket .as3cf-bucket-container{display:none}.as3cf-bucket-container h3{line-height:1.3;text-transform:none}.as3cf-bucket-container a:focus{-webkit-box-shadow:none;box-shadow:none;outline:none}.as3cf-bucket-container input[type=text]{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.as3cf-bucket-container select{-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.as3cf-bucket-container .form-table td{padding:5px 0}.as3cf-bucket-container .form-table td:first-child{width:100px;line-height:30px;vertical-align:top}.as3cf-bucket-container .bucket-actions{margin:15px 0;border-top:1px solid #ccc;padding-top:15px;overflow:hidden}.as3cf-bucket-container .bucket-actions button,.as3cf-bucket-container .bucket-actions .right{float:right;margin-right:0}.as3cf-bucket-container .bucket-actions span{display:inline-block;margin-right:20px;line-height:28px}.as3cf-bucket-container .bucket-actions .bucket-action-cancel{color:#a00;text-decoration:none}.as3cf-bucket-container .bucket-actions .bucket-action-cancel:hover{color:red}.as3cf-bucket-container .as3cf-bucket-list{padding:15px;max-height:200px;overflow-x:hidden;overflow-y:auto;background-color:#fff;font-size:14px}.as3cf-bucket-container .as3cf-bucket-list li:last-of-type{margin-bottom:0}.as3cf-bucket-container .as3cf-bucket-list a{color:#444;text-decoration:none}.as3cf-bucket-container .as3cf-bucket-list a:hover{color:#0074a2}.as3cf-bucket-container .as3cf-bucket-list a.selected{font-weight:bold;color:#0074a2}.as3cf-bucket-container .as3cf-bucket-list a .dashicons{margin-right:5px}.as3cf-bucket-container .as3cf-bucket-select,.as3cf-bucket-container .as3cf-bucket-create{display:none}.as3cf-bucket-container .bucket-actions.select{display:none}.as3cf-tab{display:none}#tab-media{display:block}#tab-support{min-height:900px}#tab-support .as3cf-sidebar{top:11px}#tab-support .support-section{border-bottom:1px solid #ccc;padding-bottom:20px;margin-bottom:20px}#tab-support .debug textarea{width:100%;min-height:200px;font-family:Consolas, Monaco, monospace;margin-bottom:5px}.as3cf-sidebar{position:absolute;top:9px;left:670px;width:292px}.as3cf-sidebar .block{padding:20px;border:1px solid #ccc}.as3cf-sidebar .subscribe{border-top:none}.as3cf-sidebar .subscribe h2{padding:0;margin:0;margin-bottom:0.5em;color:#666;font-size:20px;line-height:1.2em;float:none}.as3cf-sidebar .subscribe h3{font-size:16px;margin:0}.as3cf-sidebar .subscribe p{margin:0}.as3cf-sidebar .subscribe .intro{margin-bottom:1em;line-height:1.4}.as3cf-sidebar .subscribe li{line-height:1.4}.as3cf-sidebar .subscribe .links{margin-bottom:2em}.as3cf-sidebar .subscribe .links a{text-decoration:none}.as3cf-sidebar .subscribe .promise{color:#999;font-size:12px;line-height:1.4em}.as3cf-sidebar .subscribe .field{margin-bottom:0.5em}.as3cf-sidebar .subscribe .field p{margin-bottom:0.3em}.as3cf-sidebar .subscribe .field input[type=text],.as3cf-sidebar .subscribe .field input[type=email]{width:100%}.as3cf-sidebar .subscribe .field.submit-button{margin-bottom:1em}.as3cf-sidebar .credits{border-top:0}.as3cf-sidebar .credits h4{font-size:16px;margin-top:0;margin-bottom:10px}.as3cf-sidebar .credits ul{margin:0}.as3cf-sidebar .credits li{overflow:hidden}.as3cf-sidebar .credits li:last-child{margin-bottom:0}.as3cf-sidebar .credits img{float:left;margin-right:10px}.as3cf-sidebar .credits span{float:left;display:block;line-height:32px}.as3cf-sidebar .credits a{display:block;text-decoration:none;color:#444;font-size:16px;text-align:center}.as3cf-sidebar .credits a:hover{color:#888}@media screen and (max-width: 1052px){.as3cf-sidebar{position:relative;top:auto;right:auto}}.as3cf-banner{margin-top:35px;width:292px;height:200px;display:block;background:#f8cfae url(../img/os3-banner.svg) left bottom/220px 220px no-repeat}.as3cf-banner:focus{-webkit-box-shadow:none;box-shadow:none}.wrap .as3cf-upgrade-details{background-color:#4e0d33;padding:10px 20px 20px 20px;color:#eee;font-size:13px;margin:0;display:block;text-decoration:none}.wrap .as3cf-upgrade-details h1{font-size:28px;color:#eee;margin:0 0 15px 0;padding:0;text-decoration:none;font-weight:200;line-height:1}.wrap .as3cf-upgrade-details p{margin:0}.wrap .as3cf-upgrade-details a{color:#eee;font-weight:bold;text-decoration:none;font-size:16px;-webkit-box-shadow:none;box-shadow:none}.wrap .as3cf-upgrade-details a:hover{color:#fff}.wrap .as3cf-upgrade-details ul{margin-top:0;margin-left:16px;list-style-type:disc}.aws-compatibility-notice.error{clear:both;margin:5px 20px 5px 0}.as3cf-bucket-error span.title{font-weight:bold}.as3cf-invalid-bucket-name,.as3cf-validation-error{display:block;margin-top:2px;font-size:12px;color:#a00}.as3cf-notice-toggle-content{max-height:100px;overflow-y:scroll}.as3cf-notice-toggle-content .as3cf-notice-toggle-list{margin-top:0;margin-left:0;padding-left:40px;color:#dc3232} +.as3cf-content,.as3cf-updated,.as3cf-compatibility-notice{-webkit-box-sizing:border-box;box-sizing:border-box;max-width:650px}.settings_page_amazon-s3-and-cloudfront .error,.settings_page_amazon-s3-and-cloudfront .notice,.settings_page_amazon-s3-and-cloudfront .updated{-webkit-box-sizing:border-box;box-sizing:border-box;max-width:650px}.as3cf-main.wrap{position:relative}.as3cf-main.wrap>h1{float:left}.as3cf-main.wrap .as3cf-notice,.as3cf-main.wrap .as3cf-updated,.as3cf-main.wrap .as3cf-error{-webkit-box-sizing:border-box;box-sizing:border-box}.as3cf-main.wrap .as3cf-error.fatal{clear:both}.as3cf-main.wrap h2.nav-tab-wrapper{float:none;margin-bottom:15px;width:650px;margin-top:10px;padding:9px 0 0 5px}.as3cf-main.wrap h2.nav-tab-wrapper .nav-tab-container{float:right}.as3cf-main.wrap h2.nav-tab-wrapper .nav-tab-container :last-child{margin-right:5px}.as3cf-main.wrap h2.nav-tab-wrapper a.nav-tab-active{color:#464646;cursor:default}.as3cf-main.wrap h2.nav-tab-wrapper a:focus{-webkit-box-shadow:none;box-shadow:none}.as3cf-main.wrap .more-info{white-space:nowrap}.as3cf-main.wrap .error pre{background:#eaeaea;background:rgba(0,0,0,0.07);display:block;padding:10px 15px}.as3cf-main.wrap .error pre code{padding:0;background:none}.as3cf-main.wrap[data-tab="support"] .as3cf-notice,.as3cf-main.wrap[data-tab="support"] .error,.as3cf-main.wrap[data-tab="support"] .updated,.as3cf-main.wrap[data-tab="support"] .updated.show{display:none}.as3cf-main.wrap[data-tab="support"] .fatal .error,.as3cf-main.wrap[data-tab="support"] .as3cf-notice.important,.as3cf-main.wrap[data-tab="support"] .dbrains-api-down{display:block}.as3cf-main.wrap .as3cf-notice,.as3cf-main.wrap .error,.as3cf-main.wrap .updated{max-width:650px;margin-top:15px;-webkit-box-sizing:border-box;box-sizing:border-box}.as3cf-main.wrap .as3cf-updated{display:none}.as3cf-main.wrap .as3cf-updated.as3cf-notice,.as3cf-main.wrap .as3cf-updated.show{display:block}.as3cf-main.wrap .alignleft{margin-right:20px;margin-bottom:20px}.as3cf-main.wrap .spinner{min-width:20px}.as3cf-tab .as3cf-main-settings{display:none}.as3cf-tab .as3cf-bucket-container{display:block}.as3cf-tab.as3cf-has-bucket .as3cf-main-settings{display:block}.as3cf-tab.as3cf-has-bucket .as3cf-bucket-container{display:none}.as3cf-content>section{margin-bottom:20px}.as3cf-content>section+section.as3cf-access-keys{padding-top:20px;border-top:1px solid #d3d3d3}.as3cf-content>section+section.as3cf-access-keys .as3cf-section-heading{margin-top:0}.as3cf-tab{display:none;position:relative;width:650px}.as3cf-tab .as3cf-main-settings p{font-size:13px}.as3cf-tab .as3cf-main-settings p a{color:#444}.as3cf-tab .object-prefix-desc em{white-space:nowrap}.as3cf-tab .as3cf-url-preview-wrap{background:#fff;text-align:center;padding:20px 0 0;max-width:650px;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.as3cf-tab .as3cf-url-preview-wrap .as3cf-url-preview{margin-top:10px;padding:0 20px 10px;overflow-x:scroll}.as3cf-tab .as3cf-url-preview-wrap span{color:#aaa;text-transform:uppercase;font-weight:bold}.as3cf-tab .as3cf-radio-group label{display:block;margin-bottom:10px}.as3cf-tab .as3cf-radio-group label.disabled,.as3cf-tab .as3cf-radio-group label.disabled p{color:#bbb;cursor:default}.as3cf-tab .as3cf-radio-group p{padding-left:25px;color:#6b6b6b;margin:0;font-size:12px}.as3cf-tab .as3cf-radio-group p.as3cf-setting{margin-top:5px}.as3cf-tab .as3cf-switch{position:relative;display:inline-block;padding:2px;overflow:hidden;border-radius:2px;background-color:#d4d3d3;cursor:pointer}.as3cf-tab .as3cf-switch.on{background-color:#ade7b5}.as3cf-tab .as3cf-switch span{visibility:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;float:left;display:inline-block;height:100%;font-size:12px;line-height:20px;border-radius:2px;font-weight:bold;padding:4px 8px;background:#fff;color:#8d8d8d;z-index:1}.as3cf-tab .as3cf-switch span.on{color:#82d78b}.as3cf-tab .as3cf-switch span.checked{visibility:visible}.as3cf-tab .as3cf-switch.disabled{cursor:default;background:#e6e6e6}.as3cf-tab .as3cf-switch.disabled span{background:#f1f1f1;color:#d6d6d6}.as3cf-tab .as3cf-switch input[type="checkbox"]{position:absolute !important;top:0;left:0;opacity:0;filter:alpha(opacity=0);z-index:-1}.as3cf-tab .as3cf-setting.hide{display:none}.as3cf-tab div.as3cf-setting{margin-top:4px}.as3cf-tab h3{font-weight:normal;text-transform:uppercase}.as3cf-tab .form-table{margin:0}.as3cf-tab .form-table tr.as3cf-border-bottom td{border-bottom:1px solid #ddd;padding:20px 0px}.as3cf-tab .form-table tr.as3cf-setting-title td{padding-bottom:0}.as3cf-tab .form-table tr.as3cf-setting-title:first-child td{padding-top:20px}.as3cf-tab .form-table tr td{padding:15px 0}.as3cf-tab .form-table tr td:first-child{vertical-align:top;min-width:120px}.as3cf-tab .form-table tr td .as3cf-notice:last-child{margin-bottom:0}.as3cf-tab .form-table tr td>p:first-child{margin-top:0}.as3cf-tab .form-table tr.as3cf-bucket-setting .as3cf-defined-in-config{float:none}.as3cf-tab .form-table h3{padding:0;margin:0}.as3cf-tab .form-table h4{margin:0}.as3cf-tab .as3cf-active-bucket{font-weight:bold;margin-right:10px}.as3cf-tab .as3cf-view-bucket{color:#444;text-decoration:none;margin-right:10px}.as3cf-tab .as3cf-view-bucket:hover,.as3cf-tab .as3cf-view-bucket:active{color:#00a0d2}.as3cf-tab .as3cf-view-bucket:focus{-webkit-box-shadow:none;box-shadow:none}.as3cf-tab .as3cf-view-bucket .dashicons-external{margin-top:-2px}.as3cf-tab .tooltip{position:relative;z-index:2;cursor:pointer}.as3cf-tab .tooltip:before,.as3cf-tab .tooltip:after{visibility:hidden;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;pointer-events:none}.as3cf-tab .tooltip:before{position:absolute;bottom:150%;left:50%;margin-bottom:5px;margin-left:-250px;padding:10px;width:500px;border-radius:3px;background-color:#000;background-color:rgba(51,51,51,0.9);color:#fff;content:attr(data-tooltip);text-align:center;font-size:14px;line-height:1.3}.as3cf-tab .tooltip:after{position:absolute;bottom:150%;left:50%;margin-left:-5px;width:0;border-top:5px solid #000;border-top:5px solid rgba(51,51,51,0.9);border-right:5px solid transparent;border-left:5px solid transparent;content:" ";font-size:0;line-height:0}.as3cf-tab .tooltip:hover:before,.as3cf-tab .tooltip:hover:after{visibility:visible;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1}.as3cf-tab .as3cf-defined-in-config{background:#ccc;color:#fff;padding:2px 5px;margin:0 0 5px 5px;float:right;white-space:nowrap}.as3cf-tab .as3cf-defined-setting{color:#bbb}.as3cf-tab .as3cf-defined-setting label{cursor:default}.as3cf-tab .as3cf-defined-setting p .more-info a{color:#bbb}.as3cf-tab .as3cf-defined-setting .as3cf-radio-group p{color:#bbb}.as3cf-tab .as3cf-defined-setting .as3cf-notice{display:none !important}#tab-media{display:block}#tab-media .as3cf-main-settings{display:none}#tab-media .as3cf-bucket-setting td{padding-top:5px}#tab-media .as3cf-bucket-container{display:block}#tab-media.as3cf-has-bucket .as3cf-main-settings{display:block}#tab-media.as3cf-has-bucket .as3cf-bucket-container{display:none}.as3cf-bucket-container h3{line-height:1.3;text-transform:none}.as3cf-bucket-container a:focus{-webkit-box-shadow:none;box-shadow:none;outline:none}.as3cf-bucket-container input[type=text]{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.as3cf-bucket-container select{-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.as3cf-bucket-container .form-table td{padding:5px 0}.as3cf-bucket-container .form-table td:first-child{width:100px;line-height:30px;vertical-align:top}.as3cf-bucket-container .bucket-actions{margin:15px 0;border-top:1px solid #ccc;padding-top:15px;overflow:hidden}.as3cf-bucket-container .bucket-actions button,.as3cf-bucket-container .bucket-actions .right{float:right;margin-right:0}.as3cf-bucket-container .bucket-actions span{display:inline-block;margin-right:20px;line-height:28px}.as3cf-bucket-container .bucket-actions .bucket-action-cancel{color:#a00;text-decoration:none}.as3cf-bucket-container .bucket-actions .bucket-action-cancel:hover{color:red}.as3cf-bucket-container .as3cf-bucket-list{padding:15px;max-height:200px;overflow-x:hidden;overflow-y:auto;background-color:#fff;font-size:14px}.as3cf-bucket-container .as3cf-bucket-list li:last-of-type{margin-bottom:0}.as3cf-bucket-container .as3cf-bucket-list a{color:#444;text-decoration:none}.as3cf-bucket-container .as3cf-bucket-list a:hover{color:#0074a2}.as3cf-bucket-container .as3cf-bucket-list a.selected{font-weight:bold;color:#0074a2}.as3cf-bucket-container .as3cf-bucket-list a .dashicons{margin-right:5px}.as3cf-bucket-container .as3cf-bucket-select,.as3cf-bucket-container .as3cf-bucket-create{display:none}.as3cf-bucket-container .bucket-actions.select{display:none}#tab-media{display:block}#tab-settings .as3cf-field-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}#tab-settings .as3cf-field-wrap input{width:100%}#tab-settings .as3cf-field-wrap button,#tab-settings .as3cf-field-wrap .as3cf-defined-in-config{margin-left:20px}#tab-settings .as3cf-field-wrap .as3cf-defined-in-config{display:none;margin-bottom:0}#tab-settings .as3cf-field-wrap.as3cf-defined button{display:none}#tab-settings .as3cf-field-wrap.as3cf-defined .as3cf-defined-in-config{display:inline-block}#tab-settings .as3cf-field-wrap.as3cf-saved-field .as3cf-activate-licence{display:none}#tab-settings .as3cf-field-wrap.as3cf-licence-not-entered .as3cf-remove-licence{display:none}#tab-support{min-height:900px}#tab-support .as3cf-sidebar{top:11px}#tab-support .support-section{border-bottom:1px solid #ccc;padding-bottom:20px;margin-bottom:20px}#tab-support .support-section h3{font-size:20px}#tab-support .debug textarea{width:100%;min-height:200px;font-family:Consolas, Monaco, monospace;margin-bottom:5px}.as3cf-sidebar{position:absolute;top:9px;left:670px;width:292px}.as3cf-sidebar .block{padding:20px;border:1px solid #ccc}.as3cf-sidebar .subscribe{border-top:none}.as3cf-sidebar .subscribe h2{padding:0;margin:0;margin-bottom:0.5em;color:#666;font-size:20px;line-height:1.2em;float:none}.as3cf-sidebar .subscribe h3{font-size:16px;margin:0}.as3cf-sidebar .subscribe p{margin:0}.as3cf-sidebar .subscribe .intro{margin-bottom:1em;line-height:1.4}.as3cf-sidebar .subscribe li{line-height:1.4}.as3cf-sidebar .subscribe .links{margin-bottom:2em}.as3cf-sidebar .subscribe .links a{text-decoration:none}.as3cf-sidebar .subscribe .promise{color:#999;font-size:12px;line-height:1.4em}.as3cf-sidebar .subscribe .field{margin-bottom:0.5em}.as3cf-sidebar .subscribe .field p{margin-bottom:0.3em}.as3cf-sidebar .subscribe .field input[type=text],.as3cf-sidebar .subscribe .field input[type=email]{width:100%}.as3cf-sidebar .subscribe .field.submit-button{margin-bottom:1em}.as3cf-sidebar .credits{border-top:0}.as3cf-sidebar .credits h4{font-size:16px;margin-top:0;margin-bottom:10px}.as3cf-sidebar .credits ul{margin:0}.as3cf-sidebar .credits li{overflow:hidden}.as3cf-sidebar .credits li:last-child{margin-bottom:0}.as3cf-sidebar .credits img{float:left;margin-right:10px}.as3cf-sidebar .credits span{float:left;display:block;line-height:32px}.as3cf-sidebar .credits a{display:block;text-decoration:none;color:#444;font-size:16px;text-align:center}.as3cf-sidebar .credits a:hover{color:#888}@media screen and (max-width: 1052px){.as3cf-sidebar{position:relative;top:auto;right:auto}}.as3cf-banner{margin-top:35px;width:292px;height:200px;display:block;background:#f8cfae url(../img/os3-banner.svg) left bottom/220px 220px no-repeat}.as3cf-banner:focus{-webkit-box-shadow:none;box-shadow:none}.wrap .as3cf-upgrade-details{background-color:#4e0d33;padding:10px 20px 20px 20px;color:#eee;font-size:13px;margin:0;display:block;text-decoration:none}.wrap .as3cf-upgrade-details h1{font-size:28px;color:#eee;margin:0 0 15px 0;padding:0;text-decoration:none;font-weight:200;line-height:1}.wrap .as3cf-upgrade-details p{margin:0}.wrap .as3cf-upgrade-details a{color:#eee;font-weight:bold;text-decoration:none;font-size:16px;-webkit-box-shadow:none;box-shadow:none}.wrap .as3cf-upgrade-details a:hover{color:#fff}.wrap .as3cf-upgrade-details ul{margin-top:0;margin-left:16px;list-style-type:disc}.as3cf-compatibility-notice.error{clear:both;margin:5px 20px 5px 0}.as3cf-bucket-error span.title{font-weight:bold}.as3cf-invalid-bucket-name,.as3cf-validation-error{display:block;margin-top:2px;font-size:12px;color:#a00}.as3cf-notice-toggle-content{max-height:100px;overflow-y:scroll}.as3cf-notice-toggle-content .as3cf-notice-toggle-list{margin-top:0;margin-left:0;padding-left:40px;color:#dc3232}.as3cf-need-help{background-color:white;font-size:16px;font-weight:bold;padding:1em}.as3cf-need-help a{text-decoration:none}.as3cf-aws-logo{color:white;background-color:#f7a80d;padding:1em}.as3cf-settings h3{font-size:20px}.as3cf-settings p{font-size:14px}.as3cf-addons,.as3cf-tab .as3cf-compatibility-notice{max-width:cover}textarea.as3cf-access-key-constants-snippet.code{width:100%;white-space:pre;overflow:hidden;font-size:12px;padding:10px;height:53px}.as3cf-addons .as3cf-addons-list{margin:20px 0 200px;padding-top:5px}.as3cf-addons .as3cf-addon{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:20px;font-size:14px}.as3cf-addons .as3cf-addon-info{min-height:100px}.as3cf-addons .as3cf-addon-links{float:right}.as3cf-addons .as3cf-addon-links span{padding:4px 6px}.as3cf-addons .as3cf-addon-icon{float:left;margin-right:20px}.as3cf-addons .as3cf-addon-details{white-space:nowrap}.as3cf-addons .as3cf-addon-title,.as3cf-addons .as3cf-addon-description{font-weight:100}.as3cf-addons .as3cf-addon+.as3cf-addon{margin-top:20px}.as3cf-addons .as3cf-addon.amazon-s3-and-cloudfront-assets-pull{background-color:#0769ad;color:white}.as3cf-addons .as3cf-addon.amazon-s3-and-cloudfront-assets-pull .as3cf-addon-title,.as3cf-addons .as3cf-addon.amazon-s3-and-cloudfront-assets-pull .as3cf-addon-description,.as3cf-addons .as3cf-addon.amazon-s3-and-cloudfront-assets-pull a{color:white}.as3cf-addons .as3cf-addon.amazon-s3-and-cloudfront-assets-pull .extra{background:white}.as3cf-addons .as3cf-addon.amazon-s3-and-cloudfront-assets-pull .extra a{color:#0769ad;text-decoration:none} diff --git a/assets/img/as3cf-banner-bw.jpg b/assets/img/as3cf-banner-bw.jpg new file mode 100644 index 00000000..8ee652bf Binary files /dev/null and b/assets/img/as3cf-banner-bw.jpg differ diff --git a/assets/img/as3cf-banner-bw@2x.jpg b/assets/img/as3cf-banner-bw@2x.jpg new file mode 100644 index 00000000..f91757aa Binary files /dev/null and b/assets/img/as3cf-banner-bw@2x.jpg differ diff --git a/assets/img/as3cf-banner.jpg b/assets/img/as3cf-banner.jpg new file mode 100644 index 00000000..bf2124f8 Binary files /dev/null and b/assets/img/as3cf-banner.jpg differ diff --git a/assets/img/as3cf-banner@2x.jpg b/assets/img/as3cf-banner@2x.jpg new file mode 100644 index 00000000..f45a6d35 Binary files /dev/null and b/assets/img/as3cf-banner@2x.jpg differ diff --git a/assets/img/aws-logo.svg b/assets/img/aws-logo.svg new file mode 100644 index 00000000..f7cba68a --- /dev/null +++ b/assets/img/aws-logo.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/assets/img/icon-assets-pull.svg b/assets/img/icon-assets-pull.svg new file mode 100644 index 00000000..4b66e973 --- /dev/null +++ b/assets/img/icon-assets-pull.svg @@ -0,0 +1,10 @@ + + + + Untitled + Created with Sketch. + + + + + \ No newline at end of file diff --git a/assets/img/icon16.png b/assets/img/icon16.png new file mode 100644 index 00000000..a609c119 Binary files /dev/null and b/assets/img/icon16.png differ diff --git a/assets/js/script.js b/assets/js/script.js index 19f2de7a..e06c5353 100644 --- a/assets/js/script.js +++ b/assets/js/script.js @@ -4,7 +4,9 @@ var bucketNamePattern = /[^a-z0-9.-]/; var refreshBucketListOnLoad = false; + var $body = $( 'body' ); var $tabs = $( '.as3cf-tab' ); + var $settings = $( '.as3cf-settings' ); var $activeTab; /** @@ -68,7 +70,7 @@ $activeTab.show(); $( '.nav-tab' ).removeClass( 'nav-tab-active' ); $( 'a.nav-tab[data-tab="' + hash + '"]' ).addClass( 'nav-tab-active' ); - $( '.aws-main' ).data( 'tab', hash ); + $( '.as3cf-main' ).data( 'tab', hash ); if ( $activeTab.data( 'prefix' ) ) { as3cfModal.prefix = $activeTab.data( 'prefix' ); } @@ -294,6 +296,8 @@ // Make sure the bucket list will refresh the next time the modal loads refreshBucketListOnLoad = true; + + as3cf.showSettingsSavedNotice(); } else { that.showError( as3cf.strings.save_bucket_error, data[ 'error' ], 'as3cf-bucket-manual' ); } @@ -358,6 +362,8 @@ if ( 'undefined' !== typeof data[ 'success' ] ) { that.set( bucketName, data[ 'region' ], data[ 'can_write' ] ); $( '#' + as3cfModal.prefix + '-bucket-select' ).val( '' ); + + as3cf.showSettingsSavedNotice(); } else { that.showError( as3cf.strings.save_bucket_error, data[ 'error' ], 'as3cf-bucket-select' ); $( '.as3cf-bucket-list a' ).removeClass( 'selected' ); @@ -518,6 +524,8 @@ // Make sure the bucket list will refresh the next time the modal loads refreshBucketListOnLoad = true; + + as3cf.showSettingsSavedNotice(); } else { that.showError( as3cf.strings.create_bucket_error, data[ 'error' ], 'as3cf-bucket-create' ); } @@ -571,6 +579,35 @@ }; + /** + * Reload the page, and show the persistent updated notice. + * + * Intended for use on plugin settings page. + */ + as3cf.reloadUpdated = function() { + var url = location.pathname + location.search; + + if ( ! location.search.match( /[?&]updated=/ ) ) { + url += '&updated=1'; + } + + url += location.hash; + + location.assign( url ); + }; + + /** + * Show the standard "Settings saved." notice if not already visible. + */ + as3cf.showSettingsSavedNotice = function() { + if ( 0 < $( '#setting-error-settings_updated:visible' ).length || 0 < $( '#as3cf-settings_updated:visible' ).length ) { + return; + } + var settingsUpdatedNotice = '

' + as3cf.strings.settings_saved + '

'; + $( 'h2.nav-tab-wrapper' ).after( settingsUpdatedNotice ); + $( document ).trigger( 'wp-updates-notice-added' ); // Hack to run WP Core's makeNoticesDismissible() function. + }; + /** * Get the link to the bucket on the AWS Console and update the DOM * @@ -667,6 +704,85 @@ $( document ).trigger( 'as3cf.tabRendered', [ location.hash.replace( '#', '' ) ] ); } + /** + * Access Keys API object + * @constructor + */ + var AccessKeys = function() { + this.$key = $settings.find( 'input[name="aws-access-key-id"]' ); + this.$secret = $settings.find( 'input[name="aws-secret-access-key"]' ); + this.$spinner = $settings.find( '[data-as3cf-aws-keys-spinner]' ); + this.$feedback = $settings.find( '[data-as3cf-aws-keys-feedback]' ); + }; + + /** + * Set the access keys using the values in the settings fields. + */ + AccessKeys.prototype.set = function() { + this.sendRequest( 'set', { + 'aws-access-key-id': this.$key.val(), + 'aws-secret-access-key': this.$secret.val() + } ).done( function( response ) { + if ( response.success ) { + this.$secret.val( as3cf.strings.not_shown_placeholder ); + } + }.bind( this ) ); + }; + + /** + * Remove the access keys from the database and clear the fields. + */ + AccessKeys.prototype.remove = function() { + this.sendRequest( 'remove' ) + .done( function( response ) { + if ( response.success ) { + this.$key.val( '' ); + this.$secret.val( '' ); + } + }.bind( this ) ) + ; + }; + + /** + * Send the request to the server to update the access keys. + * + * @param {string} action The action to perform with the keys + * @param {undefined|Object} params Extra parameters to send with the request + * + * @returns {jqXHR} + */ + AccessKeys.prototype.sendRequest = function( action, params ) { + var data = { + action: 'as3cf-aws-keys-' + action, + _ajax_nonce: as3cf.nonces[ 'aws_keys_' + action ] + }; + + if ( _.isObject( params ) ) { + data = _.extend( data, params ); + } + + this.$spinner.addClass( 'is-active' ); + + return $.post( ajaxurl, data ) + .done( function( response ) { + this.$feedback + .toggleClass( 'notice-success', response.success ) + .toggleClass( 'notice-error', ! response.success ); + + if ( response.data && response.data.message ) { + this.$feedback.html( '

' + response.data.message + '

' ).show(); + } + + if ( response.success ) { + as3cf.reloadUpdated(); + } + }.bind( this ) ) + .always( function() { + this.$spinner.removeClass( 'is-active' ); + }.bind( this ) ) + ; + }; + $( document ).ready( function() { // Tabs @@ -687,8 +803,8 @@ }; // Move any compatibility errors below the nav tabs - var $navTabs = $( '.wrap.aws-main .nav-tab-wrapper' ); - $( '.aws-compatibility-notice, div.updated, div.error, div.notice' ).not( '.below-h2, .inline' ).insertAfter( $navTabs ); + var $navTabs = $( '.as3cf-main .nav-tab-wrapper' ); + $( '.as3cf-compatibility-notice, div.updated, div.error, div.notice' ).not( '.below-h2, .inline' ).insertAfter( $navTabs ); // Settings // -------------------- @@ -791,17 +907,17 @@ $( '#tab-media > .as3cf-bucket-error' ).detach().insertAfter( '.as3cf-bucket-container h3' ); // Action click handlers - $( 'body' ).on( 'click', '.bucket-action-manual', function( e ) { + $body.on( 'click', '.bucket-action-manual', function( e ) { e.preventDefault(); $( '.as3cf-bucket-container.' + as3cfModal.prefix + ' .as3cf-bucket-manual' ).show().siblings().hide(); } ); - $( 'body' ).on( 'click', '.bucket-action-browse', function( e ) { + $body.on( 'click', '.bucket-action-browse', function( e ) { e.preventDefault(); $( '.as3cf-bucket-container.' + as3cfModal.prefix + ' .as3cf-bucket-select' ).show().siblings().hide(); as3cf.buckets.loadList( refreshBucketListOnLoad ); refreshBucketListOnLoad = false; } ); - $( 'body' ).on( 'click', '.bucket-action-create', function( e ) { + $body.on( 'click', '.bucket-action-create', function( e ) { e.preventDefault(); // Reset create bucket modal @@ -810,27 +926,27 @@ $( '.as3cf-bucket-container.' + as3cfModal.prefix + ' .as3cf-bucket-create' ).show().siblings().hide(); } ); - $( 'body' ).on( 'click', '.bucket-action-cancel', function( e ) { + $body.on( 'click', '.bucket-action-cancel', function( e ) { e.preventDefault(); as3cf.buckets.resetModal(); } ); - $( 'body' ).on( 'click', '.bucket-action-save', function( e ) { + $body.on( 'click', '.bucket-action-save', function( e ) { e.preventDefault(); as3cf.buckets.saveManual(); } ); - $( 'body' ).on( 'click', '.as3cf-create-bucket-form button[type="submit"]', function( e ) { + $body.on( 'click', '.as3cf-create-bucket-form button[type="submit"]', function( e ) { e.preventDefault(); as3cf.buckets.create(); } ); // Bucket list refresh handler - $( 'body' ).on( 'click', '.bucket-action-refresh', function( e ) { + $body.on( 'click', '.bucket-action-refresh', function( e ) { e.preventDefault(); as3cf.buckets.loadList( true ); } ); // Bucket list click handler - $( 'body' ).on( 'click', '.as3cf-bucket-list a', function( e ) { + $body.on( 'click', '.as3cf-bucket-list a', function( e ) { e.preventDefault(); as3cf.buckets.saveSelected( $( this ) ); } ); @@ -844,7 +960,7 @@ } ); // Modal open - $( 'body' ).on( 'as3cf-modal-open', function( e, target ) { + $body.on( 'as3cf-modal-open', function( e, target ) { if ( '.as3cf-bucket-container.' + as3cfModal.prefix === target ) { // Reset modal @@ -862,7 +978,7 @@ as3cf.buckets.disabledButtons(); // Validate bucket name on create - $( 'body' ).on( 'input keyup', '.as3cf-create-bucket-form .as3cf-bucket-name', function( e ) { + $body.on( 'input keyup', '.as3cf-create-bucket-form .as3cf-bucket-name', function( e ) { var bucketName = $( this ).val(); var $createBucketForm = $( '.as3cf-bucket-container.' + as3cfModal.prefix + ' .as3cf-create-bucket-form' ); @@ -875,7 +991,7 @@ } ); // Check bucket name length on manual - $( 'body' ).on( 'input keyup', '.as3cf-manual-save-bucket-form .as3cf-bucket-name', function( e ) { + $body.on( 'input keyup', '.as3cf-manual-save-bucket-form .as3cf-bucket-name', function( e ) { var $manualBucketForm = $( '.as3cf-bucket-container.' + as3cfModal.prefix + ' .as3cf-manual-save-bucket-form' ); if ( $manualBucketForm.find( '.as3cf-bucket-name' ).val().length < as3cf.buckets.validLength ) { @@ -885,6 +1001,21 @@ } } ); + $settings + .on( 'click', '[data-as3cf-toggle-access-keys-form]', function( event ) { + event.preventDefault(); + $( '#as3cf_access_keys' ).toggle(); + } ) + .on( 'click', '[data-as3cf-aws-keys-action]', function( event ) { + event.preventDefault(); + var action = $( this ).data( 'as3cfAwsKeysAction' ); + var api = new AccessKeys(); + + if ( 'function' === typeof api[action] ) { + api[action](); + } + } ) + ; } ); })( jQuery, as3cfModal ); diff --git a/assets/js/script.min.js b/assets/js/script.min.js index 6a72cfa0..f8f978ca 100644 --- a/assets/js/script.min.js +++ b/assets/js/script.min.js @@ -1 +1 @@ -!function(a,b){function c(b){return a("#"+b+" .as3cf-main-settings form").find("input:not(.no-compare)").serialize()}function d(a){var b=k.find("#"+a),c=b.find("input[type=checkbox]");b.toggleClass("on").find("span").toggleClass("checked");var d=b.find("span.on").hasClass("checked");c.prop("checked",d).trigger("change")}function e(b){var c=b.next(".as3cf-validation-error"),d=a("#"+k.attr("id")+' form button[type="submit"]'),e=/[^a-zA-Z0-9\.\-]/;e.test(b.val())?(c.show(),d.prop("disabled",!0)):(c.hide(),d.prop("disabled",!1))}function f(){var c=a("#"+b.prefix+"-bucket").val(),d=k.find('input[name="object-prefix"]'),e=d.val();""!==e&&(e="&prefix="+encodeURIComponent(e));var f=as3cf.aws_bucket_link+c+e;a("#"+b.prefix+"-view-bucket").attr("href",f)}function g(){a(".as3cf-url-preview").html("Generating...");var b={_nonce:as3cf.nonces.get_url_preview};a.each(a("#tab-"+as3cf.tabs.defaultTab+" .as3cf-main-settings form").serializeArray(),function(c,d){var e=d.name,f=d.value;e=e.replace("[]",""),b[e]=void 0===b[e]?f:a.isArray(b[e])?b[e].concat(f):[b[e],f]}),b.action="as3cf-get-url-preview",a.ajax({url:ajaxurl,type:"POST",dataType:"JSON",data:b,error:function(a,b,c){alert(as3cf.strings.get_url_preview_error+c)},success:function(b,c,d){"undefined"!=typeof b.success?a(".as3cf-url-preview").html(b.url):alert(as3cf.strings.get_url_preview_error+b.error)}})}function h(){a("#as3cf-remove-local-file").is(":checked")&&a("#as3cf-serve-from-s3").is(":not(:checked)")?a("#as3cf-lost-files-notice").show():a("#as3cf-lost-files-notice").hide()}function i(){a("#as3cf-remove-local-file").is(":checked")?a("#as3cf-remove-local-notice").show():a("#as3cf-remove-local-notice").hide()}function j(){return"#"+as3cf.tabs.defaultTab===location.hash?void(location.hash=""):(as3cf.tabs.toggle(location.hash.replace("#",""),!0),void a(document).trigger("as3cf.tabRendered",[location.hash.replace("#","")]))}var k,l={},m=/[^a-z0-9.-]/,n=!1,o=a(".as3cf-tab");as3cf.tabs={defaultTab:"media",toggle:function(c,d){c=as3cf.tabs.sanitizeHash(c),o.hide(),k=a("#tab-"+c),k.show(),a(".nav-tab").removeClass("nav-tab-active"),a('a.nav-tab[data-tab="'+c+'"]').addClass("nav-tab-active"),a(".aws-main").data("tab",c),k.data("prefix")&&(b.prefix=k.data("prefix")),d||a(".as3cf-updated").removeClass("show"),"support"===c&&as3cf.tabs.getDiagnosticInfo()},getDiagnosticInfo:function(){var b=a(".debug-log-textarea");b.html(as3cf.strings.get_diagnostic_info);var c={action:"as3cf-get-diagnostic-info",_nonce:as3cf.nonces.get_diagnostic_info};a.ajax({url:ajaxurl,type:"POST",dataType:"JSON",data:c,error:function(a,c,d){b.html(d)},success:function(a,c,d){"undefined"!=typeof a.success?b.html(a.diagnostic_info):(b.html(as3cf.strings.get_diagnostic_info_error),b.append(a.error))}})},sanitizeHash:function(b){var c=a("#tab-"+b);return 0===c.length&&(b=as3cf.tabs.defaultTab),b}},as3cf.buckets={validLength:3,bucketSelectLock:!1,loadList:function(c){"undefined"==typeof c&&(c=!1);var d=a(".as3cf-bucket-container."+b.prefix+" .as3cf-bucket-list"),e=a("#"+b.prefix+"-bucket").val();if(!1===c&&d.find("li").length>1)return a(".as3cf-bucket-list a").removeClass("selected"),a('.as3cf-bucket-list a[data-bucket="'+e+'"]').addClass("selected"),void this.scrollToSelected();d.html('
  • '+d.data("working")+"
  • ");var f={action:b.prefix+"-get-buckets",_nonce:window[b.prefix.replace(/-/g,"_")].nonces.get_buckets},g=this;a.ajax({url:ajaxurl,type:"POST",dataType:"JSON",data:f,error:function(a,b,c){d.html(""),g.showError(as3cf.strings.get_buckets_error,c,"as3cf-bucket-select")},success:function(b,c,f){d.html(""),"undefined"!=typeof b.success?(a(".as3cf-bucket-error").hide(),a(b.buckets).each(function(a,b){var c=b.Name===e?"selected":"";d.append('
  • '+b.Name+'
  • ')}),g.scrollToSelected()):g.showError(as3cf.strings.get_buckets_error,b.error,"as3cf-bucket-select")}})},scrollToSelected:function(){if(a(".as3cf-bucket-list a.selected").length){var b=a("ul.as3cf-bucket-list li").first().position().top+150;a(".as3cf-bucket-list").animate({scrollTop:a("ul.as3cf-bucket-list li a.selected").position().top-b})}},resetModal:function(){var c=a(".as3cf-bucket-container."+b.prefix);!1===k.hasClass("as3cf-has-bucket")||"manual"===a("#"+b.prefix+"-bucket-select").val()?(c.find(".as3cf-bucket-manual").show().siblings().hide(),c.find(".bucket-actions.manual").show().siblings(".bucket-actions").hide()):(c.find(".as3cf-bucket-select").show().siblings().hide(),c.find(".bucket-actions.select").show().siblings(".bucket-actions").hide(),this.loadList(n),n=!1),c.find(".as3cf-bucket-error").hide();var d=a("#"+b.prefix+"-bucket").val();c.find(".as3cf-bucket-manual .as3cf-bucket-name").val(d),this.bucketSelectLock=!1},saveManual:function(){var c=a(".as3cf-bucket-container."+b.prefix+" .as3cf-manual-save-bucket-form"),d=c.find(".as3cf-bucket-name"),e=c.find("button[type=submit]"),f=d.val(),g=e.first().text();if(f===a("#"+b.prefix+"-active-bucket").text())return a(".as3cf-bucket-error").hide(),k.addClass("as3cf-has-bucket"),void b.close();a(".as3cf-bucket-error").hide(),e.text(e.data("working")),e.prop("disabled",!0);var h={action:b.prefix+"-manual-save-bucket",bucket_name:f,_nonce:window[b.prefix.replace(/-/g,"_")].nonces.manual_bucket},i=this;a.ajax({url:ajaxurl,type:"POST",dataType:"JSON",data:h,error:function(a,b,c){e.text(g),i.showError(as3cf.strings.save_bucket_error,c,"as3cf-bucket-manual")},success:function(c,d,h){e.text(g),e.prop("disabled",!1),"undefined"!=typeof c.success?(i.set(f,c.region,c.can_write),a("#"+b.prefix+"-bucket-select").val("manual"),a(".as3cf-bucket-list a").removeClass("selected").filter('[data-bucket="'+f+'"]').addClass("selected"),n=!0):i.showError(as3cf.strings.save_bucket_error,c.error,"as3cf-bucket-manual")}})},saveSelected:function(c){var d=a(".as3cf-bucket-list");if(!this.bucketSelectLock){if(this.bucketSelectLock=!0,c.hasClass("selected"))return k.addClass("as3cf-has-bucket"),void b.close();var e=a(".as3cf-bucket-list a.selected").data("bucket");a(".as3cf-bucket-list a").removeClass("selected"),c.addClass("selected"),d.addClass("saving"),c.find(".spinner").show().css("visibility","visible");var f=c.data("bucket"),g={action:b.prefix+"-save-bucket",bucket_name:f,_nonce:window[b.prefix.replace(/-/g,"_")].nonces.save_bucket},h=this;a.ajax({url:ajaxurl,type:"POST",dataType:"JSON",data:g,error:function(b,c,f){d.removeClass("saving"),h.showError(as3cf.strings.save_bucket_error,f,"as3cf-bucket-select"),a(".as3cf-bucket-list a").removeClass("selected"),a('.as3cf-bucket-list a[data-bucket="'+e+'"]').addClass("selected")},success:function(g,i,j){c.find(".spinner").hide().css("visibility","hidden"),d.removeClass("saving"),"undefined"!=typeof g.success?(h.set(f,g.region,g.can_write),a("#"+b.prefix+"-bucket-select").val("")):(h.showError(as3cf.strings.save_bucket_error,g.error,"as3cf-bucket-select"),a(".as3cf-bucket-list a").removeClass("selected"),a('.as3cf-bucket-list a[data-bucket="'+e+'"]').addClass("selected"))}})}},disabledButtons:function(){if(0!==a(".as3cf-bucket-container."+b.prefix+" .as3cf-create-bucket-form").length){var c=a(".as3cf-bucket-container."+b.prefix+" .as3cf-create-bucket-form"),d=a(".as3cf-bucket-container."+b.prefix+" .as3cf-manual-save-bucket-form");c.find(".as3cf-bucket-name").val().length<3?c.find("button[type=submit]").prop("disabled",!0):c.find("button[type=submit]").prop("disabled",!1),d.find(".as3cf-bucket-name").val().length<3?d.find("button[type=submit]").prop("disabled",!0):d.find("button[type=submit]").prop("disabled",!1)}},showError:function(b,c,d){var e=a(".as3cf-bucket-container").children(":visible"),f=e.find(".as3cf-bucket-error");d="undefined"==typeof d?null:d,d&&!e.hasClass(d)||(f.find("span.title").html(b+" —"),f.find("span.message").html(c),f.show(),this.bucketSelectLock=!1)},set:function(e,h,i){var j=a(".as3cf-bucket-container."+b.prefix+" .as3cf-manual-save-bucket-form"),m=a("#"+b.prefix+"-active-bucket");if("as3cf"===b.prefix&&0===m.text().trim().length){d("as3cf-copy-to-s3-wrap"),d("as3cf-serve-from-s3-wrap");var n=k.attr("id");l[n]=c(n)}a(".as3cf-error.fatal").hide(),m.text(e),j.find(".as3cf-bucket-name").val(e),a("#"+b.prefix+"-bucket").val(e),a("#"+b.prefix+"-region").val(h),a(".updated").not(".as3cf-notice").show(),k.addClass("as3cf-has-bucket"),k.find(".as3cf-can-write-error").toggle(!i),k.find(".as3cf-bucket-error").hide(),"as3cf"===b.prefix&&g(),f(),b.close(function(){k.trigger("bucket-change",[i]),as3cf.buckets.bucketSelectLock=!1})},create:function(){var c=a(".as3cf-bucket-container."+b.prefix+" .as3cf-create-bucket-form"),d=c.find(".as3cf-bucket-name"),e=c.find(".bucket-create-region"),f=c.find("button[type=submit]"),g=d.val(),h=f.text();a(".as3cf-bucket-error").hide(),f.text(f.data("working")),f.prop("disabled",!0);var i={action:b.prefix+"-create-bucket",bucket_name:g,_nonce:window[b.prefix.replace(/-/g,"_")].nonces.create_bucket};e.val()&&(i.region=e.val());var j=this;a.ajax({url:ajaxurl,type:"POST",dataType:"JSON",data:i,error:function(a,b,c){f.text(h),j.showError(as3cf.strings.create_bucket_error,c,"as3cf-bucket-create")},success:function(b,c,e){f.text(h),f.prop("disabled",!1),"undefined"!=typeof b.success?(j.set(g,b.region,b.can_write),a(".as3cf-bucket-select-region").hide(),a(".as3cf-bucket-select-region").prop("selected",!1),d.val(""),f.prop("disabled",!0),n=!0):j.showError(as3cf.strings.create_bucket_error,b.error,"as3cf-bucket-create")}})},isValidName:function(a){return!(a.length<3||a.length>63)&&!0!==m.test(a)},updateNameNotice:function(b){var c=null;!0===m.test(b)?c=as3cf.strings.create_bucket_invalid_chars:b.length<3?c=as3cf.strings.create_bucket_name_short:b.length>63&&(c=as3cf.strings.create_bucket_name_long),c&&b.length>0?a(".as3cf-invalid-bucket-name").html(c):a(".as3cf-invalid-bucket-name").html("")}},a(document).ready(function(){j(),window.onhashchange=function(a){"function"==typeof history.replaceState&&"#"===location.href.slice(-1)&&history.replaceState({},"",location.href.slice(0,-1)),j()};var m=a(".wrap.aws-main .nav-tab-wrapper");a(".aws-compatibility-notice, div.updated, div.error, div.notice").not(".below-h2, .inline").insertAfter(m),o.length&&o.each(function(a,b){l[b.id]=c(b.id)}),a(window).on("beforeunload.as3cf-settings",function(){if(!a.isEmptyObject(l)){var b=k.attr("id");return c(b)!==l[b]?as3cf.strings.save_alert:void 0}}),a(document).on("submit",".as3cf-main-settings form",function(b){a(window).off("beforeunload.as3cf-settings")}),a(".as3cf-switch").on("click",function(b){a(this).hasClass("disabled")||d(a(this).attr("id"))}),o.on("change",".sub-toggle",function(b){var c=a(this).attr("id");a(".as3cf-setting."+c).toggleClass("hide")}),a(".as3cf-domain").on("change",'input[type="radio"]',function(b){var c=a(this).closest('input:radio[name="domain"]:checked'),d=c.val(),e=a(this).parents(".as3cf-domain").find(".as3cf-setting.cloudfront"),f="cloudfront"===d;e.toggleClass("hide",!f)}),a(".url-preview").on("change","input",function(a){g()}),h(),a("#as3cf-serve-from-s3,#as3cf-remove-local-file").on("change",function(a){h()}),i(),a("#as3cf-remove-local-file").on("change",function(a){i()}),a('.as3cf-setting input[type="text"]').keypress(function(a){if(13===a.which)return a.preventDefault(),!1}),a('input[name="cloudfront"]').on("keyup",function(b){e(a(this))}),a('input[name="domain"]').on("change",function(b){var c=a(this),d=a("#"+k.attr("id")+' form button[type="submit"]');"cloudfront"!==c.val()?d.prop("disabled",!1):e(c.next(".as3cf-setting").find('input[name="cloudfront"]'))}),a('input[name="object-prefix"]').on("change",function(a){f()}),a("#tab-media > .as3cf-bucket-error").detach().insertAfter(".as3cf-bucket-container h3"),a("body").on("click",".bucket-action-manual",function(c){c.preventDefault(),a(".as3cf-bucket-container."+b.prefix+" .as3cf-bucket-manual").show().siblings().hide()}),a("body").on("click",".bucket-action-browse",function(c){c.preventDefault(),a(".as3cf-bucket-container."+b.prefix+" .as3cf-bucket-select").show().siblings().hide(),as3cf.buckets.loadList(n),n=!1}),a("body").on("click",".bucket-action-create",function(c){c.preventDefault(),a(".as3cf-bucket-name").val(""),a(".as3cf-invalid-bucket-name").html(""),a(".as3cf-bucket-container."+b.prefix+" .as3cf-bucket-create").show().siblings().hide()}),a("body").on("click",".bucket-action-cancel",function(a){a.preventDefault(),as3cf.buckets.resetModal()}),a("body").on("click",".bucket-action-save",function(a){a.preventDefault(),as3cf.buckets.saveManual()}),a("body").on("click",'.as3cf-create-bucket-form button[type="submit"]',function(a){a.preventDefault(),as3cf.buckets.create()}),a("body").on("click",".bucket-action-refresh",function(a){a.preventDefault(),as3cf.buckets.loadList(!0)}),a("body").on("click",".as3cf-bucket-list a",function(b){b.preventDefault(),as3cf.buckets.saveSelected(a(this))}),a(".as3cf-bucket-container").on("click","a.js-link",function(b){return b.preventDefault(),window.open(a(this).attr("href")),!1}),a("body").on("as3cf-modal-open",function(c,d){if(".as3cf-bucket-container."+b.prefix===d){as3cf.buckets.resetModal();var e=a(".as3cf-bucket-manual h3").data("modal-title");a(".as3cf-bucket-manual h3").text(e),as3cf.buckets.disabledButtons()}}),as3cf.buckets.disabledButtons(),a("body").on("input keyup",".as3cf-create-bucket-form .as3cf-bucket-name",function(c){var d=a(this).val(),e=a(".as3cf-bucket-container."+b.prefix+" .as3cf-create-bucket-form");as3cf.buckets.isValidName(d)?e.find("button[type=submit]").prop("disabled",!1):e.find("button[type=submit]").prop("disabled",!0),as3cf.buckets.updateNameNotice(d)}),a("body").on("input keyup",".as3cf-manual-save-bucket-form .as3cf-bucket-name",function(c){var d=a(".as3cf-bucket-container."+b.prefix+" .as3cf-manual-save-bucket-form");d.find(".as3cf-bucket-name").val().length1)return a(".as3cf-bucket-list a").removeClass("selected"),a('.as3cf-bucket-list a[data-bucket="'+e+'"]').addClass("selected"),void this.scrollToSelected();d.html('
  • '+d.data("working")+"
  • ");var f={action:b.prefix+"-get-buckets",_nonce:window[b.prefix.replace(/-/g,"_")].nonces.get_buckets},g=this;a.ajax({url:ajaxurl,type:"POST",dataType:"JSON",data:f,error:function(a,b,c){d.html(""),g.showError(as3cf.strings.get_buckets_error,c,"as3cf-bucket-select")},success:function(b,c,f){d.html(""),"undefined"!=typeof b.success?(a(".as3cf-bucket-error").hide(),a(b.buckets).each(function(a,b){var c=b.Name===e?"selected":"";d.append('
  • '+b.Name+'
  • ')}),g.scrollToSelected()):g.showError(as3cf.strings.get_buckets_error,b.error,"as3cf-bucket-select")}})},scrollToSelected:function(){if(a(".as3cf-bucket-list a.selected").length){var b=a("ul.as3cf-bucket-list li").first().position().top+150;a(".as3cf-bucket-list").animate({scrollTop:a("ul.as3cf-bucket-list li a.selected").position().top-b})}},resetModal:function(){var c=a(".as3cf-bucket-container."+b.prefix);!1===k.hasClass("as3cf-has-bucket")||"manual"===a("#"+b.prefix+"-bucket-select").val()?(c.find(".as3cf-bucket-manual").show().siblings().hide(),c.find(".bucket-actions.manual").show().siblings(".bucket-actions").hide()):(c.find(".as3cf-bucket-select").show().siblings().hide(),c.find(".bucket-actions.select").show().siblings(".bucket-actions").hide(),this.loadList(n),n=!1),c.find(".as3cf-bucket-error").hide();var d=a("#"+b.prefix+"-bucket").val();c.find(".as3cf-bucket-manual .as3cf-bucket-name").val(d),this.bucketSelectLock=!1},saveManual:function(){var c=a(".as3cf-bucket-container."+b.prefix+" .as3cf-manual-save-bucket-form"),d=c.find(".as3cf-bucket-name"),e=c.find("button[type=submit]"),f=d.val(),g=e.first().text();if(f===a("#"+b.prefix+"-active-bucket").text())return a(".as3cf-bucket-error").hide(),k.addClass("as3cf-has-bucket"),void b.close();a(".as3cf-bucket-error").hide(),e.text(e.data("working")),e.prop("disabled",!0);var h={action:b.prefix+"-manual-save-bucket",bucket_name:f,_nonce:window[b.prefix.replace(/-/g,"_")].nonces.manual_bucket},i=this;a.ajax({url:ajaxurl,type:"POST",dataType:"JSON",data:h,error:function(a,b,c){e.text(g),i.showError(as3cf.strings.save_bucket_error,c,"as3cf-bucket-manual")},success:function(c,d,h){e.text(g),e.prop("disabled",!1),"undefined"!=typeof c.success?(i.set(f,c.region,c.can_write),a("#"+b.prefix+"-bucket-select").val("manual"),a(".as3cf-bucket-list a").removeClass("selected").filter('[data-bucket="'+f+'"]').addClass("selected"),n=!0,as3cf.showSettingsSavedNotice()):i.showError(as3cf.strings.save_bucket_error,c.error,"as3cf-bucket-manual")}})},saveSelected:function(c){var d=a(".as3cf-bucket-list");if(!this.bucketSelectLock){if(this.bucketSelectLock=!0,c.hasClass("selected"))return k.addClass("as3cf-has-bucket"),void b.close();var e=a(".as3cf-bucket-list a.selected").data("bucket");a(".as3cf-bucket-list a").removeClass("selected"),c.addClass("selected"),d.addClass("saving"),c.find(".spinner").show().css("visibility","visible");var f=c.data("bucket"),g={action:b.prefix+"-save-bucket",bucket_name:f,_nonce:window[b.prefix.replace(/-/g,"_")].nonces.save_bucket},h=this;a.ajax({url:ajaxurl,type:"POST",dataType:"JSON",data:g,error:function(b,c,f){d.removeClass("saving"),h.showError(as3cf.strings.save_bucket_error,f,"as3cf-bucket-select"),a(".as3cf-bucket-list a").removeClass("selected"),a('.as3cf-bucket-list a[data-bucket="'+e+'"]').addClass("selected")},success:function(g,i,j){c.find(".spinner").hide().css("visibility","hidden"),d.removeClass("saving"),"undefined"!=typeof g.success?(h.set(f,g.region,g.can_write),a("#"+b.prefix+"-bucket-select").val(""),as3cf.showSettingsSavedNotice()):(h.showError(as3cf.strings.save_bucket_error,g.error,"as3cf-bucket-select"),a(".as3cf-bucket-list a").removeClass("selected"),a('.as3cf-bucket-list a[data-bucket="'+e+'"]').addClass("selected"))}})}},disabledButtons:function(){if(0!==a(".as3cf-bucket-container."+b.prefix+" .as3cf-create-bucket-form").length){var c=a(".as3cf-bucket-container."+b.prefix+" .as3cf-create-bucket-form"),d=a(".as3cf-bucket-container."+b.prefix+" .as3cf-manual-save-bucket-form");c.find(".as3cf-bucket-name").val().length<3?c.find("button[type=submit]").prop("disabled",!0):c.find("button[type=submit]").prop("disabled",!1),d.find(".as3cf-bucket-name").val().length<3?d.find("button[type=submit]").prop("disabled",!0):d.find("button[type=submit]").prop("disabled",!1)}},showError:function(b,c,d){var e=a(".as3cf-bucket-container").children(":visible"),f=e.find(".as3cf-bucket-error");d="undefined"==typeof d?null:d,d&&!e.hasClass(d)||(f.find("span.title").html(b+" —"),f.find("span.message").html(c),f.show(),this.bucketSelectLock=!1)},set:function(e,h,i){var j=a(".as3cf-bucket-container."+b.prefix+" .as3cf-manual-save-bucket-form"),m=a("#"+b.prefix+"-active-bucket");if("as3cf"===b.prefix&&0===m.text().trim().length){d("as3cf-copy-to-s3-wrap"),d("as3cf-serve-from-s3-wrap");var n=k.attr("id");l[n]=c(n)}a(".as3cf-error.fatal").hide(),m.text(e),j.find(".as3cf-bucket-name").val(e),a("#"+b.prefix+"-bucket").val(e),a("#"+b.prefix+"-region").val(h),a(".updated").not(".as3cf-notice").show(),k.addClass("as3cf-has-bucket"),k.find(".as3cf-can-write-error").toggle(!i),k.find(".as3cf-bucket-error").hide(),"as3cf"===b.prefix&&g(),f(),b.close(function(){k.trigger("bucket-change",[i]),as3cf.buckets.bucketSelectLock=!1})},create:function(){var c=a(".as3cf-bucket-container."+b.prefix+" .as3cf-create-bucket-form"),d=c.find(".as3cf-bucket-name"),e=c.find(".bucket-create-region"),f=c.find("button[type=submit]"),g=d.val(),h=f.text();a(".as3cf-bucket-error").hide(),f.text(f.data("working")),f.prop("disabled",!0);var i={action:b.prefix+"-create-bucket",bucket_name:g,_nonce:window[b.prefix.replace(/-/g,"_")].nonces.create_bucket};e.val()&&(i.region=e.val());var j=this;a.ajax({url:ajaxurl,type:"POST",dataType:"JSON",data:i,error:function(a,b,c){f.text(h),j.showError(as3cf.strings.create_bucket_error,c,"as3cf-bucket-create")},success:function(b,c,e){f.text(h),f.prop("disabled",!1),"undefined"!=typeof b.success?(j.set(g,b.region,b.can_write),a(".as3cf-bucket-select-region").hide(),a(".as3cf-bucket-select-region").prop("selected",!1),d.val(""),f.prop("disabled",!0),n=!0,as3cf.showSettingsSavedNotice()):j.showError(as3cf.strings.create_bucket_error,b.error,"as3cf-bucket-create")}})},isValidName:function(a){return!(a.length<3||a.length>63)&&!0!==m.test(a)},updateNameNotice:function(b){var c=null;!0===m.test(b)?c=as3cf.strings.create_bucket_invalid_chars:b.length<3?c=as3cf.strings.create_bucket_name_short:b.length>63&&(c=as3cf.strings.create_bucket_name_long),c&&b.length>0?a(".as3cf-invalid-bucket-name").html(c):a(".as3cf-invalid-bucket-name").html("")}},as3cf.reloadUpdated=function(){var a=location.pathname+location.search;location.search.match(/[?&]updated=/)||(a+="&updated=1"),a+=location.hash,location.assign(a)},as3cf.showSettingsSavedNotice=function(){if(!(0

    ";a("h2.nav-tab-wrapper").after(b),a(document).trigger("wp-updates-notice-added")}};var r=function(){this.$key=q.find('input[name="aws-access-key-id"]'),this.$secret=q.find('input[name="aws-secret-access-key"]'),this.$spinner=q.find("[data-as3cf-aws-keys-spinner]"),this.$feedback=q.find("[data-as3cf-aws-keys-feedback]")};r.prototype.set=function(){this.sendRequest("set",{"aws-access-key-id":this.$key.val(),"aws-secret-access-key":this.$secret.val()}).done(function(a){a.success&&this.$secret.val(as3cf.strings.not_shown_placeholder)}.bind(this))},r.prototype.remove=function(){this.sendRequest("remove").done(function(a){a.success&&(this.$key.val(""),this.$secret.val(""))}.bind(this))},r.prototype.sendRequest=function(b,c){var d={action:"as3cf-aws-keys-"+b,_ajax_nonce:as3cf.nonces["aws_keys_"+b]};return _.isObject(c)&&(d=_.extend(d,c)),this.$spinner.addClass("is-active"),a.post(ajaxurl,d).done(function(a){this.$feedback.toggleClass("notice-success",a.success).toggleClass("notice-error",!a.success),a.data&&a.data.message&&this.$feedback.html("

    "+a.data.message+"

    ").show(),a.success&&as3cf.reloadUpdated()}.bind(this)).always(function(){this.$spinner.removeClass("is-active")}.bind(this))},a(document).ready(function(){j(),window.onhashchange=function(a){"function"==typeof history.replaceState&&"#"===location.href.slice(-1)&&history.replaceState({},"",location.href.slice(0,-1)),j()};var m=a(".as3cf-main .nav-tab-wrapper");a(".as3cf-compatibility-notice, div.updated, div.error, div.notice").not(".below-h2, .inline").insertAfter(m),p.length&&p.each(function(a,b){l[b.id]=c(b.id)}),a(window).on("beforeunload.as3cf-settings",function(){if(!a.isEmptyObject(l)){var b=k.attr("id");return c(b)!==l[b]?as3cf.strings.save_alert:void 0}}),a(document).on("submit",".as3cf-main-settings form",function(b){a(window).off("beforeunload.as3cf-settings")}),a(".as3cf-switch").on("click",function(b){a(this).hasClass("disabled")||d(a(this).attr("id"))}),p.on("change",".sub-toggle",function(b){var c=a(this).attr("id");a(".as3cf-setting."+c).toggleClass("hide")}),a(".as3cf-domain").on("change",'input[type="radio"]',function(b){var c=a(this).closest('input:radio[name="domain"]:checked'),d=c.val(),e=a(this).parents(".as3cf-domain").find(".as3cf-setting.cloudfront"),f="cloudfront"===d;e.toggleClass("hide",!f)}),a(".url-preview").on("change","input",function(a){g()}),h(),a("#as3cf-serve-from-s3,#as3cf-remove-local-file").on("change",function(a){h()}),i(),a("#as3cf-remove-local-file").on("change",function(a){i()}),a('.as3cf-setting input[type="text"]').keypress(function(a){if(13===a.which)return a.preventDefault(),!1}),a('input[name="cloudfront"]').on("keyup",function(b){e(a(this))}),a('input[name="domain"]').on("change",function(b){var c=a(this),d=a("#"+k.attr("id")+' form button[type="submit"]');"cloudfront"!==c.val()?d.prop("disabled",!1):e(c.next(".as3cf-setting").find('input[name="cloudfront"]'))}),a('input[name="object-prefix"]').on("change",function(a){f()}),a("#tab-media > .as3cf-bucket-error").detach().insertAfter(".as3cf-bucket-container h3"),o.on("click",".bucket-action-manual",function(c){c.preventDefault(),a(".as3cf-bucket-container."+b.prefix+" .as3cf-bucket-manual").show().siblings().hide()}),o.on("click",".bucket-action-browse",function(c){c.preventDefault(),a(".as3cf-bucket-container."+b.prefix+" .as3cf-bucket-select").show().siblings().hide(),as3cf.buckets.loadList(n),n=!1}),o.on("click",".bucket-action-create",function(c){c.preventDefault(),a(".as3cf-bucket-name").val(""),a(".as3cf-invalid-bucket-name").html(""),a(".as3cf-bucket-container."+b.prefix+" .as3cf-bucket-create").show().siblings().hide()}),o.on("click",".bucket-action-cancel",function(a){a.preventDefault(),as3cf.buckets.resetModal()}),o.on("click",".bucket-action-save",function(a){a.preventDefault(),as3cf.buckets.saveManual()}),o.on("click",'.as3cf-create-bucket-form button[type="submit"]',function(a){a.preventDefault(),as3cf.buckets.create()}),o.on("click",".bucket-action-refresh",function(a){a.preventDefault(),as3cf.buckets.loadList(!0)}),o.on("click",".as3cf-bucket-list a",function(b){b.preventDefault(),as3cf.buckets.saveSelected(a(this))}),a(".as3cf-bucket-container").on("click","a.js-link",function(b){return b.preventDefault(),window.open(a(this).attr("href")),!1}),o.on("as3cf-modal-open",function(c,d){if(".as3cf-bucket-container."+b.prefix===d){as3cf.buckets.resetModal();var e=a(".as3cf-bucket-manual h3").data("modal-title");a(".as3cf-bucket-manual h3").text(e),as3cf.buckets.disabledButtons()}}),as3cf.buckets.disabledButtons(),o.on("input keyup",".as3cf-create-bucket-form .as3cf-bucket-name",function(c){var d=a(this).val(),e=a(".as3cf-bucket-container."+b.prefix+" .as3cf-create-bucket-form");as3cf.buckets.isValidName(d)?e.find("button[type=submit]").prop("disabled",!1):e.find("button[type=submit]").prop("disabled",!0),as3cf.buckets.updateNameNotice(d)}),o.on("input keyup",".as3cf-manual-save-bucket-form .as3cf-bucket-name",function(c){var d=a(".as3cf-bucket-container."+b.prefix+" .as3cf-manual-save-bucket-form");d.find(".as3cf-bucket-name").val().length h1 { @@ -9,8 +25,6 @@ } .as3cf-notice, .as3cf-updated, .as3cf-error { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; box-sizing: border-box; } @@ -25,13 +39,20 @@ margin-top: 10px; padding: 9px 0 0 5px; + .nav-tab-container { + float: right; + + :last-child { + margin-right: 5px; + } + } + a.nav-tab-active { color: #464646; cursor: default; } a:focus { - -webkit-box-shadow: none; box-shadow: none; } } @@ -65,8 +86,6 @@ .as3cf-notice, .error, .updated { max-width: 650px; margin-top: 15px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; box-sizing: border-box; } @@ -76,6 +95,15 @@ display: block; } } + + .alignleft { + margin-right: 20px; + margin-bottom: 20px; + } + + .spinner { + min-width: 20px; + } } /** @@ -101,6 +129,21 @@ } } +.as3cf-content { + > section { + margin-bottom: 20px; + } + + > section + section.as3cf-access-keys { + padding-top: 20px; + border-top: 1px solid #d3d3d3; + + .as3cf-section-heading { + margin-top: 0; + } + } +} + /** * Settings */ @@ -130,8 +173,6 @@ padding: 20px 0 0; max-width: 650px; width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; box-sizing: border-box; .as3cf-url-preview { @@ -173,7 +214,6 @@ padding: 2px; overflow: hidden; border-radius: 2px; - -webkit-border-radius: 2px; background-color: #d4d3d3; cursor: pointer; @@ -183,8 +223,6 @@ span { visibility: hidden; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; box-sizing: border-box; float: left; display: inline-block; @@ -192,7 +230,6 @@ font-size: 12px; line-height: 20px; border-radius: 2px; - -webkit-border-radius: 2px; font-weight: bold; padding: 4px 8px; background: #fff; @@ -241,7 +278,6 @@ h3 { font-weight: normal; text-transform: uppercase; - margin: 15px 0; } .form-table { @@ -273,12 +309,6 @@ margin-top: 0; } } - - &:first-of-type { - td { - padding-top: 5px; - } - } } tr.as3cf-bucket-setting .as3cf-defined-in-config { @@ -338,8 +368,6 @@ margin-left: -250px; padding: 10px; width: 500px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; border-radius: 3px; background-color: #000; background-color: hsla(0, 0%, 20%, 0.9); @@ -381,6 +409,7 @@ padding: 2px 5px; margin: 0 0 5px 5px; float: right; + white-space: nowrap; } .as3cf-defined-setting { @@ -414,6 +443,10 @@ display: none; } + .as3cf-bucket-setting td { + padding-top: 5px; + } + .as3cf-bucket-container { display: block; } @@ -439,7 +472,6 @@ } a:focus { - -webkit-box-shadow: none; box-shadow: none; outline: none; } @@ -535,14 +567,47 @@ } } -.as3cf-tab { - display: none; -} - #tab-media { display: block; } +#tab-settings { + .as3cf-field-wrap { + display: flex; + align-items: center; + + input { + width: 100%; + } + + button, .as3cf-defined-in-config { + margin-left: 20px; + } + + .as3cf-defined-in-config { + display: none; + margin-bottom: 0; + } + + &.as3cf-defined { + button { + display: none; + } + .as3cf-defined-in-config { + display: inline-block; + } + } + + &.as3cf-saved-field .as3cf-activate-licence { + display: none; + } + + &.as3cf-licence-not-entered .as3cf-remove-licence { + display: none; + } + } +} + #tab-support { min-height: 900px; .as3cf-sidebar { @@ -553,6 +618,10 @@ border-bottom: 1px solid #ccc; padding-bottom: 20px; margin-bottom: 20px; + + h3 { + font-size: 20px; + } } .debug { @@ -750,7 +819,7 @@ } } -.aws-compatibility-notice.error { +.as3cf-compatibility-notice.error { clear: both; margin: 5px 20px 5px 0; } @@ -780,3 +849,109 @@ color: #dc3232; } } + +.as3cf-need-help { + background-color: white; + font-size: 16px; + font-weight: bold; + padding: 1em; + + a { + text-decoration: none; + } +} + +.as3cf-aws-logo { + color: white; + background-color: $aws_orange; + padding: 1em; +} + +.as3cf-settings { + h3 { + font-size: 20px; + } + + p { + font-size: 14px; + } +} + +.as3cf-addons, +.as3cf-tab .as3cf-compatibility-notice { + max-width: cover; +} + +textarea.as3cf-access-key-constants-snippet.code { + width: 100%; + white-space: pre; + overflow: hidden; + font-size: 12px; + padding: 10px; + height: 53px; +} + +/** + * Addons Tab + */ +.as3cf-addons { + .as3cf-addons-list { + margin: 20px 0 200px; + padding-top: 5px; + } + + .as3cf-addon { + display: flex; + padding: 20px; + font-size: 14px; + + &-info { + min-height: 100px; + } + + &-links { + float: right; + + span { + padding: 4px 6px; + } + } + + &-icon { + float: left; + margin-right: 20px; + } + + &-details { + white-space: nowrap; + } + + &-title, + &-description { + font-weight: 100; + } + + + .as3cf-addon { + margin-top: 20px; + } + + &.amazon-s3-and-cloudfront-assets-pull { + background-color: $as3cf_assets; + color: white; + + .as3cf-addon-title, + .as3cf-addon-description, + a { + color: white; + } + + .extra { + background: white; + a { + color: $as3cf_assets; + text-decoration: none; + } + } + } + } +} diff --git a/classes/amazon-s3-and-cloudfront.php b/classes/amazon-s3-and-cloudfront.php index 5c395a4f..8b7fd48d 100644 --- a/classes/amazon-s3-and-cloudfront.php +++ b/classes/amazon-s3-and-cloudfront.php @@ -1,6 +1,8 @@ plugin_slug = ( is_null( $slug ) ) ? 'amazon-s3-and-cloudfront' : $slug; parent::__construct( $plugin_file_path ); - $this->aws = $aws; + if ( is_null( $aws ) ) { + $this->aws = new \DeliciousBrains\WP_Offload_S3\Amazon_Web_Services( $plugin_file_path ); + } else { + $this->aws = $aws; + } $this->notices = AS3CF_Notices::get_instance( $this ); $this->init( $plugin_file_path ); @@ -119,9 +120,11 @@ function __construct( $plugin_file_path, $aws, $slug = null ) { * @param string $plugin_file_path */ function init( $plugin_file_path ) { - self::$plugin_page = $this->plugin_slug; - $this->plugin_title = __( 'Offload S3 Lite', 'amazon-s3-and-cloudfront' ); - $this->plugin_menu_title = __( 'S3 and CloudFront', 'amazon-s3-and-cloudfront' ); + $this->plugin_title = __( 'Offload S3', 'amazon-s3-and-cloudfront' ); + $this->plugin_menu_title = __( 'Offload S3', 'amazon-s3-and-cloudfront' ); + + // Bundled SDK may require AWS setup before data migrations. + $this->handle_aws_access_key_migration(); new Upgrade_Region_Meta( $this ); new Upgrade_File_Sizes( $this ); @@ -131,11 +134,15 @@ function init( $plugin_file_path ) { new Upgrade_Filter_Post_Excerpt( $this ); // Plugin setup - add_action( 'aws_admin_menu', array( $this, 'admin_menu' ) ); + add_action( 'admin_menu', array( $this, 'admin_menu' ) ); + add_action( 'network_admin_menu', array( $this, 'admin_menu' ) ); + add_action( 'aws_admin_menu', array( $this, 'aws_admin_menu' ) ); add_filter( 'plugin_action_links', array( $this, 'plugin_actions_settings_link' ), 10, 2 ); - add_filter( 'pre_get_space_used', array( $this, 'multisite_get_spaced_used' ) ); + add_filter( 'network_admin_plugin_action_links', array( $this, 'plugin_actions_settings_link' ), 10, 2 ); + add_filter( 'pre_get_space_used', array( $this, 'multisite_get_space_used' ) ); // display a notice when either lite or pro is automatically deactivated add_action( 'pre_current_active_plugins', array( $this, 'plugin_deactivated_notice' ) ); + add_action( 'as3cf_plugin_load', array( $this, 'remove_aws_keys_if_constants_set' ) ); // Attachment screens/modals add_action( 'load-upload.php', array( $this, 'load_media_assets' ), 11 ); @@ -150,6 +157,8 @@ function init( $plugin_file_path ) { add_action( 'wp_ajax_as3cf-get-url-preview', array( $this, 'ajax_get_url_preview' ) ); add_action( 'wp_ajax_as3cf_get_attachment_s3_details', array( $this, 'ajax_get_attachment_s3_details' ) ); add_action( 'wp_ajax_as3cf-get-diagnostic-info', array( $this, 'ajax_get_diagnostic_info' ) ); + add_action( 'wp_ajax_as3cf-aws-keys-set', array( $this, 'ajax_set_aws_keys' ) ); + add_action( 'wp_ajax_as3cf-aws-keys-remove', array( $this, 'ajax_remove_aws_keys' ) ); // Rewriting URLs, doesn't depend on plugin being setup add_filter( 'wp_get_attachment_url', array( $this, 'wp_get_attachment_url' ), 99, 2 ); @@ -184,6 +193,13 @@ function init( $plugin_file_path ) { $this->register_modal_assets(); } + /** + * @return Amazon_Web_Services + */ + public function get_aws() { + return $this->aws; + } + /** * Get the plugin title to be used in page headings * @@ -252,6 +268,7 @@ function get_setting_args( $key ) { function get_setting( $key, $default = '' ) { // use settings from $_POST when generating URL preview via AJAX if ( isset( $_POST['action'] ) && 'as3cf-get-url-preview' == sanitize_key( $_POST['action'] ) ) { // input var okay + $this->verify_ajax_request(); $value = 0; if ( isset( $_POST[ $key ] ) ) { // input var okay $value = $_POST[ $key ]; // input var okay @@ -752,6 +769,80 @@ function ajax_get_diagnostic_info() { $this->end_ajax( $out ); } + /** + * Set AWS keys via ajax. + */ + public function ajax_set_aws_keys() { + check_ajax_referer( 'as3cf-aws-keys-set' ); + + $key_id = filter_input( INPUT_POST, 'aws-access-key-id' ); + $secret_key = filter_input( INPUT_POST, 'aws-secret-access-key' ); + $response = array( + 'message' => __( 'Access keys updated successfully.', 'amazon-s3-and-cloudfront' ), + ); + + if ( Amazon_Web_Services::is_any_access_key_constant_defined() ) { + wp_send_json_error( array( + 'message' => __( 'All access key constants must be removed before keys can be set in the database.', 'amazon-s3-and-cloudfront' ), + ) ); + } + + if ( $key_id ) { + $this->set_setting( 'aws-access-key-id', $key_id ); + } else { + wp_send_json_error( array( + 'message' => __( 'The Access Key ID must be set.', 'amazon-s3-and-cloudfront' ), + ) ); + } + + // Only update the secret key if entered and not set to "-- not shown --". + if ( _x( '-- not shown --', 'placeholder for hidden access key, 39 char max', 'amazon-s3-and-cloudfront' ) !== $secret_key || ! $this->get_setting( 'aws-secret-access-key' ) ) { + // AWS Secret Access keys are 40 char long. + if ( ! $secret_key || strlen( $secret_key ) < 40 ) { + wp_send_json_error( array( + 'message' => __( 'The Secret Access Key must be at least 40 characters long.', 'amazon-s3-and-cloudfront' ), + ) ); + } + + $this->set_setting( 'aws-secret-access-key', $secret_key ); + } + + $this->save_settings(); + + wp_send_json_success( $response ); + } + + /** + * Remove AWS access keys via ajax. + */ + public function ajax_remove_aws_keys() { + check_ajax_referer( 'as3cf-aws-keys-remove' ); + + $this->remove_aws_keys(); + + wp_send_json_success( array( + 'message' => __( 'Access keys removed from the database successfully.', 'amazon-s3-and-cloudfront' ), + ) ); + } + + /** + * Remove AWS access keys from saved settings if a key constant is defined. + */ + public function remove_aws_keys_if_constants_set() { + if ( Amazon_Web_Services::is_any_access_key_constant_defined() ) { + $this->remove_aws_keys(); + } + } + + /** + * Remove AWS keys from settings. + */ + protected function remove_aws_keys() { + $this->remove_setting( 'aws-access-key-id' ); + $this->remove_setting( 'aws-secret-access-key' ); + $this->save_settings(); + } + /** * Delete bulk objects from an S3 bucket * @@ -828,7 +919,7 @@ function remove_attachment_files_from_s3( $post_id, $s3object, $remove_backup_si * to cope with possible different regions */ function delete_attachment( $post_id, $force_new_s3_client = false ) { - if ( ! $this->is_plugin_setup() ) { + if ( ! $this->is_plugin_setup( true ) ) { return; } @@ -851,7 +942,7 @@ function delete_attachment( $post_id, $force_new_s3_client = false ) { * @return array */ function wp_update_attachment_metadata( $data, $post_id ) { - if ( ! $this->is_plugin_setup() ) { + if ( ! $this->is_plugin_setup( true ) ) { return $data; } @@ -947,9 +1038,7 @@ public function upload_attachment_to_s3( $post_id, $data = null, $file_path = nu // use existing bucket $bucket = $old_s3object['bucket']; // get existing region - if ( isset( $old_s3object['region'] ) ) { - $region = $old_s3object['region']; - }; + $region = isset( $old_s3object['region'] ) ? $old_s3object['region'] : ''; } else { // derive prefix from various settings if ( isset( $data['file'] ) ) { @@ -972,19 +1061,6 @@ public function upload_attachment_to_s3( $post_id, $data = null, $file_path = nu $acl = apply_filters( 'wps3_upload_acl', $acl, $type, $data, $post_id, $this ); // Old naming convention, will be deprecated soon $acl = apply_filters( 'as3cf_upload_acl', $acl, $data, $post_id ); - $s3object = array( - 'bucket' => $bucket, - 'key' => $prefix . $file_name, - 'region' => $region, - ); - - // store acl if not default - if ( $acl != self::DEFAULT_ACL ) { - $s3object['acl'] = $acl; - } - - $s3client = $this->get_s3client( $region, $force_new_s3_client ); - $args = array( 'Bucket' => $bucket, 'Key' => $prefix . $file_name, @@ -1005,11 +1081,24 @@ public function upload_attachment_to_s3( $post_id, $data = null, $file_path = nu $image_size = wp_attachment_is_image( $post_id ) ? 'full' : ''; $args = apply_filters( 'as3cf_object_meta', $args, $post_id, $image_size, false ); + $s3object = array( + 'region' => $bucket !== $args['Bucket'] ? $this->get_bucket_region( $args['Bucket'], true ) : $region, + 'bucket' => $args['Bucket'], + 'key' => $args['Key'], + 'acl' => $args['ACL'], + ); + + // Do not store object ACL if set to the default value. + if ( $s3object['acl'] === self::DEFAULT_ACL ) { + unset( $s3object['acl'] ); + } do_action( 'as3cf_upload_attachment_pre_remove', $post_id, $s3object, $prefix, $args ); $files_to_remove = array(); + $s3client = $this->get_s3client( $s3object['region'], $force_new_s3_client ); + try { $s3client->putObject( $args ); $files_to_remove[] = $file_path; @@ -1341,7 +1430,7 @@ public function wp_handle_upload_prefilter( $file ) { * @return string */ public function filter_unique_filename( $filename, $post_id = null ) { - if ( ! $this->get_setting( 'copy-to-s3' ) || ! $this->is_plugin_setup() ) { + if ( ! $this->get_setting( 'copy-to-s3' ) || ! $this->is_plugin_setup( true ) ) { return $filename; } @@ -1514,10 +1603,12 @@ public function get_attachment_s3_info( $post_id ) { /** * Check the plugin is correctly setup * + * @param bool $with_credentials Do S3 credentials need to be set up too? Defaults to false. + * * @return bool */ - function is_plugin_setup() { - if ( $this->aws->needs_access_keys() ) { + function is_plugin_setup( $with_credentials = false ) { + if ( $with_credentials && $this->aws->needs_access_keys() ) { // AWS not configured return false; } @@ -1842,7 +1933,7 @@ public function get_attachment_s3_url( $post_id, $s3object, $expires = null, $si } } - if ( ! is_null( $expires ) && $this->is_plugin_setup() ) { + if ( ! is_null( $expires ) && $this->is_plugin_setup( true ) ) { try { $expires = time() + apply_filters( 'as3cf_expires', $expires ); $secure_url = $this->get_s3client( $region ) @@ -2183,7 +2274,7 @@ public function decode_filename_in_path( $file ) { * @return string */ function update_attached_file( $file, $attachment_id ) { - if ( ! $this->is_plugin_setup() ) { + if ( ! $this->is_plugin_setup( true ) ) { return $file; } @@ -2438,12 +2529,11 @@ function save_bucket( $bucket_name, $manual = false, $region = null ) { } /** - * Add the settings menu item - * - * @param Amazon_Web_Services $aws + * Add the settings page to the top-level Settings menu item. */ - function admin_menu( $aws ) { - $hook_suffix = $aws->add_page( + public function admin_menu() { + $this->hook_suffix = add_submenu_page( + $this->get_plugin_pagenow(), $this->get_plugin_page_title(), $this->plugin_menu_title, 'manage_options', @@ -2451,10 +2541,24 @@ function admin_menu( $aws ) { array( $this, 'render_page' ) ); - if ( false !== $hook_suffix ) { - $this->hook_suffix = $hook_suffix; - add_action( 'load-' . $this->hook_suffix, array( $this, 'plugin_load' ) ); - } + do_action( 'as3cf_hook_suffix', $this->hook_suffix ); + + add_action( 'load-' . $this->hook_suffix, array( $this, 'plugin_load' ) ); + } + + /** + * Add the settings page to the top-level AWS menu item for backwards compatibility. + * + * @param \Amazon_Web_Services $aws Plugin class instance from the amazon-web-services plugin. + */ + public function aws_admin_menu( $aws ) { + $aws->add_page( + $this->get_plugin_page_title(), + $this->plugin_menu_title, + 'manage_options', + $this->plugin_slug, + array( $this, 'render_page' ) + ); } /** @@ -2463,10 +2567,13 @@ function admin_menu( $aws ) { * @param bool|string $region specify region to client for signature * @param bool $force force return of new S3 client when swapping regions * - * @return Aws\S3\S3Client + * @return S3Client */ public function get_s3client( $region = false, $force = false ) { - if ( is_null( $this->s3client ) || $force ) { + if ( is_null( $this->s3client ) || + is_null( $this->s3client_region ) || + $force || + ( false !== $region && $this->s3client_region !== $region ) ) { $args = array( 'version' => self::S3_API_VERSION, @@ -2477,9 +2584,11 @@ public function get_s3client( $region = false, $force = false ) { $args['signature'] = self::AWS_SIGNATURE; } + $s3client_region = isset( $args['region'] ) ? $args['region'] : $region; + try { $aws_client = $this->aws->get_client(); - $this->set_client( $aws_client->get( 's3', $args ) ); + $this->set_client( $aws_client->get( 's3', $args ), $s3client_region ); } catch ( \Exception $e ) { AS3CF_Error::log( $e->getMessage() ); $this->set_client( new Null_S3_Client ); @@ -2493,9 +2602,14 @@ public function get_s3client( $region = false, $force = false ) { * Setter for S3 client * * @param Aws\S3\S3Client|Null_S3_Client $client + * @param bool|string $region */ - public function set_client( $client ) { + public function set_client( $client, $region = false ) { $this->s3client = $client; + + if ( false !== $region ) { + $this->s3client_region = $region; + } } /** @@ -2633,6 +2747,11 @@ function get_buckets() { * @return bool|WP_Error */ function check_write_permission( $bucket = null, $region = null ) { + if ( $this->aws->needs_access_keys() ) { + // If no access keys set then no need check. + return false; + } + if ( is_null( $bucket ) ) { if ( ! ( $bucket = $this->get_setting( 'bucket' ) ) ) { // if no bucket set then no need check @@ -2720,8 +2839,20 @@ function register_modal_assets() { * On plugin load. */ public function plugin_load() { + /* + * If the request is using the old parent page for the settings page, (i.e. in AWS menu) + * redirect to the new one. Unfortunately, there is no way to preserve the hash, if present. + * This works because the hook suffix is the same for both, regardless of parent page. + */ + if ( $this->get_plugin_pagenow() !== $GLOBALS['pagenow'] ) { + wp_redirect( $this->get_plugin_page_url() ); + exit; + } + + add_action( 'network_admin_notices', array( $this, 'settings_saved_notice' ) ); + $this->enqueue_style( 'as3cf-styles', 'assets/css/styles', array( 'as3cf-modal' ) ); - $this->enqueue_script( 'as3cf-script', 'assets/js/script', array( 'jquery', 'as3cf-modal' ) ); + $this->enqueue_script( 'as3cf-script', 'assets/js/script', array( 'jquery', 'underscore', 'as3cf-modal' ) ); wp_localize_script( 'as3cf-script', 'as3cf', @@ -2737,6 +2868,9 @@ public function plugin_load() { 'save_alert' => __( 'The changes you made will be lost if you navigate away from this page', 'amazon-s3-and-cloudfront' ), 'get_diagnostic_info' => __( 'Getting diagnostic info...', 'amazon-s3-and-cloudfront' ), 'get_diagnostic_info_error' => __( 'Error getting diagnostic info: ', 'amazon-s3-and-cloudfront' ), + 'not_shown_placeholder' => _x( '-- not shown --', 'placeholder for hidden access key, 39 char max', 'amazon-s3-and-cloudfront' ), + // Mimic WP Core's notice text, therefore no translation needed here. + 'settings_saved' => __( 'Settings saved.' ), ), 'nonces' => array( 'create_bucket' => wp_create_nonce( 'as3cf-create-bucket' ), @@ -2745,6 +2879,8 @@ public function plugin_load() { 'save_bucket' => wp_create_nonce( 'as3cf-save-bucket' ), 'get_url_preview' => wp_create_nonce( 'as3cf-get-url-preview' ), 'get_diagnostic_info' => wp_create_nonce( 'as3cf-get-diagnostic-info' ), + 'aws_keys_set' => wp_create_nonce( 'as3cf-aws-keys-set' ), + 'aws_keys_remove' => wp_create_nonce( 'as3cf-aws-keys-remove' ), ), 'is_pro' => $this->is_pro(), 'aws_bucket_link' => $this->get_aws_bucket_link(), @@ -2810,7 +2946,6 @@ function handle_post_request() { do_action( 'as3cf_pre_save_settings' ); $post_vars = $this->get_settings_whitelist(); - $skip_sanitize = $this->get_skip_sanitize_settings(); foreach ( $post_vars as $var ) { $this->remove_setting( $var ); @@ -2819,11 +2954,7 @@ function handle_post_request() { continue; } - if ( in_array( $var, $skip_sanitize ) ) { - $value = wp_strip_all_tags( $_POST[ $var ] ); // input var okay - } else { - $value = sanitize_text_field( $_POST[ $var ] ); // input var okay - } + $value = $this->sanitize_setting( $var, $_POST[ $var ] ); $this->set_setting( $var, $value ); } @@ -2835,72 +2966,20 @@ function handle_post_request() { exit; } - /** - * Helper method to return the settings page URL for the plugin - * - * @param array $args - * @param string $url_method To prepend to admin_url() - * @param bool $escape Should we escape the URL - * - * @return string - */ - function get_plugin_page_url( $args = array(), $url_method = 'network', $escape = true ) { - $default_args = array( - 'page' => self::$plugin_page, - ); - - $args = array_merge( $default_args, $args ); - - switch ( $url_method ) { - case 'self': - $base_url = self_admin_url( 'admin.php' ); - break; - case '': - $base_url = admin_url( 'admin.php' ); - break; - default: - $base_url = network_admin_url( 'admin.php' ); - } - - // Add a hash to the URL - $hash = false; - if ( isset( $args['hash'] ) ) { - $hash = $args['hash']; - unset( $args['hash'] ); - } else if ( $this->default_tab ) { - $hash = $this->default_tab; - } - - $url = add_query_arg( $args, $base_url ); - - if ( $hash ) { - $url .= '#' . $hash; - } - - if ( $escape ) { - $url = esc_url_raw( $url ); - } - - return $url; - } - /** * Display the main settings page for the plugin */ function render_page() { - $this->aws->render_view( 'header', array( 'page_title' => $this->get_plugin_page_title(), 'page' => 'as3cf' ) ); + $this->render_view( 'header', array( 'page_title' => $this->get_plugin_page_title(), 'page' => 'as3cf' ) ); + $this->render_view( 'settings-tabs' ); - try { - $this->aws->get_client(); - $this->render_view( 'settings-tabs' ); - do_action( 'as3cf_pre_settings_render' ); - $this->render_view( 'settings' ); - do_action( 'as3cf_post_settings_render' ); - } catch ( \Exception $e ) { - $this->render_view( 'error-fatal', array( 'message' => $e->getMessage() ) ); - } + do_action( 'as3cf_pre_settings_render' ); + + $this->render_view( 'settings' ); + + do_action( 'as3cf_post_settings_render' ); - $this->aws->render_view( 'footer' ); + $this->render_view( 'footer' ); } /** @@ -2910,13 +2989,33 @@ function render_page() { */ function get_settings_tabs() { $tabs = array( - 'media' => _x( 'Media Library', 'Show the media library tab', 'amazon-s3-and-cloudfront' ), - 'support' => _x( 'Support', 'Show the support tab', 'amazon-s3-and-cloudfront' ), + 'media' => _x( 'Media Library', 'Show the media library tab', 'amazon-s3-and-cloudfront' ), + 'addons' => _x( 'Addons', 'Show the addons tab', 'amazon-s3-and-cloudfront' ), + 'settings' => _x( 'Settings', 'Show the settings tab', 'amazon-s3-and-cloudfront' ), + 'support' => _x( 'Support', 'Show the support tab', 'amazon-s3-and-cloudfront' ), ); return apply_filters( 'as3cf_settings_tabs', $tabs ); } + /** + * Recursively build addons list + * + * @param array|null $addons + */ + function render_addons( $addons = null ) { + if ( is_null( $addons ) ) { + $addons = $this->get_addons(); + } + + foreach ( $addons as $slug => $addon ) { + $this->render_view( 'addon', array( + 'slug' => $slug, + 'addon' => $addon + ) ); + } + } + /** * Get the prefix path for the files. Ignores WP media library * year month subdirectory setting and just uses S3 setting @@ -3137,7 +3236,7 @@ function make_acl_admin_notice( $s3object ) { * Check if PHP GD and Imagick is installed */ function check_for_gd_imagick() { - if ( ! $this->is_plugin_setup() ) { + if ( ! $this->is_plugin_setup( true ) ) { // No notice until plugin is setup return; } @@ -3339,7 +3438,8 @@ function output_diagnostic_info( $escape = true ) { $output .= 'cURL: '; if ( function_exists( 'curl_init' ) ) { - $output .= 'Enabled'; + $curl = curl_version(); + $output .= esc_html( $curl['version'] ); } else { $output .= 'Disabled'; } @@ -3492,10 +3592,21 @@ function output_diagnostic_info( $escape = true ) { } $theme_info = wp_get_theme(); - $output .= "Active Theme Name: " . esc_html( $theme_info->get( 'Name' ) ) . "\r\n"; - $output .= "Active Theme Folder: " . esc_html( basename( $theme_info->get_stylesheet_directory() ) ) . "\r\n"; - if ( $theme_info->get( 'Template' ) ) { - $output .= "Parent Theme Folder: " . esc_html( $theme_info->get( 'Template' ) ) . "\r\n"; + $output .= "Active Theme Name: " . esc_html( $theme_info->get( 'Name' ) ); + $output .= "\r\n"; + $output .= "Active Theme Version: " . esc_html( $theme_info->get( 'Version' ) ); + $output .= "\r\n"; + $output .= "Active Theme Folder: " . esc_html( $theme_info->get_stylesheet() ); + $output .= "\r\n"; + + if ( is_child_theme() ) { + $parent_info = $theme_info->parent(); + $output .= "Parent Theme Name: " . esc_html( $parent_info->get( 'Name' ) ); + $output .= "\r\n"; + $output .= "Parent Theme Version: " . esc_html( $parent_info->get( 'Version' ) ); + $output .= "\r\n"; + $output .= "Parent Theme Folder: " . esc_html( $parent_info->get_stylesheet() ); + $output .= "\r\n"; } if ( ! file_exists( $theme_info->get_stylesheet_directory() ) ) { $output .= "WARNING: Active Theme Folder Not Found\r\n"; @@ -3748,6 +3859,10 @@ function get_all_blog_table_prefixes( $exclude_blog_ids = array() ) { * @return string */ function get_access_denied_notice_message( $single = true ) { + if ( $this->aws->needs_access_keys() ) { + return sprintf( __( 'Define your AWS keys to enable write access to the bucket', 'amazon-s3-and-cloudfront' ), '#settings' ); + } + $url = $this->dbrains_url( '/wp-offload-s3/doc/quick-start-guide/', array( 'utm_campaign' => 'error+messages', ), 'bucket-restrictions' ); @@ -3770,7 +3885,7 @@ function get_access_denied_notice_message( $single = true ) { * * @return float|int */ - function multisite_get_spaced_used( $space_used ) { + function multisite_get_space_used( $space_used ) { global $wpdb; // Sum the total file size (including image sizes) for all S3 attachments @@ -3962,10 +4077,10 @@ public function more_info_link( $path, $utm_content = '', $hash = '' ) { } $url = $this->dbrains_url( $path, $args, $hash ); - $text = __( 'More info', 'amazon-s3-and-cloudfront' ); + $text = __( 'More info »', 'amazon-s3-and-cloudfront' ); $link = AS3CF_Utils::dbrains_link( $url, $text ); - return sprintf( '%s »', $link ); + return sprintf( '%s', $link ); } /** @@ -4404,4 +4519,119 @@ protected function consolidate_upload_errors( $upload_errors ) { return $errors; } + + /** + * Get all defined addons that use this plugin + * + * @param bool $unfiltered + * + * @return array + */ + public function get_addons( $unfiltered = false ) { + $addons = $this->get_available_addons(); + + if ( $unfiltered ) { + return $addons; + } + + return apply_filters( 'as3cf_addons', $addons ); + } + + /** + * @return array + */ + protected function get_available_addons() { + return array( + 'amazon-s3-and-cloudfront-assets-pull' => array( + 'title' => __( 'Assets Pull', 'amazon-s3-and-cloudfront' ), + 'sub' => __( 'An addon for WP Offload S3 to serve your site\'s JS, CSS, and other enqueued assets from Amazon CloudFront or another CDN.', 'amazon-s3-and-cloudfront'), + 'url' => $this->dbrains_url( '/wp-offload-s3/doc/assets-pull-addon/', array( + 'utm_campaign' => 'addons+install', + ) ), + 'label' => __( 'Feature', 'amazon-s3-and-cloudfront' ), + 'icon' => true, + 'active' => class_exists( 'Amazon_S3_And_CloudFront_Assets_Pull' ), + ), + ); + } + + /** + * Get the URL of the addon's icon + * + * @param string $slug + * + * @return string + */ + function get_addon_icon_url( $slug ) { + $filename = str_replace( 'amazon-s3-and-cloudfront-', '', $slug ); + $filename = 'icon-' . $filename . '.svg'; + + return plugins_url( 'assets/img/' . $filename, $this->plugin_file_path ); + } + + /** + * Polyfill for displaying "Settings saved." consistently between single-site and multisite environments. + * + * TL;DR: options-head.php is loaded for options-general.php (single sites only) which does this, but not on multisite. + * + * @see https://github.com/WordPress/WordPress/blob/c2d709e9d6cbe7f9b3c37da0a7c9aae788158124/wp-admin/admin-header.php#L265-L266 + * @see https://github.com/WordPress/WordPress/blob/9b68e5953406024c75b92f7ebe2aef0385c8956e/wp-admin/options-head.php#L13-L16 + */ + public function settings_saved_notice() { + if ( isset( $_GET['updated'] ) && isset( $_GET['page'] ) ) { + // For back-compat with plugins that don't use the Settings API and just set updated=1 in the redirect. + add_settings_error( 'general', 'settings_updated', __( 'Settings saved.' ), 'updated' ); + } + + settings_errors(); + } + + /** + * Migrate access keys from AWS database setting to this plugin's settings record and raise any notices. + */ + private function handle_aws_access_key_migration() { + add_action( 'aws_access_key_form_header', array( $this, 'handle_aws_access_key_form_header' ) ); + + if ( class_exists( '\Amazon_Web_Services' ) ) { + $message = sprintf( + __( 'Amazon Web Services Plugin No Longer Required — As of version 1.6 of WP Offload S3, the Amazon Web Services plugin is no longer required. We have removed the dependency by bundling a small portion of the AWS SDK into WP Offload S3. As long as none of your other active plugins or themes depend on the Amazon Web Services plugin, it should be safe to deactivate and delete it. %2$s', 'amazon-s3-and-cloudfront' ), + 'https://wordpress.org/plugins/amazon-web-services/', + $this->more_info_link( '/wp-offload-s3-1-6-released/', 'os3+settings+aws+active' ) + ); + $args = array( + 'only_show_to_user' => false, + 'only_show_in_settings' => true, + 'custom_id' => 'aws-plugin-no-longer-required', + ); + $this->notices->add_notice( $message, $args ); + + if ( is_a( $this->aws, '\DeliciousBrains\WP_Offload_S3\Amazon_Web_Services' ) && $this->aws->needs_access_keys() ) { + // Have access keys been defined in still active AWS plugin's database settings? + $aws_settings = get_site_option( \Amazon_Web_Services::SETTINGS_KEY ); + + // If both AWS keys set and we already have a bucket set, safe to use the AWS keys. + if ( ! empty( $aws_settings['access_key_id'] ) && ! empty( $aws_settings['secret_access_key'] ) && false !== $this->get_setting( 'bucket' ) ) { + $this->set_setting( 'aws-access-key-id', $aws_settings['access_key_id'] ); + $this->set_setting( 'aws-secret-access-key', $aws_settings['secret_access_key'] ); + $this->save_settings(); + } + } + } else { + $this->notices->remove_notice_by_id( 'aws-plugin-no-longer-required' ); + } + } + + /** + * Create message in AWS access key form that this plugin no longer uses those settings. + */ + public function handle_aws_access_key_form_header() { + $notice['message'] = sprintf( + __( 'WP Offload S3 Settings Moved — You now define your AWS keys for WP Offload S3 in the new Settings tab. Saving settings in the form below will have no effect on WP Offload S3. %2$s', 'amazon-s3-and-cloudfront' ), + $this->get_plugin_page_url( array( 'hash' => 'settings' ) ), + $this->more_info_link( '/wp-offload-s3-1-6-released/', 'aws+os3+access+keys+setting+moved' ) + ); + $notice['inline'] = true; + + $this->render_view( 'notice', $notice ); + } } diff --git a/classes/amazon-web-services.php b/classes/amazon-web-services.php new file mode 100644 index 00000000..a62c9a8a --- /dev/null +++ b/classes/amazon-web-services.php @@ -0,0 +1,167 @@ +use_ec2_iam_roles() ) { + return false; + } + + return ! $this->are_access_keys_set(); + } + + /** + * Check if both access key id & secret are present. + * + * @return bool + */ + function are_access_keys_set() { + return $this->get_access_key_id() && $this->get_secret_access_key(); + } + + /** + * Get the AWS key from a constant or the settings. + * + * Falls back to settings only if neither constant is defined. + * + * @return string + */ + public function get_access_key_id() { + if ( $this->is_any_access_key_constant_defined() ) { + $constant = $this->access_key_id_constant(); + + return $constant ? constant( $constant ) : ''; + } + + return $this->get_setting( 'aws-access-key-id' ); + } + + /** + * Get the AWS secret from a constant or the settings + * + * Falls back to settings only if neither constant is defined. + * + * @return string + */ + public function get_secret_access_key() { + if ( $this->is_any_access_key_constant_defined() ) { + $constant = $this->secret_access_key_constant(); + + return $constant ? constant( $constant ) : ''; + } + + return $this->get_setting( 'aws-secret-access-key' ); + } + + /** + * Check if any access key (id or secret, prefixed or not) is defined. + * + * @return bool + */ + public static function is_any_access_key_constant_defined() { + return static::access_key_id_constant() || static::secret_access_key_constant(); + } + + /** + * Allows the AWS client factory to use the IAM role for EC2 instances + * instead of key/secret for credentials + * http://docs.aws.amazon.com/aws-sdk-php/guide/latest/credentials.html#instance-profile-credentials + * + * @return bool + */ + public function use_ec2_iam_roles() { + $constant = $this->use_ec2_iam_role_constant(); + + return $constant && constant( $constant ); + } + + /** + * Get the constant used to define the aws access key id. + * + * @return string|false Constant name if defined, otherwise false + */ + public static function access_key_id_constant() { + return AS3CF_Utils::get_first_defined_constant( array( + 'AS3CF_AWS_ACCESS_KEY_ID', + 'DBI_AWS_ACCESS_KEY_ID', + 'AWS_ACCESS_KEY_ID', + ) ); + } + + /** + * Get the constant used to define the aws secret access key. + * + * @return string|false Constant name if defined, otherwise false + */ + public static function secret_access_key_constant() { + return AS3CF_Utils::get_first_defined_constant( array( + 'AS3CF_AWS_SECRET_ACCESS_KEY', + 'DBI_AWS_SECRET_ACCESS_KEY', + 'AWS_SECRET_ACCESS_KEY', + ) ); + } + + /** + * Get the constant used to enable the use of EC2 IAM roles. + * + * @return string|false Constant name if defined, otherwise false + */ + public static function use_ec2_iam_role_constant() { + return AS3CF_Utils::get_first_defined_constant( array( + 'AS3CF_AWS_USE_EC2_IAM_ROLE', + 'DBI_AWS_USE_EC2_IAM_ROLE', + 'AWS_USE_EC2_IAM_ROLE', + ) ); + } + + /** + * Instantiate a new AWS service client for the AWS SDK + * using the defined AWS key and secret + * + * @return Aws + * @throws Exception + */ + function get_client() { + if ( $this->needs_access_keys() ) { + throw new Exception( sprintf( __( 'You must first set your AWS access keys to use this addon.', 'amazon-s3-and-cloudfront' ), $this->get_plugin_page_url() . '#settings' ) ); + } + + if ( is_null( $this->client ) ) { + $args = array(); + + if ( ! $this->use_ec2_iam_roles() ) { + $args = array( + 'key' => $this->get_access_key_id(), + 'secret' => $this->get_secret_access_key(), + ); + } + + $args = apply_filters( 'aws_get_client_args', $args ); + $this->client = Aws::factory( $args ); + } + + return $this->client; + } +} diff --git a/classes/wp-aws-compatibility-check.php b/classes/as3cf-compatibility-check.php similarity index 75% rename from classes/wp-aws-compatibility-check.php rename to classes/as3cf-compatibility-check.php index 66da850b..05224a1c 100644 --- a/classes/wp-aws-compatibility-check.php +++ b/classes/as3cf-compatibility-check.php @@ -1,6 +1,6 @@ parent_plugin_slug ) ) { - return false; - } - + public function get_error_msg() { if ( ! is_null( $this->error_message ) ) { return $this->error_message; } - $plugin_basename = $this->get_plugin_basename(); - $parent_basename = $this->get_parent_plugin_basename(); - $parent_plugin_link_html = sprintf( '%s', $this->get_parent_plugin_url(), $this->get_parent_plugin_name() ); - + $plugin_basename = $this->get_plugin_basename(); $deactivate_url = $this->get_plugin_action_url( 'deactivate', $plugin_basename ); $deactivate_link = sprintf( '%s', $deactivate_url, __( 'deactivate', 'amazon-s3-and-cloudfront' ) ); $hide_notice_msg = '
    ' . sprintf( __( 'You can %s the %s plugin to get rid of this notice.', 'amazon-s3-and-cloudfront' ), $deactivate_link, $this->plugin_name ) . ''; + // Check basic requirements for AWS SDK. + $sdk_errors = $this->get_sdk_requirements_errors(); + if ( ! empty( $sdk_errors ) ) { + $sdk_errors = $this->get_sdk_error_msg() . $hide_notice_msg; + return $this->set_error_msg( $sdk_errors ); + } + + // Remainder of tests are for addons. + if ( is_null( $this->parent_plugin_slug ) ) { + return false; + } + + $parent_basename = $this->get_parent_plugin_basename(); + $parent_plugin_link_html = sprintf( '%s', $this->get_parent_plugin_url(), $this->get_parent_plugin_name() ); + if ( ! $this->is_parent_plugin_enabled() ) { $msg = sprintf( __( '%s has been disabled as it requires the %s plugin.', 'amazon-s3-and-cloudfront' ), $this->plugin_name, $parent_plugin_link_html ); @@ -330,9 +339,9 @@ function get_error_msg() { if ( isset( $GLOBALS['aws_meta'][ $this->parent_plugin_slug ]['compatible'] ) && ! $GLOBALS['aws_meta'][ $this->parent_plugin_slug ]['compatible'] ) { $msg = rtrim( $msg, '.' ) . ', ' . __( 'which is currently disabled.', 'amazon-s3-and-cloudfront' ); } else { - $msg .= ' ' . __( 'It appears to be installed already.', 'amazon-s3-and-cloudfront' ); + $msg .= ' ' . __( 'It appears to be installed already.', 'amazon-s3-and-cloudfront' ); $activate_url = $this->get_plugin_action_url( 'activate', $parent_basename ); - $msg .= ' ' . _x( 'Activate it now.', 'Activate plugin', 'amazon-s3-and-cloudfront' ) . ''; + $msg .= ' ' . _x( 'Activate it now.', 'Activate plugin', 'amazon-s3-and-cloudfront' ) . ''; } } else { $install_url = 'https://deliciousbrains.com/my-account/'; @@ -368,8 +377,8 @@ function get_error_msg() { } $update_url = $this->get_plugin_action_url( 'upgrade', $parent_basename ); - $msg .= ' ' . __( 'Update to the latest version', 'amazon-s3-and-cloudfront' ) . ''; + $msg .= ' ' . __( 'Update to the latest version', 'amazon-s3-and-cloudfront' ) . ''; $msg .= $hide_notice_msg; return $this->set_error_msg( $msg ); @@ -438,7 +447,7 @@ function check_capabilities() { * Display compatibility notices to users who can manage plugins */ function hook_admin_notices() { - if ( ! $this->check_capabilities() ){ + if ( ! $this->check_capabilities() ) { return; } @@ -479,7 +488,7 @@ function get_admin_notice() { * @param string $message */ function render_notice( $message ) { - printf( '

    %s

    ', $message ); + printf( '

    %s

    ', $message ); } /** @@ -520,5 +529,152 @@ public static function is_installing_or_updating_plugins() { return self::$is_installing_or_updating_plugins; } + + /** + * Checks if another version of WP Offload S3 (Lite) is active and deactivates it. + * To be hooked on `activated_plugin` so other plugin is deactivated when current plugin is activated. + * + * @param string $plugin + * + * @return bool + */ + public static function deactivate_other_instances( $plugin ) { + if ( ! in_array( basename( $plugin ), array( 'amazon-s3-and-cloudfront-pro.php', 'wordpress-s3.php' ) ) ) { + return false; + } + + $plugin_to_deactivate = 'wordpress-s3.php'; + $deactivated_notice_id = '1'; + $activated_plugin_min_version = '1.1'; + $plugin_to_deactivate_min_version = '1.0'; + if ( basename( $plugin ) === $plugin_to_deactivate ) { + $plugin_to_deactivate = 'amazon-s3-and-cloudfront-pro.php'; + $deactivated_notice_id = '2'; + $activated_plugin_min_version = '1.0'; + $plugin_to_deactivate_min_version = '1.1'; + } + + $version = self::get_plugin_version_from_basename( $plugin ); + + if ( version_compare( $version, $activated_plugin_min_version, '<' ) ) { + return false; + } + + if ( is_multisite() ) { + $active_plugins = (array) get_site_option( 'active_sitewide_plugins', array() ); + $active_plugins = array_keys( $active_plugins ); + } else { + $active_plugins = (array) get_option( 'active_plugins', array() ); + } + + foreach ( $active_plugins as $basename ) { + if ( false !== strpos( $basename, $plugin_to_deactivate ) ) { + $version = self::get_plugin_version_from_basename( $basename ); + + if ( version_compare( $version, $plugin_to_deactivate_min_version, '<' ) ) { + return false; + } + + set_transient( 'as3cf_deactivated_notice_id', $deactivated_notice_id, HOUR_IN_SECONDS ); + deactivate_plugins( $basename ); + + return true; + } + } + + return false; + } + + /** + * Get plugin data from basename + * + * @param string $basename + * + * @return string + */ + public static function get_plugin_version_from_basename( $basename ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + + $plugin_path = WP_PLUGIN_DIR . '/' . $basename; + $plugin_data = get_plugin_data( $plugin_path ); + + return $plugin_data['Version']; + } + + /** + * Return an array of issues with the server's compatibility with the AWS SDK + * + * @return array + */ + public function get_sdk_requirements_errors() { + static $errors; + + if ( ! is_null( $errors ) ) { + return $errors; + } + + $errors = array(); + + if ( version_compare( PHP_VERSION, '5.3.3', '<' ) ) { + $errors[] = __( 'a PHP version less than 5.3.3', 'amazon-s3-and-cloudfront' ); + } + + if ( ! function_exists( 'curl_version' ) ) { + $errors[] = __( 'no PHP cURL library activated', 'amazon-s3-and-cloudfront' ); + + return $errors; + } + + if ( ! ( $curl = curl_version() ) || empty( $curl['version'] ) || empty( $curl['features'] ) || version_compare( $curl['version'], '7.16.2', '<' ) ) { + $errors[] = __( 'a cURL version less than 7.16.2', 'amazon-s3-and-cloudfront' ); + } + + if ( ! empty( $curl['features'] ) ) { + $curl_errors = array(); + + if ( ! CURL_VERSION_SSL ) { + $curl_errors[] = 'OpenSSL'; + } + + if ( ! CURL_VERSION_LIBZ ) { + $curl_errors[] = 'zlib'; + } + + if ( $curl_errors ) { + $errors[] = __( 'cURL compiled without', 'amazon-s3-and-cloudfront' ) . ' ' . implode( ' or ', $curl_errors ); // xss ok + } + } + + if ( ! function_exists( 'curl_multi_exec' ) ) { + $errors[] = __( 'the function curl_multi_exec disabled', 'amazon-s3-and-cloudfront' ); + } + + return $errors; + } + + /** + * Prepare an error message with compatibility issues + * + * @return string + */ + public function get_sdk_error_msg() { + $errors = $this->get_sdk_requirements_errors(); + + if ( ! $errors ) { + return ''; + } + + $msg = __( 'The official Amazon Web Services SDK requires PHP 5.3.3+ and cURL 7.16.2+ compiled with OpenSSL and zlib. Your server currently has', 'amazon-s3-and-cloudfront' ); + + if ( count( $errors ) > 1 ) { + $last_one = ' and ' . array_pop( $errors ); + } else { + $last_one = ''; + } + + $msg .= ' ' . implode( ', ', $errors ) . $last_one . '.'; + + return $msg; + } } } diff --git a/classes/as3cf-filter.php b/classes/as3cf-filter.php index 3c42ec38..953a7469 100644 --- a/classes/as3cf-filter.php +++ b/classes/as3cf-filter.php @@ -621,11 +621,25 @@ protected function replace_urls( $content, $url_pairs ) { foreach ( $url_pairs as $find => $replace ) { $replace = $this->normalize_replace_value( $replace ); $content = str_replace( $find, $replace, $content ); + $content = $this->url_replaced( $find, $replace, $content ); } return $content; } + /** + * Each time a URL is replaced this function is called to allow for logging or further updates etc. + * + * @param string $find URL with no scheme. + * @param string $replace URL with no scheme. + * @param string $content + * + * @return string + */ + protected function url_replaced( $find, $replace, $content ) { + return $content; + } + /** * Get post cache * diff --git a/classes/as3cf-plugin-base.php b/classes/as3cf-plugin-base.php new file mode 100644 index 00000000..f8464f7f --- /dev/null +++ b/classes/as3cf-plugin-base.php @@ -0,0 +1,605 @@ +plugin_file_path = $plugin_file_path; + $this->plugin_dir_path = rtrim( plugin_dir_path( $plugin_file_path ), '/' ); + $this->plugin_basename = plugin_basename( $plugin_file_path ); + $this->plugin_pagenow = is_multisite() ? 'settings.php' : 'options-general.php'; + + if ( $this->plugin_slug && isset( $GLOBALS['aws_meta'][ $this->plugin_slug ]['version'] ) ) { + $this->plugin_version = $GLOBALS['aws_meta'][ $this->plugin_slug ]['version']; + } + } + + /** + * Accessor for plugin version + * + * @return mixed + */ + public function get_plugin_version() { + return $this->plugin_version; + } + + /** + * Accessor for plugin slug + * + * @return string + */ + public function get_plugin_slug() { + return $this->plugin_slug; + } + + /** + * Accessor for plugin basename + * + * @return string + */ + public function get_plugin_basename() { + return $this->plugin_basename; + } + + /** + * Accessor for plugin file path + * + * @return string + */ + public function get_plugin_file_path() { + return $this->plugin_file_path; + } + + /** + * Accessor for plugin dir path + * + * @return string + */ + public function get_plugin_dir_path() { + return $this->plugin_dir_path; + } + + /** + * Accessor for plugin_pagenow + * + * @return string + */ + public function get_plugin_pagenow() { + return $this->plugin_pagenow; + } + + /** + * Get the plugin's settings array + * + * @param bool $force + * + * @return array + */ + function get_settings( $force = false ) { + if ( is_null( $this->settings ) || $force ) { + $this->settings = $this->filter_settings( get_site_option( static::SETTINGS_KEY ) ); + } + + return $this->settings; + } + + /** + * Get all settings that have been defined via constant for the plugin + * + * @param bool $force + * + * @return array + */ + function get_defined_settings( $force = false ) { + if ( ! defined( static::SETTINGS_CONSTANT ) ) { + $this->defined_settings = array(); + + return $this->defined_settings; + } + + if ( is_null( $this->defined_settings ) || $force ) { + $this->defined_settings = array(); + $unserialized = maybe_unserialize( constant( static::SETTINGS_CONSTANT ) ); + $unserialized = is_array( $unserialized ) ? $unserialized : array(); + + foreach ( $unserialized as $key => $value ) { + if ( ! in_array( $key, $this->get_settings_whitelist() ) ) { + continue; + } + + if ( is_bool( $value ) || is_null( $value ) ) { + $value = (int) $value; + } + + if ( is_numeric( $value ) ) { + $value = strval( $value ); + } else { + $value = $this->sanitize_setting( $key, $value ); + } + + $this->defined_settings[ $key ] = $value; + } + + $this->listen_for_settings_constant_changes(); + + // Normalize the defined settings before saving, so we can detect when a real change happens. + ksort( $this->defined_settings ); + update_site_option( 'as3cf_constant_' . static::SETTINGS_CONSTANT, $this->defined_settings ); + } + + return $this->defined_settings; + } + + /** + * Subscribe to changes of the site option used to store the constant-defined settings. + */ + protected function listen_for_settings_constant_changes() { + if ( ! has_action( 'update_site_option_' . 'as3cf_constant_' . static::SETTINGS_CONSTANT, array( + $this, + 'settings_constant_changed', + ) ) ) { + add_action( 'add_site_option_' . 'as3cf_constant_' . static::SETTINGS_CONSTANT, array( + $this, + 'settings_constant_added', + ), 10, 3 ); + add_action( 'update_site_option_' . 'as3cf_constant_' . static::SETTINGS_CONSTANT, array( + $this, + 'settings_constant_changed', + ), 10, 4 ); + } + } + + /** + * Translate a settings constant option addition into a change. + * + * @param string $option Name of the option. + * @param mixed $value Value the option is being initialized with. + * @param int $network_id ID of the network. + */ + public function settings_constant_added( $option, $value, $network_id ) { + $db_settings = get_site_option( static::SETTINGS_KEY, array() ); + $this->settings_constant_changed( $option, $value, $db_settings, $network_id ); + } + + /** + * Callback for announcing when settings-defined values change. + * + * @param string $option Name of the option. + * @param mixed $new_settings Current value of the option. + * @param mixed $old_settings Old value of the option. + * @param int $network_id ID of the network. + */ + public function settings_constant_changed( $option, $new_settings, $old_settings, $network_id ) { + $old_settings = $old_settings ?: array(); + + foreach ( $this->get_settings_whitelist() as $setting ) { + $old_value = isset( $old_settings[ $setting ] ) ? $old_settings[ $setting ] : null; + $new_value = isset( $new_settings[ $setting ] ) ? $new_settings[ $setting ] : null; + + if ( $old_value !== $new_value ) { + /** + * Setting-specific hook for setting change. + * + * @param mixed $new_value + * @param mixed $old_value + * @param string $setting + */ + do_action( 'as3cf_constant_' . static::SETTINGS_CONSTANT . '_changed_' . $setting, $new_value, $old_value, $setting ); + + /** + * Generic hook for setting change. + * + * @param mixed $new_value + * @param mixed $old_value + * @param string $setting + */ + do_action( 'as3cf_constant_' . static::SETTINGS_CONSTANT . '_changed', $new_value, $old_value, $setting ); + } + } + } + + /** + * Filter the plugin settings array + * + * @param array $settings + * + * @return array $settings + */ + function filter_settings( $settings ) { + $defined_settings = $this->get_defined_settings(); + + // Bail early if there are no defined settings + if ( empty( $defined_settings ) ) { + return $settings; + } + + foreach ( $defined_settings as $key => $value ) { + $settings[ $key ] = $value; + } + + return $settings; + } + + /** + * Get the whitelisted settings for the plugin. + * Meant to be overridden in child classes. + * + * @return array + */ + function get_settings_whitelist() { + return array(); + } + + /** + * List of settings that should skip full sanitize. + * + * @return array + */ + function get_skip_sanitize_settings() { + return array(); + } + + /** + * Sanitize a setting value, maybe. + * + * @param $key + * @param $value + * + * @return string + */ + function sanitize_setting( $key, $value ) { + $skip_sanitize = $this->get_skip_sanitize_settings(); + + if ( in_array( $key, $skip_sanitize ) ) { + $value = wp_strip_all_tags( $value ); + } else { + $value = sanitize_text_field( $value ); + } + + return $value; + } + + /** + * Get a specific setting + * + * @param $key + * @param string $default + * + * @return string + */ + function get_setting( $key, $default = '' ) { + $this->get_settings(); + + if ( isset( $this->settings[ $key ] ) ) { + $setting = $this->settings[ $key ]; + } else { + $setting = $default; + } + + return apply_filters( 'as3cf_get_setting', $setting, $key ); + } + + /** + * Gets a single setting that has been defined in the plugin settings constant + * + * @param string $key + * @param mixed $default + * + * @return mixed + */ + function get_defined_setting( $key, $default = '' ) { + $defined_settings = $this->get_defined_settings(); + $setting = isset( $defined_settings[ $key ] ) ? $defined_settings[ $key ] : $default; + + return $setting; + } + + /** + * Delete a setting + * + * @param $key + */ + function remove_setting( $key ) { + $this->get_settings(); + + if ( isset( $this->settings[ $key ] ) ) { + unset( $this->settings[ $key ] ); + } + } + + /** + * Removes a defined setting from the defined_settings array. + * + * Does not unset the actual constant. + * + * @param $key + */ + function remove_defined_setting( $key ) { + $this->get_defined_settings(); + + if ( isset( $this->defined_settings[ $key ] ) ) { + unset( $this->defined_settings[ $key ] ); + } + } + + /** + * Render a view template file + * + * @param string $view View filename without the extension + * @param array $args Arguments to pass to the view + */ + function render_view( $view, $args = array() ) { + extract( $args ); + include $this->plugin_dir_path . '/view/' . $view . '.php'; + } + + /** + * Set a setting + * + * @param $key + * @param $value + */ + function set_setting( $key, $value ) { + $this->get_settings(); + + $this->settings[ $key ] = $value; + } + + /** + * Bulk set the settings array + * + * @param array $settings + */ + function set_settings( $settings ) { + $this->settings = $settings; + } + + /** + * Save the settings to the database + */ + public function save_settings() { + if ( is_array( $this->settings ) ) { + ksort( $this->settings ); + } + + $this->update_site_option( static::SETTINGS_KEY, $this->settings ); + } + + /** + * Update site option. + * + * @param string $option + * @param mixed $value + * @param bool $autoload + * + * @return bool + */ + public function update_site_option( $option, $value, $autoload = true ) { + if ( is_multisite() ) { + return update_site_option( $option, $value ); + } + + return update_option( $option, $value, $autoload ); + } + + /** + * Helper method to return the settings page URL for the plugin + * + * @param array $args + * @param string $url_method To prepend to admin_url() + * @param bool $escape Should we escape the URL + * + * @return string + */ + public function get_plugin_page_url( $args = array(), $url_method = 'network', $escape = true ) { + $default_args = array( + 'page' => static::$plugin_page, + ); + + $args = array_merge( $default_args, $args ); + + switch ( $url_method ) { + case 'self': + $base_url = self_admin_url( $this->get_plugin_pagenow() ); + break; + default: + $base_url = network_admin_url( $this->get_plugin_pagenow() ); + } + + // Add a hash to the URL + $hash = false; + if ( isset( $args['hash'] ) ) { + $hash = $args['hash']; + unset( $args['hash'] ); + } else if ( $this->default_tab ) { + $hash = $this->default_tab; + } + + $url = add_query_arg( $args, $base_url ); + + if ( $hash ) { + $url .= '#' . $hash; + } + + if ( $escape ) { + $url = esc_url_raw( $url ); + } + + return $url; + } + + /** + * The text for the plugin action link for the plugin on the plugins page. + * + * @return string + */ + function get_plugin_action_settings_text() { + return __( 'Settings', 'amazon-s3-and-cloudfront' ); + } + + /** + * Add a link to the plugin row for the plugin on the plugins page. + * Needs to be implemented for an extending class using - + * add_filter( 'plugin_action_links', array( $this, 'plugin_actions_settings_link' ), 10, 2 ); + * + * @param array $links + * @param string $file + * + * @return array + */ + function plugin_actions_settings_link( $links, $file ) { + $url = $this->get_plugin_page_url(); + $text = $this->get_plugin_action_settings_text(); + + $settings_link = '' . esc_html( $text ) . ''; + + if ( $file == $this->plugin_basename ) { + array_unshift( $links, $settings_link ); + } + + return $links; + } + + /** + * Enqueue script. + * + * @param string $handle + * @param string $path + * @param array $deps + * @param bool $footer + */ + public function enqueue_script( $handle, $path, $deps = array(), $footer = true ) { + $version = $this->get_asset_version(); + $suffix = $this->get_asset_suffix(); + + $src = plugins_url( $path . $suffix . '.js', $this->plugin_file_path ); + wp_enqueue_script( $handle, $src, $deps, $version, $footer ); + } + + /** + * Enqueue style. + * + * @param string $handle + * @param string $path + * @param array $deps + */ + public function enqueue_style( $handle, $path, $deps = array() ) { + $version = $this->get_asset_version(); + + $src = plugins_url( $path . '.css', $this->plugin_file_path ); + wp_enqueue_style( $handle, $src, $deps, $version ); + } + + /** + * Get the version used for script enqueuing + * + * @return mixed + */ + public function get_asset_version() { + return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? time() : $this->plugin_version; + } + + /** + * Get the filename suffix used for script enqueuing + * + * @return mixed + */ + public function get_asset_suffix() { + return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + } + + /** + * Get all AWS regions + * + * @return array + */ + public function get_aws_regions() { + $regions = array( + 'us-east-1' => 'US Standard', + 'us-west-1' => 'Northern California', + 'us-west-2' => 'Oregon', + 'ca-central-1' => 'Montreal', + 'eu-west-1' => 'Ireland', + 'eu-west-2' => 'London', + 'eu-central-1' => 'Frankfurt', + 'ap-southeast-1' => 'Singapore', + 'ap-southeast-2' => 'Sydney', + 'ap-northeast-1' => 'Tokyo', + 'ap-northeast-2' => 'Seoul', + 'ap-south-1' => 'Mumbai', + 'sa-east-1' => 'Sao Paulo', + ); + + return apply_filters( 'aws_get_regions', $regions ); + } + + /** + * Generate site URL with correct UTM tags. + * + * @param string $path + * @param array $args + * @param string $hash + * + * @return string + */ + public function dbrains_url( $path, $args = array(), $hash = '' ) { + $args = wp_parse_args( $args, array( + 'utm_medium' => 'insideplugin', + 'utm_source' => $this->get_utm_source(), + ) ); + $args = array_map( 'urlencode', $args ); + $url = trailingslashit( self::DBRAINS_URL ) . ltrim( $path, '/' ); + $url = add_query_arg( $args, $url ); + + if ( $hash ) { + $url .= '#' . $hash; + } + + return $url; + } + + /** + * Get UTM source for plugin. + * + * @return string + */ + protected function get_utm_source() { + return 'AWS'; + } + + /** + * Get the My Account URL + * + * @param array $args + * @param string $hash + * + * @return string + */ + public function get_my_account_url( $args = array(), $hash = '' ) { + return $this->dbrains_url( '/my-account/', $args, $hash ); + } +} diff --git a/classes/as3cf-plugin-compatibility.php b/classes/as3cf-plugin-compatibility.php index 5b395efa..e6a8a5b4 100644 --- a/classes/as3cf-plugin-compatibility.php +++ b/classes/as3cf-plugin-compatibility.php @@ -38,6 +38,11 @@ class AS3CF_Plugin_Compatibility { */ protected $compatibility_addons; + /** + * @var array + */ + private $removed_files = array(); + /** * @param Amazon_S3_And_CloudFront $as3cf */ @@ -96,11 +101,16 @@ function compatibility_init_if_setup() { add_filter( 'wp_unique_filename', array( $this, 'customizer_crop_unique_filename' ), 10, 3 ); /* - * Regenerate Thumbnails + * Regenerate Thumbnails (before v3) * https://wordpress.org/plugins/regenerate-thumbnails/ */ add_filter( 'as3cf_get_attached_file', array( $this, 'regenerate_thumbnails_download_file' ), 10, 4 ); + /** + * Regenerate Thumbnails v3+ and other REST-API using plugins that need a local file. + */ + add_filter( 'rest_dispatch_request', array( $this, 'rest_dispatch_request_copy_back_to_local' ), 10, 4 ); + /* * WP-CLI Compatibility */ @@ -141,6 +151,51 @@ function legacy_copy_back_to_local( $url, $file, $attachment_id, $s3_object ) { */ public function enable_get_attached_file_copy_back_to_local() { add_filter( 'as3cf_get_attached_file_copy_back_to_local', '__return_true' ); + + // Monitor any files that are subsequently removed. + add_filter( 'as3cf_upload_attachment_local_files_to_remove', array( + $this, + 'monitor_local_files_to_remove', + ), 10, 3 ); + + // Prevent subsequent attempts to copy back after upload and remove. + add_filter( 'as3cf_get_attached_file_copy_back_to_local', array( + $this, + 'prevent_copy_back_to_local_after_remove', + ), 10, 4 ); + } + + /** + * Keeps track of local files that are removed after upload. + * + * @param array $files_to_remove + * @param integer $post_id + * @param string $file_path + * + * @return array + */ + public function monitor_local_files_to_remove( $files_to_remove, $post_id, $file_path ) { + $this->removed_files = array_merge( $this->removed_files, $files_to_remove ); + + return $files_to_remove; + } + + /** + * Prevent subsequent attempts to copy back after upload and remove. + * + * @param bool $copy_back_to_local + * @param string $file + * @param integer $attachment_id + * @param array $s3_object + * + * @return bool + */ + public function prevent_copy_back_to_local_after_remove( $copy_back_to_local, $file, $attachment_id, $s3_object ) { + if ( $copy_back_to_local && in_array( $file, $this->removed_files ) ) { + $copy_back_to_local = false; + } + + return $copy_back_to_local; } /** @@ -863,4 +918,34 @@ public function maybe_warn_about_php_version() { $this->as3cf->notices->remove_notice_by_id( $key_base . '-settings' ); } } + + /** + * Filters the REST dispatch request to determine whether route needs compatibility actions. + * + * @param bool $dispatch_result Dispatch result, will be used if not empty. + * @param WP_REST_Request $request Request used to generate the response. + * @param string $route Route matched for the request. + * @param array $handler Route handler used for the request. + * + * @return bool + */ + public function rest_dispatch_request_copy_back_to_local( $dispatch_result, $request, $route, $handler ) { + $routes = array( + '/regenerate-thumbnails/v\d+/regenerate/', + ); + + $routes = apply_filters( 'as3cf_rest_api_enable_get_attached_file_copy_back_to_local', $routes ); + $routes = is_array( $routes ) ? $routes : (array) $routes; + + if ( ! empty( $routes ) ) { + foreach ( $routes as $match_route ) { + if ( preg_match( '@' . $match_route . '@i', $route ) ) { + $this->enable_get_attached_file_copy_back_to_local(); + break; + } + } + } + + return $dispatch_result; + } } diff --git a/classes/as3cf-stream-wrapper.php b/classes/as3cf-stream-wrapper.php index c068a5c2..8fc4fb2d 100644 --- a/classes/as3cf-stream-wrapper.php +++ b/classes/as3cf-stream-wrapper.php @@ -1,14 +1,17 @@ get_post_cache( $post->ID ); $to_cache = array(); - if ( 1 === count( $pages ) && ! empty( $pages[0] ) ) { + if ( is_array( $pages ) && 1 === count( $pages ) && ! empty( $pages[0] ) ) { // Post already filtered and available on global $page array, continue $post->post_content = $pages[0]; } else { @@ -113,17 +113,42 @@ public function filter_widget_display( $instance, $class ) { * @return bool */ protected function url_needs_replacing( $url ) { + if ( str_replace( $this->get_bare_upload_base_urls(), '', $url ) === $url ) { + // Remote URL, no replacement needed + return false; + } + + // Local URL, perform replacement + return true; + } + + /** + * Get an array of bare base_urls that can be used for uploaded items. + * + * @return array + */ + private function get_bare_upload_base_urls() { + $base_urls = array(); + $uploads = wp_upload_dir(); $base_url = $this->as3cf->maybe_fix_local_subsite_url( $uploads['baseurl'] ); $base_url = AS3CF_Utils::remove_scheme( $base_url ); - - if ( false !== strpos( $url, $base_url ) ) { - // Local URL, perform replacement - return true; + $domain = AS3CF_Utils::parse_url( $uploads['baseurl'], PHP_URL_HOST ); + + /** + * Allow alteration of the local domains that can be matched on. + * + * @param array $domains + */ + $domains = apply_filters( 'as3cf_local_domains', (array) $domain ); + + if ( ! empty( $domains ) ) { + foreach ( array_unique( $domains ) as $match_domain ) { + $base_urls[] = substr_replace( $base_url, $match_domain, 2, strlen( $domain ) ); + } } - // Remote URL, no replacement needed - return false; + return $base_urls; } /** @@ -166,9 +191,7 @@ protected function get_attachment_id_from_url( $url ) { return $this->query_cache[ $full_url ]; } - $upload_dir = wp_upload_dir(); - $base_url = AS3CF_Utils::remove_scheme( $upload_dir['baseurl'] ); - $path = $this->as3cf->decode_filename_in_path( ltrim( str_replace( $base_url, '', $full_url ), '/' ) ); + $path = $this->as3cf->decode_filename_in_path( ltrim( str_replace( $this->get_bare_upload_base_urls(), '', $full_url ), '/' ) ); $sql = $wpdb->prepare( " SELECT post_id FROM {$wpdb->postmeta} @@ -210,9 +233,6 @@ protected function get_attachment_ids_from_urls( $urls ) { $urls = array( $urls ); } - $upload_dir = wp_upload_dir(); - $base_url = AS3CF_Utils::remove_scheme( $upload_dir['baseurl'] ); - $paths = array(); $full_urls = array(); @@ -226,7 +246,7 @@ protected function get_attachment_ids_from_urls( $urls ) { continue; } - $path = $this->as3cf->decode_filename_in_path( ltrim( str_replace( $base_url, '', $full_url ), '/' ) ); + $path = $this->as3cf->decode_filename_in_path( ltrim( str_replace( $this->get_bare_upload_base_urls(), '', $full_url ), '/' ) ); $paths[ $path ] = $full_url; $full_urls[ $full_url ] = $url; @@ -312,4 +332,21 @@ protected function pre_replace_content( $content ) { return $this->remove_aws_query_strings( $content, $base_url ); } + + /** + * Each time a URL is replaced this function is called to allow for logging or further updates etc. + * + * @param string $find URL with no scheme. + * @param string $replace URL with no scheme. + * @param string $content + * + * @return string + */ + protected function url_replaced( $find, $replace, $content ) { + if ( (bool) $this->as3cf->get_setting( 'force-https' ) ) { + $content = str_replace( 'http:' . $replace, 'https:' . $replace, $content ); + } + + return $content; + } } diff --git a/classes/upgrades/upgrade.php b/classes/upgrades/upgrade.php index 49958814..be68bcbf 100644 --- a/classes/upgrades/upgrade.php +++ b/classes/upgrades/upgrade.php @@ -187,7 +187,7 @@ protected function maybe_init() { return false; } - if ( ! $this->as3cf->is_plugin_setup() ) { + if ( ! $this->as3cf->is_plugin_setup( true ) ) { return false; } diff --git a/composer.json b/composer.json index 07476029..3db64fb2 100644 --- a/composer.json +++ b/composer.json @@ -2,10 +2,10 @@ "name": "deliciousbrains/wp-amazon-s3-and-cloudfront", "type": "wordpress-plugin", "homepage": "https://github.com/deliciousbrains/wp-amazon-s3-and-cloudfront", - "license": "GPLv3", + "license": "GPL-3.0-only", "description": "Automatically copies media uploads to Amazon S3 for delivery. Optionally configure Amazon CloudFront for even faster delivery.", "keywords": ["plugin","amazon-web-services","s3","cloudfront","cdn"], "require": { - "composer/installers": "~1.0.6" + "composer/installers": "^1.0" } } diff --git a/languages/amazon-s3-and-cloudfront-en.pot b/languages/amazon-s3-and-cloudfront-en.pot index 69ae174f..03af508e 100644 --- a/languages/amazon-s3-and-cloudfront-en.pot +++ b/languages/amazon-s3-and-cloudfront-en.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: amazon-s3-and-cloudfront\n" "Report-Msgid-Bugs-To: nom@deliciousbrains.com\n" -"POT-Creation-Date: 2018-01-26 12:18+0000\n" +"POT-Creation-Date: 2018-02-20 13:49+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,132 +18,175 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: classes/amazon-s3-and-cloudfront.php:123 -msgid "Offload S3 Lite" -msgstr "" - #: classes/amazon-s3-and-cloudfront.php:124 -msgid "S3 and CloudFront" +msgid "Offload S3" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:238 -#: view/bucket-setting.php:18 +#: classes/amazon-s3-and-cloudfront.php:254 +#: view/bucket-setting.php:17 +#: view/settings/settings.php:76 +#: view/settings/settings.php:93 msgid "defined in wp-config.php" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:921 -#: classes/amazon-s3-and-cloudfront.php:1081 +#: classes/amazon-s3-and-cloudfront.php:781 +msgid "Access keys updated successfully." +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:786 +msgid "" +"All access key constants must be removed before keys can be set in the " +"database." +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:794 +msgid "The Access Key ID must be set." +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:799 +#: classes/amazon-s3-and-cloudfront.php:2871 +#: view/settings/settings.php:88 +msgctxt "placeholder for hidden access key, 39 char max" +msgid "-- not shown --" +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:803 +msgid "The Secret Access Key must be at least 40 characters long." +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:824 +msgid "Access keys removed from the database successfully." +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:1012 +#: classes/amazon-s3-and-cloudfront.php:1170 #, php-format msgid "File %s does not exist" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:932 +#: classes/amazon-s3-and-cloudfront.php:1023 #, php-format msgid "Mime type %s is not allowed" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:1017 -#: classes/amazon-s3-and-cloudfront.php:1089 +#: classes/amazon-s3-and-cloudfront.php:1106 +#: classes/amazon-s3-and-cloudfront.php:1178 #, php-format msgid "Error uploading %s to S3: %s" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2233 +#: classes/amazon-s3-and-cloudfront.php:2324 msgid "Cheatin’ eh?" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2237 +#: classes/amazon-s3-and-cloudfront.php:2328 msgid "You do not have sufficient permissions to access this page." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2243 +#: classes/amazon-s3-and-cloudfront.php:2334 msgid "No bucket name provided." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2523 +#: classes/amazon-s3-and-cloudfront.php:2637 msgid "Error Getting Bucket Region" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2524 +#: classes/amazon-s3-and-cloudfront.php:2638 #, php-format msgid "There was an error attempting to get the region of the bucket %s: %s" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2657 +#: classes/amazon-s3-and-cloudfront.php:2776 msgid "" "This is a test file to check if the user has write permission to S3. Delete " "me if found." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2676 +#: classes/amazon-s3-and-cloudfront.php:2795 #, php-format msgid "" "There was an error attempting to check the permissions of the bucket %s: %s" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2730 +#: classes/amazon-s3-and-cloudfront.php:2861 msgid "Error creating bucket" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2731 +#: classes/amazon-s3-and-cloudfront.php:2862 msgid "Bucket name too short." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2732 +#: classes/amazon-s3-and-cloudfront.php:2863 msgid "Bucket name too long." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2733 +#: classes/amazon-s3-and-cloudfront.php:2864 msgid "" "Invalid character. Bucket names can contain lowercase letters, numbers, " "periods and hyphens." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2734 +#: classes/amazon-s3-and-cloudfront.php:2865 msgid "Error saving bucket" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2735 +#: classes/amazon-s3-and-cloudfront.php:2866 msgid "Error fetching buckets" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2736 +#: classes/amazon-s3-and-cloudfront.php:2867 msgid "Error getting URL preview: " msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2737 +#: classes/amazon-s3-and-cloudfront.php:2868 msgid "The changes you made will be lost if you navigate away from this page" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2738 +#: classes/amazon-s3-and-cloudfront.php:2869 msgid "Getting diagnostic info..." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2739 +#: classes/amazon-s3-and-cloudfront.php:2870 msgid "Error getting diagnostic info: " msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2807 +#: classes/amazon-s3-and-cloudfront.php:2873 +#: classes/amazon-s3-and-cloudfront.php:4583 +msgid "Settings saved." +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:2943 msgid "Cheatin' eh?" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2913 +#: classes/amazon-s3-and-cloudfront.php:2992 msgctxt "Show the media library tab" msgid "Media Library" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:2914 +#: classes/amazon-s3-and-cloudfront.php:2993 +msgctxt "Show the addons tab" +msgid "Addons" +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:2994 +msgctxt "Show the settings tab" +msgid "Settings" +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:2995 msgctxt "Show the support tab" msgid "Support" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:3131 +#: classes/amazon-s3-and-cloudfront.php:3230 #, php-format msgid "" "WP Offload S3 — The file %s has been given %s " "permissions on Amazon S3." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:3150 +#: classes/amazon-s3-and-cloudfront.php:3249 msgid "" "WP Offload S3 Requirement Missing — Looks like you " "don't have an image manipulation library installed on this server and " @@ -151,11 +194,17 @@ msgid "" "Please setup GD or ImageMagick." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:3755 +#: classes/amazon-s3-and-cloudfront.php:3863 +#, php-format +msgid "" +"Define your AWS keys to enable write access to the bucket" +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:3870 msgid "Quick Start Guide" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:3757 +#: classes/amazon-s3-and-cloudfront.php:3872 #, php-format msgid "" "Looks like we don't have write access to this bucket. It's likely that the " @@ -164,7 +213,7 @@ msgid "" "correctly." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:3759 +#: classes/amazon-s3-and-cloudfront.php:3874 #, php-format msgid "" "Looks like we don't have access to the buckets. It's likely that the user " @@ -172,39 +221,39 @@ msgid "" "Please see our %s for instructions on setting up permissions correctly." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:3909 +#: classes/amazon-s3-and-cloudfront.php:4024 msgid "WP Offload S3 Activation" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:3910 +#: classes/amazon-s3-and-cloudfront.php:4025 msgid "" "WP Offload S3 Lite and WP Offload S3 cannot both be active. We've " "automatically deactivated WP Offload S3 Lite." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:3912 +#: classes/amazon-s3-and-cloudfront.php:4027 msgid "WP Offload S3 Lite Activation" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:3913 +#: classes/amazon-s3-and-cloudfront.php:4028 msgid "" "WP Offload S3 Lite and WP Offload S3 cannot both be active. We've " "automatically deactivated WP Offload S3." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:3965 -msgid "More info" +#: classes/amazon-s3-and-cloudfront.php:4080 +msgid "More info »" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:4060 +#: classes/amazon-s3-and-cloudfront.php:4175 msgid "this doc" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:4062 +#: classes/amazon-s3-and-cloudfront.php:4177 msgid "WP Offload S3 Feature Removed" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:4063 +#: classes/amazon-s3-and-cloudfront.php:4178 #, php-format msgid "" "You had the \"Always non-SSL\" option selected in your settings, but we've " @@ -215,35 +264,177 @@ msgid "" "to the old behavior." msgstr "" -#: classes/amazon-s3-and-cloudfront.php:4093 -#: classes/amazon-s3-and-cloudfront.php:4202 +#: classes/amazon-s3-and-cloudfront.php:4208 +#: classes/amazon-s3-and-cloudfront.php:4317 msgid "Amazon S3" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:4203 +#: classes/amazon-s3-and-cloudfront.php:4318 msgctxt "Amazon S3 bucket" msgid "Bucket" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:4204 +#: classes/amazon-s3-and-cloudfront.php:4319 msgctxt "Path to file on Amazon S3" msgid "Path" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:4205 +#: classes/amazon-s3-and-cloudfront.php:4320 msgctxt "Location of Amazon S3 bucket" msgid "Region" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:4206 +#: classes/amazon-s3-and-cloudfront.php:4321 msgctxt "Access control list of the file on Amazon S3" msgid "Access" msgstr "" -#: classes/amazon-s3-and-cloudfront.php:4207 +#: classes/amazon-s3-and-cloudfront.php:4322 msgid "URL" msgstr "" +#: classes/amazon-s3-and-cloudfront.php:4546 +msgid "Assets Pull" +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:4547 +msgid "" +"An addon for WP Offload S3 to serve your site's JS, CSS, and other enqueued " +"assets from Amazon CloudFront or another CDN." +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:4551 +msgid "Feature" +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:4597 +#, php-format +msgid "" +"Amazon Web Services Plugin No Longer Required — As of " +"version 1.6 of WP Offload S3, the Amazon Web Services " +"plugin is no longer required. We have removed the dependency by bundling a " +"small portion of the AWS SDK into WP Offload S3. As long as none of your " +"other active plugins or themes depend on the Amazon Web Services plugin, it " +"should be safe to deactivate and delete it. %2$s" +msgstr "" + +#: classes/amazon-s3-and-cloudfront.php:4629 +#, php-format +msgid "" +"WP Offload S3 Settings Moved — You now define your " +"AWS keys for WP Offload S3 in the new Settings tab. " +"Saving settings in the form below will have no effect on WP Offload S3. %2$s" +msgstr "" + +#: classes/amazon-web-services.php:148 +#, php-format +msgid "" +"You must first set your AWS access keys to use this addon." +msgstr "" + +#: classes/as3cf-compatibility-check.php:317 +msgid "deactivate" +msgstr "" + +#: classes/as3cf-compatibility-check.php:318 +#, php-format +msgid "You can %s the %s plugin to get rid of this notice." +msgstr "" + +#: classes/as3cf-compatibility-check.php:336 +#, php-format +msgid "%s has been disabled as it requires the %s plugin." +msgstr "" + +#: classes/as3cf-compatibility-check.php:340 +msgid "which is currently disabled." +msgstr "" + +#: classes/as3cf-compatibility-check.php:342 +msgid "It appears to be installed already." +msgstr "" + +#: classes/as3cf-compatibility-check.php:344 +msgctxt "Activate plugin" +msgid "Activate it now." +msgstr "" + +#: classes/as3cf-compatibility-check.php:351 +#, php-format +msgid "Install and activate it." +msgstr "" + +#: classes/as3cf-compatibility-check.php:362 +#, php-format +msgid "" +"%s has been disabled as it requires version %s or later of the %s plugin." +msgstr "" + +#: classes/as3cf-compatibility-check.php:365 +#, php-format +msgid "You currently have version %s installed." +msgstr "" + +#: classes/as3cf-compatibility-check.php:372 +#: classes/as3cf-compatibility-check.php:410 +#, php-format +msgid "A valid license for %s is required to update." +msgstr "" + +#: classes/as3cf-compatibility-check.php:381 +msgid "Update to the latest version" +msgstr "" + +#: classes/as3cf-compatibility-check.php:392 +#, php-format +msgid "" +"%1$s has been disabled because it is not a supported addon of the %2$s " +"plugin." +msgstr "" + +#: classes/as3cf-compatibility-check.php:401 +#, php-format +msgid "" +"%1$s has been disabled because it will not work with the version of the %2$s " +"plugin installed. %1$s %3$s or later is required." +msgstr "" + +#: classes/as3cf-compatibility-check.php:404 +#, php-format +msgid "Update %s to the latest version" +msgstr "" + +#: classes/as3cf-compatibility-check.php:473 +#, php-format +msgid "The %s plugin has been deactivated." +msgstr "" + +#: classes/as3cf-compatibility-check.php:619 +msgid "a PHP version less than 5.3.3" +msgstr "" + +#: classes/as3cf-compatibility-check.php:623 +msgid "no PHP cURL library activated" +msgstr "" + +#: classes/as3cf-compatibility-check.php:629 +msgid "a cURL version less than 7.16.2" +msgstr "" + +#: classes/as3cf-compatibility-check.php:644 +msgid "cURL compiled without" +msgstr "" + +#: classes/as3cf-compatibility-check.php:649 +msgid "the function curl_multi_exec disabled" +msgstr "" + +#: classes/as3cf-compatibility-check.php:667 +msgid "" +"The official Amazon Web Services SDK requires PHP 5.3.3+ and cURL " +"7.16.2+ compiled with OpenSSL and zlib. Your server currently has" +msgstr "" + #: classes/as3cf-notices.php:431 msgid "Error dismissing notice." msgstr "" @@ -252,19 +443,23 @@ msgstr "" msgid "Invalid notice ID." msgstr "" -#: classes/as3cf-plugin-compatibility.php:515 +#: classes/as3cf-plugin-base.php:461 +msgid "Settings" +msgstr "" + +#: classes/as3cf-plugin-compatibility.php:570 #, php-format msgid "The local directory %s does not exist and could not be created." msgstr "" -#: classes/as3cf-plugin-compatibility.php:516 -#: classes/as3cf-plugin-compatibility.php:528 +#: classes/as3cf-plugin-compatibility.php:571 +#: classes/as3cf-plugin-compatibility.php:583 #: classes/upgrades/upgrade-meta-wp-error.php:81 #, php-format msgid "There was an error attempting to download the file %s from S3: %s" msgstr "" -#: classes/as3cf-plugin-compatibility.php:836 +#: classes/as3cf-plugin-compatibility.php:891 #, php-format msgid "" "Warning: This site is using PHP %1$s, in a future update WP " @@ -381,81 +576,28 @@ msgstr "" msgid "Every %d Minutes" msgstr "" -#: classes/wp-aws-compatibility-check.php:323 -msgid "deactivate" -msgstr "" - -#: classes/wp-aws-compatibility-check.php:324 -#, php-format -msgid "You can %s the %s plugin to get rid of this notice." -msgstr "" - -#: classes/wp-aws-compatibility-check.php:327 -#, php-format -msgid "%s has been disabled as it requires the %s plugin." -msgstr "" - -#: classes/wp-aws-compatibility-check.php:331 -msgid "which is currently disabled." -msgstr "" - -#: classes/wp-aws-compatibility-check.php:333 -msgid "It appears to be installed already." +#: view/addon.php:11 +msgid "More Details »" msgstr "" -#: classes/wp-aws-compatibility-check.php:335 -msgctxt "Activate plugin" -msgid "Activate it now." -msgstr "" - -#: classes/wp-aws-compatibility-check.php:342 -#, php-format -msgid "Install and activate it." +#: view/addon.php:40 +msgctxt "Plugin already installed and activated" +msgid "Installed & Activated" msgstr "" -#: classes/wp-aws-compatibility-check.php:353 -#, php-format -msgid "" -"%s has been disabled as it requires version %s or later of the %s plugin." +#: view/addon.php:42 +msgctxt "Plugin already installed" +msgid "Installed" msgstr "" -#: classes/wp-aws-compatibility-check.php:356 -#, php-format -msgid "You currently have version %s installed." +#: view/addon.php:43 +msgctxt "Activate plugin now" +msgid "Activate Now" msgstr "" -#: classes/wp-aws-compatibility-check.php:363 -#: classes/wp-aws-compatibility-check.php:401 -#, php-format -msgid "A valid license for %s is required to update." -msgstr "" - -#: classes/wp-aws-compatibility-check.php:371 -msgid "Update to the latest version" -msgstr "" - -#: classes/wp-aws-compatibility-check.php:383 -#, php-format -msgid "" -"%1$s has been disabled because it is not a supported addon of the %2$s " -"plugin." -msgstr "" - -#: classes/wp-aws-compatibility-check.php:392 -#, php-format -msgid "" -"%1$s has been disabled because it will not work with the version of the %2$s " -"plugin installed. %1$s %3$s or later is required." -msgstr "" - -#: classes/wp-aws-compatibility-check.php:395 -#, php-format -msgid "Update %s to the latest version" -msgstr "" - -#: classes/wp-aws-compatibility-check.php:464 -#, php-format -msgid "The %s plugin has been deactivated." +#: view/addon.php:45 +msgctxt "Install plugin now" +msgid "Install Now" msgstr "" #: view/attachment-metabox.php:14 @@ -546,19 +688,26 @@ msgstr "" msgid "Create New Bucket" msgstr "" -#: view/bucket-setting.php:7 +#: view/bucket-setting.php:8 msgid "Bucket" msgstr "" -#: view/bucket-setting.php:12 +#: view/bucket-setting.php:13 msgid "View in S3 console" msgstr "" -#: view/bucket-setting.php:16 +#: view/bucket-setting.php:19 msgid "Change" msgstr "" -#: view/bucket-setting.php:35 +#: view/bucket-setting.php:37 +#, php-format +msgid "" +"Bucket Select DisabledDefine your " +"AWS keys to configure the bucket" +msgstr "" + +#: view/bucket-setting.php:46 msgid "" "Bucket Select Disabled — Bucket selection has been " "disabled while files are copied between buckets." @@ -620,105 +769,181 @@ msgstr "" msgid "Show" msgstr "" -#: view/settings.php:10 -msgid "Settings saved." +#: view/settings/addons.php:10 +#, php-format +msgid "" +"Get Addons — The following addons are available with a WP " +"Offload S3 Gold license or better.
    Visit deliciousbrains." +"com to purchase in just a few clicks." msgstr "" -#: view/settings.php:48 +#: view/settings/media.php:13 +#, php-format +msgid "Define your AWS keys to configure WP Offload S3" +msgstr "" + +#: view/settings/media.php:47 msgid "Enable/Disable the Plugin" msgstr "" -#: view/settings.php:56 +#: view/settings/media.php:56 msgid "Copy Files to S3" msgstr "" -#: view/settings.php:58 +#: view/settings/media.php:58 msgid "" "When a file is uploaded to the Media Library, copy it to S3. Existing files " "are not copied to S3." msgstr "" -#: view/settings.php:71 +#: view/settings/media.php:71 msgid "Rewrite File URLs" msgstr "" -#: view/settings.php:73 +#: view/settings/media.php:73 msgid "" "For Media Library files that have been copied to S3, rewrite the URLs so " "that they are served from S3/CloudFront instead of your server." msgstr "" -#: view/settings.php:80 +#: view/settings/media.php:80 msgid "Configure File URLs" msgstr "" -#: view/settings.php:101 +#: view/settings/media.php:101 msgid "Path" msgstr "" -#: view/settings.php:103 +#: view/settings/media.php:103 msgid "By default the path is the same as your local WordPress files." msgstr "" -#: view/settings.php:120 +#: view/settings/media.php:120 msgid "Year/Month" msgstr "" -#: view/settings.php:122 +#: view/settings/media.php:122 msgid "Add the Year/Month in the URL." msgstr "" -#: view/settings.php:135 +#: view/settings/media.php:135 msgid "Force HTTPS" msgstr "" -#: view/settings.php:137 +#: view/settings/media.php:137 msgid "" "By default we use HTTPS when the request is HTTPS and regular HTTP when the " "request is HTTP, but you may want to force the use of HTTPS always, " "regardless of the request." msgstr "" -#: view/settings.php:144 +#: view/settings/media.php:144 msgid "Advanced Options" msgstr "" -#: view/settings.php:153 +#: view/settings/media.php:153 msgid "Remove Files From Server" msgstr "" -#: view/settings.php:154 +#: view/settings/media.php:154 msgid "Once a file has been copied to S3, remove it from the local server." msgstr "" -#: view/settings.php:158 +#: view/settings/media.php:158 msgid "" "Broken URLs — There will be broken URLs for files " "that don't exist locally. You can fix this by enabling Rewrite File " "URLs to use the S3 URLs." msgstr "" -#: view/settings.php:169 +#: view/settings/media.php:169 #, php-format msgid "" "Warning — Some plugins depend on the file being " "present on the local server and may not work when the file is removed. %s" msgstr "" -#: view/settings.php:187 +#: view/settings/media.php:187 msgid "Object Versioning" msgstr "" -#: view/settings.php:189 +#: view/settings/media.php:189 msgid "" "Append a timestamp to the S3 file path. Recommended when using CloudFront so " "you don't have to worry about cache invalidation." msgstr "" -#: view/settings.php:196 +#: view/settings/media.php:196 +#: view/settings/settings.php:112 msgid "Save Changes" msgstr "" +#: view/settings/settings.php:19 +msgid "AWS Access Keys" +msgstr "" + +#: view/settings/settings.php:23 +msgid "You have enabled the use of IAM roles for Amazon EC2 instances." +msgstr "" + +#: view/settings/settings.php:30 +msgid "" +"Please check your wp-config.php file as it looks like one of your defines is " +"missing or incorrect." +msgstr "" + +#: view/settings/settings.php:36 +#, php-format +msgid "" +"You’ve already defined your AWS access keys in your wp-config.php. If " +"you’d prefer to manage them here and store them in the database (not recommended), simply remove the lines from your wp-" +"config." +msgstr "" + +#: view/settings/settings.php:42 +msgid "" +"We recommend defining your Access Keys in wp-config.php so long as you " +"don’t commit it to source control (you shouldn’t be). Simply " +"copy the following snippet and replace the stars with the keys." +msgstr "" + +#: view/settings/settings.php:52 +#, php-format +msgid "" +"You’re storing your Access Keys in the database (not " +"recommended)." +msgstr "" + +#: view/settings/settings.php:56 +msgid "" +"If you’d rather store your Access Keys in the database, click here to reveal a form." +msgstr "" + +#: view/settings/settings.php:66 +msgid "Access Key ID" +msgstr "" + +#: view/settings/settings.php:83 +msgid "Secret Access Key" +msgstr "" + +#: view/settings/settings.php:103 +msgid "This will store your AWS access keys in the database (not recommended)." +msgstr "" + +#: view/settings/settings.php:115 +msgid "Remove Keys" +msgstr "" + +#: view/settings/settings.php:127 +#, php-format +msgid "" +"Need help getting your Access Keys? Check out the Quick Start " +"Guide →" +msgstr "" + #: view/sidebar.php:13 msgid "Upload existing Media Library to S3" msgstr "" diff --git a/readme.txt b/readme.txt index 385f6f14..141ce4d7 100644 --- a/readme.txt +++ b/readme.txt @@ -3,7 +3,7 @@ Contributors: bradt, deliciousbrains Tags: uploads, amazon, s3, amazon s3, mirror, admin, media, cdn, cloudfront Requires at least: 4.6 Tested up to: 4.9 -Stable tag: 1.2.1 +Stable tag: 1.3 License: GPLv3 Copies files to Amazon S3 as they are uploaded to the Media Library. Optionally configure Amazon CloudFront for faster delivery. @@ -65,6 +65,23 @@ This version requires PHP 5.3.3+ and the Amazon Web Services plugin == Changelog == += WP Offload S3 Lite 1.3 - 2018-02-20 = +* [Release Summary Blog Post](https://deliciousbrains.com/wp-offload-s3-1-6-released/?utm_campaign=changelogs&utm_source=wordpress.org&utm_medium=free%2Bplugin%2Blisting) +* New: [Amazon Web Services plugin](https://wordpress.org/plugins/amazon-web-services/) is no longer required to run WP Offload S3 Lite +* New: Added [`as3cf_local_domains`](https://deliciousbrains.com/wp-offload-s3/doc/filtering-urls-for-multiple-domains/?utm_campaign=changelogs&utm_source=wordpress.org&utm_medium=free%2Bplugin%2Blisting) filter for when site content is updated through multiple domains +* Improvement: AWS keys can be set in new "Settings" tab if not defined in wp-config.php +* Improvement: Minor tweaks to settings page UI including right aligning tabs and consistent title across Lite and Pro plugins +* Improvement: cURL version, theme version and parent theme information added to diagnostics +* Bug fix: Incompatible with plugins that include AWS PHP SDK v3 +* Bug fix: Regenerate Thumbnails v3.0+ does not work with Remove Files From Server option +* Bug fix: "Warning: count(): Parameter must be an array or an object that implements Countable" error with PHP 7.2 +* Bug fix: Force HTTPS not being applied to non-srcset S3 URLs in pages served over HTTP +* Bug fix: Content URLs not filtered to S3 URLs if AWS keys not set +* Bug fix: URL preview can be coerced to display invalid URL +* Bug fix: Changes to upload made via `as3cf_object_meta` filter are not reflected in amazonS3_info records +* Bug fix: Settings link not showing in network admin plugins page +* Bug fix: License in composer.json fails Packagist validation + = WP Offload S3 Lite 1.2.1 - 2017-11-20 = * New: Compatibility with HTML Widget * New: Dismissible admin notice that WP Offload S3 Lite will soon require PHP 5.5+ diff --git a/vendor/Aws2/aws/aws-sdk-php/LICENSE.md b/vendor/Aws2/aws/aws-sdk-php/LICENSE.md new file mode 100644 index 00000000..8d53e9f5 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/LICENSE.md @@ -0,0 +1,141 @@ +# Apache License +Version 2.0, January 2004 + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +## 1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 +through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the +License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled +by, or are under common control with that entity. For the purposes of this definition, "control" means +(i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract +or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial +ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software +source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, +including but not limited to compiled object code, generated documentation, and conversions to other media +types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, +as indicated by a copyright notice that is included in or attached to the work (an example is provided in the +Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) +the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, +as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not +include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work +and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any +modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to +Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to +submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of +electronic, verbal, or written communication sent to the Licensor or its representatives, including but not +limited to communication on electronic mailing lists, source code control systems, and issue tracking systems +that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but +excluding communication that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been +received by Licensor and subsequently incorporated within the Work. + +## 2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare +Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +## 3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent +license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such +license applies only to those patent claims licensable by such Contributor that are necessarily infringed by +their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such +Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim +or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work +constitutes direct or contributory patent infringement, then any patent licenses granted to You under this +License for that Work shall terminate as of the date such litigation is filed. + +## 4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without +modifications, and in Source or Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and + + 2. You must cause any modified files to carry prominent notices stating that You changed the files; and + + 3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, + trademark, and attribution notices from the Source form of the Work, excluding those notices that do + not pertain to any part of the Derivative Works; and + + 4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that + You distribute must include a readable copy of the attribution notices contained within such NOTICE + file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed as part of the Derivative Works; within + the Source form or documentation, if provided along with the Derivative Works; or, within a display + generated by the Derivative Works, if and wherever such third-party notices normally appear. The + contents of the NOTICE file are for informational purposes only and do not modify the License. You may + add Your own attribution notices within Derivative Works that You distribute, alongside or as an + addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be + construed as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide additional or different license +terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative +Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the +conditions stated in this License. + +## 5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by +You to the Licensor shall be under the terms and conditions of this License, without any additional terms or +conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate +license agreement you may have executed with Licensor regarding such Contributions. + +## 6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, service marks, or product names of +the Licensor, except as required for reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +## 7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor +provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express +or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, +MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +## 8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless +required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any +Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential +damages of any character arising as a result of this License or out of the use or inability to use the Work +(including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has been advised of the possibility +of such damages. + +## 9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, +acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole +responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold +each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/vendor/Aws2/aws/aws-sdk-php/NOTICE.md b/vendor/Aws2/aws/aws-sdk-php/NOTICE.md new file mode 100644 index 00000000..84858532 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/NOTICE.md @@ -0,0 +1,112 @@ +# AWS SDK for PHP + + + +Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"). +You may not use this file except in compliance with the License. +A copy of the License is located at + + + +or in the "license" file accompanying this file. This file is distributed +on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +express or implied. See the License for the specific language governing +permissions and limitations under the License. + +# Guzzle + + + +Copyright (c) 2011 Michael Dowling, https://github.com/mtdowling + +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. + +# Symfony + + + +Copyright (c) 2004-2012 Fabien Potencier + +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. + +# Doctrine Common + + + +Copyright (c) 2006-2012 Doctrine Project + +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. + +# Monolog + + + +Copyright (c) Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/Aws2/aws/aws-sdk-php/composer.json b/vendor/Aws2/aws/aws-sdk-php/composer.json new file mode 100644 index 00000000..b9ea20a8 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/composer.json @@ -0,0 +1,51 @@ +{ + "name": "aws\/aws-sdk-php", + "homepage": "http:\/\/aws.amazon.com\/sdkforphp", + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "keywords": [ + "aws", + "amazon", + "sdk", + "s3", + "ec2", + "dynamodb", + "cloud", + "glacier" + ], + "type": "library", + "license": "Apache-2.0", + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http:\/\/aws.amazon.com" + } + ], + "support": { + "forum": "https:\/\/forums.aws.amazon.com\/forum.jspa?forumID=80", + "issues": "https:\/\/github.com\/aws\/aws-sdk-php\/issues" + }, + "require": { + "php": ">=5.3.3", + "guzzle\/guzzle": "~3.7" + }, + "suggest": { + "doctrine\/cache": "Adds support for caching of credentials and responses", + "ext-apc": "Allows service description opcode caching, request and response caching, and credentials caching", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "monolog\/monolog": "Adds support for logging HTTP requests and responses", + "symfony\/yaml": "Eases the ability to write manifests for creating jobs in AWS Import\/Export" + }, + "require-dev": { + "ext-openssl": "*", + "doctrine\/cache": "~1.0", + "monolog\/monolog": "~1.4", + "phpunit\/phpunit": "~4.0", + "phpunit\/phpunit-mock-objects": "2.3.1", + "symfony\/yaml": "~2.1" + }, + "autoload": { + "psr-0": { + "Aws": "src\/" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Aws.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Aws.php new file mode 100644 index 00000000..c69d7ab8 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Aws.php @@ -0,0 +1,97 @@ +addAlias('_aws', self::getDefaultServiceDefinition())->addAlias('_sdk1', __DIR__ . '/Resources/sdk1-config.php'); + return $loader->load($config, $globalParameters); + } + /** + * Get the full path to the default service builder definition file + * + * @return string + */ + public static function getDefaultServiceDefinition() + { + return __DIR__ . '/Resources/aws-config.php'; + } + /** + * Returns the configuration for the service builder + * + * @return array + */ + public function getConfig() + { + return $this->builderConfig; + } + /** + * Enables the facades for the clients defined in the service builder + * + * @param string|null $namespace The namespace that the facades should be mounted to. Defaults to global namespace + * + * @return Aws + * @deprecated "Facades" are being removed in version 3.0 of the SDK. + */ + public function enableFacades($namespace = null) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Facade\Facade::mountFacades($this, $namespace); + return $this; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/AbstractClient.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/AbstractClient.php new file mode 100644 index 00000000..7ea7db50 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/AbstractClient.php @@ -0,0 +1,215 @@ +get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BASE_URL), $config); + $this->credentials = $credentials; + $this->signature = $signature; + $this->aggregator = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryAggregator\DuplicateAggregator(); + // Make sure the user agent is prefixed by the SDK version + $this->setUserAgent('aws-sdk-php2/' . \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Aws::VERSION, true); + // Add the event listener so that requests are signed before they are sent + $dispatcher = $this->getEventDispatcher(); + $dispatcher->addSubscriber(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Signature\SignatureListener($credentials, $signature)); + if ($backoff = $config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BACKOFF)) { + $dispatcher->addSubscriber($backoff, -255); + } + } + public function __call($method, $args) + { + if (substr($method, 0, 3) === 'get' && substr($method, -8) === 'Iterator') { + // Allow magic method calls for iterators (e.g. $client->getIterator($params)) + $commandOptions = isset($args[0]) ? $args[0] : null; + $iteratorOptions = isset($args[1]) ? $args[1] : array(); + return $this->getIterator(substr($method, 3, -8), $commandOptions, $iteratorOptions); + } elseif (substr($method, 0, 9) == 'waitUntil') { + // Allow magic method calls for waiters (e.g. $client->waitUntil($params)) + return $this->waitUntil(substr($method, 9), isset($args[0]) ? $args[0] : array()); + } else { + return parent::__call(ucfirst($method), $args); + } + } + /** + * Get an endpoint for a specific region from a service description + * @deprecated This function will no longer be updated to work with new regions. + */ + public static function getEndpoint(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\ServiceDescriptionInterface $description, $region, $scheme) + { + try { + $service = $description->getData('endpointPrefix'); + $provider = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\RulesEndpointProvider::fromDefaults(); + $result = $provider(array('service' => $service, 'region' => $region, 'scheme' => $scheme)); + return $result['endpoint']; + } catch (\InvalidArgumentException $e) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException($e->getMessage(), 0, $e); + } + } + public function getCredentials() + { + return $this->credentials; + } + public function setCredentials(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\CredentialsInterface $credentials) + { + $formerCredentials = $this->credentials; + $this->credentials = $credentials; + // Dispatch an event that the credentials have been changed + $this->dispatch('client.credentials_changed', array('credentials' => $credentials, 'former_credentials' => $formerCredentials)); + return $this; + } + public function getSignature() + { + return $this->signature; + } + public function getRegions() + { + return $this->serviceDescription->getData('regions'); + } + public function getRegion() + { + return $this->getConfig(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::REGION); + } + public function setRegion($region) + { + $config = $this->getConfig(); + $formerRegion = $config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::REGION); + $global = $this->serviceDescription->getData('globalEndpoint'); + $provider = $config->get('endpoint_provider'); + if (!$provider) { + throw new \RuntimeException('No endpoint provider configured'); + } + // Only change the region if the service does not have a global endpoint + if (!$global || $this->serviceDescription->getData('namespace') === 'S3') { + $endpoint = call_user_func($provider, array('scheme' => $config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SCHEME), 'region' => $region, 'service' => $config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SERVICE))); + $this->setBaseUrl($endpoint['endpoint']); + $config->set(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BASE_URL, $endpoint['endpoint']); + $config->set(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::REGION, $region); + // Update the signature if necessary + $signature = $this->getSignature(); + if ($signature instanceof EndpointSignatureInterface) { + /** @var EndpointSignatureInterface $signature */ + $signature->setRegionName($region); + } + // Dispatch an event that the region has been changed + $this->dispatch('client.region_changed', array('region' => $region, 'former_region' => $formerRegion)); + } + return $this; + } + public function waitUntil($waiter, array $input = array()) + { + $this->getWaiter($waiter, $input)->wait(); + return $this; + } + public function getWaiter($waiter, array $input = array()) + { + return $this->getWaiterFactory()->build($waiter)->setClient($this)->setConfig($input); + } + public function setWaiterFactory(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterFactoryInterface $waiterFactory) + { + $this->waiterFactory = $waiterFactory; + return $this; + } + public function getWaiterFactory() + { + if (!$this->waiterFactory) { + $clientClass = get_class($this); + // Use a composite factory that checks for classes first, then config waiters + $this->waiterFactory = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\CompositeWaiterFactory(array(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterClassFactory(substr($clientClass, 0, strrpos($clientClass, '\\')) . '\\Waiter'))); + if ($this->getDescription()) { + $waiterConfig = $this->getDescription()->getData('waiters') ?: array(); + $this->waiterFactory->addFactory(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfigFactory($waiterConfig)); + } + } + return $this->waiterFactory; + } + public function getApiVersion() + { + return $this->serviceDescription->getApiVersion(); + } + /** + * {@inheritdoc} + * @throws \Aws\Common\Exception\TransferException + */ + public function send($requests) + { + try { + return parent::send($requests); + } catch (CurlException $e) { + $wrapped = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\TransferException($e->getMessage(), null, $e); + $wrapped->setCurlHandle($e->getCurlHandle())->setCurlInfo($e->getCurlInfo())->setError($e->getError(), $e->getErrorNo())->setRequest($e->getRequest()); + throw $wrapped; + } + } + /** + * Ensures that the duplicate query string aggregator is used so that + * query string values are sent over the wire as foo=bar&foo=baz. + * {@inheritdoc} + */ + public function createRequest($method = 'GET', $uri = null, $headers = null, $body = null, array $options = array()) + { + $request = parent::createRequest($method, $uri, $headers, $body, $options); + $request->getQuery()->setAggregator($this->aggregator); + return $request; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/AwsClientInterface.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/AwsClientInterface.php new file mode 100644 index 00000000..a811c216 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/AwsClientInterface.php @@ -0,0 +1,107 @@ + 'https'); + /** + * @var array Default client requirements + */ + protected static $commonConfigRequirements = array(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SERVICE_DESCRIPTION); + /** + * @var string The namespace of the client + */ + protected $clientNamespace; + /** + * @var array The config options + */ + protected $config = array(); + /** + * @var array The config defaults + */ + protected $configDefaults = array(); + /** + * @var array The config requirements + */ + protected $configRequirements = array(); + /** + * @var ExceptionParserInterface The Parser interface for the client + */ + protected $exceptionParser; + /** + * @var array Array of configuration data for iterators available for the client + */ + protected $iteratorsConfig = array(); + /** @var string */ + private $clientClass; + /** @var string */ + private $serviceName; + /** + * Factory method for creating the client builder + * + * @param string $namespace The namespace of the client + * + * @return ClientBuilder + */ + public static function factory($namespace = null) + { + return new static($namespace); + } + /** + * Constructs a client builder + * + * @param string $namespace The namespace of the client + */ + public function __construct($namespace = null) + { + $this->clientNamespace = $namespace; + // Determine service and class name + $this->clientClass = 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\DefaultClient'; + if ($this->clientNamespace) { + $this->serviceName = substr($this->clientNamespace, strrpos($this->clientNamespace, '\\') + 1); + $this->clientClass = $this->clientNamespace . '\\' . $this->serviceName . 'Client'; + } + } + /** + * Sets the config options + * + * @param array|Collection $config The config options + * + * @return ClientBuilder + */ + public function setConfig($config) + { + $this->config = $this->processArray($config); + return $this; + } + /** + * Sets the config options' defaults + * + * @param array|Collection $defaults The default values + * + * @return ClientBuilder + */ + public function setConfigDefaults($defaults) + { + $this->configDefaults = $this->processArray($defaults); + return $this; + } + /** + * Sets the required config options + * + * @param array|Collection $required The required config options + * + * @return ClientBuilder + */ + public function setConfigRequirements($required) + { + $this->configRequirements = $this->processArray($required); + return $this; + } + /** + * Sets the exception parser. If one is not provided the builder will use + * the default XML exception parser. + * + * @param ExceptionParserInterface $parser The exception parser + * + * @return ClientBuilder + */ + public function setExceptionParser(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\Parser\ExceptionParserInterface $parser) + { + $this->exceptionParser = $parser; + return $this; + } + /** + * Set the configuration for the client's iterators + * + * @param array $config Configuration data for client's iterators + * + * @return ClientBuilder + */ + public function setIteratorsConfig(array $config) + { + $this->iteratorsConfig = $config; + return $this; + } + /** + * Performs the building logic using all of the parameters that have been + * set and falling back to default values. Returns an instantiate service + * client with credentials prepared and plugins attached. + * + * @return AwsClientInterface + * @throws InvalidArgumentException + */ + public function build() + { + // Resolve configuration + $config = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection::fromConfig($this->config, array_merge(self::$commonConfigDefaults, $this->configDefaults), self::$commonConfigRequirements + $this->configRequirements); + if ($config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::VERSION] === 'latest') { + $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::VERSION] = constant("{$this->clientClass}::LATEST_API_VERSION"); + } + if (!isset($config['endpoint_provider'])) { + $config['endpoint_provider'] = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\RulesEndpointProvider::fromDefaults(); + } + // Resolve the endpoint, signature, and credentials + $description = $this->updateConfigFromDescription($config); + $signature = $this->getSignature($description, $config); + $credentials = $this->getCredentials($config); + $this->extractHttpConfig($config); + // Resolve exception parser + if (!$this->exceptionParser) { + $this->exceptionParser = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\Parser\DefaultXmlExceptionParser(); + } + // Resolve backoff strategy + $backoff = $config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BACKOFF); + if ($backoff === null) { + $retries = isset($config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BACKOFF_RETRIES]) ? $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BACKOFF_RETRIES] : 3; + $backoff = $this->createDefaultBackoff($retries); + $config->set(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BACKOFF, $backoff); + } + if ($backoff) { + $this->addBackoffLogger($backoff, $config); + } + /** @var AwsClientInterface $client */ + $client = new $this->clientClass($credentials, $signature, $config); + $client->setDescription($description); + // Add exception marshaling so that more descriptive exception are thrown + if ($this->clientNamespace) { + $exceptionFactory = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\NamespaceExceptionFactory($this->exceptionParser, "{$this->clientNamespace}\\Exception", "{$this->clientNamespace}\\Exception\\{$this->serviceName}Exception"); + $client->addSubscriber(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\ExceptionListener($exceptionFactory)); + } + // Add the UserAgentPlugin to append to the User-Agent header of requests + $client->addSubscriber(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Client\UserAgentListener()); + // Filters used for the cache plugin + $client->getConfig()->set('params.cache.key_filter', 'header=date,x-amz-date,x-amz-security-token,x-amzn-authorization'); + // Set the iterator resource factory based on the provided iterators config + $client->setResourceIteratorFactory(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Iterator\AwsResourceIteratorFactory($this->iteratorsConfig, new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\ResourceIteratorClassFactory($this->clientNamespace . '\\Iterator'))); + // Disable parameter validation if needed + if ($config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::VALIDATION) === false) { + $params = $config->get('command.params') ?: array(); + $params['command.disable_validation'] = true; + $config->set('command.params', $params); + } + return $client; + } + /** + * Add backoff logging to the backoff plugin if needed + * + * @param BackoffPlugin $plugin Backoff plugin + * @param Collection $config Configuration settings + * + * @throws InvalidArgumentException + */ + protected function addBackoffLogger(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\BackoffPlugin $plugin, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection $config) + { + // The log option can be set to `debug` or an instance of a LogAdapterInterface + if ($logger = $config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BACKOFF_LOGGER)) { + $format = $config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BACKOFF_LOGGER_TEMPLATE); + if ($logger === 'debug') { + $logger = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Log\ClosureLogAdapter(function ($message) { + trigger_error($message . "\n"); + }); + } elseif (!$logger instanceof LogAdapterInterface) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BACKOFF_LOGGER . ' must be set to `debug` or an instance of ' . 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Log\\LogAdapterInterface'); + } + // Create the plugin responsible for logging exponential backoff retries + $logPlugin = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\BackoffLogger($logger); + // You can specify a custom format or use the default + if ($format) { + $logPlugin->setTemplate($format); + } + $plugin->addSubscriber($logPlugin); + } + } + /** + * Ensures that an array (e.g. for config data) is actually in array form + * + * @param array|Collection $array The array data + * + * @return array + * @throws InvalidArgumentException if the arg is not an array or Collection + */ + protected function processArray($array) + { + if ($array instanceof Collection) { + $array = $array->getAll(); + } + if (!is_array($array)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('The config must be provided as an array or Collection.'); + } + return $array; + } + /** + * Update a configuration object from a service description + * + * @param Collection $config Config to update + * + * @return ServiceDescription + * @throws InvalidArgumentException + */ + protected function updateConfigFromDescription(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection $config) + { + $description = $config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SERVICE_DESCRIPTION); + if (!$description instanceof ServiceDescription) { + // Inject the version into the sprintf template if it is a string + if (is_string($description)) { + $description = sprintf($description, $config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::VERSION)); + } + $description = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\ServiceDescription::factory($description); + $config->set(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SERVICE_DESCRIPTION, $description); + } + if (!$config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SERVICE)) { + $config->set(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SERVICE, $description->getData('endpointPrefix')); + } + if ($iterators = $description->getData('iterators')) { + $this->setIteratorsConfig($iterators); + } + $this->handleRegion($config); + $this->handleEndpoint($config); + return $description; + } + /** + * Return an appropriate signature object for a a client based on the + * "signature" configuration setting, or the default signature specified in + * a service description. The signature can be set to a valid signature + * version identifier string or an instance of Aws\Common\Signature\SignatureInterface. + * + * @param ServiceDescription $description Description that holds a signature option + * @param Collection $config Configuration options + * + * @return SignatureInterface + * @throws InvalidArgumentException + */ + protected function getSignature(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\ServiceDescription $description, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection $config) + { + // If a custom signature has not been provided, then use the default + // signature setting specified in the service description. + $signature = $config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SIGNATURE) ?: $description->getData('signatureVersion'); + if (is_string($signature)) { + if ($signature == 'v4') { + $signature = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Signature\SignatureV4(); + } elseif ($signature == 'v2') { + $signature = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Signature\SignatureV2(); + } elseif ($signature == 'v3https') { + $signature = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Signature\SignatureV3Https(); + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException("Invalid signature type: {$signature}"); + } + } elseif (!$signature instanceof SignatureInterface) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('The provided signature is not ' . 'a signature version string or an instance of ' . 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\SignatureInterface'); + } + // Allow a custom service name or region value to be provided + if ($signature instanceof EndpointSignatureInterface) { + // Determine the service name to use when signing + $signature->setServiceName($config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SIGNATURE_SERVICE) ?: $description->getData('signingName') ?: $description->getData('endpointPrefix')); + // Determine the region to use when signing requests + $signature->setRegionName($config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SIGNATURE_REGION) ?: $config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::REGION)); + } + return $signature; + } + protected function getCredentials(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection $config) + { + $credentials = $config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::CREDENTIALS); + if (is_array($credentials)) { + $credentials = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\Credentials::factory($credentials); + } elseif ($credentials === false) { + $credentials = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\NullCredentials(); + } elseif (!$credentials instanceof CredentialsInterface) { + $credentials = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\Credentials::factory($config); + } + return $credentials; + } + private function handleRegion(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection $config) + { + // Make sure a valid region is set + $region = $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::REGION]; + $description = $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SERVICE_DESCRIPTION]; + $global = $description->getData('globalEndpoint'); + if (!$global && !$region) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('A region is required when using ' . $description->getData('serviceFullName')); + } elseif ($global && !$region) { + $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::REGION] = 'us-east-1'; + } + } + private function handleEndpoint(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection $config) + { + // Alias "endpoint" with "base_url" for forwards compatibility. + if ($config['endpoint']) { + $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BASE_URL] = $config['endpoint']; + return; + } + if ($config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BASE_URL]) { + return; + } + $endpoint = call_user_func($config['endpoint_provider'], array('scheme' => $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SCHEME], 'region' => $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::REGION], 'service' => $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SERVICE])); + $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BASE_URL] = $endpoint['endpoint']; + // Set a signature if one was not explicitly provided. + if (!$config->hasKey(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SIGNATURE) && isset($endpoint['signatureVersion'])) { + $config->set(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SIGNATURE, $endpoint['signatureVersion']); + } + // The the signing region if endpoint rule specifies one. + if (isset($endpoint['credentialScope'])) { + $scope = $endpoint['credentialScope']; + if (isset($scope['region'])) { + $config->set(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SIGNATURE_REGION, $scope['region']); + } + } + } + private function createDefaultBackoff($retries = 3) + { + return new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\BackoffPlugin( + // Retry failed requests up to 3 times if it is determined that the request can be retried + new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\TruncatedBackoffStrategy( + $retries, + // Retry failed requests with 400-level responses due to throttling + new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Client\ThrottlingErrorChecker( + $this->exceptionParser, + // Retry failed requests due to transient network or cURL problems + new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\CurlBackoffStrategy( + null, + // Retry failed requests with 500-level responses + new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\HttpBackoffStrategy( + array(500, 503, 509), + // Retry requests that failed due to expired credentials + new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Client\ExpiredCredentialsChecker($this->exceptionParser, new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\ExponentialBackoffStrategy()) + ) + ) + ) + ) + ); + } + private function extractHttpConfig(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection $config) + { + $http = $config['http']; + if (!is_array($http)) { + return; + } + if (isset($http['verify'])) { + $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SSL_CERT] = $http['verify']; + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/DefaultClient.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/DefaultClient.php new file mode 100644 index 00000000..84352c87 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/DefaultClient.php @@ -0,0 +1,63 @@ +setConfig($config)->setConfigDefaults(array(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SCHEME => 'https'))->build(); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/ExpiredCredentialsChecker.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/ExpiredCredentialsChecker.php new file mode 100644 index 00000000..3bca1864 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/ExpiredCredentialsChecker.php @@ -0,0 +1,68 @@ + true, 'ExpiredTokenException' => true, 'ExpiredToken' => true); + /** + * @var ExceptionParserInterface Exception parser used to parse exception responses + */ + protected $exceptionParser; + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\Parser\ExceptionParserInterface $exceptionParser, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\BackoffStrategyInterface $next = null) + { + $this->exceptionParser = $exceptionParser; + $this->next = $next; + } + public function makesDecision() + { + return true; + } + protected function getDelay($retries, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response = null, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\HttpException $e = null) + { + if ($response && $response->isClientError()) { + $parts = $this->exceptionParser->parse($request, $response); + if (!isset($this->retryable[$parts['code']]) || !$request->getClient()) { + return null; + } + /** @var AwsClientInterface $client */ + $client = $request->getClient(); + // Only retry if the credentials can be refreshed + if (!$client->getCredentials() instanceof AbstractRefreshableCredentials) { + return null; + } + // Resign the request using new credentials + $client->getSignature()->signRequest($request, $client->getCredentials()->setExpiration(-1)); + // Retry immediately with no delay + return 0; + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/ThrottlingErrorChecker.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/ThrottlingErrorChecker.php new file mode 100644 index 00000000..17faa1ff --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/ThrottlingErrorChecker.php @@ -0,0 +1,60 @@ + true, 'Throttling' => true, 'ThrottlingException' => true, 'ProvisionedThroughputExceededException' => true, 'RequestThrottled' => true); + /** + * @var ExceptionParserInterface Exception parser used to parse exception responses + */ + protected $exceptionParser; + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\Parser\ExceptionParserInterface $exceptionParser, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\BackoffStrategyInterface $next = null) + { + $this->exceptionParser = $exceptionParser; + if ($next) { + $this->setNext($next); + } + } + /** + * {@inheritdoc} + */ + public function makesDecision() + { + return true; + } + /** + * {@inheritdoc} + */ + protected function getDelay($retries, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response = null, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\HttpException $e = null) + { + if ($response && $response->isClientError()) { + $parts = $this->exceptionParser->parse($request, $response); + return isset(self::$throttlingExceptions[$parts['code']]) ? true : null; + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/UploadBodyListener.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/UploadBodyListener.php new file mode 100644 index 00000000..eac65a86 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/UploadBodyListener.php @@ -0,0 +1,87 @@ +commands = $commands; + $this->bodyParameter = (string) $bodyParameter; + $this->sourceParameter = (string) $sourceParameter; + } + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() + { + return array('command.before_prepare' => array('onCommandBeforePrepare')); + } + /** + * Converts filenames and file handles into EntityBody objects before the command is validated + * + * @param Event $event Event emitted + * @throws InvalidArgumentException + */ + public function onCommandBeforePrepare(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + /** @var Command $command */ + $command = $event['command']; + if (in_array($command->getName(), $this->commands)) { + // Get the interesting parameters + $source = $command->get($this->sourceParameter); + $body = $command->get($this->bodyParameter); + // If a file path is passed in then get the file handle + if (is_string($source) && file_exists($source)) { + $body = fopen($source, 'r'); + } + // Prepare the body parameter and remove the source file parameter + if (null !== $body) { + $command->remove($this->sourceParameter); + $command->set($this->bodyParameter, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory($body)); + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException("You must specify a non-null value for the {$this->bodyParameter} or {$this->sourceParameter} parameters."); + } + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/UserAgentListener.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/UserAgentListener.php new file mode 100644 index 00000000..2350a8a1 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Client/UserAgentListener.php @@ -0,0 +1,58 @@ + 'onBeforeSend'); + } + /** + * Adds strings to the User-Agent header using the `ua.append` parameter of a command + * + * @param Event $event Event emitted + */ + public function onBeforeSend(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $command = $event['command']; + if ($userAgentAppends = $command->get(self::OPTION)) { + $request = $command->getRequest(); + $userAgent = (string) $request->getHeader('User-Agent'); + foreach ((array) $userAgentAppends as $append) { + $append = ' ' . $append; + if (strpos($userAgent, $append) === false) { + $userAgent .= $append; + } + } + $request->setHeader('User-Agent', $userAgent); + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Command/AwsQueryVisitor.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Command/AwsQueryVisitor.php new file mode 100644 index 00000000..730ebf24 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Command/AwsQueryVisitor.php @@ -0,0 +1,108 @@ +fqname = $command->getName(); + $query = array(); + $this->customResolver($value, $param, $query, $param->getWireName()); + $request->addPostFields($query); + } + /** + * Map nested parameters into the location_key based parameters + * + * @param array $value Value to map + * @param Parameter $param Parameter that holds information about the current key + * @param array $query Built up query string values + * @param string $prefix String to prepend to sub query values + */ + protected function customResolver($value, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, array &$query, $prefix = '') + { + switch ($param->getType()) { + case 'object': + $this->resolveObject($param, $value, $prefix, $query); + break; + case 'array': + $this->resolveArray($param, $value, $prefix, $query); + break; + default: + $query[$prefix] = $param->filter($value); + } + } + /** + * Custom handling for objects + * + * @param Parameter $param Parameter for the object + * @param array $value Value that is set for this parameter + * @param string $prefix Prefix for the resulting key + * @param array $query Query string array passed by reference + */ + protected function resolveObject(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, array $value, $prefix, array &$query) + { + // Maps are implemented using additional properties + $hasAdditionalProperties = $param->getAdditionalProperties() instanceof Parameter; + $additionalPropertyCount = 0; + foreach ($value as $name => $v) { + if ($subParam = $param->getProperty($name)) { + // if the parameter was found by name as a regular property + $key = $prefix . '.' . $subParam->getWireName(); + $this->customResolver($v, $subParam, $query, $key); + } elseif ($hasAdditionalProperties) { + // Handle map cases like &Attribute.1.Name=&Attribute.1.Value= + $additionalPropertyCount++; + $data = $param->getData(); + $keyName = isset($data['keyName']) ? $data['keyName'] : 'key'; + $valueName = isset($data['valueName']) ? $data['valueName'] : 'value'; + $query["{$prefix}.{$additionalPropertyCount}.{$keyName}"] = $name; + $newPrefix = "{$prefix}.{$additionalPropertyCount}.{$valueName}"; + if (is_array($v)) { + $this->customResolver($v, $param->getAdditionalProperties(), $query, $newPrefix); + } else { + $query[$newPrefix] = $param->filter($v); + } + } + } + } + /** + * Custom handling for arrays + * + * @param Parameter $param Parameter for the object + * @param array $value Value that is set for this parameter + * @param string $prefix Prefix for the resulting key + * @param array $query Query string array passed by reference + */ + protected function resolveArray(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, array $value, $prefix, array &$query) + { + static $serializeEmpty = array('SetLoadBalancerPoliciesForBackendServer' => 1, 'SetLoadBalancerPoliciesOfListener' => 1, 'UpdateStack' => 1); + // For BC, serialize empty lists for specific operations + if (!$value) { + if (isset($serializeEmpty[$this->fqname])) { + if (substr($prefix, -7) === '.member') { + $prefix = substr($prefix, 0, -7); + } + $query[$prefix] = ''; + } + return; + } + $offset = $param->getData('offset') ?: 1; + foreach ($value as $index => $v) { + $index += $offset; + if (is_array($v) && ($items = $param->getItems())) { + $this->customResolver($v, $items, $query, $prefix . '.' . $index); + } else { + $query[$prefix . '.' . $index] = $param->filter($v); + } + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Command/JsonCommand.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Command/JsonCommand.php new file mode 100644 index 00000000..1ef3a650 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Command/JsonCommand.php @@ -0,0 +1,43 @@ +request->getBody()) { + $this->request->setBody('{}'); + } + // Never send the Expect header when interacting with a JSON query service + $this->request->removeHeader('Expect'); + // Always send JSON requests as a raw string rather than using streams to avoid issues with + // cURL error code 65: "necessary data rewind wasn't possible". + // This could be removed after PHP addresses https://bugs.php.net/bug.php?id=47204 + $this->request->getCurlOptions()->set(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlHandle::BODY_AS_STRING, true); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Command/QueryCommand.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Command/QueryCommand.php new file mode 100644 index 00000000..3e34a9f4 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Command/QueryCommand.php @@ -0,0 +1,49 @@ +getRequestSerializer()->addVisitor('aws.query', self::$queryVisitor); + $this->getResponseParser()->addVisitor('xml', self::$xmlVisitor); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Command/XmlResponseLocationVisitor.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Command/XmlResponseLocationVisitor.php new file mode 100644 index 00000000..29b9aff0 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Command/XmlResponseLocationVisitor.php @@ -0,0 +1,63 @@ +getOperation(); + if ($operation->getServiceDescription()->getData('resultWrapped')) { + $wrappingNode = $operation->getName() . 'Result'; + if (isset($result[$wrappingNode])) { + $result = $result[$wrappingNode] + $result; + unset($result[$wrappingNode]); + } + } + } + /** + * Accounts for wrapper nodes + * {@inheritdoc} + */ + public function visit(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, &$value, $context = null) + { + parent::visit($command, $response, $param, $value, $context); + // Account for wrapper nodes (e.g. RDS, ElastiCache, etc) + if ($param->getData('wrapper')) { + $wireName = $param->getWireName(); + $value += $value[$wireName]; + unset($value[$wireName]); + } + } + /** + * Filter used when converting XML maps into associative arrays in service descriptions + * + * @param array $value Value to filter + * @param string $entryName Name of each entry + * @param string $keyName Name of each key + * @param string $valueName Name of each value + * + * @return array Returns the map of the XML data + */ + public static function xmlMap($value, $entryName, $keyName, $valueName) + { + $result = array(); + foreach ($value as $entry) { + $result[$entry[$keyName]] = $entry[$valueName]; + } + return $result; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/AbstractCredentialsDecorator.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/AbstractCredentialsDecorator.php new file mode 100644 index 00000000..198a8057 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/AbstractCredentialsDecorator.php @@ -0,0 +1,120 @@ +credentials = $credentials; + } + /** + * {@inheritdoc} + */ + public function serialize() + { + return $this->credentials->serialize(); + } + /** + * {@inheritdoc} + */ + public function unserialize($serialized) + { + $this->credentials = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\Credentials('', ''); + $this->credentials->unserialize($serialized); + } + /** + * {@inheritdoc} + */ + public function getAccessKeyId() + { + return $this->credentials->getAccessKeyId(); + } + /** + * {@inheritdoc} + */ + public function getSecretKey() + { + return $this->credentials->getSecretKey(); + } + /** + * {@inheritdoc} + */ + public function getSecurityToken() + { + return $this->credentials->getSecurityToken(); + } + /** + * {@inheritdoc} + */ + public function getExpiration() + { + return $this->credentials->getExpiration(); + } + /** + * {@inheritdoc} + */ + public function isExpired() + { + return $this->credentials->isExpired(); + } + /** + * {@inheritdoc} + */ + public function setAccessKeyId($key) + { + $this->credentials->setAccessKeyId($key); + return $this; + } + /** + * {@inheritdoc} + */ + public function setSecretKey($secret) + { + $this->credentials->setSecretKey($secret); + return $this; + } + /** + * {@inheritdoc} + */ + public function setSecurityToken($token) + { + $this->credentials->setSecurityToken($token); + return $this; + } + /** + * {@inheritdoc} + */ + public function setExpiration($timestamp) + { + $this->credentials->setExpiration($timestamp); + return $this; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/AbstractRefreshableCredentials.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/AbstractRefreshableCredentials.php new file mode 100644 index 00000000..0b8c740e --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/AbstractRefreshableCredentials.php @@ -0,0 +1,80 @@ +credentials->isExpired()) { + $this->refresh(); + } + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\Credentials($this->credentials->getAccessKeyId(), $this->credentials->getSecretKey(), $this->credentials->getSecurityToken(), $this->credentials->getExpiration()); + } + /** + * {@inheritdoc} + */ + public function getAccessKeyId() + { + if ($this->credentials->isExpired()) { + $this->refresh(); + } + return $this->credentials->getAccessKeyId(); + } + /** + * {@inheritdoc} + */ + public function getSecretKey() + { + if ($this->credentials->isExpired()) { + $this->refresh(); + } + return $this->credentials->getSecretKey(); + } + /** + * {@inheritdoc} + */ + public function getSecurityToken() + { + if ($this->credentials->isExpired()) { + $this->refresh(); + } + return $this->credentials->getSecurityToken(); + } + /** + * {@inheritdoc} + */ + public function serialize() + { + if ($this->credentials->isExpired()) { + $this->refresh(); + } + return $this->credentials->serialize(); + } + /** + * Attempt to get new credentials + */ + protected abstract function refresh(); +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/CacheableCredentials.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/CacheableCredentials.php new file mode 100644 index 00000000..9b55bde5 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/CacheableCredentials.php @@ -0,0 +1,69 @@ +cache = $cache; + $this->cacheKey = $cacheKey; + parent::__construct($credentials); + } + /** + * Attempt to get new credentials from cache or from the adapted object + */ + protected function refresh() + { + if (!($cache = $this->cache->fetch($this->cacheKey))) { + // The credentials were not found, so try again and cache if new + $this->credentials->getAccessKeyId(); + if (!$this->credentials->isExpired()) { + // The credentials were updated, so cache them + $this->cache->save($this->cacheKey, $this->credentials, $this->credentials->getExpiration() - time()); + } + } else { + // The credentials were found in cache, so update the adapter object + // if the cached credentials are not expired + if (!$cache->isExpired()) { + $this->credentials->setAccessKeyId($cache->getAccessKeyId()); + $this->credentials->setSecretKey($cache->getSecretKey()); + $this->credentials->setSecurityToken($cache->getSecurityToken()); + $this->credentials->setExpiration($cache->getExpiration()); + } + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/Credentials.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/Credentials.php new file mode 100644 index 00000000..cadcda53 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/Credentials.php @@ -0,0 +1,270 @@ + null, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SECRET => null, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::TOKEN => null, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::TOKEN_TTD => null, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::PROFILE => null, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::CREDENTIALS_CACHE => null, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::CREDENTIALS_CACHE_KEY => null, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::CREDENTIALS_CLIENT => null); + } + /** + * Factory method for creating new credentials. This factory method will + * create the appropriate credentials object with appropriate decorators + * based on the passed configuration options. + * + * @param array $config Options to use when instantiating the credentials + * + * @return CredentialsInterface + * @throws InvalidArgumentException If the caching options are invalid + * @throws RuntimeException If using the default cache and APC is disabled + */ + public static function factory($config = array()) + { + // Add default key values + foreach (self::getConfigDefaults() as $key => $value) { + if (!isset($config[$key])) { + $config[$key] = $value; + } + } + // Set up the cache + $cache = $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::CREDENTIALS_CACHE]; + $cacheKey = $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::CREDENTIALS_CACHE_KEY] ?: 'credentials_' . ($config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::KEY] ?: crc32(gethostname())); + if ($cacheKey && $cache instanceof CacheAdapterInterface && ($cached = self::createFromCache($cache, $cacheKey))) { + return $cached; + } + // Create the credentials object + if (!$config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::KEY] || !$config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SECRET]) { + $credentials = self::createFromEnvironment($config); + } else { + // Instantiate using short or long term credentials + $credentials = new static($config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::KEY], $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SECRET], $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::TOKEN], $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::TOKEN_TTD]); + } + // Check if the credentials are refreshable, and if so, configure caching + $cache = $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::CREDENTIALS_CACHE]; + if ($cacheKey && $cache) { + $credentials = self::createCache($credentials, $cache, $cacheKey); + } + return $credentials; + } + /** + * Create credentials from the credentials ini file in the HOME directory. + * + * @param string|null $profile Pass a specific profile to use. If no + * profile is specified we will attempt to use + * the value specified in the AWS_PROFILE + * environment variable. If AWS_PROFILE is not + * set, the "default" profile is used. + * @param string|null $filename Pass a string to specify the location of the + * credentials files. If null is passed, the + * SDK will attempt to find the configuration + * file at in your HOME directory at + * ~/.aws/credentials. + * @return CredentialsInterface + * @throws \RuntimeException if the file cannot be found, if the file is + * invalid, or if the profile is invalid. + */ + public static function fromIni($profile = null, $filename = null) + { + if (!$filename) { + $filename = self::getHomeDir() . '/.aws/credentials'; + } + if (!$profile) { + $profile = self::getEnvVar(self::ENV_PROFILE) ?: 'default'; + } + if (!is_readable($filename) || ($data = parse_ini_file($filename, true)) === false) { + throw new \RuntimeException("Invalid AWS credentials file: {$filename}."); + } + if (!isset($data[$profile]['aws_access_key_id']) || !isset($data[$profile]['aws_secret_access_key'])) { + throw new \RuntimeException("Invalid AWS credentials profile {$profile} in {$filename}."); + } + return new self($data[$profile]['aws_access_key_id'], $data[$profile]['aws_secret_access_key'], isset($data[$profile]['aws_security_token']) ? $data[$profile]['aws_security_token'] : null); + } + /** + * Constructs a new BasicAWSCredentials object, with the specified AWS + * access key and AWS secret key + * + * @param string $accessKeyId AWS access key ID + * @param string $secretAccessKey AWS secret access key + * @param string $token Security token to use + * @param int $expiration UNIX timestamp for when credentials expire + */ + public function __construct($accessKeyId, $secretAccessKey, $token = null, $expiration = null) + { + $this->key = trim($accessKeyId); + $this->secret = trim($secretAccessKey); + $this->token = $token; + $this->ttd = $expiration; + } + public function serialize() + { + return json_encode(array(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::KEY => $this->key, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SECRET => $this->secret, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::TOKEN => $this->token, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::TOKEN_TTD => $this->ttd)); + } + public function unserialize($serialized) + { + $data = json_decode($serialized, true); + $this->key = $data[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::KEY]; + $this->secret = $data[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SECRET]; + $this->token = $data[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::TOKEN]; + $this->ttd = $data[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::TOKEN_TTD]; + } + public function getAccessKeyId() + { + return $this->key; + } + public function getSecretKey() + { + return $this->secret; + } + public function getSecurityToken() + { + return $this->token; + } + public function getExpiration() + { + return $this->ttd; + } + public function isExpired() + { + return $this->ttd !== null && time() >= $this->ttd; + } + public function setAccessKeyId($key) + { + $this->key = $key; + return $this; + } + public function setSecretKey($secret) + { + $this->secret = $secret; + return $this; + } + public function setSecurityToken($token) + { + $this->token = $token; + return $this; + } + public function setExpiration($timestamp) + { + $this->ttd = $timestamp; + return $this; + } + /** + * When no keys are provided, attempt to create them based on the + * environment or instance profile credentials. + * + * @param array|Collection $config + * + * @return CredentialsInterface + */ + private static function createFromEnvironment($config) + { + // Get key and secret from ENV variables + $envKey = self::getEnvVar(self::ENV_KEY); + if (!($envSecret = self::getEnvVar(self::ENV_SECRET))) { + // Use AWS_SECRET_ACCESS_KEY if AWS_SECRET_KEY was not set + $envSecret = self::getEnvVar(self::ENV_SECRET_ACCESS_KEY); + } + // Use credentials from the environment variables if available + if ($envKey && $envSecret) { + return new static($envKey, $envSecret); + } + try { + // Use credentials from the INI file in HOME directory if available + return self::fromIni($config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::PROFILE]); + } catch (\RuntimeException $e) { + // Otherwise, try using instance profile credentials (available on EC2 instances) + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\RefreshableInstanceProfileCredentials(new static('', '', '', 1), $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::CREDENTIALS_CLIENT]); + } + } + private static function createFromCache(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Cache\CacheAdapterInterface $cache, $cacheKey) + { + $cached = $cache->fetch($cacheKey); + if ($cached instanceof CredentialsInterface && !$cached->isExpired()) { + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\CacheableCredentials($cached, $cache, $cacheKey); + } + return null; + } + private static function createCache(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\CredentialsInterface $credentials, $cache, $cacheKey) + { + if ($cache === 'true' || $cache === true) { + // If no cache adapter was provided, then create one for the user + // @codeCoverageIgnoreStart + if (!extension_loaded('apc')) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RequiredExtensionNotLoadedException('PHP has not been compiled with APC. Unable to cache ' . 'the credentials.'); + } elseif (!class_exists('DeliciousBrains\\WP_Offload_S3\\Aws2\\Doctrine\\Common\\Cache\\ApcCache')) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('Cannot set ' . \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::CREDENTIALS_CACHE . ' to true because the Doctrine cache component is ' . 'not installed. Either install doctrine/cache or pass in an instantiated ' . 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\CacheAdapterInterface object'); + } + // @codeCoverageIgnoreEnd + $cache = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Cache\DoctrineCacheAdapter(new \DeliciousBrains\WP_Offload_S3\Aws2\Doctrine\Common\Cache\ApcCache()); + } elseif (!$cache instanceof CacheAdapterInterface) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('Unable to utilize caching with the specified options'); + } + // Decorate the credentials with a cache + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\CacheableCredentials($credentials, $cache, $cacheKey); + } + private static function getHomeDir() + { + // On Linux/Unix-like systems, use the HOME environment variable + if ($homeDir = self::getEnvVar('HOME')) { + return $homeDir; + } + // Get the HOMEDRIVE and HOMEPATH values for Windows hosts + $homeDrive = self::getEnvVar('HOMEDRIVE'); + $homePath = self::getEnvVar('HOMEPATH'); + return $homeDrive && $homePath ? $homeDrive . $homePath : null; + } + /** + * Fetches the value of an environment variable by checking $_SERVER and getenv(). + * + * @param string $var Name of the environment variable + * + * @return mixed|null + */ + private static function getEnvVar($var) + { + return isset($_SERVER[$var]) ? $_SERVER[$var] : getenv($var); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/CredentialsInterface.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/CredentialsInterface.php new file mode 100644 index 00000000..e21e79c8 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Credentials/CredentialsInterface.php @@ -0,0 +1,88 @@ +setClient($client); + } + public function setClient(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\InstanceMetadata\InstanceMetadataClient $client = null) + { + $this->customClient = null !== $client; + $this->client = $client ?: \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\InstanceMetadata\InstanceMetadataClient::factory(); + } + public function serialize() + { + $serializable = array('credentials' => parent::serialize(), 'customClient' => $this->customClient); + if ($this->customClient) { + $serializable['client'] = serialize($this->client); + } + return json_encode($serializable); + } + public function unserialize($value) + { + $serialized = json_decode($value, true); + parent::unserialize($serialized['credentials']); + $this->customClient = $serialized['customClient']; + $this->client = $this->customClient ? unserialize($serialized['client']) : \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\InstanceMetadata\InstanceMetadataClient::factory(); + } + /** + * Attempt to get new credentials from the instance profile + * + * @throws InstanceProfileCredentialsException On error + */ + protected function refresh() + { + $credentials = $this->client->getInstanceProfileCredentials(); + // Expire the token 5 minutes early to pre-fetch before expiring. + $this->credentials->setAccessKeyId($credentials->getAccessKeyId())->setSecretKey($credentials->getSecretKey())->setSecurityToken($credentials->getSecurityToken())->setExpiration($credentials->getExpiration() - 300); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Enum.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Enum.php new file mode 100644 index 00000000..e67bbe7b --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Enum.php @@ -0,0 +1,51 @@ +getConstants(); + } + return self::$cache[$class]; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Enum/ClientOptions.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Enum/ClientOptions.php new file mode 100644 index 00000000..1ad22a53 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Enum/ClientOptions.php @@ -0,0 +1,142 @@ +factory = $factory; + } + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() + { + return array('request.error' => array('onRequestError', -1)); + } + /** + * Throws a more meaningful request exception if available + * + * @param Event $event Event emitted + */ + public function onRequestError(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $e = $this->factory->fromResponse($event['request'], $event['response']); + $event->stopPropagation(); + throw $e; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/InstanceProfileCredentialsException.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/InstanceProfileCredentialsException.php new file mode 100644 index 00000000..0ec9d9b1 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/InstanceProfileCredentialsException.php @@ -0,0 +1,47 @@ +statusCode = $code; + } + /** + * Get the error response code from the service + * + * @return string|null + */ + public function getStatusCode() + { + return $this->statusCode; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/InvalidArgumentException.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/InvalidArgumentException.php new file mode 100644 index 00000000..8d6eb645 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/InvalidArgumentException.php @@ -0,0 +1,24 @@ +getMessage(), 0, $exception); + $this->state = $state; + } + /** + * Get the state of the transfer + * + * @return TransferStateInterface + */ + public function getState() + { + return $this->state; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/NamespaceExceptionFactory.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/NamespaceExceptionFactory.php new file mode 100644 index 00000000..983804ce --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/NamespaceExceptionFactory.php @@ -0,0 +1,89 @@ +parser = $parser; + $this->baseNamespace = $baseNamespace; + $this->defaultException = $defaultException; + } + /** + * {@inheritdoc} + */ + public function fromResponse(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + $parts = $this->parser->parse($request, $response); + // Removing leading 'AWS.' and embedded periods + $className = $this->baseNamespace . '\\' . str_replace(array('AWS.', '.'), '', $parts['code']); + if (substr($className, -9) !== 'Exception') { + $className .= 'Exception'; + } + $className = class_exists($className) ? $className : $this->defaultException; + return $this->createException($className, $request, $response, $parts); + } + /** + * Create an prepare an exception object + * + * @param string $className Name of the class to create + * @param RequestInterface $request Request + * @param Response $response Response received + * @param array $parts Parsed exception data + * + * @return \Exception + */ + protected function createException($className, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response, array $parts) + { + $class = new $className($parts['message']); + if ($class instanceof ServiceResponseException) { + $class->setExceptionCode($parts['code']); + $class->setExceptionType($parts['type']); + $class->setResponse($response); + $class->setRequest($request); + $class->setRequestId($parts['request_id']); + } + return $class; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/OutOfBoundsException.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/OutOfBoundsException.php new file mode 100644 index 00000000..c4eb1301 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/OutOfBoundsException.php @@ -0,0 +1,24 @@ + null, 'message' => null, 'type' => $response->isClientError() ? 'client' : 'server', 'request_id' => (string) $response->getHeader('x-amzn-RequestId'), 'parsed' => null); + // Parse the json and normalize key casings + if (null !== ($json = json_decode($response->getBody(true), true))) { + $data['parsed'] = array_change_key_case($json); + } + // Do additional, protocol-specific parsing and return the result + $data = $this->doParse($data, $response); + // Remove "Fault" suffix from exception names + if (isset($data['code']) && strpos($data['code'], 'Fault')) { + $data['code'] = preg_replace('/^([a-zA-Z]+)Fault$/', '$1', $data['code']); + } + return $data; + } + /** + * Pull relevant exception data out of the parsed json + * + * @param array $data The exception data + * @param Response $response The response from the service containing the error + * + * @return array + */ + protected abstract function doParse(array $data, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response); +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/DefaultXmlExceptionParser.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/DefaultXmlExceptionParser.php new file mode 100644 index 00000000..4be51db9 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/DefaultXmlExceptionParser.php @@ -0,0 +1,93 @@ + null, 'message' => null, 'type' => $response->isClientError() ? 'client' : 'server', 'request_id' => null, 'parsed' => null); + $body = $response->getBody(true); + if (!$body) { + $this->parseHeaders($request, $response, $data); + return $data; + } + try { + $xml = new \SimpleXMLElement($body); + $this->parseBody($xml, $data); + return $data; + } catch (\Exception $e) { + // Gracefully handle parse errors. This could happen when the + // server responds with a non-XML response (e.g., private beta + // services). + $data['code'] = 'PhpInternalXmlParseError'; + $data['message'] = 'A non-XML response was received'; + return $data; + } + } + /** + * Parses additional exception information from the response headers + * + * @param RequestInterface $request Request that was issued + * @param Response $response The response from the request + * @param array $data The current set of exception data + */ + protected function parseHeaders(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response, array &$data) + { + $data['message'] = $response->getStatusCode() . ' ' . $response->getReasonPhrase(); + if ($requestId = $response->getHeader('x-amz-request-id')) { + $data['request_id'] = $requestId; + $data['message'] .= " (Request-ID: {$requestId})"; + } + } + /** + * Parses additional exception information from the response body + * + * @param \SimpleXMLElement $body The response body as XML + * @param array $data The current set of exception data + */ + protected function parseBody(\SimpleXMLElement $body, array &$data) + { + $data['parsed'] = $body; + $namespaces = $body->getDocNamespaces(); + if (isset($namespaces[''])) { + // Account for the default namespace being defined and PHP not being able to handle it :( + $body->registerXPathNamespace('ns', $namespaces['']); + $prefix = 'ns:'; + } else { + $prefix = ''; + } + if ($tempXml = $body->xpath("//{$prefix}Code[1]")) { + $data['code'] = (string) $tempXml[0]; + } + if ($tempXml = $body->xpath("//{$prefix}Message[1]")) { + $data['message'] = (string) $tempXml[0]; + } + $tempXml = $body->xpath("//{$prefix}RequestId[1]"); + if (empty($tempXml)) { + $tempXml = $body->xpath("//{$prefix}RequestID[1]"); + } + if (isset($tempXml[0])) { + $data['request_id'] = (string) $tempXml[0]; + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/ExceptionParserInterface.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/ExceptionParserInterface.php new file mode 100644 index 00000000..c70ae771 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/ExceptionParserInterface.php @@ -0,0 +1,41 @@ +getHeader('x-amzn-ErrorType')) { + $data['code'] = substr($code, 0, strpos($code, ':')); + } + return $data; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/RequiredExtensionNotLoadedException.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/RequiredExtensionNotLoadedException.php new file mode 100644 index 00000000..cd2db9a2 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/RequiredExtensionNotLoadedException.php @@ -0,0 +1,24 @@ +exceptionCode = $code; + } + /** + * Get the exception code + * + * @return string|null + */ + public function getExceptionCode() + { + return $this->exceptionCode; + } + /** + * Set the exception type + * + * @param string $type Exception type + */ + public function setExceptionType($type) + { + $this->exceptionType = $type; + } + /** + * Get the exception type (one of client or server) + * + * @return string|null + */ + public function getExceptionType() + { + return $this->exceptionType; + } + /** + * Set the request ID + * + * @param string $id Request ID + */ + public function setRequestId($id) + { + $this->requestId = $id; + } + /** + * Get the Request ID + * + * @return string|null + */ + public function getRequestId() + { + return $this->requestId; + } + /** + * Set the associated response + * + * @param Response $response Response + */ + public function setResponse(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + $this->response = $response; + } + /** + * Get the associated response object + * + * @return Response|null + */ + public function getResponse() + { + return $this->response; + } + /** + * Set the associated request + * + * @param RequestInterface $request + */ + public function setRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $this->request = $request; + } + /** + * Get the associated request object + * + * @return RequestInterface|null + */ + public function getRequest() + { + return $this->request; + } + /** + * Get the status code of the response + * + * @return int|null + */ + public function getStatusCode() + { + return $this->response ? $this->response->getStatusCode() : null; + } + /** + * Cast to a string + * + * @return string + */ + public function __toString() + { + $message = get_class($this) . ': ' . 'AWS Error Code: ' . $this->getExceptionCode() . ', ' . 'Status Code: ' . $this->getStatusCode() . ', ' . 'AWS Request ID: ' . $this->getRequestId() . ', ' . 'AWS Error Type: ' . $this->getExceptionType() . ', ' . 'AWS Error Message: ' . $this->getMessage(); + // Add the User-Agent if available + if ($this->request) { + $message .= ', ' . 'User-Agent: ' . $this->request->getHeader('User-Agent'); + } + return $message; + } + /** + * Get the request ID of the error. This value is only present if a + * response was received, and is not present in the event of a networking + * error. + * + * Same as `getRequestId()` method, but matches the interface for SDKv3. + * + * @return string|null Returns null if no response was received + */ + public function getAwsRequestId() + { + return $this->requestId; + } + /** + * Get the AWS error type. + * + * Same as `getExceptionType()` method, but matches the interface for SDKv3. + * + * @return string|null Returns null if no response was received + */ + public function getAwsErrorType() + { + return $this->exceptionType; + } + /** + * Get the AWS error code. + * + * Same as `getExceptionCode()` method, but matches the interface for SDKv3. + * + * @return string|null Returns null if no response was received + */ + public function getAwsErrorCode() + { + return $this->exceptionCode; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/TransferException.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/TransferException.php new file mode 100644 index 00000000..99992b1d --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Exception/TransferException.php @@ -0,0 +1,25 @@ +getConfig() as $service) { + if (isset($service['alias'], $service['class'])) { + $facadeClass = __NAMESPACE__ . '\\' . $service['alias']; + $facadeAlias = ltrim($targetNamespace . '\\' . $service['alias'], '\\'); + if (!class_exists($facadeAlias) && class_exists($facadeClass)) { + // @codeCoverageIgnoreStart + class_alias($facadeClass, $facadeAlias); + // @codeCoverageIgnoreEnd + } + } + } + } + /** + * Returns the instance of the client that the facade operates on + * + * @return \Aws\Common\Client\AwsClientInterface + */ + public static function getClient() + { + return self::$serviceBuilder->get(static::getServiceBuilderKey()); + } + public static function __callStatic($method, $args) + { + return call_user_func_array(array(self::getClient(), $method), $args); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Facade/FacadeInterface.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Facade/FacadeInterface.php new file mode 100644 index 00000000..bd29f412 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Facade/FacadeInterface.php @@ -0,0 +1,34 @@ +context = hash_init($algorithm); + } + /** + * {@inheritdoc} + */ + public function addData($data) + { + if (!$this->context) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\LogicException('You may not add more data to a finalized chunk hash.'); + } + hash_update($this->context, $data); + return $this; + } + /** + * {@inheritdoc} + */ + public function getHash($returnBinaryForm = false) + { + if (!$this->hash) { + $this->hashRaw = hash_final($this->context, true); + $this->hash = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Hash\HashUtils::binToHex($this->hashRaw); + $this->context = null; + } + return $returnBinaryForm ? $this->hashRaw : $this->hash; + } + /** + * {@inheritdoc} + */ + public function __clone() + { + if ($this->context) { + $this->context = hash_copy($this->context); + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Hash/ChunkHashInterface.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Hash/ChunkHashInterface.php new file mode 100644 index 00000000..15af8512 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Hash/ChunkHashInterface.php @@ -0,0 +1,49 @@ +checksums = $inBinaryForm ? $checksums : array_map('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Hash\\HashUtils::hexToBin', $checksums); + // Pre-calculate hash + $treeHash->getHash(); + return $treeHash; + } + /** + * Create a tree hash from a content body + * + * @param string|resource|EntityBody $content Content to create a tree hash for + * @param string $algorithm A valid hash algorithm name as returned by `hash_algos()` + * + * @return TreeHash + */ + public static function fromContent($content, $algorithm = self::DEFAULT_ALGORITHM) + { + $treeHash = new self($algorithm); + // Read the data in 1MB chunks and add to tree hash + $content = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory($content); + while ($data = $content->read(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\Size::MB)) { + $treeHash->addData($data); + } + // Pre-calculate hash + $treeHash->getHash(); + return $treeHash; + } + /** + * Validates an entity body with a tree hash checksum + * + * @param string|resource|EntityBody $content Content to create a tree hash for + * @param string $checksum The checksum to use for validation + * @param string $algorithm A valid hash algorithm name as returned by `hash_algos()` + * + * @return bool + */ + public static function validateChecksum($content, $checksum, $algorithm = self::DEFAULT_ALGORITHM) + { + $treeHash = self::fromContent($content, $algorithm); + return $checksum === $treeHash->getHash(); + } + /** + * {@inheritdoc} + */ + public function __construct($algorithm = self::DEFAULT_ALGORITHM) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Hash\HashUtils::validateAlgorithm($algorithm); + $this->algorithm = $algorithm; + } + /** + * {@inheritdoc} + * @throws LogicException if the root tree hash is already calculated + * @throws InvalidArgumentException if the data is larger than 1MB + */ + public function addData($data) + { + // Error if hash is already calculated + if ($this->hash) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\LogicException('You may not add more data to a finalized tree hash.'); + } + // Make sure that only 1MB chunks or smaller get passed in + if (strlen($data) > \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\Size::MB) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('The chunk of data added is too large for tree hashing.'); + } + // Store the raw hash of this data segment + $this->checksums[] = hash($this->algorithm, $data, true); + return $this; + } + /** + * Add a checksum to the tree hash directly + * + * @param string $checksum The checksum to add + * @param bool $inBinaryForm Whether or not the checksum is already in binary form + * + * @return self + * @throws LogicException if the root tree hash is already calculated + */ + public function addChecksum($checksum, $inBinaryForm = false) + { + // Error if hash is already calculated + if ($this->hash) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\LogicException('You may not add more checksums to a finalized tree hash.'); + } + // Convert the checksum to binary form if necessary + $this->checksums[] = $inBinaryForm ? $checksum : \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Hash\HashUtils::hexToBin($checksum); + return $this; + } + /** + * {@inheritdoc} + */ + public function getHash($returnBinaryForm = false) + { + if (!$this->hash) { + // Perform hashes up the tree to arrive at the root checksum of the tree hash + $hashes = $this->checksums; + while (count($hashes) > 1) { + $sets = array_chunk($hashes, 2); + $hashes = array(); + foreach ($sets as $set) { + $hashes[] = count($set) === 1 ? $set[0] : hash($this->algorithm, $set[0] . $set[1], true); + } + } + $this->hashRaw = $hashes[0]; + $this->hash = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Hash\HashUtils::binToHex($this->hashRaw); + } + return $returnBinaryForm ? $this->hashRaw : $this->hash; + } + /** + * @return array Array of raw checksums composing the tree hash + */ + public function getChecksums() + { + return $this->checksums; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/HostNameUtils.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/HostNameUtils.php new file mode 100644 index 00000000..420f319b --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/HostNameUtils.php @@ -0,0 +1,75 @@ +getHost(), -14) != '.amazonaws.com') { + return self::DEFAULT_REGION; + } + $serviceAndRegion = substr($url->getHost(), 0, -14); + // Special handling for S3 regions + $separator = strpos($serviceAndRegion, 's3') === 0 ? '-' : '.'; + $separatorPos = strpos($serviceAndRegion, $separator); + // If don't detect a separator, then return the default region + if ($separatorPos === false) { + return self::DEFAULT_REGION; + } + $region = substr($serviceAndRegion, $separatorPos + 1); + // All GOV regions currently use the default GOV region + if ($region == 'us-gov') { + return self::DEFAULT_GOV_REGION; + } + return $region; + } + /** + * Parse the AWS service name from a URL + * + * @param Url $url HTTP URL + * + * @return string Returns a service name (or empty string) + * @link http://docs.aws.amazon.com/general/latest/gr/rande.html + */ + public static function parseServiceName(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Url $url) + { + // The service name is the first part of the host + $parts = explode('.', $url->getHost(), 2); + // Special handling for S3 + if (stripos($parts[0], 's3') === 0) { + return 's3'; + } + return $parts[0]; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/InstanceMetadata/InstanceMetadataClient.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/InstanceMetadata/InstanceMetadataClient.php new file mode 100644 index 00000000..37975919 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/InstanceMetadata/InstanceMetadataClient.php @@ -0,0 +1,81 @@ + 'http://169.254.169.254/{version}/', 'version' => 'latest', 'request.options' => array('connect_timeout' => 5, 'timeout' => 10)), array('base_url', 'version')); + return new self($config); + } + /** + * Constructor override + */ + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection $config) + { + $this->setConfig($config); + $this->setBaseUrl($config->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BASE_URL)); + $this->defaultHeaders = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection(); + $this->setRequestFactory(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestFactory::getInstance()); + } + /** + * Get instance profile credentials + * + * @return Credentials + * @throws InstanceProfileCredentialsException + */ + public function getInstanceProfileCredentials() + { + try { + $request = $this->get('meta-data/iam/security-credentials/'); + $credentials = trim($request->send()->getBody(true)); + $result = $this->get("meta-data/iam/security-credentials/{$credentials}")->send()->json(); + } catch (\Exception $e) { + $message = sprintf('Error retrieving credentials from the instance profile metadata server. When you are' . ' not running inside of Amazon EC2, you must provide your AWS access key ID and secret access key in' . ' the "key" and "secret" options when creating a client or provide an instantiated' . ' Aws\\Common\\Credentials\\CredentialsInterface object. (%s)', $e->getMessage()); + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InstanceProfileCredentialsException($message, $e->getCode()); + } + // Ensure that the status code was successful + if ($result['Code'] !== 'Success') { + $e = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InstanceProfileCredentialsException('Unexpected response code: ' . $result['Code']); + $e->setStatusCode($result['Code']); + throw $e; + } + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\Credentials($result['AccessKeyId'], $result['SecretAccessKey'], $result['Token'], strtotime($result['Expiration'])); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/InstanceMetadata/Waiter/ServiceAvailable.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/InstanceMetadata/Waiter/ServiceAvailable.php new file mode 100644 index 00000000..2bd3e8e2 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/InstanceMetadata/Waiter/ServiceAvailable.php @@ -0,0 +1,46 @@ +client->get(); + try { + $request->getCurlOptions()->set(CURLOPT_CONNECTTIMEOUT, 10)->set(CURLOPT_TIMEOUT, 10); + $request->send(); + return true; + } catch (CurlException $e) { + return false; + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Iterator/AwsResourceIterator.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Iterator/AwsResourceIterator.php new file mode 100644 index 00000000..d87ed857 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Iterator/AwsResourceIterator.php @@ -0,0 +1,152 @@ +lastResult; + } + /** + * {@inheritdoc} + * This AWS specific version of the resource iterator provides a default implementation of the typical AWS iterator + * process. It relies on configuration and extension to implement the operation-specific logic of handling results + * and nextTokens. This method will loop until resources are acquired or there are no more iterations available. + */ + protected function sendRequest() + { + do { + // Prepare the request including setting the next token + $this->prepareRequest(); + if ($this->nextToken) { + $this->applyNextToken(); + } + // Execute the request and handle the results + $this->command->add(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::OPTION, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::ITERATOR); + $this->lastResult = $this->command->getResult(); + $resources = $this->handleResults($this->lastResult); + $this->determineNextToken($this->lastResult); + // If no resources collected, prepare to reiterate before yielding + if ($reiterate = empty($resources) && $this->nextToken) { + $this->command = clone $this->originalCommand; + } + } while ($reiterate); + return $resources; + } + protected function prepareRequest() + { + // Get the limit parameter key to set + $limitKey = $this->get('limit_key'); + if ($limitKey && ($limit = $this->command->get($limitKey))) { + $pageSize = $this->calculatePageSize(); + // If the limit of the command is different than the pageSize of the iterator, use the smaller value + if ($limit && $pageSize) { + $realLimit = min($limit, $pageSize); + $this->command->set($limitKey, $realLimit); + } + } + } + protected function handleResults(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\Model $result) + { + $results = array(); + // Get the result key that contains the results + if ($resultKey = $this->get('result_key')) { + $results = $this->getValueFromResult($result, $resultKey) ?: array(); + } + return $results; + } + protected function applyNextToken() + { + // Get the token parameter key to set + if ($tokenParam = $this->get('input_token')) { + // Set the next token. Works with multi-value tokens + if (is_array($tokenParam)) { + if (is_array($this->nextToken) && count($tokenParam) === count($this->nextToken)) { + foreach (array_combine($tokenParam, $this->nextToken) as $param => $token) { + $this->command->set($param, $token); + } + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('The definition of the iterator\'s token parameter and the actual token ' . 'value are not compatible.'); + } + } else { + $this->command->set($tokenParam, $this->nextToken); + } + } + } + protected function determineNextToken(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\Model $result) + { + $this->nextToken = null; + // If the value of "more_results" is true or there is no "more_results" to check, then try to get the next token + $moreKey = $this->get('more_results'); + if ($moreKey === null || $this->getValueFromResult($result, $moreKey)) { + // Get the token key to check + if ($tokenKey = $this->get('output_token')) { + // Get the next token's value. Works with multi-value tokens + if (is_array($tokenKey)) { + $this->nextToken = array(); + foreach ($tokenKey as $key) { + $this->nextToken[] = $this->getValueFromResult($result, $key); + } + } else { + $this->nextToken = $this->getValueFromResult($result, $tokenKey); + } + } + } + } + /** + * Extracts the value from the result using Collection::getPath. Also adds some additional logic for keys that need + * to access n-1 indexes (e.g., ImportExport, Kinesis). The n-1 logic only works for the known cases. We will switch + * to a jmespath implementation in the future to cover all cases + * + * @param Model $result + * @param string $key + * + * @return mixed|null + */ + protected function getValueFromResult(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\Model $result, $key) + { + // Special handling for keys that need to access n-1 indexes + if (strpos($key, '#') !== false) { + $keyParts = explode('#', $key, 2); + $items = $result->getPath(trim($keyParts[0], '/')); + if ($items && is_array($items)) { + $index = count($items) - 1; + $key = strtr($key, array('#' => $index)); + } + } + // Get the value + return $result->getPath($key); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Iterator/AwsResourceIteratorFactory.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Iterator/AwsResourceIteratorFactory.php new file mode 100644 index 00000000..4002e983 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Iterator/AwsResourceIteratorFactory.php @@ -0,0 +1,84 @@ + null, 'output_token' => null, 'limit_key' => null, 'result_key' => null, 'more_results' => null); + /** + * @var array Legacy configuration options mapped to their new names + */ + private static $legacyConfigOptions = array('token_param' => 'input_token', 'token_key' => 'output_token', 'limit_param' => 'limit_key', 'more_key' => 'more_results'); + /** + * @var array Iterator configuration for each iterable operation + */ + protected $config; + /** + * @var ResourceIteratorFactoryInterface Another factory that will be used first to instantiate the iterator + */ + protected $primaryIteratorFactory; + /** + * @param array $config An array of configuration values for the factory + * @param ResourceIteratorFactoryInterface $primaryIteratorFactory Another factory to use for chain of command + */ + public function __construct(array $config, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\ResourceIteratorFactoryInterface $primaryIteratorFactory = null) + { + $this->primaryIteratorFactory = $primaryIteratorFactory; + $this->config = array(); + foreach ($config as $name => $operation) { + $this->config[$name] = $operation + self::$defaultIteratorConfig; + } + } + public function build(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, array $options = array()) + { + // Get the configuration data for the command + $commandName = $command->getName(); + $commandSupported = isset($this->config[$commandName]); + $options = $this->translateLegacyConfigOptions($options); + $options += $commandSupported ? $this->config[$commandName] : array(); + // Instantiate the iterator using the primary factory (if one was provided) + if ($this->primaryIteratorFactory && $this->primaryIteratorFactory->canBuild($command)) { + $iterator = $this->primaryIteratorFactory->build($command, $options); + } elseif (!$commandSupported) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException("Iterator was not found for {$commandName}."); + } else { + // Instantiate a generic AWS resource iterator + $iterator = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Iterator\AwsResourceIterator($command, $options); + } + return $iterator; + } + public function canBuild(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + if ($this->primaryIteratorFactory) { + return $this->primaryIteratorFactory->canBuild($command); + } else { + return isset($this->config[$command->getName()]); + } + } + /** + * @param array $config The config for a single operation + * + * @return array The modified config with legacy options translated + */ + private function translateLegacyConfigOptions($config) + { + foreach (self::$legacyConfigOptions as $legacyOption => $newOption) { + if (isset($config[$legacyOption])) { + $config[$newOption] = $config[$legacyOption]; + unset($config[$legacyOption]); + } + } + return $config; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractTransfer.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractTransfer.php new file mode 100644 index 00000000..b8767d02 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractTransfer.php @@ -0,0 +1,219 @@ +client = $client; + $this->state = $state; + $this->source = $source; + $this->options = $options; + $this->init(); + $this->partSize = $this->calculatePartSize(); + } + public function __invoke() + { + return $this->upload(); + } + /** + * {@inheritdoc} + */ + public static function getAllEvents() + { + return array(self::BEFORE_PART_UPLOAD, self::AFTER_UPLOAD, self::BEFORE_PART_UPLOAD, self::AFTER_PART_UPLOAD, self::AFTER_ABORT, self::AFTER_COMPLETE); + } + /** + * {@inheritdoc} + */ + public function abort() + { + $command = $this->getAbortCommand(); + $result = $command->getResult(); + $this->state->setAborted(true); + $this->stop(); + $this->dispatch(self::AFTER_ABORT, $this->getEventData($command)); + return $result; + } + /** + * {@inheritdoc} + */ + public function stop() + { + $this->stopped = true; + return $this->state; + } + /** + * {@inheritdoc} + */ + public function getState() + { + return $this->state; + } + /** + * Get the array of options associated with the transfer + * + * @return array + */ + public function getOptions() + { + return $this->options; + } + /** + * Set an option on the transfer + * + * @param string $option Name of the option + * @param mixed $value Value to set + * + * @return self + */ + public function setOption($option, $value) + { + $this->options[$option] = $value; + return $this; + } + /** + * Get the source body of the upload + * + * @return EntityBodyInterface + */ + public function getSource() + { + return $this->source; + } + /** + * {@inheritdoc} + * @throws MultipartUploadException when an error is encountered. Use getLastException() to get more information. + * @throws RuntimeException when attempting to upload an aborted transfer + */ + public function upload() + { + if ($this->state->isAborted()) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('The transfer has been aborted and cannot be uploaded'); + } + $this->stopped = false; + $eventData = $this->getEventData(); + $this->dispatch(self::BEFORE_UPLOAD, $eventData); + try { + $this->transfer(); + $this->dispatch(self::AFTER_UPLOAD, $eventData); + if ($this->stopped) { + return null; + } else { + $result = $this->complete(); + $this->dispatch(self::AFTER_COMPLETE, $eventData); + } + } catch (\Exception $e) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\MultipartUploadException($this->state, $e); + } + return $result; + } + /** + * Get an array used for event notifications + * + * @param OperationCommand $command Command to include in event data + * + * @return array + */ + protected function getEventData(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\OperationCommand $command = null) + { + $data = array('transfer' => $this, 'source' => $this->source, 'options' => $this->options, 'client' => $this->client, 'part_size' => $this->partSize, 'state' => $this->state); + if ($command) { + $data['command'] = $command; + } + return $data; + } + /** + * Hook to initialize the transfer + */ + protected function init() + { + } + /** + * Determine the upload part size based on the size of the source data and + * taking into account the acceptable minimum and maximum part sizes. + * + * @return int The part size + */ + protected abstract function calculatePartSize(); + /** + * Complete the multipart upload + * + * @return Model Returns the result of the complete multipart upload command + */ + protected abstract function complete(); + /** + * Hook to implement in subclasses to perform the actual transfer + */ + protected abstract function transfer(); + /** + * Fetches the abort command fom the concrete implementation + * + * @return OperationCommand + */ + protected abstract function getAbortCommand(); +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractTransferState.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractTransferState.php new file mode 100644 index 00000000..4f1b0be8 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractTransferState.php @@ -0,0 +1,145 @@ +uploadId = $uploadId; + } + /** + * {@inheritdoc} + */ + public function getUploadId() + { + return $this->uploadId; + } + /** + * Get a data value from the transfer state's uploadId + * + * @param string $key Key to retrieve (e.g. Bucket, Key, UploadId, etc) + * + * @return string|null + */ + public function getFromId($key) + { + $params = $this->uploadId->toParams(); + return isset($params[$key]) ? $params[$key] : null; + } + /** + * {@inheritdoc} + */ + public function getPart($partNumber) + { + return isset($this->parts[$partNumber]) ? $this->parts[$partNumber] : null; + } + /** + * {@inheritdoc} + */ + public function addPart(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Model\MultipartUpload\UploadPartInterface $part) + { + $partNumber = $part->getPartNumber(); + $this->parts[$partNumber] = $part; + return $this; + } + /** + * {@inheritdoc} + */ + public function hasPart($partNumber) + { + return isset($this->parts[$partNumber]); + } + /** + * {@inheritdoc} + */ + public function getPartNumbers() + { + return array_keys($this->parts); + } + /** + * {@inheritdoc} + */ + public function setAborted($aborted) + { + $this->aborted = (bool) $aborted; + return $this; + } + /** + * {@inheritdoc} + */ + public function isAborted() + { + return $this->aborted; + } + /** + * {@inheritdoc} + */ + public function count() + { + return count($this->parts); + } + /** + * {@inheritdoc} + */ + public function getIterator() + { + return new \ArrayIterator($this->parts); + } + /** + * {@inheritdoc} + */ + public function serialize() + { + return serialize(get_object_vars($this)); + } + /** + * {@inheritdoc} + */ + public function unserialize($serialized) + { + $data = unserialize($serialized); + foreach (get_object_vars($this) as $property => $oldValue) { + if (array_key_exists($property, $data)) { + $this->{$property} = $data[$property]; + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException("The {$property} property could be restored during unserialization."); + } + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadBuilder.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadBuilder.php new file mode 100644 index 00000000..17619368 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadBuilder.php @@ -0,0 +1,131 @@ +client = $client; + return $this; + } + /** + * Set the state of the upload. This is useful for resuming from a previously started multipart upload. + * You must use a local file stream as the data source if you wish to resume from a previous upload. + * + * @param TransferStateInterface|string $state Pass a TransferStateInterface object or the ID of the initiated + * multipart upload. When an ID is passed, the builder will create a + * state object using the data from a ListParts API response. + * + * @return $this + */ + public function resumeFrom($state) + { + $this->state = $state; + return $this; + } + /** + * Set the data source of the transfer + * + * @param resource|string|EntityBody $source Source of the transfer. Pass a string to transfer from a file on disk. + * You can also stream from a resource returned from fopen or a Guzzle + * {@see EntityBody} object. + * + * @return $this + * @throws InvalidArgumentException when the source cannot be found or opened + */ + public function setSource($source) + { + // Use the contents of a file as the data source + if (is_string($source)) { + if (!file_exists($source)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException("File does not exist: {$source}"); + } + // Clear the cache so that we send accurate file sizes + clearstatcache(true, $source); + $source = fopen($source, 'r'); + } + $this->source = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory($source); + if ($this->source->isSeekable() && $this->source->getSize() == 0) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('Empty body provided to upload builder'); + } + return $this; + } + /** + * Specify the headers to set on the upload + * + * @param array $headers Headers to add to the uploaded object + * + * @return $this + */ + public function setHeaders(array $headers) + { + $this->headers = $headers; + return $this; + } + /** + * Build the appropriate uploader based on the builder options + * + * @return TransferInterface + */ + public abstract function build(); + /** + * Initiate the multipart upload + * + * @return TransferStateInterface + */ + protected abstract function initiateMultipartUpload(); +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadId.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadId.php new file mode 100644 index 00000000..2925d33c --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadId.php @@ -0,0 +1,81 @@ +loadData($data); + return $uploadId; + } + /** + * {@inheritdoc} + */ + public function toParams() + { + return $this->data; + } + /** + * {@inheritdoc} + */ + public function serialize() + { + return serialize($this->data); + } + /** + * {@inheritdoc} + */ + public function unserialize($serialized) + { + $this->loadData(unserialize($serialized)); + } + /** + * Loads an array of data into the UploadId by extracting only the needed keys + * + * @param array $data Data to load + * + * @throws InvalidArgumentException if a required key is missing + */ + protected function loadData($data) + { + $data = array_replace(static::$expectedValues, array_intersect_key($data, static::$expectedValues)); + foreach ($data as $key => $value) { + if (isset($data[$key])) { + $this->data[$key] = $data[$key]; + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException("A required key [{$key}] was missing from the UploadId."); + } + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadPart.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadPart.php new file mode 100644 index 00000000..491228d9 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadPart.php @@ -0,0 +1,91 @@ +loadData($data); + return $part; + } + /** + * {@inheritdoc} + */ + public function getPartNumber() + { + return $this->partNumber; + } + /** + * {@inheritdoc} + */ + public function toArray() + { + $array = array(); + foreach (static::$keyMap as $key => $property) { + $array[$key] = $this->{$property}; + } + return $array; + } + /** + * {@inheritdoc} + */ + public function serialize() + { + return serialize($this->toArray()); + } + /** + * {@inheritdoc} + */ + public function unserialize($serialized) + { + $this->loadData(unserialize($serialized)); + } + /** + * Loads an array of data into the upload part by extracting only the needed keys + * + * @param array|\Traversable $data Data to load into the upload part value object + * + * @throws InvalidArgumentException if a required key is missing + */ + protected function loadData($data) + { + foreach (static::$keyMap as $key => $property) { + if (isset($data[$key])) { + $this->{$property} = $data[$key]; + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException("A required key [{$key}] was missing from the upload part."); + } + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/TransferInterface.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/TransferInterface.php new file mode 100644 index 00000000..f07b63a6 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/TransferInterface.php @@ -0,0 +1,61 @@ + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Aws', 'services' => array('default_settings' => array('params' => array()), 'autoscaling' => array('alias' => 'AutoScaling', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\AutoScaling\\AutoScalingClient'), 'cloudformation' => array('alias' => 'CloudFormation', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CloudFormation\\CloudFormationClient'), 'cloudfront' => array('alias' => 'CloudFront', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CloudFront\\CloudFrontClient'), 'cloudfront_20120505' => array('extends' => 'cloudfront', 'params' => array('version' => '2012-05-05')), 'cloudhsm' => array('alias' => 'CloudHsm', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CloudHsm\\CloudHsmClient'), 'cloudsearch' => array('alias' => 'CloudSearch', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CloudSearch\\CloudSearchClient'), 'cloudsearch_20110201' => array('extends' => 'cloudsearch', 'params' => array('version' => '2011-02-01')), 'cloudsearchdomain' => array('alias' => 'CloudSearchDomain', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CloudSearchDomain\\CloudSearchDomainClient'), 'cloudtrail' => array('alias' => 'CloudTrail', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CloudTrail\\CloudTrailClient'), 'cloudwatch' => array('alias' => 'CloudWatch', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CloudWatch\\CloudWatchClient'), 'cloudwatchlogs' => array('alias' => 'CloudWatchLogs', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CloudWatchLogs\\CloudWatchLogsClient'), 'cognito-identity' => array('alias' => 'CognitoIdentity', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CognitoIdentity\\CognitoIdentityClient'), 'cognitoidentity' => array('extends' => 'cognito-identity'), 'cognito-sync' => array('alias' => 'CognitoSync', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CognitoSync\\CognitoSyncClient'), 'cognitosync' => array('extends' => 'cognito-sync'), 'codecommit' => array('alias' => 'CodeCommit', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CodeCommit\\CodeCommitClient'), 'codedeploy' => array('alias' => 'CodeDeploy', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CodeDeploy\\CodeDeployClient'), 'codepipeline' => array('alias' => 'CodePipeline', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\CodePipeline\\CodePipelineClient'), 'config' => array('alias' => 'ConfigService', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\ConfigService\\ConfigServiceClient'), 'datapipeline' => array('alias' => 'DataPipeline', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\DataPipeline\\DataPipelineClient'), 'devicefarm' => array('alias' => 'DeviceFarm', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\DeviceFarm\\DeviceFarmClient'), 'directconnect' => array('alias' => 'DirectConnect', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\DirectConnect\\DirectConnectClient'), 'ds' => array('alias' => 'DirectoryService', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\DirectoryService\\DirectoryServiceClient'), 'dynamodb' => array('alias' => 'DynamoDb', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\DynamoDb\\DynamoDbClient'), 'dynamodb_20111205' => array('extends' => 'dynamodb', 'params' => array('version' => '2011-12-05')), 'dynamodbstreams' => array('alias' => 'DynamoDbStreams', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\DynamoDbStreams\\DynamoDbStreamsClient'), 'ec2' => array('alias' => 'Ec2', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Ec2\\Ec2Client'), 'ecs' => array('alias' => 'Ecs', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Ecs\\EcsClient'), 'elasticache' => array('alias' => 'ElastiCache', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\ElastiCache\\ElastiCacheClient'), 'elasticbeanstalk' => array('alias' => 'ElasticBeanstalk', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\ElasticBeanstalk\\ElasticBeanstalkClient'), 'efs' => array('alias' => 'Efs', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Efs\\EfsClient'), 'elasticloadbalancing' => array('alias' => 'ElasticLoadBalancing', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\ElasticLoadBalancing\\ElasticLoadBalancingClient'), 'elastictranscoder' => array('alias' => 'ElasticTranscoder', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\ElasticTranscoder\\ElasticTranscoderClient'), 'emr' => array('alias' => 'Emr', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Emr\\EmrClient'), 'glacier' => array('alias' => 'Glacier', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Glacier\\GlacierClient'), 'kinesis' => array('alias' => 'Kinesis', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Kinesis\\KinesisClient'), 'kms' => array('alias' => 'Kms', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Kms\\KmsClient'), 'lambda' => array('alias' => 'Lambda', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Lambda\\LambdaClient'), 'iam' => array('alias' => 'Iam', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Iam\\IamClient'), 'importexport' => array('alias' => 'ImportExport', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\ImportExport\\ImportExportClient'), 'machinelearning' => array('alias' => 'MachineLearning', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\MachineLearning\\MachineLearningClient'), 'opsworks' => array('alias' => 'OpsWorks', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\OpsWorks\\OpsWorksClient'), 'rds' => array('alias' => 'Rds', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Rds\\RdsClient'), 'redshift' => array('alias' => 'Redshift', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Redshift\\RedshiftClient'), 'route53' => array('alias' => 'Route53', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Route53\\Route53Client'), 'route53domains' => array('alias' => 'Route53Domains', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Route53Domains\\Route53DomainsClient'), 's3' => array('alias' => 'S3', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client'), 'sdb' => array('alias' => 'SimpleDb', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\SimpleDb\\SimpleDbClient'), 'ses' => array('alias' => 'Ses', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Ses\\SesClient'), 'sns' => array('alias' => 'Sns', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Sns\\SnsClient'), 'sqs' => array('alias' => 'Sqs', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Sqs\\SqsClient'), 'ssm' => array('alias' => 'Ssm', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Ssm\\SsmClient'), 'storagegateway' => array('alias' => 'StorageGateway', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\StorageGateway\\StorageGatewayClient'), 'sts' => array('alias' => 'Sts', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Sts\\StsClient'), 'support' => array('alias' => 'Support', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Support\\SupportClient'), 'swf' => array('alias' => 'Swf', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Swf\\SwfClient'), 'workspaces' => array('alias' => 'WorkSpaces', 'extends' => 'default_settings', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\WorkSpaces\\WorkSpacesClient'))); diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Resources/public-endpoints.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Resources/public-endpoints.php new file mode 100644 index 00000000..638c42b4 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Resources/public-endpoints.php @@ -0,0 +1,3 @@ + 2, 'endpoints' => array('*/*' => array('endpoint' => '{service}.{region}.amazonaws.com'), 'cn-north-1/*' => array('endpoint' => '{service}.{region}.amazonaws.com.cn', 'signatureVersion' => 'v4'), 'us-gov-west-1/iam' => array('endpoint' => 'iam.us-gov.amazonaws.com'), 'us-gov-west-1/sts' => array('endpoint' => 'sts.us-gov-west-1.amazonaws.com'), 'us-gov-west-1/s3' => array('endpoint' => 's3-{region}.amazonaws.com'), '*/cloudfront' => array('endpoint' => 'cloudfront.amazonaws.com', 'credentialScope' => array('region' => 'us-east-1')), '*/iam' => array('endpoint' => 'iam.amazonaws.com', 'credentialScope' => array('region' => 'us-east-1')), '*/importexport' => array('endpoint' => 'importexport.amazonaws.com', 'credentialScope' => array('region' => 'us-east-1')), '*/route53' => array('endpoint' => 'route53.amazonaws.com', 'credentialScope' => array('region' => 'us-east-1')), '*/sts' => array('endpoint' => 'sts.amazonaws.com', 'credentialScope' => array('region' => 'us-east-1')), 'us-east-1/sdb' => array('endpoint' => 'sdb.amazonaws.com'), 'us-east-1/s3' => array('endpoint' => 's3.amazonaws.com'), 'us-west-1/s3' => array('endpoint' => 's3-{region}.amazonaws.com'), 'us-west-2/s3' => array('endpoint' => 's3-{region}.amazonaws.com'), 'eu-west-1/s3' => array('endpoint' => 's3-{region}.amazonaws.com'), 'ap-southeast-1/s3' => array('endpoint' => 's3-{region}.amazonaws.com'), 'ap-southeast-2/s3' => array('endpoint' => 's3-{region}.amazonaws.com'), 'ap-northeast-1/s3' => array('endpoint' => 's3-{region}.amazonaws.com'), 'sa-east-1/s3' => array('endpoint' => 's3-{region}.amazonaws.com'))); diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Resources/sdk1-config.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Resources/sdk1-config.php new file mode 100644 index 00000000..6f98b597 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Resources/sdk1-config.php @@ -0,0 +1,17 @@ + array('_aws'), 'services' => array('sdk1_settings' => array('extends' => 'default_settings', 'params' => array('certificate_authority' => \false)), 'v1.autoscaling' => array('extends' => 'sdk1_settings', 'class' => 'AmazonAS'), 'v1.cloudformation' => array('extends' => 'sdk1_settings', 'class' => 'AmazonCloudFormation'), 'v1.cloudfront' => array('extends' => 'sdk1_settings', 'class' => 'AmazonCloudFront'), 'v1.cloudsearch' => array('extends' => 'sdk1_settings', 'class' => 'AmazonCloudSearch'), 'v1.cloudwatch' => array('extends' => 'sdk1_settings', 'class' => 'AmazonCloudWatch'), 'v1.dynamodb' => array('extends' => 'sdk1_settings', 'class' => 'AmazonDynamoDB'), 'v1.ec2' => array('extends' => 'sdk1_settings', 'class' => 'AmazonEC2'), 'v1.elasticache' => array('extends' => 'sdk1_settings', 'class' => 'AmazonElastiCache'), 'v1.elasticbeanstalk' => array('extends' => 'sdk1_settings', 'class' => 'AmazonElasticBeanstalk'), 'v1.elb' => array('extends' => 'sdk1_settings', 'class' => 'AmazonELB'), 'v1.emr' => array('extends' => 'sdk1_settings', 'class' => 'AmazonEMR'), 'v1.iam' => array('extends' => 'sdk1_settings', 'class' => 'AmazonIAM'), 'v1.importexport' => array('extends' => 'sdk1_settings', 'class' => 'AmazonImportExport'), 'v1.rds' => array('extends' => 'sdk1_settings', 'class' => 'AmazonRDS'), 'v1.s3' => array('extends' => 'sdk1_settings', 'class' => 'AmazonS3'), 'v1.sdb' => array('extends' => 'sdk1_settings', 'class' => 'AmazonSDB'), 'v1.ses' => array('extends' => 'sdk1_settings', 'class' => 'AmazonSES'), 'v1.sns' => array('extends' => 'sdk1_settings', 'class' => 'AmazonSNS'), 'v1.sqs' => array('extends' => 'sdk1_settings', 'class' => 'AmazonSQS'), 'v1.storagegateway' => array('extends' => 'sdk1_settings', 'class' => 'AmazonStorageGateway'), 'v1.sts' => array('extends' => 'sdk1_settings', 'class' => 'AmazonSTS'), 'v1.swf' => array('extends' => 'sdk1_settings', 'class' => 'AmazonSWF'))); diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/RulesEndpointProvider.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/RulesEndpointProvider.php new file mode 100644 index 00000000..fe47f5ad --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/RulesEndpointProvider.php @@ -0,0 +1,55 @@ +patterns = $patterns; + } + /** + * Creates and returns the default RulesEndpointProvider based on the + * public rule sets. + * + * @return self + */ + public static function fromDefaults() + { + return new self(require __DIR__ . '/Resources/public-endpoints.php'); + } + public function __invoke(array $args = array()) + { + if (!isset($args['service'])) { + throw new \InvalidArgumentException('Requires a "service" value'); + } + if (!isset($args['region'])) { + throw new \InvalidArgumentException('Requires a "region" value'); + } + foreach ($this->getKeys($args['region'], $args['service']) as $key) { + if (isset($this->patterns['endpoints'][$key])) { + return $this->expand($this->patterns['endpoints'][$key], $args); + } + } + throw new \RuntimeException('Could not resolve endpoint'); + } + private function expand(array $config, array $args) + { + $scheme = isset($args['scheme']) ? $args['scheme'] : 'https'; + $config['endpoint'] = $scheme . '://' . str_replace(array('{service}', '{region}'), array($args['service'], $args['region']), $config['endpoint']); + return $config; + } + private function getKeys($region, $service) + { + return array("{$region}/{$service}", "{$region}/*", "*/{$service}", "*/*"); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Signature/AbstractSignature.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Signature/AbstractSignature.php new file mode 100644 index 00000000..17a3fac4 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Signature/AbstractSignature.php @@ -0,0 +1,39 @@ +credentials = $credentials; + $this->signature = $signature; + } + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() + { + return array('request.before_send' => array('onRequestBeforeSend', -255), 'client.credentials_changed' => array('onCredentialsChanged')); + } + /** + * Updates the listener with new credentials if the client is updated + * + * @param Event $event Event emitted + */ + public function onCredentialsChanged(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $this->credentials = $event['credentials']; + } + /** + * Signs requests before they are sent + * + * @param Event $event Event emitted + */ + public function onRequestBeforeSend(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $creds = $this->credentials instanceof AbstractRefreshableCredentials ? $this->credentials->getCredentials() : $this->credentials; + if (!$creds instanceof NullCredentials) { + $this->signature->signRequest($event['request'], $creds); + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV2.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV2.php new file mode 100644 index 00000000..de2f6e71 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV2.php @@ -0,0 +1,86 @@ +getTimestamp(true); + // set values we need in CanonicalizedParameterString + $this->addParameter($request, 'Timestamp', gmdate('c', $timestamp)); + $this->addParameter($request, 'SignatureVersion', '2'); + $this->addParameter($request, 'SignatureMethod', 'HmacSHA256'); + $this->addParameter($request, 'AWSAccessKeyId', $credentials->getAccessKeyId()); + if ($token = $credentials->getSecurityToken()) { + $this->addParameter($request, 'SecurityToken', $token); + } + // Get the path and ensure it's absolute + $path = '/' . ltrim($request->getUrl(true)->normalizePath()->getPath(), '/'); + // build string to sign + $sign = $request->getMethod() . "\n" . $request->getHost() . "\n" . $path . "\n" . $this->getCanonicalizedParameterString($request); + // Add the string to sign to the request for debugging purposes + $request->getParams()->set('aws.string_to_sign', $sign); + $signature = base64_encode(hash_hmac('sha256', $sign, $credentials->getSecretKey(), true)); + $this->addParameter($request, 'Signature', $signature); + } + /** + * Add a parameter key and value to the request according to type + * + * @param RequestInterface $request The request + * @param string $key The name of the parameter + * @param string $value The value of the parameter + */ + public function addParameter(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $key, $value) + { + if ($request->getMethod() == 'POST') { + $request->setPostField($key, $value); + } else { + $request->getQuery()->set($key, $value); + } + } + /** + * Get the canonicalized query/parameter string for a request + * + * @param RequestInterface $request Request used to build canonicalized string + * + * @return string + */ + private function getCanonicalizedParameterString(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + if ($request->getMethod() == 'POST') { + $params = $request->getPostFields()->toArray(); + } else { + $params = $request->getQuery()->toArray(); + } + // Don't resign a previous signature value + unset($params['Signature']); + uksort($params, 'strcmp'); + $str = ''; + foreach ($params as $key => $val) { + $str .= rawurlencode($key) . '=' . rawurlencode($val) . '&'; + } + return substr($str, 0, -1); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV3Https.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV3Https.php new file mode 100644 index 00000000..2f66416e --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV3Https.php @@ -0,0 +1,47 @@ +hasHeader('date') && !$request->hasHeader('x-amz-date')) { + $request->setHeader('Date', gmdate(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\DateFormat::RFC1123, $this->getTimestamp())); + } + // Add the security token if one is present + if ($credentials->getSecurityToken()) { + $request->setHeader('x-amz-security-token', $credentials->getSecurityToken()); + } + // Determine the string to sign + $stringToSign = (string) ($request->getHeader('Date') ?: $request->getHeader('x-amz-date')); + $request->getParams()->set('aws.string_to_sign', $stringToSign); + // Calculate the signature + $signature = base64_encode(hash_hmac('sha256', $stringToSign, $credentials->getSecretKey(), true)); + // Add the authorization header to the request + $headerFormat = 'AWS3-HTTPS AWSAccessKeyId=%s,Algorithm=HmacSHA256,Signature=%s'; + $request->setHeader('X-Amzn-Authorization', sprintf($headerFormat, $credentials->getAccessKeyId(), $signature)); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV4.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV4.php new file mode 100644 index 00000000..9481e56d --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV4.php @@ -0,0 +1,360 @@ +serviceName = $serviceName; + $this->regionName = $regionName; + } + /** + * Set the service name instead of inferring it from a request URL + * + * @param string $service Name of the service used when signing + * + * @return self + */ + public function setServiceName($service) + { + $this->serviceName = $service; + return $this; + } + /** + * Set the region name instead of inferring it from a request URL + * + * @param string $region Name of the region used when signing + * + * @return self + */ + public function setRegionName($region) + { + $this->regionName = $region; + return $this; + } + /** + * Set the maximum number of computed hashes to cache + * + * @param int $maxCacheSize Maximum number of hashes to cache + * + * @return self + */ + public function setMaxCacheSize($maxCacheSize) + { + $this->maxCacheSize = $maxCacheSize; + return $this; + } + public function signRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\CredentialsInterface $credentials) + { + $timestamp = $this->getTimestamp(); + $longDate = gmdate(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\DateFormat::ISO8601, $timestamp); + $shortDate = substr($longDate, 0, 8); + // Remove any previously set Authorization headers so that retries work + $request->removeHeader('Authorization'); + // Requires a x-amz-date header or Date + if ($request->hasHeader('x-amz-date') || !$request->hasHeader('Date')) { + $request->setHeader('x-amz-date', $longDate); + } else { + $request->setHeader('Date', gmdate(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\DateFormat::RFC1123, $timestamp)); + } + // Add the security token if one is present + if ($credentials->getSecurityToken()) { + $request->setHeader('x-amz-security-token', $credentials->getSecurityToken()); + } + // Parse the service and region or use one that is explicitly set + $region = $this->regionName; + $service = $this->serviceName; + if (!$region || !$service) { + $url = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Url::factory($request->getUrl()); + $region = $region ?: \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\HostNameUtils::parseRegionName($url); + $service = $service ?: \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\HostNameUtils::parseServiceName($url); + } + $credentialScope = $this->createScope($shortDate, $region, $service); + $payload = $this->getPayload($request); + $signingContext = $this->createSigningContext($request, $payload); + $signingContext['string_to_sign'] = $this->createStringToSign($longDate, $credentialScope, $signingContext['canonical_request']); + // Calculate the signing key using a series of derived keys + $signingKey = $this->getSigningKey($shortDate, $region, $service, $credentials->getSecretKey()); + $signature = hash_hmac('sha256', $signingContext['string_to_sign'], $signingKey); + $request->setHeader('Authorization', "AWS4-HMAC-SHA256 " . "Credential={$credentials->getAccessKeyId()}/{$credentialScope}, " . "SignedHeaders={$signingContext['signed_headers']}, Signature={$signature}"); + // Add debug information to the request + $request->getParams()->set('aws.signature', $signingContext); + } + public function createPresignedUrl(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\CredentialsInterface $credentials, $expires) + { + $request = $this->createPresignedRequest($request, $credentials); + $query = $request->getQuery(); + $httpDate = gmdate(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\DateFormat::ISO8601, $this->getTimestamp()); + $shortDate = substr($httpDate, 0, 8); + $scope = $this->createScope($shortDate, $this->regionName, $this->serviceName); + $this->addQueryValues($scope, $request, $credentials, $expires); + $payload = $this->getPresignedPayload($request); + $context = $this->createSigningContext($request, $payload); + $stringToSign = $this->createStringToSign($httpDate, $scope, $context['canonical_request']); + $key = $this->getSigningKey($shortDate, $this->regionName, $this->serviceName, $credentials->getSecretKey()); + $query['X-Amz-Signature'] = hash_hmac('sha256', $stringToSign, $key); + return $request->getUrl(); + } + /** + * Converts a POST request to a GET request by moving POST fields into the + * query string. + * + * Useful for pre-signing query protocol requests. + * + * @param EntityEnclosingRequestInterface $request Request to clone + * + * @return RequestInterface + * @throws \InvalidArgumentException if the method is not POST + */ + public static function convertPostToGet(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\EntityEnclosingRequestInterface $request) + { + if ($request->getMethod() !== 'POST') { + throw new \InvalidArgumentException('Expected a POST request but ' . 'received a ' . $request->getMethod() . ' request.'); + } + $cloned = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestFactory::getInstance()->cloneRequestWithMethod($request, 'GET'); + // Move POST fields to the query if they are present + foreach ($request->getPostFields() as $name => $value) { + $cloned->getQuery()->set($name, $value); + } + return $cloned; + } + /** + * Get the payload part of a signature from a request. + * + * @param RequestInterface $request + * + * @return string + */ + protected function getPayload(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + // Calculate the request signature payload + if ($request->hasHeader('x-amz-content-sha256')) { + // Handle streaming operations (e.g. Glacier.UploadArchive) + return (string) $request->getHeader('x-amz-content-sha256'); + } + if ($request instanceof EntityEnclosingRequestInterface) { + if ($request->getMethod() == 'POST' && count($request->getPostFields())) { + return hash('sha256', (string) $request->getPostFields()); + } elseif ($body = $request->getBody()) { + return \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Stream\Stream::getHash($request->getBody(), 'sha256'); + } + } + return self::DEFAULT_PAYLOAD; + } + /** + * Get the payload of a request for use with pre-signed URLs. + * + * @param RequestInterface $request + * + * @return string + */ + protected function getPresignedPayload(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + return $this->getPayload($request); + } + protected function createCanonicalizedPath(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $doubleEncoded = rawurlencode(ltrim($request->getPath(), '/')); + return '/' . str_replace('%2F', '/', $doubleEncoded); + } + private function createStringToSign($longDate, $credentialScope, $creq) + { + return "AWS4-HMAC-SHA256\n{$longDate}\n{$credentialScope}\n" . hash('sha256', $creq); + } + private function createPresignedRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\CredentialsInterface $credentials) + { + // POST requests can be sent as GET requests instead by moving the + // POST fields into the query string. + if ($request instanceof EntityEnclosingRequestInterface && $request->getMethod() === 'POST' && strpos($request->getHeader('Content-Type'), 'application/x-www-form-urlencoded') === 0) { + $sr = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestFactory::getInstance()->cloneRequestWithMethod($request, 'GET'); + // Move POST fields to the query if they are present + foreach ($request->getPostFields() as $name => $value) { + $sr->getQuery()->set($name, $value); + } + } else { + $sr = clone $request; + } + // Make sure to handle temporary credentials + if ($token = $credentials->getSecurityToken()) { + $sr->setHeader('X-Amz-Security-Token', $token); + $sr->getQuery()->set('X-Amz-Security-Token', $token); + } + $this->moveHeadersToQuery($sr); + return $sr; + } + /** + * Create the canonical representation of a request + * + * @param RequestInterface $request Request to canonicalize + * @param string $payload Request payload (typically the value + * of the x-amz-content-sha256 header. + * + * @return array Returns an array of context information including: + * - canonical_request + * - signed_headers + */ + private function createSigningContext(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $payload) + { + $signable = array('host' => true, 'date' => true, 'content-md5' => true); + // Normalize the path as required by SigV4 and ensure it's absolute + $canon = $request->getMethod() . "\n" . $this->createCanonicalizedPath($request) . "\n" . $this->getCanonicalizedQueryString($request) . "\n"; + $canonHeaders = array(); + foreach ($request->getHeaders()->getAll() as $key => $values) { + $key = strtolower($key); + if (isset($signable[$key]) || substr($key, 0, 6) === 'x-amz-') { + $values = $values->toArray(); + if (count($values) == 1) { + $values = $values[0]; + } else { + sort($values); + $values = implode(',', $values); + } + $canonHeaders[$key] = $key . ':' . preg_replace('/\\s+/', ' ', $values); + } + } + ksort($canonHeaders); + $signedHeadersString = implode(';', array_keys($canonHeaders)); + $canon .= implode("\n", $canonHeaders) . "\n\n" . $signedHeadersString . "\n" . $payload; + return array('canonical_request' => $canon, 'signed_headers' => $signedHeadersString); + } + /** + * Get a hash for a specific key and value. If the hash was previously + * cached, return it + * + * @param string $shortDate Short date + * @param string $region Region name + * @param string $service Service name + * @param string $secretKey Secret Access Key + * + * @return string + */ + private function getSigningKey($shortDate, $region, $service, $secretKey) + { + $cacheKey = $shortDate . '_' . $region . '_' . $service . '_' . $secretKey; + // Retrieve the hash form the cache or create it and add it to the cache + if (!isset($this->hashCache[$cacheKey])) { + // When the cache size reaches the max, then just clear the cache + if (++$this->cacheSize > $this->maxCacheSize) { + $this->hashCache = array(); + $this->cacheSize = 0; + } + $dateKey = hash_hmac('sha256', $shortDate, 'AWS4' . $secretKey, true); + $regionKey = hash_hmac('sha256', $region, $dateKey, true); + $serviceKey = hash_hmac('sha256', $service, $regionKey, true); + $this->hashCache[$cacheKey] = hash_hmac('sha256', 'aws4_request', $serviceKey, true); + } + return $this->hashCache[$cacheKey]; + } + /** + * Get the canonicalized query string for a request + * + * @param RequestInterface $request + * @return string + */ + private function getCanonicalizedQueryString(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $queryParams = $request->getQuery()->getAll(); + unset($queryParams['X-Amz-Signature']); + if (empty($queryParams)) { + return ''; + } + $qs = ''; + ksort($queryParams); + foreach ($queryParams as $key => $values) { + if (is_array($values)) { + sort($values); + } elseif ($values === 0) { + $values = array('0'); + } elseif (!$values) { + $values = array(''); + } + foreach ((array) $values as $value) { + if ($value === \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryString::BLANK) { + $value = ''; + } + $qs .= rawurlencode($key) . '=' . rawurlencode($value) . '&'; + } + } + return substr($qs, 0, -1); + } + private function convertExpires($expires) + { + if ($expires instanceof \DateTime) { + $expires = $expires->getTimestamp(); + } elseif (!is_numeric($expires)) { + $expires = strtotime($expires); + } + $duration = $expires - time(); + // Ensure that the duration of the signature is not longer than a week + if ($duration > 604800) { + throw new \InvalidArgumentException('The expiration date of a ' . 'signature version 4 presigned URL must be less than one ' . 'week'); + } + return $duration; + } + private function createScope($shortDate, $region, $service) + { + return $shortDate . '/' . $region . '/' . $service . '/aws4_request'; + } + private function addQueryValues($scope, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\CredentialsInterface $credentials, $expires) + { + $credential = $credentials->getAccessKeyId() . '/' . $scope; + // Set query params required for pre-signed URLs + $request->getQuery()->set('X-Amz-Algorithm', 'AWS4-HMAC-SHA256')->set('X-Amz-Credential', $credential)->set('X-Amz-Date', gmdate('Ymd\\THis\\Z', $this->getTimestamp()))->set('X-Amz-SignedHeaders', 'Host')->set('X-Amz-Expires', $this->convertExpires($expires)); + } + private function moveHeadersToQuery(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $query = $request->getQuery(); + foreach ($request->getHeaders() as $name => $header) { + if (substr($name, 0, 5) == 'x-amz') { + $query[$header->getName()] = (string) $header; + } + if ($name !== 'host') { + $request->removeHeader($name); + } + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/AbstractResourceWaiter.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/AbstractResourceWaiter.php new file mode 100644 index 00000000..60aeae9d --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/AbstractResourceWaiter.php @@ -0,0 +1,48 @@ +client = $client; + return $this; + } + /** + * {@inheritdoc} + */ + public function wait() + { + if (!$this->client) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('No client has been specified on the waiter'); + } + parent::wait(); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/AbstractWaiter.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/AbstractWaiter.php new file mode 100644 index 00000000..a72e6aaf --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/AbstractWaiter.php @@ -0,0 +1,120 @@ +config[self::MAX_ATTEMPTS]) ? $this->config[self::MAX_ATTEMPTS] : 10; + } + /** + * Get the amount of time in seconds to delay between attempts + * + * @return int + */ + public function getInterval() + { + return isset($this->config[self::INTERVAL]) ? $this->config[self::INTERVAL] : 0; + } + /** + * {@inheritdoc} + */ + public function setMaxAttempts($maxAttempts) + { + $this->config[self::MAX_ATTEMPTS] = $maxAttempts; + return $this; + } + /** + * {@inheritdoc} + */ + public function setInterval($interval) + { + $this->config[self::INTERVAL] = $interval; + return $this; + } + /** + * Set config options associated with the waiter + * + * @param array $config Options to set + * + * @return self + */ + public function setConfig(array $config) + { + if (isset($config['waiter.before_attempt'])) { + $this->getEventDispatcher()->addListener('waiter.before_attempt', $config['waiter.before_attempt']); + unset($config['waiter.before_attempt']); + } + if (isset($config['waiter.before_wait'])) { + $this->getEventDispatcher()->addListener('waiter.before_wait', $config['waiter.before_wait']); + unset($config['waiter.before_wait']); + } + $this->config = $config; + return $this; + } + /** + * {@inheritdoc} + */ + public function wait() + { + $this->attempts = 0; + do { + $this->dispatch('waiter.before_attempt', array('waiter' => $this, 'config' => $this->config)); + if ($this->doWait()) { + break; + } + if (++$this->attempts >= $this->getMaxAttempts()) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('Wait method never resolved to true after ' . $this->attempts . ' attempts'); + } + $this->dispatch('waiter.before_wait', array('waiter' => $this, 'config' => $this->config)); + if ($this->getInterval()) { + usleep($this->getInterval() * 1000000); + } + } while (1); + } + /** + * Method to implement in subclasses + * + * @return bool Return true when successful, false on failure + */ + protected abstract function doWait(); +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/CallableWaiter.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/CallableWaiter.php new file mode 100644 index 00000000..70cd6996 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/CallableWaiter.php @@ -0,0 +1,73 @@ +callable = $callable; + return $this; + } + /** + * Set additional context for the callable function. This data will be passed into the callable function as the + * second argument + * + * @param array $context Additional context + * + * @return self + */ + public function setContext(array $context) + { + $this->context = $context; + return $this; + } + /** + * {@inheritdoc} + */ + public function doWait() + { + if (!$this->callable) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('No callable was specified for the wait method'); + } + return call_user_func($this->callable, $this->attempts, $this->context); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/CompositeWaiterFactory.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/CompositeWaiterFactory.php new file mode 100644 index 00000000..c15f7fe4 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/CompositeWaiterFactory.php @@ -0,0 +1,81 @@ +factories = $factories; + } + /** + * {@inheritdoc} + */ + public function build($waiter) + { + if (!($factory = $this->getFactory($waiter))) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException("Waiter was not found matching {$waiter}."); + } + return $factory->build($waiter); + } + /** + * {@inheritdoc} + */ + public function canBuild($waiter) + { + return (bool) $this->getFactory($waiter); + } + /** + * Add a factory to the composite factory + * + * @param WaiterFactoryInterface $factory Factory to add + * + * @return self + */ + public function addFactory(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterFactoryInterface $factory) + { + $this->factories[] = $factory; + return $this; + } + /** + * Get the factory that matches the waiter name + * + * @param string $waiter Name of the waiter + * + * @return WaiterFactoryInterface|bool + */ + protected function getFactory($waiter) + { + foreach ($this->factories as $factory) { + if ($factory->canBuild($waiter)) { + return $factory; + } + } + return false; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/ConfigResourceWaiter.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/ConfigResourceWaiter.php new file mode 100644 index 00000000..6b5e0963 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/ConfigResourceWaiter.php @@ -0,0 +1,185 @@ +waiterConfig = $waiterConfig; + $this->setInterval($waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::INTERVAL)); + $this->setMaxAttempts($waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::MAX_ATTEMPTS)); + } + /** + * {@inheritdoc} + */ + public function setConfig(array $config) + { + foreach ($config as $key => $value) { + if (substr($key, 0, 7) == 'waiter.') { + $this->waiterConfig->set(substr($key, 7), $value); + } + } + if (!isset($config[self::INTERVAL])) { + $config[self::INTERVAL] = $this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::INTERVAL); + } + if (!isset($config[self::MAX_ATTEMPTS])) { + $config[self::MAX_ATTEMPTS] = $this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::MAX_ATTEMPTS); + } + return parent::setConfig($config); + } + /** + * Get the waiter's configuration data + * + * @return WaiterConfig + */ + public function getWaiterConfig() + { + return $this->waiterConfig; + } + /** + * {@inheritdoc} + */ + protected function doWait() + { + $params = $this->config; + // remove waiter settings from the operation's input + foreach (array_keys($params) as $key) { + if (substr($key, 0, 7) == 'waiter.') { + unset($params[$key]); + } + } + $operation = $this->client->getCommand($this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::OPERATION), $params); + try { + return $this->checkResult($this->client->execute($operation)); + } catch (ValidationException $e) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException($this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::WAITER_NAME) . ' waiter validation failed: ' . $e->getMessage(), $e->getCode(), $e); + } catch (ServiceResponseException $e) { + // Check if this exception satisfies a success or failure acceptor + $transition = $this->checkErrorAcceptor($e); + if (null !== $transition) { + return $transition; + } + // Check if this exception should be ignored + foreach ((array) $this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::IGNORE_ERRORS) as $ignore) { + if ($e->getExceptionCode() == $ignore) { + // This exception is ignored, so it counts as a failed attempt rather than a fast-fail + return false; + } + } + // Allow non-ignore exceptions to bubble through + throw $e; + } + } + /** + * Check if an exception satisfies a success or failure acceptor + * + * @param ServiceResponseException $e + * + * @return bool|null Returns true for success, false for failure, and null for no transition + */ + protected function checkErrorAcceptor(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\ServiceResponseException $e) + { + if ($this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::SUCCESS_TYPE) == 'error') { + if ($e->getExceptionCode() == $this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::SUCCESS_VALUE)) { + // Mark as a success + return true; + } + } + // Mark as an attempt + return null; + } + /** + * Check to see if the response model satisfies a success or failure state + * + * @param Model $result Result model + * + * @return bool + * @throws RuntimeException + */ + protected function checkResult(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\Model $result) + { + // Check if the result evaluates to true based on the path and output model + if ($this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::SUCCESS_TYPE) == 'output' && $this->checkPath($result, $this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::SUCCESS_PATH), $this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::SUCCESS_VALUE))) { + return true; + } + // It did not finish waiting yet. Determine if we need to fail-fast based on the failure acceptor. + if ($this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::FAILURE_TYPE) == 'output') { + $failureValue = $this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::FAILURE_VALUE); + if ($failureValue) { + $key = $this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::FAILURE_PATH); + if ($this->checkPath($result, $key, $failureValue, false)) { + // Determine which of the results triggered the failure + $triggered = array_intersect((array) $this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::FAILURE_VALUE), array_unique((array) $result->getPath($key))); + // fast fail because the failure case was satisfied + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('A resource entered into an invalid state of "' . implode(', ', $triggered) . '" while waiting with the "' . $this->waiterConfig->get(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig::WAITER_NAME) . '" waiter.'); + } + } + } + return false; + } + /** + * Check to see if the path of the output key is satisfied by the value + * + * @param Model $model Result model + * @param string $key Key to check + * @param string $checkValue Compare the key to the value + * @param bool $all Set to true to ensure all value match or false to only match one + * + * @return bool + */ + protected function checkPath(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\Model $model, $key = null, $checkValue = array(), $all = true) + { + // If no key is set, then just assume true because the request succeeded + if (!$key) { + return true; + } + if (!($result = $model->getPath($key))) { + return false; + } + $total = $matches = 0; + foreach ((array) $result as $value) { + $total++; + foreach ((array) $checkValue as $check) { + if ($value == $check) { + $matches++; + break; + } + } + } + // When matching all values, ensure that the match count matches the total count + if ($all && $total != $matches) { + return false; + } + return $matches > 0; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/ResourceWaiterInterface.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/ResourceWaiterInterface.php new file mode 100644 index 00000000..7e6eaef8 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/ResourceWaiterInterface.php @@ -0,0 +1,33 @@ + CamelCase). + */ +class WaiterClassFactory implements \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterFactoryInterface +{ + /** + * @var array List of namespaces used to look for classes + */ + protected $namespaces; + /** + * @var InflectorInterface Inflector used to inflect class names + */ + protected $inflector; + /** + * @param array|string $namespaces Namespaces of waiter objects + * @param InflectorInterface $inflector Inflector used to resolve class names + */ + public function __construct($namespaces = array(), \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Inflection\InflectorInterface $inflector = null) + { + $this->namespaces = (array) $namespaces; + $this->inflector = $inflector ?: \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Inflection\Inflector::getDefault(); + } + /** + * Registers a namespace to check for Waiters + * + * @param string $namespace Namespace which contains Waiter classes + * + * @return self + */ + public function registerNamespace($namespace) + { + array_unshift($this->namespaces, $namespace); + return $this; + } + /** + * {@inheritdoc} + */ + public function build($waiter) + { + if (!($className = $this->getClassName($waiter))) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException("Waiter was not found matching {$waiter}."); + } + return new $className(); + } + /** + * {@inheritdoc} + */ + public function canBuild($waiter) + { + return $this->getClassName($waiter) !== null; + } + /** + * Get the name of a waiter class + * + * @param string $waiter Waiter name + * + * @return string|null + */ + protected function getClassName($waiter) + { + $waiterName = $this->inflector->camel($waiter); + // Determine the name of the class to load + $className = null; + foreach ($this->namespaces as $namespace) { + $potentialClassName = $namespace . '\\' . $waiterName; + if (class_exists($potentialClassName)) { + return $potentialClassName; + } + } + return null; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterConfig.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterConfig.php new file mode 100644 index 00000000..ab010a90 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterConfig.php @@ -0,0 +1,64 @@ +data = $data; + $this->extractConfig(); + } + /** + * Create the command configuration variables + */ + protected function extractConfig() + { + // Populate success.* and failure.* if specified in acceptor.* + foreach ($this->data as $key => $value) { + if (substr($key, 0, 9) == 'acceptor.') { + $name = substr($key, 9); + if (!isset($this->data["success.{$name}"])) { + $this->data["success.{$name}"] = $value; + } + if (!isset($this->data["failure.{$name}"])) { + $this->data["failure.{$name}"] = $value; + } + unset($this->data[$key]); + } + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterConfigFactory.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterConfigFactory.php new file mode 100644 index 00000000..a820e570 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterConfigFactory.php @@ -0,0 +1,86 @@ +config = $config; + $this->inflector = $inflector ?: \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Inflection\Inflector::getDefault(); + } + /** + * {@inheritdoc} + */ + public function build($waiter) + { + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\ConfigResourceWaiter($this->getWaiterConfig($waiter)); + } + /** + * {@inheritdoc} + */ + public function canBuild($waiter) + { + return isset($this->config[$waiter]) || isset($this->config[$this->inflector->camel($waiter)]); + } + /** + * Get waiter configuration data, taking __default__ and extensions into account + * + * @param string $name Waiter name + * + * @return WaiterConfig + * @throws InvalidArgumentException + */ + protected function getWaiterConfig($name) + { + if (!$this->canBuild($name)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('No waiter found matching "' . $name . '"'); + } + // inflect the name if needed + $name = isset($this->config[$name]) ? $name : $this->inflector->camel($name); + $waiter = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig($this->config[$name]); + $waiter['name'] = $name; + // Always use __default__ as the basis if it's set + if (isset($this->config['__default__'])) { + $parentWaiter = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Waiter\WaiterConfig($this->config['__default__']); + $waiter = $parentWaiter->overwriteWith($waiter); + } + // Allow for configuration extensions + if (isset($this->config[$name]['extends'])) { + $waiter = $this->getWaiterConfig($this->config[$name]['extends'])->overwriteWith($waiter); + } + return $waiter; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterFactoryInterface.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterFactoryInterface.php new file mode 100644 index 00000000..a501996d --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterFactoryInterface.php @@ -0,0 +1,40 @@ + array('onCommandBeforePrepare', -255)); + } + /** + * An event handler for constructing ACP definitions. + * + * @param Event $event The event to respond to. + * + * @throws InvalidArgumentException + */ + public function onCommandBeforePrepare(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + /** @var \Guzzle\Service\Command\AbstractCommand $command */ + $command = $event['command']; + $operation = $command->getOperation(); + if ($operation->hasParam('ACP') && $command->hasKey('ACP')) { + if ($acp = $command->get('ACP')) { + // Ensure that the correct object was passed + if (!$acp instanceof Acp) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('ACP must be an instance of Aws\\S3\\Model\\Acp'); + } + // Check if the user specified both an ACP and Grants + if ($command->hasKey('Grants')) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('Use either the ACP parameter or the Grants parameter. Do not use both.'); + } + // Add the correct headers/body based parameters to the command + if ($operation->hasParam('Grants')) { + $command->overwriteWith($acp->toArray()); + } else { + $acp->updateCommand($command); + } + } + // Remove the ACP parameter + $command->remove('ACP'); + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/BucketStyleListener.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/BucketStyleListener.php new file mode 100644 index 00000000..faf441c5 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/BucketStyleListener.php @@ -0,0 +1,73 @@ + true); + public static function getSubscribedEvents() + { + return array('command.after_prepare' => array('onCommandAfterPrepare', -255)); + } + /** + * Changes how buckets are referenced in the HTTP request + * + * @param Event $event Event emitted + */ + public function onCommandAfterPrepare(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $command = $event['command']; + $bucket = $command['Bucket']; + $request = $command->getRequest(); + $pathStyle = false; + // Skip operations that do not need the bucket moved to the host. + if (isset(self::$exclusions[$command->getName()])) { + return; + } + if ($key = $command['Key']) { + // Modify the command Key to account for the {/Key*} explosion into an array + if (is_array($key)) { + $command['Key'] = $key = implode('/', $key); + } + } + // Set the key and bucket on the request + $request->getParams()->set('bucket', $bucket)->set('key', $key); + // Switch to virtual if PathStyle is disabled, or not a DNS compatible bucket name, or the scheme is + // http, or the scheme is https and there are no dots in the host header (avoids SSL issues) + if (!$command['PathStyle'] && $command->getClient()->isValidBucketName($bucket) && !($command->getRequest()->getScheme() == 'https' && strpos($bucket, '.'))) { + // Switch to virtual hosted bucket + $request->setHost($bucket . '.' . $request->getHost()); + $request->setPath(preg_replace("#^/{$bucket}#", '', $request->getPath())); + } else { + $pathStyle = true; + } + if (!$bucket) { + $request->getParams()->set('s3.resource', '/'); + } elseif ($pathStyle) { + // Path style does not need a trailing slash + $request->getParams()->set('s3.resource', '/' . rawurlencode($bucket) . ($key ? '/' . \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\S3Client::encodeKey($key) : '')); + } else { + // Bucket style needs a trailing slash + $request->getParams()->set('s3.resource', '/' . rawurlencode($bucket) . ($key ? '/' . \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\S3Client::encodeKey($key) : '/')); + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Command/S3Command.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Command/S3Command.php new file mode 100644 index 00000000..cdc605f5 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Command/S3Command.php @@ -0,0 +1,57 @@ +client->createPresignedUrl($this->prepare(), $expires); + } + /** + * {@inheritdoc} + */ + protected function process() + { + $request = $this->getRequest(); + $response = $this->getResponse(); + // Dispatch an error if a 301 redirect occurred + if ($response->getStatusCode() == 301) { + $this->getClient()->getEventDispatcher()->dispatch('request.error', new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event(array('request' => $this->getRequest(), 'response' => $response))); + } + parent::process(); + // Set the GetObject URL if using the PutObject operation + if ($this->result instanceof Model && $this->getName() == 'PutObject') { + $this->result->set('ObjectURL', $request->getUrl()); + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Enum/CannedAcl.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Enum/CannedAcl.php new file mode 100644 index 00000000..3b7b26e9 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Enum/CannedAcl.php @@ -0,0 +1,31 @@ +errors = $errors; + } + /** + * Get the errored objects + * + * @return array Returns an array of associative arrays, each containing + * a 'Code', 'Message', and 'Key' key. + */ + public function getErrors() + { + return $this->errors; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Exception/EntityTooLargeException.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Exception/EntityTooLargeException.php new file mode 100644 index 00000000..23175ac1 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Exception/EntityTooLargeException.php @@ -0,0 +1,24 @@ +getStatusCode() === 301) { + $data['type'] = 'client'; + if (isset($data['message'], $data['parsed'])) { + $data['message'] = rtrim($data['message'], '.') . ': "' . $data['parsed']->Endpoint . '".'; + } + } + return $data; + } + /** + * {@inheritdoc} + */ + protected function parseHeaders(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response, array &$data) + { + parent::parseHeaders($request, $response, $data); + // Get the request + $status = $response->getStatusCode(); + $method = $request->getMethod(); + // Attempt to determine code for 403s and 404s + if ($status === 403) { + $data['code'] = 'AccessDenied'; + } elseif ($method === 'HEAD' && $status === 404) { + $path = explode('/', trim($request->getPath(), '/')); + $host = explode('.', $request->getHost()); + $bucket = count($host) === 4 ? $host[0] : array_shift($path); + $object = array_shift($path); + if ($bucket && $object) { + $data['code'] = 'NoSuchKey'; + } elseif ($bucket) { + $data['code'] = 'NoSuchBucket'; + } + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Exception/PermanentRedirectException.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Exception/PermanentRedirectException.php new file mode 100644 index 00000000..66edf65f --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Exception/PermanentRedirectException.php @@ -0,0 +1,24 @@ +setNext($next); + } + } + public function makesDecision() + { + return true; + } + protected function getDelay($retries, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response = null, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\HttpException $e = null) + { + if ($response && $request->getMethod() === 'POST' && $request instanceof EntityEnclosingRequestInterface && $response->getStatusCode() == 200 && strpos($request->getBody(), 'getBody(), 'get('Buckets') ?: array(); + // If only the names_only set, change arrays to a string + if ($this->get('names_only')) { + foreach ($buckets as &$bucket) { + $bucket = $bucket['Name']; + } + } + return $buckets; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Iterator/ListMultipartUploadsIterator.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Iterator/ListMultipartUploadsIterator.php new file mode 100644 index 00000000..55dd9324 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Iterator/ListMultipartUploadsIterator.php @@ -0,0 +1,43 @@ +get('Uploads') ?: array(); + // If there are prefixes and we want them, merge them in + if ($this->get('return_prefixes') && $result->hasKey('CommonPrefixes')) { + $uploads = array_merge($uploads, $result->get('CommonPrefixes')); + } + return $uploads; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Iterator/ListObjectVersionsIterator.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Iterator/ListObjectVersionsIterator.php new file mode 100644 index 00000000..02482113 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Iterator/ListObjectVersionsIterator.php @@ -0,0 +1,45 @@ +get('Versions') ?: array(); + $deleteMarkers = $result->get('DeleteMarkers') ?: array(); + $versions = array_merge($versions, $deleteMarkers); + // If there are prefixes and we want them, merge them in + if ($this->get('return_prefixes') && $result->hasKey('CommonPrefixes')) { + $versions = array_merge($versions, $result->get('CommonPrefixes')); + } + return $versions; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Iterator/ListObjectsIterator.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Iterator/ListObjectsIterator.php new file mode 100644 index 00000000..70523269 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Iterator/ListObjectsIterator.php @@ -0,0 +1,62 @@ +get('Contents') ?: array(); + $numObjects = count($objects); + $lastKey = $numObjects ? $objects[$numObjects - 1]['Key'] : false; + if ($lastKey && !$result->hasKey($this->get('output_token'))) { + $result->set($this->get('output_token'), $lastKey); + } + // Closure for getting the name of an object or prefix + $getName = function ($object) { + return isset($object['Key']) ? $object['Key'] : $object['Prefix']; + }; + // If common prefixes returned (i.e. a delimiter was set) and they need to be returned, there is more to do + if ($this->get('return_prefixes') && $result->hasKey('CommonPrefixes')) { + // Collect and format the prefixes to include with the objects + $objects = array_merge($objects, $result->get('CommonPrefixes')); + // Sort the objects and prefixes to maintain alphabetical order, but only if some of each were returned + if ($this->get('sort_results') && $lastKey && $objects) { + usort($objects, function ($object1, $object2) use($getName) { + return strcmp($getName($object1), $getName($object2)); + }); + } + } + // If only the names are desired, iterate through the results and convert the arrays to the object/prefix names + if ($this->get('names_only')) { + $objects = array_map($getName, $objects); + } + return $objects; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Iterator/OpendirIterator.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Iterator/OpendirIterator.php new file mode 100644 index 00000000..c7306c2a --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Iterator/OpendirIterator.php @@ -0,0 +1,75 @@ +filePrefix = $filePrefix; + $this->dirHandle = $dirHandle; + $this->next(); + } + public function __destruct() + { + if ($this->dirHandle) { + closedir($this->dirHandle); + } + } + public function rewind() + { + $this->key = 0; + rewinddir($this->dirHandle); + } + public function current() + { + return $this->currentFile; + } + public function next() + { + if ($file = readdir($this->dirHandle)) { + $this->currentFile = new \SplFileInfo($this->filePrefix . $file); + } else { + $this->currentFile = false; + } + $this->key++; + } + public function key() + { + return $this->key; + } + public function valid() + { + return $this->currentFile !== false; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/Acp.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/Acp.php new file mode 100644 index 00000000..a2eb06c5 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/Acp.php @@ -0,0 +1,208 @@ +setOwner($owner); + $this->setGrants($grants); + } + /** + * Create an Acp object from an array. This can be used to create an ACP from a response to a GetObject/Bucket ACL + * operation. + * + * @param array $data Array of ACP data + * + * @return Acp + */ + public static function fromArray(array $data) + { + $builder = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\AcpBuilder(); + $builder->setOwner((string) $data['Owner']['ID'], $data['Owner']['DisplayName']); + // Add each Grantee to the ACP + foreach ($data['Grants'] as $grant) { + $permission = $grant['Permission']; + // Determine the type for response bodies that are missing the Type parameter + if (!isset($grant['Grantee']['Type'])) { + if (isset($grant['Grantee']['ID'])) { + $grant['Grantee']['Type'] = 'CanonicalUser'; + } elseif (isset($grant['Grantee']['URI'])) { + $grant['Grantee']['Type'] = 'Group'; + } else { + $grant['Grantee']['Type'] = 'AmazonCustomerByEmail'; + } + } + switch ($grant['Grantee']['Type']) { + case 'Group': + $builder->addGrantForGroup($permission, $grant['Grantee']['URI']); + break; + case 'AmazonCustomerByEmail': + $builder->addGrantForEmail($permission, $grant['Grantee']['EmailAddress']); + break; + case 'CanonicalUser': + $builder->addGrantForUser($permission, $grant['Grantee']['ID'], $grant['Grantee']['DisplayName']); + } + } + return $builder->build(); + } + /** + * Set the owner of the ACP policy + * + * @param Grantee $owner ACP policy owner + * + * @return $this + * + * @throws InvalidArgumentException if the grantee does not have an ID set + */ + public function setOwner(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Grantee $owner) + { + if (!$owner->isCanonicalUser()) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('The owner must have an ID set.'); + } + $this->owner = $owner; + return $this; + } + /** + * Get the owner of the ACP policy + * + * @return Grantee + */ + public function getOwner() + { + return $this->owner; + } + /** + * Set the grants for the ACP + * + * @param array|\Traversable $grants List of grants for the ACP + * + * @return $this + * + * @throws InvalidArgumentException + */ + public function setGrants($grants = array()) + { + $this->grants = new \SplObjectStorage(); + if ($grants) { + if (is_array($grants) || $grants instanceof \Traversable) { + /** @var Grant $grant */ + foreach ($grants as $grant) { + $this->addGrant($grant); + } + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('Grants must be passed in as an array or Traversable object.'); + } + } + return $this; + } + /** + * Get all of the grants + * + * @return \SplObjectStorage + */ + public function getGrants() + { + return $this->grants; + } + /** + * Add a Grant + * + * @param Grant $grant Grant to add + * + * @return $this + */ + public function addGrant(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Grant $grant) + { + if (count($this->grants) < 100) { + $this->grants->attach($grant); + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\OverflowException('An ACP may contain up to 100 grants.'); + } + return $this; + } + /** + * Get the total number of attributes + * + * @return int + */ + public function count() + { + return count($this->grants); + } + /** + * Returns the grants for iteration + * + * @return \SplObjectStorage + */ + public function getIterator() + { + return $this->grants; + } + /** + * Applies grant headers to a command's parameters + * + * @param AbstractCommand $command Command to be updated + * + * @return $this + */ + public function updateCommand(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\AbstractCommand $command) + { + $parameters = array(); + foreach ($this->grants as $grant) { + /** @var Grant $grant */ + $parameters = array_merge_recursive($parameters, $grant->getParameterArray()); + } + foreach ($parameters as $name => $values) { + $command->set($name, implode(', ', (array) $values)); + } + return $this; + } + /** + * {@inheritdoc} + */ + public function toArray() + { + $grants = array(); + foreach ($this->grants as $grant) { + $grants[] = $grant->toArray(); + } + return array('Owner' => array('ID' => $this->owner->getId(), 'DisplayName' => $this->owner->getDisplayName()), 'Grants' => $grants); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/AcpBuilder.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/AcpBuilder.php new file mode 100644 index 00000000..a319c329 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/AcpBuilder.php @@ -0,0 +1,120 @@ +owner = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Grantee($id, $displayName ?: $id, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::USER); + return $this; + } + /** + * Create and store a Grant with a CanonicalUser Grantee for the ACL + * + * @param string $permission Permission for the Grant + * @param string $id Grantee identifier + * @param string $displayName Grantee display name + * + * @return $this + */ + public function addGrantForUser($permission, $id, $displayName = null) + { + $grantee = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Grantee($id, $displayName ?: $id, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::USER); + $this->addGrant($permission, $grantee); + return $this; + } + /** + * Create and store a Grant with a AmazonCustomerByEmail Grantee for the ACL + * + * @param string $permission Permission for the Grant + * @param string $email Grantee email address + * + * @return $this + */ + public function addGrantForEmail($permission, $email) + { + $grantee = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Grantee($email, null, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::EMAIL); + $this->addGrant($permission, $grantee); + return $this; + } + /** + * Create and store a Grant with a Group Grantee for the ACL + * + * @param string $permission Permission for the Grant + * @param string $group Grantee group + * + * @return $this + */ + public function addGrantForGroup($permission, $group) + { + $grantee = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Grantee($group, null, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::GROUP); + $this->addGrant($permission, $grantee); + return $this; + } + /** + * Create and store a Grant for the ACL + * + * @param string $permission Permission for the Grant + * @param Grantee $grantee The Grantee for the Grant + * + * @return $this + */ + public function addGrant($permission, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Grantee $grantee) + { + $this->grants[] = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Grant($grantee, $permission); + return $this; + } + /** + * Builds the ACP and returns it + * + * @return Acp + */ + public function build() + { + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Acp($this->owner, $this->grants); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/ClearBucket.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/ClearBucket.php new file mode 100644 index 00000000..cf9b40dd --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/ClearBucket.php @@ -0,0 +1,161 @@ +client = $client; + $this->bucket = $bucket; + } + /** + * {@inheritdoc} + */ + public static function getAllEvents() + { + return array(self::AFTER_DELETE, self::BEFORE_CLEAR, self::AFTER_CLEAR); + } + /** + * Set the bucket that is to be cleared + * + * @param string $bucket Name of the bucket to clear + * + * @return $this + */ + public function setBucket($bucket) + { + $this->bucket = $bucket; + return $this; + } + /** + * Get the iterator used to yield the keys to be deleted. A default iterator + * will be created and returned if no iterator has been explicitly set. + * + * @return \Iterator + */ + public function getIterator() + { + if (!$this->iterator) { + $this->iterator = $this->client->getIterator('ListObjectVersions', array('Bucket' => $this->bucket)); + } + return $this->iterator; + } + /** + * Sets a different iterator to use than the default iterator. This can be helpful when you wish to delete + * only specific keys from a bucket (e.g. keys that match a certain prefix or delimiter, or perhaps keys that + * pass through a filtered, decorated iterator). + * + * @param \Iterator $iterator Iterator used to yield the keys to be deleted + * + * @return $this + */ + public function setIterator(\Iterator $iterator) + { + $this->iterator = $iterator; + return $this; + } + /** + * Set the MFA token to send with each request + * + * @param string $mfa MFA token to send with each request. The value is the concatenation of the authentication + * device's serial number, a space, and the value displayed on your authentication device. + * + * @return $this + */ + public function setMfa($mfa) + { + $this->mfa = $mfa; + return $this; + } + /** + * Clear the bucket + * + * @return int Returns the number of deleted keys + * @throws ExceptionCollection + */ + public function clear() + { + $that = $this; + $batch = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\DeleteObjectsBatch::factory($this->client, $this->bucket, $this->mfa); + $batch = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\NotifyingBatch($batch, function ($items) use($that) { + $that->dispatch(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\ClearBucket::AFTER_DELETE, array('keys' => $items)); + }); + $batch = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\FlushingBatch(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\ExceptionBufferingBatch($batch), 1000); + // Let any listeners know that the bucket is about to be cleared + $this->dispatch(self::BEFORE_CLEAR, array('iterator' => $this->getIterator(), 'batch' => $batch, 'mfa' => $this->mfa)); + $deleted = 0; + foreach ($this->getIterator() as $object) { + if (isset($object['VersionId'])) { + $versionId = $object['VersionId'] == 'null' ? null : $object['VersionId']; + } else { + $versionId = null; + } + $batch->addKey($object['Key'], $versionId); + $deleted++; + } + $batch->flush(); + // If any errors were encountered, then throw an ExceptionCollection + if (count($batch->getExceptions())) { + $e = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\ExceptionCollection(); + foreach ($batch->getExceptions() as $exception) { + $e->add($exception->getPrevious()); + } + throw $e; + } + // Let any listeners know that the bucket was cleared + $this->dispatch(self::AFTER_CLEAR, array('deleted' => $deleted)); + return $deleted; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/DeleteObjectsBatch.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/DeleteObjectsBatch.php new file mode 100644 index 00000000..02d59cb5 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/DeleteObjectsBatch.php @@ -0,0 +1,72 @@ + %s, VersionId => %s] and call flush when the objects + * should be deleted. + */ +class DeleteObjectsBatch extends \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\AbstractBatchDecorator +{ + /** + * Factory for creating a DeleteObjectsBatch + * + * @param AwsClientInterface $client Client used to transfer requests + * @param string $bucket Bucket that contains the objects to delete + * @param string $mfa MFA token to use with the request + * + * @return static + */ + public static function factory(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Client\AwsClientInterface $client, $bucket, $mfa = null) + { + $batch = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\BatchBuilder::factory()->createBatchesWith(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\BatchSizeDivisor(1000))->transferWith(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\DeleteObjectsTransfer($client, $bucket, $mfa))->build(); + return new static($batch); + } + /** + * Add an object to be deleted + * + * @param string $key Key of the object + * @param string $versionId VersionID of the object + * + * @return $this + */ + public function addKey($key, $versionId = null) + { + return $this->add(array('Key' => $key, 'VersionId' => $versionId)); + } + /** + * {@inheritdoc} + */ + public function add($item) + { + if ($item instanceof AbstractCommand && $item->getName() == 'DeleteObject') { + $item = array('Key' => $item['Key'], 'VersionId' => $item['VersionId']); + } + if (!is_array($item) || !isset($item['Key'])) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('Item must be a DeleteObject command or array containing a Key and VersionId key.'); + } + return parent::add($item); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/DeleteObjectsTransfer.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/DeleteObjectsTransfer.php new file mode 100644 index 00000000..7caf053c --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/DeleteObjectsTransfer.php @@ -0,0 +1,112 @@ +client = $client; + $this->bucket = $bucket; + $this->mfa = $mfa; + } + /** + * Set a new MFA token value + * + * @param string $token MFA token + * + * @return $this + */ + public function setMfa($token) + { + $this->mfa = $token; + return $this; + } + /** + * {@inheritdoc} + * @throws OverflowException if a batch has more than 1000 items + * @throws InvalidArgumentException when an invalid batch item is encountered + */ + public function transfer(array $batch) + { + if (empty($batch)) { + return; + } + if (count($batch) > 1000) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\OverflowException('Batches should be divided into chunks of no larger than 1000 keys'); + } + $del = array(); + $command = $this->client->getCommand('DeleteObjects', array('Bucket' => $this->bucket, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::OPTION => \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::BATCH)); + if ($this->mfa) { + $command->getRequestHeaders()->set('x-amz-mfa', $this->mfa); + } + foreach ($batch as $object) { + // Ensure that the batch item is valid + if (!is_array($object) || !isset($object['Key'])) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Exception\InvalidArgumentException('Invalid batch item encountered: ' . var_export($batch, true)); + } + $del[] = array('Key' => $object['Key'], 'VersionId' => isset($object['VersionId']) ? $object['VersionId'] : null); + } + $command['Objects'] = $del; + $command->execute(); + $this->processResponse($command); + } + /** + * Process the response of the DeleteMultipleObjects request + * + * @paramCommandInterface $command Command executed + */ + protected function processResponse(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + $result = $command->getResult(); + // Ensure that the objects were deleted successfully + if (!empty($result['Errors'])) { + $errors = $result['Errors']; + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Exception\DeleteMultipleObjectsException($errors); + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/Grant.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/Grant.php new file mode 100644 index 00000000..6bfd237a --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/Grant.php @@ -0,0 +1,114 @@ + 'GrantRead', \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\Permission::WRITE => 'GrantWrite', \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\Permission::READ_ACP => 'GrantReadACP', \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\Permission::WRITE_ACP => 'GrantWriteACP', \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\Permission::FULL_CONTROL => 'GrantFullControl'); + /** + * @var Grantee The grantee affected by the grant + */ + protected $grantee; + /** + * @var string The permission set by the grant + */ + protected $permission; + /** + * Constructs an ACL + * + * @param Grantee $grantee Affected grantee + * @param string $permission Permission applied + */ + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Grantee $grantee, $permission) + { + $this->setGrantee($grantee); + $this->setPermission($permission); + } + /** + * Set the grantee affected by the grant + * + * @param Grantee $grantee Affected grantee + * + * @return $this + */ + public function setGrantee(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Grantee $grantee) + { + $this->grantee = $grantee; + return $this; + } + /** + * Get the grantee affected by the grant + * + * @return Grantee + */ + public function getGrantee() + { + return $this->grantee; + } + /** + * Set the permission set by the grant + * + * @param string $permission Permission applied + * + * @return $this + * + * @throws InvalidArgumentException + */ + public function setPermission($permission) + { + $valid = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\Permission::values(); + if (!in_array($permission, $valid)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('The permission must be one of ' . 'the following: ' . implode(', ', $valid) . '.'); + } + $this->permission = $permission; + return $this; + } + /** + * Get the permission set by the grant + * + * @return string + */ + public function getPermission() + { + return $this->permission; + } + /** + * Returns an array of the operation parameter and value to set on the operation + * + * @return array + */ + public function getParameterArray() + { + return array(self::$parameterMap[$this->permission] => $this->grantee->getHeaderValue()); + } + /** + * {@inheritdoc} + */ + public function toArray() + { + return array('Grantee' => $this->grantee->toArray(), 'Permission' => $this->permission); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/Grantee.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/Grantee.php new file mode 100644 index 00000000..fbfd3ac3 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/Grantee.php @@ -0,0 +1,211 @@ + 'id', \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::EMAIL => 'emailAddress', \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::GROUP => 'uri'); + /** + * @var string The account ID, email, or URL identifying the grantee + */ + protected $id; + /** + * @var string The display name of the grantee + */ + protected $displayName; + /** + * @var string The type of the grantee (CanonicalUser or Group) + */ + protected $type; + /** + * Constructs a Grantee + * + * @param string $id Grantee identifier + * @param string $displayName Grantee display name + * @param string $expectedType The expected type of the grantee + */ + public function __construct($id, $displayName = null, $expectedType = null) + { + $this->type = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::USER; + $this->setId($id, $expectedType); + $this->setDisplayName($displayName); + } + /** + * Sets the account ID, email, or URL identifying the grantee + * + * @param string $id Grantee identifier + * @param string $expectedType The expected type of the grantee + * + * @return Grantee + * + * @throws UnexpectedValueException if $expectedType is set and the grantee + * is not of that type after instantiation + * @throws InvalidArgumentException when the ID provided is not a string + */ + public function setId($id, $expectedType = null) + { + if (in_array($id, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\Group::values())) { + $this->type = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::GROUP; + } elseif (!is_string($id)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('The grantee ID must be provided as a string value.'); + } + if (strpos($id, '@') !== false) { + $this->type = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::EMAIL; + } + if ($expectedType && $expectedType !== $this->type) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\UnexpectedValueException('The type of the grantee after ' . 'setting the ID did not match the specified, expected type "' . $expectedType . '" but received "' . $this->type . '".'); + } + $this->id = $id; + return $this; + } + /** + * Gets the grantee identifier + * + * @return string + */ + public function getId() + { + return $this->id; + } + /** + * Gets the grantee email address (if it is set) + * + * @return null|string + */ + public function getEmailAddress() + { + return $this->isAmazonCustomerByEmail() ? $this->id : null; + } + /** + * Gets the grantee URI (if it is set) + * + * @return null|string + */ + public function getGroupUri() + { + return $this->isGroup() ? $this->id : null; + } + /** + * Sets the display name of the grantee + * + * @param string $displayName Grantee name + * + * @return Grantee + * + * @throws LogicException when the grantee type not CanonicalUser + */ + public function setDisplayName($displayName) + { + if ($this->type === \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::USER) { + if (empty($displayName) || !is_string($displayName)) { + $displayName = $this->id; + } + $this->displayName = $displayName; + } else { + if ($displayName) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\LogicException('The display name can only be set ' . 'for grantees specified by ID.'); + } + } + return $this; + } + /** + * Gets the grantee display name + * + * @return string + */ + public function getDisplayName() + { + return $this->displayName; + } + /** + * Gets the grantee type (determined by ID) + * + * @return string + */ + public function getType() + { + return $this->type; + } + /** + * Returns true if this grantee object represents a canonical user by ID + * + * @return bool + */ + public function isCanonicalUser() + { + return $this->type === \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::USER; + } + /** + * Returns true if this grantee object represents a customer by email + * + * @return bool + */ + public function isAmazonCustomerByEmail() + { + return $this->type === \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::EMAIL; + } + /** + * Returns true if this grantee object represents a group by URL + * + * @return bool + */ + public function isGroup() + { + return $this->type === \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::GROUP; + } + /** + * Returns the value used in headers to specify this grantee + * + * @return string + */ + public function getHeaderValue() + { + $key = static::$headerMap[$this->type]; + return "{$key}=\"{$this->id}\""; + } + /** + * {@inheritdoc} + */ + public function toArray() + { + $result = array('Type' => $this->type); + switch ($this->type) { + case \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::USER: + $result['ID'] = $this->id; + $result['DisplayName'] = $this->displayName; + break; + case \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::EMAIL: + $result['EmailAddress'] = $this->id; + break; + case \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Enum\GranteeType::GROUP: + $result['URI'] = $this->id; + } + return $result; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/AbstractTransfer.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/AbstractTransfer.php new file mode 100644 index 00000000..ad38f7bd --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/AbstractTransfer.php @@ -0,0 +1,83 @@ +options = array_replace(array('min_part_size' => self::MIN_PART_SIZE, 'part_md5' => true), $this->options); + // Make sure the part size can be calculated somehow + if (!$this->options['min_part_size'] && !$this->source->getContentLength()) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('The ContentLength of the data source could not be determined, and no ' . 'min_part_size option was provided'); + } + } + /** + * {@inheritdoc} + */ + protected function calculatePartSize() + { + $partSize = $this->source->getContentLength() ? (int) ceil($this->source->getContentLength() / self::MAX_PARTS) : self::MIN_PART_SIZE; + $partSize = max($this->options['min_part_size'], $partSize); + $partSize = min($partSize, self::MAX_PART_SIZE); + $partSize = max($partSize, self::MIN_PART_SIZE); + return $partSize; + } + /** + * {@inheritdoc} + */ + protected function complete() + { + /** @var UploadPart $part */ + $parts = array(); + foreach ($this->state as $part) { + $parts[] = array('PartNumber' => $part->getPartNumber(), 'ETag' => $part->getETag()); + } + $params = $this->state->getUploadId()->toParams(); + $params[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::OPTION] = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::MULTIPART_UPLOAD; + $params['Parts'] = $parts; + $command = $this->client->getCommand('CompleteMultipartUpload', $params); + return $command->getResult(); + } + /** + * {@inheritdoc} + */ + protected function getAbortCommand() + { + $params = $this->state->getUploadId()->toParams(); + $params[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::OPTION] = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::MULTIPART_UPLOAD; + /** @var OperationCommand $command */ + $command = $this->client->getCommand('AbortMultipartUpload', $params); + return $command; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/ParallelTransfer.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/ParallelTransfer.php new file mode 100644 index 00000000..180011b8 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/ParallelTransfer.php @@ -0,0 +1,100 @@ +source->isLocal() || $this->source->getWrapper() != 'plainfile') { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('The source data must be a local file stream when uploading in parallel.'); + } + if (empty($this->options['concurrency'])) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('The `concurrency` option must be specified when instantiating.'); + } + } + /** + * {@inheritdoc} + */ + protected function transfer() + { + $totalParts = (int) ceil($this->source->getContentLength() / $this->partSize); + $concurrency = min($totalParts, $this->options['concurrency']); + $partsToSend = $this->prepareParts($concurrency); + $eventData = $this->getEventData(); + while (!$this->stopped && count($this->state) < $totalParts) { + $currentTotal = count($this->state); + $commands = array(); + for ($i = 0; $i < $concurrency && $i + $currentTotal < $totalParts; $i++) { + // Move the offset to the correct position + $partsToSend[$i]->setOffset(($currentTotal + $i) * $this->partSize); + // @codeCoverageIgnoreStart + if ($partsToSend[$i]->getContentLength() == 0) { + break; + } + // @codeCoverageIgnoreEnd + $params = $this->state->getUploadId()->toParams(); + $eventData['command'] = $this->client->getCommand('UploadPart', array_replace($params, array('PartNumber' => count($this->state) + 1 + $i, 'Body' => $partsToSend[$i], 'ContentMD5' => (bool) $this->options['part_md5'], \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::OPTION => \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::MULTIPART_UPLOAD))); + $commands[] = $eventData['command']; + // Notify any listeners of the part upload + $this->dispatch(self::BEFORE_PART_UPLOAD, $eventData); + } + // Allow listeners to stop the transfer if needed + if ($this->stopped) { + break; + } + // Execute each command, iterate over the results, and add to the transfer state + /** @var \Guzzle\Service\Command\OperationCommand $command */ + foreach ($this->client->execute($commands) as $command) { + $this->state->addPart(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\UploadPart::fromArray(array('PartNumber' => $command['PartNumber'], 'ETag' => $command->getResponse()->getEtag(), 'Size' => (int) $command->getRequest()->getBody()->getContentLength(), 'LastModified' => gmdate(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\DateFormat::RFC2822)))); + $eventData['command'] = $command; + // Notify any listeners the the part was uploaded + $this->dispatch(self::AFTER_PART_UPLOAD, $eventData); + } + } + } + /** + * Prepare the entity body handles to use while transferring + * + * @param int $concurrency Number of parts to prepare + * + * @return array Parts to send + */ + protected function prepareParts($concurrency) + { + $url = $this->source->getUri(); + // Use the source EntityBody as the first part + $parts = array(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\ReadLimitEntityBody($this->source, $this->partSize)); + // Open EntityBody handles for each part to upload in parallel + for ($i = 1; $i < $concurrency; $i++) { + $parts[] = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\ReadLimitEntityBody(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody(fopen($url, 'r')), $this->partSize); + } + return $parts; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/SerialTransfer.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/SerialTransfer.php new file mode 100644 index 00000000..35b29303 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/SerialTransfer.php @@ -0,0 +1,65 @@ +stopped && !$this->source->isConsumed()) { + if ($this->source->getContentLength() && $this->source->isSeekable()) { + // If the stream is seekable and the Content-Length known, then stream from the data source + $body = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\ReadLimitEntityBody($this->source, $this->partSize, $this->source->ftell()); + } else { + // We need to read the data source into a temporary buffer before streaming + $body = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory(); + while ($body->getContentLength() < $this->partSize && $body->write($this->source->read(max(1, min(10 * \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\Size::KB, $this->partSize - $body->getContentLength()))))) { + } + } + // @codeCoverageIgnoreStart + if ($body->getContentLength() == 0) { + break; + } + // @codeCoverageIgnoreEnd + $params = $this->state->getUploadId()->toParams(); + $command = $this->client->getCommand('UploadPart', array_replace($params, array('PartNumber' => count($this->state) + 1, 'Body' => $body, 'ContentMD5' => (bool) $this->options['part_md5'], \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::OPTION => \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::MULTIPART_UPLOAD))); + // Notify observers that the part is about to be uploaded + $eventData = $this->getEventData(); + $eventData['command'] = $command; + $this->dispatch(self::BEFORE_PART_UPLOAD, $eventData); + // Allow listeners to stop the transfer if needed + if ($this->stopped) { + break; + } + $response = $command->getResponse(); + $this->state->addPart(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\UploadPart::fromArray(array('PartNumber' => $command['PartNumber'], 'ETag' => $response->getEtag(), 'Size' => $body->getContentLength(), 'LastModified' => gmdate(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\DateFormat::RFC2822)))); + // Notify observers that the part was uploaded + $this->dispatch(self::AFTER_PART_UPLOAD, $eventData); + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/TransferState.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/TransferState.php new file mode 100644 index 00000000..c3e9f22c --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/TransferState.php @@ -0,0 +1,38 @@ +getIterator('ListParts', $uploadId->toParams()) as $part) { + $transferState->addPart(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\UploadPart::fromArray($part)); + } + return $transferState; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadBuilder.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadBuilder.php new file mode 100644 index 00000000..c821e0ec --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadBuilder.php @@ -0,0 +1,243 @@ +setOption('Bucket', $bucket); + } + /** + * Set the key of the object + * + * @param string $key Key of the object to upload + * + * @return $this + */ + public function setKey($key) + { + return $this->setOption('Key', $key); + } + /** + * Set the minimum acceptable part size + * + * @param int $minSize Minimum acceptable part size in bytes + * + * @return $this + */ + public function setMinPartSize($minSize) + { + $this->minPartSize = (int) max((int) $minSize, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\AbstractTransfer::MIN_PART_SIZE); + return $this; + } + /** + * Set the concurrency level to use when uploading parts. This affects how + * many parts are uploaded in parallel. You must use a local file as your + * data source when using a concurrency greater than 1 + * + * @param int $concurrency Concurrency level + * + * @return $this + */ + public function setConcurrency($concurrency) + { + $this->concurrency = $concurrency; + return $this; + } + /** + * Explicitly set the MD5 hash of the entire body + * + * @param string $md5 MD5 hash of the entire body + * + * @return $this + */ + public function setMd5($md5) + { + $this->md5 = $md5; + return $this; + } + /** + * Set to true to have the builder calculate the MD5 hash of the entire data + * source before initiating a multipart upload (this could be an expensive + * operation). This setting can ony be used with seekable data sources. + * + * @param bool $calculateMd5 Set to true to calculate the MD5 hash of the body + * + * @return $this + */ + public function calculateMd5($calculateMd5) + { + $this->calculateEntireMd5 = (bool) $calculateMd5; + return $this; + } + /** + * Specify whether or not to calculate the MD5 hash of each uploaded part. + * This setting defaults to true. + * + * @param bool $usePartMd5 Set to true to calculate the MD5 has of each part + * + * @return $this + */ + public function calculatePartMd5($usePartMd5) + { + $this->calculatePartMd5 = (bool) $usePartMd5; + return $this; + } + /** + * Set the ACP to use on the object + * + * @param Acp $acp ACP to set on the object + * + * @return $this + */ + public function setAcp(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Acp $acp) + { + return $this->setOption('ACP', $acp); + } + /** + * Set an option to pass to the initial CreateMultipartUpload operation + * + * @param string $name Option name + * @param string $value Option value + * + * @return $this + */ + public function setOption($name, $value) + { + $this->commandOptions[$name] = $value; + return $this; + } + /** + * Add an array of options to pass to the initial CreateMultipartUpload operation + * + * @param array $options Array of CreateMultipartUpload operation parameters + * + * @return $this + */ + public function addOptions(array $options) + { + $this->commandOptions = array_replace($this->commandOptions, $options); + return $this; + } + /** + * Set an array of transfer options to apply to the upload transfer object + * + * @param array $options Transfer options + * + * @return $this + */ + public function setTransferOptions(array $options) + { + $this->transferOptions = $options; + return $this; + } + /** + * {@inheritdoc} + * @throws InvalidArgumentException when attempting to resume a transfer using a non-seekable stream + * @throws InvalidArgumentException when missing required properties (bucket, key, client, source) + */ + public function build() + { + if ($this->state instanceof TransferState) { + $this->commandOptions = array_replace($this->commandOptions, $this->state->getUploadId()->toParams()); + } + if (!isset($this->commandOptions['Bucket']) || !isset($this->commandOptions['Key']) || !$this->client || !$this->source) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('You must specify a Bucket, Key, client, and source.'); + } + if ($this->state && !$this->source->isSeekable()) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('You cannot resume a transfer using a non-seekable source.'); + } + // If no state was set, then create one by initiating or loading a multipart upload + if (is_string($this->state)) { + $this->state = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\TransferState::fromUploadId($this->client, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\UploadId::fromParams(array('Bucket' => $this->commandOptions['Bucket'], 'Key' => $this->commandOptions['Key'], 'UploadId' => $this->state))); + } elseif (!$this->state) { + $this->state = $this->initiateMultipartUpload(); + } + $options = array_replace(array('min_part_size' => $this->minPartSize, 'part_md5' => (bool) $this->calculatePartMd5, 'concurrency' => $this->concurrency), $this->transferOptions); + return $this->concurrency > 1 ? new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\ParallelTransfer($this->client, $this->state, $this->source, $options) : new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\SerialTransfer($this->client, $this->state, $this->source, $options); + } + /** + * {@inheritdoc} + */ + protected function initiateMultipartUpload() + { + // Determine Content-Type + if (!isset($this->commandOptions['ContentType'])) { + if ($mimeType = $this->source->getContentType()) { + $this->commandOptions['ContentType'] = $mimeType; + } + } + $params = array_replace(array(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::OPTION => \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\UaString::MULTIPART_UPLOAD, 'command.headers' => $this->headers, 'Metadata' => array()), $this->commandOptions); + // Calculate the MD5 hash if none was set and it is asked of the builder + if ($this->calculateEntireMd5) { + $this->md5 = $this->source->getContentMd5(); + } + // If an MD5 is specified, then add it to the custom headers of the request + // so that it will be returned when downloading the object from Amazon S3 + if ($this->md5) { + $params['Metadata']['x-amz-Content-MD5'] = $this->md5; + } + $result = $this->client->getCommand('CreateMultipartUpload', $params)->execute(); + // Create a new state based on the initiated upload + $params['UploadId'] = $result['UploadId']; + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\TransferState(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\UploadId::fromParams($params)); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadId.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadId.php new file mode 100644 index 00000000..7900affc --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadId.php @@ -0,0 +1,30 @@ + false, 'Key' => false, 'UploadId' => false); +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadPart.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadPart.php new file mode 100644 index 00000000..4feab5d8 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadPart.php @@ -0,0 +1,62 @@ + 'partNumber', 'ETag' => 'eTag', 'LastModified' => 'lastModified', 'Size' => 'size'); + /** + * @var string The ETag for this part + */ + protected $eTag; + /** + * @var string The last modified date + */ + protected $lastModified; + /** + * @var int The size (or content-length) in bytes of the upload body + */ + protected $size; + /** + * @return string + */ + public function getETag() + { + return $this->eTag; + } + /** + * @return string + */ + public function getLastModified() + { + return $this->lastModified; + } + /** + * @return int + */ + public function getSize() + { + return $this->size; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/PostObject.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/PostObject.php new file mode 100644 index 00000000..e92a7516 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Model/PostObject.php @@ -0,0 +1,229 @@ + tag attributes as an array + */ + protected $formAttributes; + /** + * @var array The form's elements as an array + */ + protected $formInputs; + /** + * @var string The raw json policy + */ + protected $jsonPolicy; + /** + * Constructs the PostObject + * + * The options array accepts the following keys: + * + * - acl: The access control setting to apply to the uploaded file. Accepts any of the + * CannedAcl constants + * - Cache-Control: The Cache-Control HTTP header value to apply to the uploaded file + * - Content-Disposition: The Content-Disposition HTTP header value to apply to the uploaded file + * - Content-Encoding: The Content-Encoding HTTP header value to apply to the uploaded file + * - Content-Type: The Content-Type HTTP header value to apply to the uploaded file. The default + * value is `application/octet-stream` + * - Expires: The Expires HTTP header value to apply to the uploaded file + * - key: The location where the file should be uploaded to. The default value is + * `^${filename}` which will use the name of the uploaded file + * - policy: A raw policy in JSON format. By default, the PostObject creates one for you + * - policy_callback: A callback used to modify the policy before encoding and signing it. The + * method signature for the callback should accept an array of the policy data as + * the 1st argument, (optionally) the PostObject as the 2nd argument, and return + * the policy data with the desired modifications. + * - success_action_redirect: The URI for Amazon S3 to redirect to upon successful upload + * - success_action_status: The status code for Amazon S3 to return upon successful upload + * - ttd: The expiration time for the generated upload form data + * - x-amz-meta-*: Any custom meta tag that should be set to the object + * - x-amz-server-side-encryption: The server-side encryption mechanism to use + * - x-amz-storage-class: The storage setting to apply to the object + * - x-amz-server-side​-encryption​-customer-algorithm: The SSE-C algorithm + * - x-amz-server-side​-encryption​-customer-key: The SSE-C customer secret key + * - x-amz-server-side​-encryption​-customer-key-MD5: The MD5 hash of the SSE-C customer secret key + * + * For the Cache-Control, Content-Disposition, Content-Encoding, + * Content-Type, Expires, and key options, to use a "starts-with" comparison + * instead of an equals comparison, prefix the value with a ^ (carat) + * character + * + * @param S3Client $client + * @param $bucket + * @param array $options + */ + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\S3Client $client, $bucket, array $options = array()) + { + $this->setClient($client); + $this->setBucket($bucket); + parent::__construct($options); + } + /** + * Analyzes the provided data and turns it into useful data that can be + * consumed and used to build an upload form + * + * @return PostObject + */ + public function prepareData() + { + // Validate required options + $options = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection::fromConfig($this->data, array('ttd' => '+1 hour', 'key' => '^${filename}')); + // Format ttd option + $ttd = $options['ttd']; + $ttd = is_numeric($ttd) ? (int) $ttd : strtotime($ttd); + unset($options['ttd']); + // If a policy or policy callback were provided, extract those from the options + $rawJsonPolicy = $options['policy']; + $policyCallback = $options['policy_callback']; + unset($options['policy'], $options['policy_callback']); + // Setup policy document + $policy = array('expiration' => gmdate(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\DateFormat::ISO8601_S3, $ttd), 'conditions' => array(array('bucket' => $this->bucket))); + // Configure the endpoint/action + $url = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Url::factory($this->client->getBaseUrl()); + if ($url->getScheme() === 'https' && strpos($this->bucket, '.') !== false) { + // Use path-style URLs + $url->setPath($this->bucket); + } else { + // Use virtual-style URLs + $url->setHost($this->bucket . '.' . $url->getHost()); + } + // Setup basic form + $this->formAttributes = array('action' => (string) $url, 'method' => 'POST', 'enctype' => 'multipart/form-data'); + $this->formInputs = array('AWSAccessKeyId' => $this->client->getCredentials()->getAccessKeyId()); + // Add success action status + $status = (int) $options->get('success_action_status'); + if ($status && in_array($status, array(200, 201, 204))) { + $this->formInputs['success_action_status'] = (string) $status; + $policy['conditions'][] = array('success_action_status' => (string) $status); + unset($options['success_action_status']); + } + // Add other options + foreach ($options as $key => $value) { + $value = (string) $value; + if ($value[0] === '^') { + $value = substr($value, 1); + $this->formInputs[$key] = $value; + $value = preg_replace('/\\$\\{(\\w*)\\}/', '', $value); + $policy['conditions'][] = array('starts-with', '$' . $key, $value); + } else { + $this->formInputs[$key] = $value; + $policy['conditions'][] = array($key => $value); + } + } + // Handle the policy + $policy = is_callable($policyCallback) ? $policyCallback($policy, $this) : $policy; + $this->jsonPolicy = $rawJsonPolicy ?: json_encode($policy); + $this->applyPolicy(); + return $this; + } + /** + * Sets the S3 client + * + * @param S3Client $client + * + * @return PostObject + */ + public function setClient(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\S3Client $client) + { + $this->client = $client; + return $this; + } + /** + * Gets the S3 client + * + * @return S3Client + */ + public function getClient() + { + return $this->client; + } + /** + * Sets the bucket and makes sure it is a valid bucket name + * + * @param string $bucket + * + * @return PostObject + */ + public function setBucket($bucket) + { + $this->bucket = $bucket; + return $this; + } + /** + * Gets the bucket name + * + * @return string + */ + public function getBucket() + { + return $this->bucket; + } + /** + * Gets the form attributes as an array + * + * @return array + */ + public function getFormAttributes() + { + return $this->formAttributes; + } + /** + * Gets the form inputs as an array + * + * @return array + */ + public function getFormInputs() + { + return $this->formInputs; + } + /** + * Gets the raw JSON policy + * + * @return string + */ + public function getJsonPolicy() + { + return $this->jsonPolicy; + } + /** + * Handles the encoding, singing, and injecting of the policy + */ + protected function applyPolicy() + { + $jsonPolicy64 = base64_encode($this->jsonPolicy); + $this->formInputs['policy'] = $jsonPolicy64; + $this->formInputs['signature'] = base64_encode(hash_hmac('sha1', $jsonPolicy64, $this->client->getCredentials()->getSecretKey(), true)); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Resources/s3-2006-03-01.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Resources/s3-2006-03-01.php new file mode 100644 index 00000000..7f6ea821 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Resources/s3-2006-03-01.php @@ -0,0 +1,17 @@ + '2006-03-01', 'endpointPrefix' => 's3', 'serviceFullName' => 'Amazon Simple Storage Service', 'serviceAbbreviation' => 'Amazon S3', 'serviceType' => 'rest-xml', 'timestampFormat' => 'rfc822', 'globalEndpoint' => 's3.amazonaws.com', 'signatureVersion' => 's3', 'namespace' => 'S3', 'regions' => array('us-east-1' => array('http' => \true, 'https' => \true, 'hostname' => 's3.amazonaws.com'), 'us-west-1' => array('http' => \true, 'https' => \true, 'hostname' => 's3-us-west-1.amazonaws.com'), 'us-west-2' => array('http' => \true, 'https' => \true, 'hostname' => 's3-us-west-2.amazonaws.com'), 'eu-west-1' => array('http' => \true, 'https' => \true, 'hostname' => 's3-eu-west-1.amazonaws.com'), 'eu-central-1' => array('http' => \true, 'https' => \true, 'hostname' => 's3-eu-central-1.amazonaws.com'), 'ap-northeast-1' => array('http' => \true, 'https' => \true, 'hostname' => 's3-ap-northeast-1.amazonaws.com'), 'ap-southeast-1' => array('http' => \true, 'https' => \true, 'hostname' => 's3-ap-southeast-1.amazonaws.com'), 'ap-southeast-2' => array('http' => \true, 'https' => \true, 'hostname' => 's3-ap-southeast-2.amazonaws.com'), 'sa-east-1' => array('http' => \true, 'https' => \true, 'hostname' => 's3-sa-east-1.amazonaws.com'), 'cn-north-1' => array('http' => \true, 'https' => \true, 'hostname' => 's3.cn-north-1.amazonaws.com.cn'), 'us-gov-west-1' => array('http' => \true, 'https' => \true, 'hostname' => 's3-us-gov-west-1.amazonaws.com')), 'operations' => array('AbortMultipartUpload' => array('httpMethod' => 'DELETE', 'uri' => '/{Bucket}{/Key*}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'AbortMultipartUploadOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadAbort.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'UploadId' => array('required' => \true, 'type' => 'string', 'location' => 'query', 'sentAs' => 'uploadId'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer')), 'errorResponses' => array(array('reason' => 'The specified multipart upload does not exist.', 'class' => 'NoSuchUploadException'))), 'CompleteMultipartUpload' => array('httpMethod' => 'POST', 'uri' => '/{Bucket}{/Key*}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'CompleteMultipartUploadOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html', 'data' => array('xmlRoot' => array('name' => 'CompleteMultipartUpload', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'Parts' => array('type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'CompletedPart', 'type' => 'object', 'sentAs' => 'Part', 'properties' => array('ETag' => array('type' => 'string'), 'PartNumber' => array('type' => 'numeric')))), 'UploadId' => array('required' => \true, 'type' => 'string', 'location' => 'query', 'sentAs' => 'uploadId'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'CopyObject' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}{/Key*}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'CopyObjectOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html', 'data' => array('xmlRoot' => array('name' => 'CopyObjectRequest', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('ACL' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-acl'), 'Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'CacheControl' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Cache-Control'), 'ContentDisposition' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Disposition'), 'ContentEncoding' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Encoding'), 'ContentLanguage' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Language'), 'ContentType' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Type'), 'CopySource' => array('required' => \true, 'type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source'), 'CopySourceIfMatch' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-if-match'), 'CopySourceIfModifiedSince' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-if-modified-since'), 'CopySourceIfNoneMatch' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-if-none-match'), 'CopySourceIfUnmodifiedSince' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-if-unmodified-since'), 'Expires' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http', 'location' => 'header'), 'GrantFullControl' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-full-control'), 'GrantRead' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-read'), 'GrantReadACP' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-read-acp'), 'GrantWriteACP' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-write-acp'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'Metadata' => array('type' => 'object', 'location' => 'header', 'sentAs' => 'x-amz-meta-', 'additionalProperties' => array('type' => 'string')), 'MetadataDirective' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-metadata-directive'), 'ServerSideEncryption' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption'), 'StorageClass' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-storage-class'), 'WebsiteRedirectLocation' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-website-redirect-location'), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKey' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'SSEKMSKeyId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'), 'CopySourceSSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-algorithm'), 'CopySourceSSECustomerKey' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-key'), 'CopySourceSSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-key-MD5'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'), 'ACP' => array('type' => 'object', 'additionalProperties' => \true), 'command.expects' => array('static' => \true, 'default' => 'application/xml')), 'errorResponses' => array(array('reason' => 'The source object of the COPY operation is not in the active tier and is only stored in Amazon Glacier.', 'class' => 'ObjectNotInActiveTierErrorException'))), 'CreateBucket' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'CreateBucketOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUT.html', 'data' => array('xmlRoot' => array('name' => 'CreateBucketConfiguration', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('ACL' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-acl'), 'Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'LocationConstraint' => array('type' => 'string', 'location' => 'xml'), 'GrantFullControl' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-full-control'), 'GrantRead' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-read'), 'GrantReadACP' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-read-acp'), 'GrantWrite' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-write'), 'GrantWriteACP' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-write-acp'), 'ACP' => array('type' => 'object', 'additionalProperties' => \true)), 'errorResponses' => array(array('reason' => 'The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.', 'class' => 'BucketAlreadyExistsException'))), 'CreateMultipartUpload' => array('httpMethod' => 'POST', 'uri' => '/{Bucket}{/Key*}?uploads', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'CreateMultipartUploadOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html', 'data' => array('xmlRoot' => array('name' => 'CreateMultipartUploadRequest', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('ACL' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-acl'), 'Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'CacheControl' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Cache-Control'), 'ContentDisposition' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Disposition'), 'ContentEncoding' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Encoding'), 'ContentLanguage' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Language'), 'ContentType' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Type'), 'Expires' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http', 'location' => 'header'), 'GrantFullControl' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-full-control'), 'GrantRead' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-read'), 'GrantReadACP' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-read-acp'), 'GrantWriteACP' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-write-acp'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'Metadata' => array('type' => 'object', 'location' => 'header', 'sentAs' => 'x-amz-meta-', 'additionalProperties' => array('type' => 'string')), 'ServerSideEncryption' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption'), 'StorageClass' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-storage-class'), 'WebsiteRedirectLocation' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-website-redirect-location'), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKey' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'SSEKMSKeyId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'), 'ACP' => array('type' => 'object', 'additionalProperties' => \true), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'DeleteBucket' => array('httpMethod' => 'DELETE', 'uri' => '/{Bucket}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'DeleteBucketOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETE.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'))), 'DeleteBucketCors' => array('httpMethod' => 'DELETE', 'uri' => '/{Bucket}?cors', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'DeleteBucketCorsOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETEcors.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'))), 'DeleteBucketLifecycle' => array('httpMethod' => 'DELETE', 'uri' => '/{Bucket}?lifecycle', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'DeleteBucketLifecycleOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETElifecycle.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'))), 'DeleteBucketPolicy' => array('httpMethod' => 'DELETE', 'uri' => '/{Bucket}?policy', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'DeleteBucketPolicyOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETEpolicy.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'))), 'DeleteBucketReplication' => array('httpMethod' => 'DELETE', 'uri' => '/{Bucket}?replication', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'DeleteBucketReplicationOutput', 'responseType' => 'model', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'))), 'DeleteBucketTagging' => array('httpMethod' => 'DELETE', 'uri' => '/{Bucket}?tagging', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'DeleteBucketTaggingOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETEtagging.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'))), 'DeleteBucketWebsite' => array('httpMethod' => 'DELETE', 'uri' => '/{Bucket}?website', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'DeleteBucketWebsiteOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETEwebsite.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'))), 'DeleteObject' => array('httpMethod' => 'DELETE', 'uri' => '/{Bucket}{/Key*}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'DeleteObjectOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'MFA' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-mfa'), 'VersionId' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'versionId'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'))), 'DeleteObjects' => array('httpMethod' => 'POST', 'uri' => '/{Bucket}?delete', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'DeleteObjectsOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/multiobjectdeleteapi.html', 'data' => array('xmlRoot' => array('name' => 'Delete', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/')), 'contentMd5' => \true), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Objects' => array('required' => \true, 'type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'ObjectIdentifier', 'type' => 'object', 'sentAs' => 'Object', 'properties' => array('Key' => array('required' => \true, 'type' => 'string', 'minLength' => 1), 'VersionId' => array('type' => 'string')))), 'Quiet' => array('type' => 'boolean', 'format' => 'boolean-string', 'location' => 'xml'), 'MFA' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-mfa'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetBucketAcl' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?acl', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetBucketAclOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETacl.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetBucketCors' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?cors', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetBucketCorsOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETcors.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetBucketLifecycle' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?lifecycle', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetBucketLifecycleOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlifecycle.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetBucketLifecycleConfiguration' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?lifecycle', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetBucketLifecycleConfigurationOutput', 'responseType' => 'model', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetBucketLocation' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?location', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetBucketLocationOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlocation.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'))), 'GetBucketLogging' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?logging', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetBucketLoggingOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlogging.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetBucketNotification' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?notification', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'NotificationConfigurationDeprecated', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETnotification.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetBucketNotificationConfiguration' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?notification', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'NotificationConfiguration', 'responseType' => 'model', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetBucketPolicy' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?policy', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetBucketPolicyOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETpolicy.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'))), 'GetBucketReplication' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?replication', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetBucketReplicationOutput', 'responseType' => 'model', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetBucketRequestPayment' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?requestPayment', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetBucketRequestPaymentOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTrequestPaymentGET.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetBucketTagging' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?tagging', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetBucketTaggingOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETtagging.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetBucketVersioning' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?versioning', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetBucketVersioningOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETversioningStatus.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetBucketWebsite' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?website', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetBucketWebsiteOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETwebsite.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'GetObject' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}{/Key*}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetObjectOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'IfMatch' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'If-Match'), 'IfModifiedSince' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http', 'location' => 'header', 'sentAs' => 'If-Modified-Since'), 'IfNoneMatch' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'If-None-Match'), 'IfUnmodifiedSince' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http', 'location' => 'header', 'sentAs' => 'If-Unmodified-Since'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'Range' => array('type' => 'string', 'location' => 'header'), 'ResponseCacheControl' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'response-cache-control'), 'ResponseContentDisposition' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'response-content-disposition'), 'ResponseContentEncoding' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'response-content-encoding'), 'ResponseContentLanguage' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'response-content-language'), 'ResponseContentType' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'response-content-type'), 'ResponseExpires' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http', 'location' => 'query', 'sentAs' => 'response-expires'), 'VersionId' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'versionId'), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKey' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'), 'SaveAs' => array('location' => 'response_body')), 'errorResponses' => array(array('reason' => 'The specified key does not exist.', 'class' => 'NoSuchKeyException'))), 'GetObjectAcl' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}{/Key*}?acl', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetObjectAclOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'VersionId' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'versionId'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'), 'command.expects' => array('static' => \true, 'default' => 'application/xml')), 'errorResponses' => array(array('reason' => 'The specified key does not exist.', 'class' => 'NoSuchKeyException'))), 'GetObjectTorrent' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}{/Key*}?torrent', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'GetObjectTorrentOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETtorrent.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'))), 'HeadBucket' => array('httpMethod' => 'HEAD', 'uri' => '/{Bucket}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'HeadBucketOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketHEAD.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri')), 'errorResponses' => array(array('reason' => 'The specified bucket does not exist.', 'class' => 'NoSuchBucketException'))), 'HeadObject' => array('httpMethod' => 'HEAD', 'uri' => '/{Bucket}{/Key*}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'HeadObjectOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectHEAD.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'IfMatch' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'If-Match'), 'IfModifiedSince' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http', 'location' => 'header', 'sentAs' => 'If-Modified-Since'), 'IfNoneMatch' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'If-None-Match'), 'IfUnmodifiedSince' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http', 'location' => 'header', 'sentAs' => 'If-Unmodified-Since'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'Range' => array('type' => 'string', 'location' => 'header'), 'VersionId' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'versionId'), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKey' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer')), 'errorResponses' => array(array('reason' => 'The specified key does not exist.', 'class' => 'NoSuchKeyException'))), 'ListBuckets' => array('httpMethod' => 'GET', 'uri' => '/', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'ListBucketsOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTServiceGET.html', 'parameters' => array('command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'ListMultipartUploads' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?uploads', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'ListMultipartUploadsOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListMPUpload.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Delimiter' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'delimiter'), 'EncodingType' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'encoding-type'), 'KeyMarker' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'key-marker'), 'MaxUploads' => array('type' => 'numeric', 'location' => 'query', 'sentAs' => 'max-uploads'), 'Prefix' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'prefix'), 'UploadIdMarker' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'upload-id-marker'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'ListObjectVersions' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}?versions', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'ListObjectVersionsOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETVersion.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Delimiter' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'delimiter'), 'EncodingType' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'encoding-type'), 'KeyMarker' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'key-marker'), 'MaxKeys' => array('type' => 'numeric', 'location' => 'query', 'sentAs' => 'max-keys'), 'Prefix' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'prefix'), 'VersionIdMarker' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'version-id-marker'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'ListObjects' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'ListObjectsOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Delimiter' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'delimiter'), 'EncodingType' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'encoding-type'), 'Marker' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'marker'), 'MaxKeys' => array('type' => 'numeric', 'location' => 'query', 'sentAs' => 'max-keys'), 'Prefix' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'prefix'), 'command.expects' => array('static' => \true, 'default' => 'application/xml')), 'errorResponses' => array(array('reason' => 'The specified bucket does not exist.', 'class' => 'NoSuchBucketException'))), 'ListParts' => array('httpMethod' => 'GET', 'uri' => '/{Bucket}{/Key*}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'ListPartsOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListParts.html', 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'MaxParts' => array('type' => 'numeric', 'location' => 'query', 'sentAs' => 'max-parts'), 'PartNumberMarker' => array('type' => 'numeric', 'location' => 'query', 'sentAs' => 'part-number-marker'), 'UploadId' => array('required' => \true, 'type' => 'string', 'location' => 'query', 'sentAs' => 'uploadId'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'), 'command.expects' => array('static' => \true, 'default' => 'application/xml'))), 'PutBucketAcl' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?acl', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketAclOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTacl.html', 'data' => array('xmlRoot' => array('name' => 'AccessControlPolicy', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('ACL' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-acl'), 'Grants' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'AccessControlList', 'items' => array('name' => 'Grant', 'type' => 'object', 'properties' => array('Grantee' => array('type' => 'object', 'properties' => array('DisplayName' => array('type' => 'string'), 'EmailAddress' => array('type' => 'string'), 'ID' => array('type' => 'string'), 'Type' => array('required' => \true, 'type' => 'string', 'sentAs' => 'xsi:type', 'data' => array('xmlAttribute' => \true, 'xmlNamespace' => 'http://www.w3.org/2001/XMLSchema-instance')), 'URI' => array('type' => 'string'))), 'Permission' => array('type' => 'string')))), 'Owner' => array('type' => 'object', 'location' => 'xml', 'properties' => array('DisplayName' => array('type' => 'string'), 'ID' => array('type' => 'string'))), 'Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'GrantFullControl' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-full-control'), 'GrantRead' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-read'), 'GrantReadACP' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-read-acp'), 'GrantWrite' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-write'), 'GrantWriteACP' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-write-acp'), 'ACP' => array('type' => 'object', 'additionalProperties' => \true))), 'PutBucketCors' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?cors', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketCorsOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTcors.html', 'data' => array('xmlRoot' => array('name' => 'CORSConfiguration', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/')), 'contentMd5' => \true), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'CORSRules' => array('required' => \true, 'type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'CORSRule', 'type' => 'object', 'sentAs' => 'CORSRule', 'properties' => array('AllowedHeaders' => array('type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'AllowedHeader', 'type' => 'string', 'sentAs' => 'AllowedHeader')), 'AllowedMethods' => array('required' => \true, 'type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'AllowedMethod', 'type' => 'string', 'sentAs' => 'AllowedMethod')), 'AllowedOrigins' => array('required' => \true, 'type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'AllowedOrigin', 'type' => 'string', 'sentAs' => 'AllowedOrigin')), 'ExposeHeaders' => array('type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'ExposeHeader', 'type' => 'string', 'sentAs' => 'ExposeHeader')), 'MaxAgeSeconds' => array('type' => 'numeric')))))), 'PutBucketLifecycle' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?lifecycle', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketLifecycleOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html', 'data' => array('xmlRoot' => array('name' => 'LifecycleConfiguration', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/')), 'contentMd5' => \true), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Rules' => array('required' => \true, 'type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Rule', 'type' => 'object', 'sentAs' => 'Rule', 'properties' => array('Expiration' => array('type' => 'object', 'properties' => array('Date' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time'), 'Days' => array('type' => 'numeric'))), 'ID' => array('type' => 'string'), 'Prefix' => array('required' => \true, 'type' => 'string'), 'Status' => array('required' => \true, 'type' => 'string'), 'Transition' => array('type' => 'object', 'properties' => array('Date' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time'), 'Days' => array('type' => 'numeric'), 'StorageClass' => array('type' => 'string'))), 'NoncurrentVersionTransition' => array('type' => 'object', 'properties' => array('NoncurrentDays' => array('type' => 'numeric'), 'StorageClass' => array('type' => 'string'))), 'NoncurrentVersionExpiration' => array('type' => 'object', 'properties' => array('NoncurrentDays' => array('type' => 'numeric')))))))), 'PutBucketLifecycleConfiguration' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?lifecycle', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketLifecycleConfigurationOutput', 'responseType' => 'model', 'data' => array('xmlRoot' => array('name' => 'LifecycleConfiguration', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Rules' => array('required' => \true, 'type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'LifecycleRule', 'type' => 'object', 'sentAs' => 'Rule', 'properties' => array('Expiration' => array('type' => 'object', 'properties' => array('Date' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http'), 'Days' => array('type' => 'numeric'))), 'ID' => array('type' => 'string'), 'Prefix' => array('required' => \true, 'type' => 'string'), 'Status' => array('required' => \true, 'type' => 'string'), 'Transitions' => array('type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Transition', 'type' => 'object', 'sentAs' => 'Transition', 'properties' => array('Date' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http'), 'Days' => array('type' => 'numeric'), 'StorageClass' => array('type' => 'string')))), 'NoncurrentVersionTransitions' => array('type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'NoncurrentVersionTransition', 'type' => 'object', 'sentAs' => 'NoncurrentVersionTransition', 'properties' => array('NoncurrentDays' => array('type' => 'numeric'), 'StorageClass' => array('type' => 'string')))), 'NoncurrentVersionExpiration' => array('type' => 'object', 'properties' => array('NoncurrentDays' => array('type' => 'numeric')))))))), 'PutBucketLogging' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?logging', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketLoggingOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlogging.html', 'data' => array('xmlRoot' => array('name' => 'BucketLoggingStatus', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/')), 'xmlAllowEmpty' => \true), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'LoggingEnabled' => array('type' => 'object', 'location' => 'xml', 'properties' => array('TargetBucket' => array('type' => 'string'), 'TargetGrants' => array('type' => 'array', 'items' => array('name' => 'Grant', 'type' => 'object', 'properties' => array('Grantee' => array('type' => 'object', 'properties' => array('DisplayName' => array('type' => 'string'), 'EmailAddress' => array('type' => 'string'), 'ID' => array('type' => 'string'), 'Type' => array('required' => \true, 'type' => 'string', 'sentAs' => 'xsi:type', 'data' => array('xmlAttribute' => \true, 'xmlNamespace' => 'http://www.w3.org/2001/XMLSchema-instance')), 'URI' => array('type' => 'string'))), 'Permission' => array('type' => 'string')))), 'TargetPrefix' => array('type' => 'string'))))), 'PutBucketNotification' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?notification', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketNotificationOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTnotification.html', 'data' => array('xmlRoot' => array('name' => 'NotificationConfiguration', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/')), 'xmlAllowEmpty' => \true), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'TopicConfiguration' => array('type' => 'object', 'location' => 'xml', 'properties' => array('Id' => array('type' => 'string'), 'Events' => array('type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Event', 'type' => 'string')), 'Event' => array('type' => 'string'), 'Topic' => array('type' => 'string'))), 'QueueConfiguration' => array('type' => 'object', 'location' => 'xml', 'properties' => array('Id' => array('type' => 'string'), 'Event' => array('type' => 'string'), 'Events' => array('type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Event', 'type' => 'string')), 'Queue' => array('type' => 'string'))), 'CloudFunctionConfiguration' => array('type' => 'object', 'location' => 'xml', 'properties' => array('Id' => array('type' => 'string'), 'Event' => array('type' => 'string'), 'Events' => array('type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Event', 'type' => 'string')), 'CloudFunction' => array('type' => 'string'), 'InvocationRole' => array('type' => 'string'))))), 'PutBucketNotificationConfiguration' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?notification', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketNotificationConfigurationOutput', 'responseType' => 'model', 'data' => array('xmlRoot' => array('name' => 'NotificationConfiguration', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'TopicConfigurations' => array('type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'TopicConfiguration', 'type' => 'object', 'sentAs' => 'TopicConfiguration', 'properties' => array('Id' => array('type' => 'string'), 'TopicArn' => array('required' => \true, 'type' => 'string', 'sentAs' => 'Topic'), 'Events' => array('required' => \true, 'type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Event', 'type' => 'string', 'sentAs' => 'Event')), 'Filter' => array('type' => 'object', 'properties' => array('Key' => array('type' => 'object', 'sentAs' => 'S3Key', 'properties' => array('FilterRules' => array('type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'FilterRule', 'type' => 'object', 'sentAs' => 'FilterRule', 'properties' => array('Name' => array('type' => 'string'), 'Value' => array('type' => 'string'))))))))))), 'QueueConfigurations' => array('type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'QueueConfiguration', 'type' => 'object', 'sentAs' => 'QueueConfiguration', 'properties' => array('Id' => array('type' => 'string'), 'QueueArn' => array('required' => \true, 'type' => 'string', 'sentAs' => 'Queue'), 'Events' => array('required' => \true, 'type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Event', 'type' => 'string', 'sentAs' => 'Event')), 'Filter' => array('type' => 'object', 'properties' => array('Key' => array('type' => 'object', 'sentAs' => 'S3Key', 'properties' => array('FilterRules' => array('type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'FilterRule', 'type' => 'object', 'sentAs' => 'FilterRule', 'properties' => array('Name' => array('type' => 'string'), 'Value' => array('type' => 'string'))))))))))), 'LambdaFunctionConfigurations' => array('type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'LambdaFunctionConfiguration', 'type' => 'object', 'sentAs' => 'CloudFunctionConfiguration', 'properties' => array('Id' => array('type' => 'string'), 'LambdaFunctionArn' => array('required' => \true, 'type' => 'string', 'sentAs' => 'CloudFunction'), 'Events' => array('required' => \true, 'type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Event', 'type' => 'string', 'sentAs' => 'Event')), 'Filter' => array('type' => 'object', 'properties' => array('Key' => array('type' => 'object', 'sentAs' => 'S3Key', 'properties' => array('FilterRules' => array('type' => 'array', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'FilterRule', 'type' => 'object', 'sentAs' => 'FilterRule', 'properties' => array('Name' => array('type' => 'string'), 'Value' => array('type' => 'string'))))))))))))), 'PutBucketPolicy' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?policy', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketPolicyOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTpolicy.html', 'data' => array('xmlRoot' => array('name' => 'PutBucketPolicyRequest', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Policy' => array('required' => \true, 'type' => array('string', 'object'), 'location' => 'body'))), 'PutBucketReplication' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?replication', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketReplicationOutput', 'responseType' => 'model', 'data' => array('xmlRoot' => array('name' => 'ReplicationConfiguration', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Role' => array('required' => \true, 'type' => 'string', 'location' => 'xml'), 'Rules' => array('required' => \true, 'type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'ReplicationRule', 'type' => 'object', 'sentAs' => 'Rule', 'properties' => array('ID' => array('type' => 'string'), 'Prefix' => array('required' => \true, 'type' => 'string'), 'Status' => array('required' => \true, 'type' => 'string'), 'Destination' => array('required' => \true, 'type' => 'object', 'properties' => array('Bucket' => array('required' => \true, 'type' => 'string'), 'StorageClass' => array('type' => 'string')))))))), 'PutBucketRequestPayment' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?requestPayment', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketRequestPaymentOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTrequestPaymentPUT.html', 'data' => array('xmlRoot' => array('name' => 'RequestPaymentConfiguration', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Payer' => array('required' => \true, 'type' => 'string', 'location' => 'xml'))), 'PutBucketTagging' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?tagging', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketTaggingOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTtagging.html', 'data' => array('xmlRoot' => array('name' => 'Tagging', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/')), 'contentMd5' => \true), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'TagSet' => array('required' => \true, 'type' => 'array', 'location' => 'xml', 'items' => array('name' => 'Tag', 'type' => 'object', 'properties' => array('Key' => array('required' => \true, 'type' => 'string', 'minLength' => 1), 'Value' => array('required' => \true, 'type' => 'string')))))), 'PutBucketVersioning' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?versioning', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketVersioningOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTVersioningStatus.html', 'data' => array('xmlRoot' => array('name' => 'VersioningConfiguration', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'MFA' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-mfa'), 'MFADelete' => array('type' => 'string', 'location' => 'xml', 'sentAs' => 'MfaDelete'), 'Status' => array('type' => 'string', 'location' => 'xml'))), 'PutBucketWebsite' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}?website', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutBucketWebsiteOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTwebsite.html', 'data' => array('xmlRoot' => array('name' => 'WebsiteConfiguration', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/')), 'xmlAllowEmpty' => \true), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'ErrorDocument' => array('type' => 'object', 'location' => 'xml', 'properties' => array('Key' => array('required' => \true, 'type' => 'string', 'minLength' => 1))), 'IndexDocument' => array('type' => 'object', 'location' => 'xml', 'properties' => array('Suffix' => array('required' => \true, 'type' => 'string'))), 'RedirectAllRequestsTo' => array('type' => 'object', 'location' => 'xml', 'properties' => array('HostName' => array('required' => \true, 'type' => 'string'), 'Protocol' => array('type' => 'string'))), 'RoutingRules' => array('type' => 'array', 'location' => 'xml', 'items' => array('name' => 'RoutingRule', 'type' => 'object', 'properties' => array('Condition' => array('type' => 'object', 'properties' => array('HttpErrorCodeReturnedEquals' => array('type' => 'string'), 'KeyPrefixEquals' => array('type' => 'string'))), 'Redirect' => array('required' => \true, 'type' => 'object', 'properties' => array('HostName' => array('type' => 'string'), 'HttpRedirectCode' => array('type' => 'string'), 'Protocol' => array('type' => 'string'), 'ReplaceKeyPrefixWith' => array('type' => 'string'), 'ReplaceKeyWith' => array('type' => 'string')))))))), 'PutObject' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}{/Key*}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutObjectOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html', 'data' => array('xmlRoot' => array('name' => 'PutObjectRequest', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('ACL' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-acl'), 'Body' => array('type' => array('string', 'object'), 'location' => 'body'), 'Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'CacheControl' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Cache-Control'), 'ContentDisposition' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Disposition'), 'ContentEncoding' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Encoding'), 'ContentLanguage' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Language'), 'ContentLength' => array('type' => 'numeric', 'location' => 'header', 'sentAs' => 'Content-Length'), 'ContentMD5' => array('type' => array('string', 'boolean'), 'location' => 'header', 'sentAs' => 'Content-MD5'), 'ContentType' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Type'), 'Expires' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http', 'location' => 'header'), 'GrantFullControl' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-full-control'), 'GrantRead' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-read'), 'GrantReadACP' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-read-acp'), 'GrantWriteACP' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-write-acp'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'Metadata' => array('type' => 'object', 'location' => 'header', 'sentAs' => 'x-amz-meta-', 'additionalProperties' => array('type' => 'string')), 'ServerSideEncryption' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption'), 'StorageClass' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-storage-class'), 'WebsiteRedirectLocation' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-website-redirect-location'), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKey' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'SSEKMSKeyId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'), 'ACP' => array('type' => 'object', 'additionalProperties' => \true))), 'PutObjectAcl' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}{/Key*}?acl', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'PutObjectAclOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUTacl.html', 'data' => array('xmlRoot' => array('name' => 'AccessControlPolicy', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('ACL' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-acl'), 'Grants' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'AccessControlList', 'items' => array('name' => 'Grant', 'type' => 'object', 'properties' => array('Grantee' => array('type' => 'object', 'properties' => array('DisplayName' => array('type' => 'string'), 'EmailAddress' => array('type' => 'string'), 'ID' => array('type' => 'string'), 'Type' => array('required' => \true, 'type' => 'string', 'sentAs' => 'xsi:type', 'data' => array('xmlAttribute' => \true, 'xmlNamespace' => 'http://www.w3.org/2001/XMLSchema-instance')), 'URI' => array('type' => 'string'))), 'Permission' => array('type' => 'string')))), 'Owner' => array('type' => 'object', 'location' => 'xml', 'properties' => array('DisplayName' => array('type' => 'string'), 'ID' => array('type' => 'string'))), 'Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'GrantFullControl' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-full-control'), 'GrantRead' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-read'), 'GrantReadACP' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-read-acp'), 'GrantWrite' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-write'), 'GrantWriteACP' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-grant-write-acp'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'), 'ACP' => array('type' => 'object', 'additionalProperties' => \true)), 'errorResponses' => array(array('reason' => 'The specified key does not exist.', 'class' => 'NoSuchKeyException'))), 'RestoreObject' => array('httpMethod' => 'POST', 'uri' => '/{Bucket}{/Key*}?restore', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'RestoreObjectOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectRestore.html', 'data' => array('xmlRoot' => array('name' => 'RestoreRequest', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'VersionId' => array('type' => 'string', 'location' => 'query', 'sentAs' => 'versionId'), 'Days' => array('required' => \true, 'type' => 'numeric', 'location' => 'xml'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer')), 'errorResponses' => array(array('reason' => 'This operation is not allowed against this storage tier', 'class' => 'ObjectAlreadyInActiveTierErrorException'))), 'UploadPart' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}{/Key*}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'UploadPartOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html', 'data' => array('xmlRoot' => array('name' => 'UploadPartRequest', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('Body' => array('type' => array('string', 'object'), 'location' => 'body'), 'Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'ContentLength' => array('type' => 'numeric', 'location' => 'header', 'sentAs' => 'Content-Length'), 'ContentMD5' => array('type' => array('string', 'boolean'), 'location' => 'header', 'sentAs' => 'Content-MD5'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'PartNumber' => array('required' => \true, 'type' => 'numeric', 'location' => 'query', 'sentAs' => 'partNumber'), 'UploadId' => array('required' => \true, 'type' => 'string', 'location' => 'query', 'sentAs' => 'uploadId'), 'ServerSideEncryption' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption'), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKey' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'))), 'UploadPartCopy' => array('httpMethod' => 'PUT', 'uri' => '/{Bucket}{/Key*}', 'class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command', 'responseClass' => 'UploadPartCopyOutput', 'responseType' => 'model', 'documentationUrl' => 'http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html', 'data' => array('xmlRoot' => array('name' => 'UploadPartCopyRequest', 'namespaces' => array('http://s3.amazonaws.com/doc/2006-03-01/'))), 'parameters' => array('Bucket' => array('required' => \true, 'type' => 'string', 'location' => 'uri'), 'CopySource' => array('required' => \true, 'type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source'), 'CopySourceIfMatch' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-if-match'), 'CopySourceIfModifiedSince' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-if-modified-since'), 'CopySourceIfNoneMatch' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-if-none-match'), 'CopySourceIfUnmodifiedSince' => array('type' => array('object', 'string', 'integer'), 'format' => 'date-time-http', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-if-unmodified-since'), 'CopySourceRange' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-range'), 'Key' => array('required' => \true, 'type' => 'string', 'location' => 'uri', 'minLength' => 1, 'filters' => array('DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client::explodeKey')), 'PartNumber' => array('required' => \true, 'type' => 'numeric', 'location' => 'query', 'sentAs' => 'partNumber'), 'UploadId' => array('required' => \true, 'type' => 'string', 'location' => 'query', 'sentAs' => 'uploadId'), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKey' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'CopySourceSSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-algorithm'), 'CopySourceSSECustomerKey' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-key'), 'CopySourceSSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-key-MD5'), 'RequestPayer' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-payer'), 'command.expects' => array('static' => \true, 'default' => 'application/xml')))), 'models' => array('AbortMultipartUploadOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'CompleteMultipartUploadOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Location' => array('type' => 'string', 'location' => 'xml'), 'Bucket' => array('type' => 'string', 'location' => 'xml'), 'Key' => array('type' => 'string', 'location' => 'xml'), 'Expiration' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-expiration'), 'ETag' => array('type' => 'string', 'location' => 'xml'), 'ServerSideEncryption' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption'), 'VersionId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-version-id'), 'SSEKMSKeyId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'CopyObjectOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('ETag' => array('type' => 'string', 'location' => 'xml'), 'LastModified' => array('type' => 'string', 'location' => 'xml'), 'Expiration' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-expiration'), 'CopySourceVersionId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-version-id'), 'VersionId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-version-id'), 'ServerSideEncryption' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption'), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'SSEKMSKeyId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'CreateBucketOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Location' => array('type' => 'string', 'location' => 'header'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'CreateMultipartUploadOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Bucket' => array('type' => 'string', 'location' => 'xml', 'sentAs' => 'Bucket'), 'Key' => array('type' => 'string', 'location' => 'xml'), 'UploadId' => array('type' => 'string', 'location' => 'xml'), 'ServerSideEncryption' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption'), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'SSEKMSKeyId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'DeleteBucketOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'DeleteBucketCorsOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'DeleteBucketLifecycleOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'DeleteBucketPolicyOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'DeleteBucketReplicationOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'DeleteBucketTaggingOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'DeleteBucketWebsiteOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'DeleteObjectOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('DeleteMarker' => array('type' => 'boolean', 'location' => 'header', 'sentAs' => 'x-amz-delete-marker'), 'VersionId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-version-id'), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'DeleteObjectsOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Deleted' => array('type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'DeletedObject', 'type' => 'object', 'properties' => array('Key' => array('type' => 'string'), 'VersionId' => array('type' => 'string'), 'DeleteMarker' => array('type' => 'boolean'), 'DeleteMarkerVersionId' => array('type' => 'string')))), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'Errors' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'Error', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Error', 'type' => 'object', 'sentAs' => 'Error', 'properties' => array('Key' => array('type' => 'string'), 'VersionId' => array('type' => 'string'), 'Code' => array('type' => 'string'), 'Message' => array('type' => 'string')))), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetBucketAclOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Owner' => array('type' => 'object', 'location' => 'xml', 'properties' => array('DisplayName' => array('type' => 'string'), 'ID' => array('type' => 'string'))), 'Grants' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'AccessControlList', 'items' => array('name' => 'Grant', 'type' => 'object', 'sentAs' => 'Grant', 'properties' => array('Grantee' => array('type' => 'object', 'properties' => array('DisplayName' => array('type' => 'string'), 'EmailAddress' => array('type' => 'string'), 'ID' => array('type' => 'string'), 'Type' => array('type' => 'string', 'sentAs' => 'xsi:type', 'data' => array('xmlAttribute' => \true, 'xmlNamespace' => 'http://www.w3.org/2001/XMLSchema-instance')), 'URI' => array('type' => 'string'))), 'Permission' => array('type' => 'string')))), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetBucketCorsOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('CORSRules' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'CORSRule', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'CORSRule', 'type' => 'object', 'sentAs' => 'CORSRule', 'properties' => array('AllowedHeaders' => array('type' => 'array', 'sentAs' => 'AllowedHeader', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'AllowedHeader', 'type' => 'string', 'sentAs' => 'AllowedHeader')), 'AllowedMethods' => array('type' => 'array', 'sentAs' => 'AllowedMethod', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'AllowedMethod', 'type' => 'string', 'sentAs' => 'AllowedMethod')), 'AllowedOrigins' => array('type' => 'array', 'sentAs' => 'AllowedOrigin', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'AllowedOrigin', 'type' => 'string', 'sentAs' => 'AllowedOrigin')), 'ExposeHeaders' => array('type' => 'array', 'sentAs' => 'ExposeHeader', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'ExposeHeader', 'type' => 'string', 'sentAs' => 'ExposeHeader')), 'MaxAgeSeconds' => array('type' => 'numeric')))), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetBucketLifecycleOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Rules' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'Rule', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Rule', 'type' => 'object', 'sentAs' => 'Rule', 'properties' => array('Expiration' => array('type' => 'object', 'properties' => array('Date' => array('type' => 'string'), 'Days' => array('type' => 'numeric'))), 'ID' => array('type' => 'string'), 'Prefix' => array('type' => 'string'), 'Status' => array('type' => 'string'), 'Transition' => array('type' => 'object', 'properties' => array('Date' => array('type' => 'string'), 'Days' => array('type' => 'numeric'), 'StorageClass' => array('type' => 'string'))), 'NoncurrentVersionTransition' => array('type' => 'object', 'properties' => array('NoncurrentDays' => array('type' => 'numeric'), 'StorageClass' => array('type' => 'string'))), 'NoncurrentVersionExpiration' => array('type' => 'object', 'properties' => array('NoncurrentDays' => array('type' => 'numeric')))))), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetBucketLifecycleConfigurationOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Rules' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'Rule', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'LifecycleRule', 'type' => 'object', 'sentAs' => 'Rule', 'properties' => array('Expiration' => array('type' => 'object', 'properties' => array('Date' => array('type' => 'string'), 'Days' => array('type' => 'numeric'))), 'ID' => array('type' => 'string'), 'Prefix' => array('type' => 'string'), 'Status' => array('type' => 'string'), 'Transitions' => array('type' => 'array', 'sentAs' => 'Transition', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Transition', 'type' => 'object', 'sentAs' => 'Transition', 'properties' => array('Date' => array('type' => 'string'), 'Days' => array('type' => 'numeric'), 'StorageClass' => array('type' => 'string')))), 'NoncurrentVersionTransitions' => array('type' => 'array', 'sentAs' => 'NoncurrentVersionTransition', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'NoncurrentVersionTransition', 'type' => 'object', 'sentAs' => 'NoncurrentVersionTransition', 'properties' => array('NoncurrentDays' => array('type' => 'numeric'), 'StorageClass' => array('type' => 'string')))), 'NoncurrentVersionExpiration' => array('type' => 'object', 'properties' => array('NoncurrentDays' => array('type' => 'numeric')))))), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetBucketLocationOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Location' => array('type' => 'string', 'location' => 'body', 'filters' => array('strval', 'strip_tags', 'trim')))), 'GetBucketLoggingOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('LoggingEnabled' => array('type' => 'object', 'location' => 'xml', 'properties' => array('TargetBucket' => array('type' => 'string'), 'TargetGrants' => array('type' => 'array', 'items' => array('name' => 'Grant', 'type' => 'object', 'sentAs' => 'Grant', 'properties' => array('Grantee' => array('type' => 'object', 'properties' => array('DisplayName' => array('type' => 'string'), 'EmailAddress' => array('type' => 'string'), 'ID' => array('type' => 'string'), 'Type' => array('type' => 'string', 'sentAs' => 'xsi:type', 'data' => array('xmlAttribute' => \true, 'xmlNamespace' => 'http://www.w3.org/2001/XMLSchema-instance')), 'URI' => array('type' => 'string'))), 'Permission' => array('type' => 'string')))), 'TargetPrefix' => array('type' => 'string'))), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'NotificationConfigurationDeprecated' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('TopicConfiguration' => array('type' => 'object', 'location' => 'xml', 'properties' => array('Id' => array('type' => 'string'), 'Events' => array('type' => 'array', 'sentAs' => 'Event', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Event', 'type' => 'string', 'sentAs' => 'Event')), 'Event' => array('type' => 'string'), 'Topic' => array('type' => 'string'))), 'QueueConfiguration' => array('type' => 'object', 'location' => 'xml', 'properties' => array('Id' => array('type' => 'string'), 'Event' => array('type' => 'string'), 'Events' => array('type' => 'array', 'sentAs' => 'Event', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Event', 'type' => 'string', 'sentAs' => 'Event')), 'Queue' => array('type' => 'string'))), 'CloudFunctionConfiguration' => array('type' => 'object', 'location' => 'xml', 'properties' => array('Id' => array('type' => 'string'), 'Event' => array('type' => 'string'), 'Events' => array('type' => 'array', 'sentAs' => 'Event', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Event', 'type' => 'string', 'sentAs' => 'Event')), 'CloudFunction' => array('type' => 'string'), 'InvocationRole' => array('type' => 'string'))), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'NotificationConfiguration' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('TopicConfigurations' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'TopicConfiguration', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'TopicConfiguration', 'type' => 'object', 'sentAs' => 'TopicConfiguration', 'properties' => array('Id' => array('type' => 'string'), 'TopicArn' => array('type' => 'string', 'sentAs' => 'Topic'), 'Events' => array('type' => 'array', 'sentAs' => 'Event', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Event', 'type' => 'string', 'sentAs' => 'Event')), 'Filter' => array('type' => 'object', 'properties' => array('Key' => array('type' => 'object', 'sentAs' => 'S3Key', 'properties' => array('FilterRules' => array('type' => 'array', 'sentAs' => 'FilterRule', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'FilterRule', 'type' => 'object', 'sentAs' => 'FilterRule', 'properties' => array('Name' => array('type' => 'string'), 'Value' => array('type' => 'string'))))))))))), 'QueueConfigurations' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'QueueConfiguration', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'QueueConfiguration', 'type' => 'object', 'sentAs' => 'QueueConfiguration', 'properties' => array('Id' => array('type' => 'string'), 'QueueArn' => array('type' => 'string', 'sentAs' => 'Queue'), 'Events' => array('type' => 'array', 'sentAs' => 'Event', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Event', 'type' => 'string', 'sentAs' => 'Event')), 'Filter' => array('type' => 'object', 'properties' => array('Key' => array('type' => 'object', 'sentAs' => 'S3Key', 'properties' => array('FilterRules' => array('type' => 'array', 'sentAs' => 'FilterRule', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'FilterRule', 'type' => 'object', 'sentAs' => 'FilterRule', 'properties' => array('Name' => array('type' => 'string'), 'Value' => array('type' => 'string'))))))))))), 'LambdaFunctionConfigurations' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'CloudFunctionConfiguration', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'LambdaFunctionConfiguration', 'type' => 'object', 'sentAs' => 'CloudFunctionConfiguration', 'properties' => array('Id' => array('type' => 'string'), 'LambdaFunctionArn' => array('type' => 'string', 'sentAs' => 'CloudFunction'), 'Events' => array('type' => 'array', 'sentAs' => 'Event', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Event', 'type' => 'string', 'sentAs' => 'Event')), 'Filter' => array('type' => 'object', 'properties' => array('Key' => array('type' => 'object', 'sentAs' => 'S3Key', 'properties' => array('FilterRules' => array('type' => 'array', 'sentAs' => 'FilterRule', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'FilterRule', 'type' => 'object', 'sentAs' => 'FilterRule', 'properties' => array('Name' => array('type' => 'string'), 'Value' => array('type' => 'string'))))))))))), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetBucketPolicyOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Policy' => array('type' => 'string', 'instanceOf' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\EntityBody', 'location' => 'body'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetBucketReplicationOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Role' => array('type' => 'string', 'location' => 'xml'), 'Rules' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'Rule', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'ReplicationRule', 'type' => 'object', 'sentAs' => 'Rule', 'properties' => array('ID' => array('type' => 'string'), 'Prefix' => array('type' => 'string'), 'Status' => array('type' => 'string'), 'Destination' => array('type' => 'object', 'properties' => array('Bucket' => array('type' => 'string'), 'StorageClass' => array('type' => 'string')))))), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetBucketRequestPaymentOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Payer' => array('type' => 'string', 'location' => 'xml'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetBucketTaggingOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('TagSet' => array('type' => 'array', 'location' => 'xml', 'items' => array('name' => 'Tag', 'type' => 'object', 'sentAs' => 'Tag', 'properties' => array('Key' => array('type' => 'string'), 'Value' => array('type' => 'string')))), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetBucketVersioningOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Status' => array('type' => 'string', 'location' => 'xml'), 'MFADelete' => array('type' => 'string', 'location' => 'xml', 'sentAs' => 'MfaDelete'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetBucketWebsiteOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RedirectAllRequestsTo' => array('type' => 'object', 'location' => 'xml', 'properties' => array('HostName' => array('type' => 'string'), 'Protocol' => array('type' => 'string'))), 'IndexDocument' => array('type' => 'object', 'location' => 'xml', 'properties' => array('Suffix' => array('type' => 'string'))), 'ErrorDocument' => array('type' => 'object', 'location' => 'xml', 'properties' => array('Key' => array('type' => 'string'))), 'RoutingRules' => array('type' => 'array', 'location' => 'xml', 'items' => array('name' => 'RoutingRule', 'type' => 'object', 'sentAs' => 'RoutingRule', 'properties' => array('Condition' => array('type' => 'object', 'properties' => array('HttpErrorCodeReturnedEquals' => array('type' => 'string'), 'KeyPrefixEquals' => array('type' => 'string'))), 'Redirect' => array('type' => 'object', 'properties' => array('HostName' => array('type' => 'string'), 'HttpRedirectCode' => array('type' => 'string'), 'Protocol' => array('type' => 'string'), 'ReplaceKeyPrefixWith' => array('type' => 'string'), 'ReplaceKeyWith' => array('type' => 'string')))))), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetObjectOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Body' => array('type' => 'string', 'instanceOf' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\EntityBody', 'location' => 'body'), 'DeleteMarker' => array('type' => 'boolean', 'location' => 'header', 'sentAs' => 'x-amz-delete-marker'), 'AcceptRanges' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'accept-ranges'), 'Expiration' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-expiration'), 'Restore' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-restore'), 'LastModified' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Last-Modified'), 'ContentLength' => array('type' => 'numeric', 'location' => 'header', 'sentAs' => 'Content-Length'), 'ETag' => array('type' => 'string', 'location' => 'header'), 'MissingMeta' => array('type' => 'numeric', 'location' => 'header', 'sentAs' => 'x-amz-missing-meta'), 'VersionId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-version-id'), 'CacheControl' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Cache-Control'), 'ContentDisposition' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Disposition'), 'ContentEncoding' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Encoding'), 'ContentLanguage' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Language'), 'ContentRange' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Range'), 'ContentType' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Type'), 'Expires' => array('type' => 'string', 'location' => 'header'), 'WebsiteRedirectLocation' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-website-redirect-location'), 'ServerSideEncryption' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption'), 'Metadata' => array('type' => 'object', 'location' => 'header', 'sentAs' => 'x-amz-meta-', 'additionalProperties' => array('type' => 'string')), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'SSEKMSKeyId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'), 'StorageClass' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-storage-class'), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'ReplicationStatus' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-replication-status'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetObjectAclOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Owner' => array('type' => 'object', 'location' => 'xml', 'properties' => array('DisplayName' => array('type' => 'string'), 'ID' => array('type' => 'string'))), 'Grants' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'AccessControlList', 'items' => array('name' => 'Grant', 'type' => 'object', 'sentAs' => 'Grant', 'properties' => array('Grantee' => array('type' => 'object', 'properties' => array('DisplayName' => array('type' => 'string'), 'EmailAddress' => array('type' => 'string'), 'ID' => array('type' => 'string'), 'Type' => array('type' => 'string', 'sentAs' => 'xsi:type', 'data' => array('xmlAttribute' => \true, 'xmlNamespace' => 'http://www.w3.org/2001/XMLSchema-instance')), 'URI' => array('type' => 'string'))), 'Permission' => array('type' => 'string')))), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'GetObjectTorrentOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Body' => array('type' => 'string', 'instanceOf' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\EntityBody', 'location' => 'body'), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'HeadBucketOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'HeadObjectOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('DeleteMarker' => array('type' => 'boolean', 'location' => 'header', 'sentAs' => 'x-amz-delete-marker'), 'AcceptRanges' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'accept-ranges'), 'Expiration' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-expiration'), 'Restore' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-restore'), 'LastModified' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Last-Modified'), 'ContentLength' => array('type' => 'numeric', 'location' => 'header', 'sentAs' => 'Content-Length'), 'ETag' => array('type' => 'string', 'location' => 'header'), 'MissingMeta' => array('type' => 'numeric', 'location' => 'header', 'sentAs' => 'x-amz-missing-meta'), 'VersionId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-version-id'), 'CacheControl' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Cache-Control'), 'ContentDisposition' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Disposition'), 'ContentEncoding' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Encoding'), 'ContentLanguage' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Language'), 'ContentType' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'Content-Type'), 'Expires' => array('type' => 'string', 'location' => 'header'), 'WebsiteRedirectLocation' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-website-redirect-location'), 'ServerSideEncryption' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption'), 'Metadata' => array('type' => 'object', 'location' => 'header', 'sentAs' => 'x-amz-meta-', 'additionalProperties' => array('type' => 'string')), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'SSEKMSKeyId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'), 'StorageClass' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-storage-class'), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'ReplicationStatus' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-replication-status'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'ListBucketsOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Buckets' => array('type' => 'array', 'location' => 'xml', 'items' => array('name' => 'Bucket', 'type' => 'object', 'sentAs' => 'Bucket', 'properties' => array('Name' => array('type' => 'string'), 'CreationDate' => array('type' => 'string')))), 'Owner' => array('type' => 'object', 'location' => 'xml', 'properties' => array('DisplayName' => array('type' => 'string'), 'ID' => array('type' => 'string'))), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'ListMultipartUploadsOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Bucket' => array('type' => 'string', 'location' => 'xml'), 'KeyMarker' => array('type' => 'string', 'location' => 'xml'), 'UploadIdMarker' => array('type' => 'string', 'location' => 'xml'), 'NextKeyMarker' => array('type' => 'string', 'location' => 'xml'), 'Prefix' => array('type' => 'string', 'location' => 'xml'), 'Delimiter' => array('type' => 'string', 'location' => 'xml'), 'NextUploadIdMarker' => array('type' => 'string', 'location' => 'xml'), 'MaxUploads' => array('type' => 'numeric', 'location' => 'xml'), 'IsTruncated' => array('type' => 'boolean', 'location' => 'xml'), 'Uploads' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'Upload', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'MultipartUpload', 'type' => 'object', 'sentAs' => 'Upload', 'properties' => array('UploadId' => array('type' => 'string'), 'Key' => array('type' => 'string'), 'Initiated' => array('type' => 'string'), 'StorageClass' => array('type' => 'string'), 'Owner' => array('type' => 'object', 'properties' => array('DisplayName' => array('type' => 'string'), 'ID' => array('type' => 'string'))), 'Initiator' => array('type' => 'object', 'properties' => array('ID' => array('type' => 'string'), 'DisplayName' => array('type' => 'string')))))), 'CommonPrefixes' => array('type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'CommonPrefix', 'type' => 'object', 'properties' => array('Prefix' => array('type' => 'string')))), 'EncodingType' => array('type' => 'string', 'location' => 'xml'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'ListObjectVersionsOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('IsTruncated' => array('type' => 'boolean', 'location' => 'xml'), 'KeyMarker' => array('type' => 'string', 'location' => 'xml'), 'VersionIdMarker' => array('type' => 'string', 'location' => 'xml'), 'NextKeyMarker' => array('type' => 'string', 'location' => 'xml'), 'NextVersionIdMarker' => array('type' => 'string', 'location' => 'xml'), 'Versions' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'Version', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'ObjectVersion', 'type' => 'object', 'sentAs' => 'Version', 'properties' => array('ETag' => array('type' => 'string'), 'Size' => array('type' => 'numeric'), 'StorageClass' => array('type' => 'string'), 'Key' => array('type' => 'string'), 'VersionId' => array('type' => 'string'), 'IsLatest' => array('type' => 'boolean'), 'LastModified' => array('type' => 'string'), 'Owner' => array('type' => 'object', 'properties' => array('DisplayName' => array('type' => 'string'), 'ID' => array('type' => 'string')))))), 'DeleteMarkers' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'DeleteMarker', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'DeleteMarkerEntry', 'type' => 'object', 'sentAs' => 'DeleteMarker', 'properties' => array('Owner' => array('type' => 'object', 'properties' => array('DisplayName' => array('type' => 'string'), 'ID' => array('type' => 'string'))), 'Key' => array('type' => 'string'), 'VersionId' => array('type' => 'string'), 'IsLatest' => array('type' => 'boolean'), 'LastModified' => array('type' => 'string')))), 'Name' => array('type' => 'string', 'location' => 'xml'), 'Prefix' => array('type' => 'string', 'location' => 'xml'), 'Delimiter' => array('type' => 'string', 'location' => 'xml'), 'MaxKeys' => array('type' => 'numeric', 'location' => 'xml'), 'CommonPrefixes' => array('type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'CommonPrefix', 'type' => 'object', 'properties' => array('Prefix' => array('type' => 'string')))), 'EncodingType' => array('type' => 'string', 'location' => 'xml'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'ListObjectsOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('IsTruncated' => array('type' => 'boolean', 'location' => 'xml'), 'Marker' => array('type' => 'string', 'location' => 'xml'), 'NextMarker' => array('type' => 'string', 'location' => 'xml'), 'Contents' => array('type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Object', 'type' => 'object', 'properties' => array('Key' => array('type' => 'string'), 'LastModified' => array('type' => 'string'), 'ETag' => array('type' => 'string'), 'Size' => array('type' => 'numeric'), 'StorageClass' => array('type' => 'string'), 'Owner' => array('type' => 'object', 'properties' => array('DisplayName' => array('type' => 'string'), 'ID' => array('type' => 'string')))))), 'Name' => array('type' => 'string', 'location' => 'xml'), 'Prefix' => array('type' => 'string', 'location' => 'xml'), 'Delimiter' => array('type' => 'string', 'location' => 'xml'), 'MaxKeys' => array('type' => 'numeric', 'location' => 'xml'), 'CommonPrefixes' => array('type' => 'array', 'location' => 'xml', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'CommonPrefix', 'type' => 'object', 'properties' => array('Prefix' => array('type' => 'string')))), 'EncodingType' => array('type' => 'string', 'location' => 'xml'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'ListPartsOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Bucket' => array('type' => 'string', 'location' => 'xml'), 'Key' => array('type' => 'string', 'location' => 'xml'), 'UploadId' => array('type' => 'string', 'location' => 'xml'), 'PartNumberMarker' => array('type' => 'numeric', 'location' => 'xml'), 'NextPartNumberMarker' => array('type' => 'numeric', 'location' => 'xml'), 'MaxParts' => array('type' => 'numeric', 'location' => 'xml'), 'IsTruncated' => array('type' => 'boolean', 'location' => 'xml'), 'Parts' => array('type' => 'array', 'location' => 'xml', 'sentAs' => 'Part', 'data' => array('xmlFlattened' => \true), 'items' => array('name' => 'Part', 'type' => 'object', 'sentAs' => 'Part', 'properties' => array('PartNumber' => array('type' => 'numeric'), 'LastModified' => array('type' => 'string'), 'ETag' => array('type' => 'string'), 'Size' => array('type' => 'numeric')))), 'Initiator' => array('type' => 'object', 'location' => 'xml', 'properties' => array('ID' => array('type' => 'string'), 'DisplayName' => array('type' => 'string'))), 'Owner' => array('type' => 'object', 'location' => 'xml', 'properties' => array('DisplayName' => array('type' => 'string'), 'ID' => array('type' => 'string'))), 'StorageClass' => array('type' => 'string', 'location' => 'xml'), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketAclOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketCorsOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketLifecycleOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketLifecycleConfigurationOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketLoggingOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketNotificationOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketNotificationConfigurationOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketPolicyOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketReplicationOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketRequestPaymentOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketTaggingOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketVersioningOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutBucketWebsiteOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'PutObjectOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('Expiration' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-expiration'), 'ETag' => array('type' => 'string', 'location' => 'header'), 'ServerSideEncryption' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption'), 'VersionId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-version-id'), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'SSEKMSKeyId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'), 'ObjectURL' => array())), 'PutObjectAclOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'RestoreObjectOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'UploadPartOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('ServerSideEncryption' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption'), 'ETag' => array('type' => 'string', 'location' => 'header'), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'SSEKMSKeyId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id'))), 'UploadPartCopyOutput' => array('type' => 'object', 'additionalProperties' => \true, 'properties' => array('CopySourceVersionId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-copy-source-version-id'), 'ETag' => array('type' => 'string', 'location' => 'xml'), 'LastModified' => array('type' => 'string', 'location' => 'xml'), 'ServerSideEncryption' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption'), 'SSECustomerAlgorithm' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'), 'SSECustomerKeyMD5' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'), 'SSEKMSKeyId' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'), 'RequestCharged' => array('type' => 'string', 'location' => 'header', 'sentAs' => 'x-amz-request-charged'), 'RequestId' => array('location' => 'header', 'sentAs' => 'x-amz-request-id')))), 'iterators' => array('ListBuckets' => array('result_key' => 'Buckets'), 'ListMultipartUploads' => array('limit_key' => 'MaxUploads', 'more_results' => 'IsTruncated', 'output_token' => array('NextKeyMarker', 'NextUploadIdMarker'), 'input_token' => array('KeyMarker', 'UploadIdMarker'), 'result_key' => array('Uploads', 'CommonPrefixes')), 'ListObjectVersions' => array('more_results' => 'IsTruncated', 'limit_key' => 'MaxKeys', 'output_token' => array('NextKeyMarker', 'NextVersionIdMarker'), 'input_token' => array('KeyMarker', 'VersionIdMarker'), 'result_key' => array('Versions', 'DeleteMarkers', 'CommonPrefixes')), 'ListObjects' => array('more_results' => 'IsTruncated', 'limit_key' => 'MaxKeys', 'output_token' => 'NextMarker', 'input_token' => 'Marker', 'result_key' => array('Contents', 'CommonPrefixes')), 'ListParts' => array('more_results' => 'IsTruncated', 'limit_key' => 'MaxParts', 'output_token' => 'NextPartNumberMarker', 'input_token' => 'PartNumberMarker', 'result_key' => 'Parts')), 'waiters' => array('__default__' => array('interval' => 5, 'max_attempts' => 20), 'BucketExists' => array('operation' => 'HeadBucket', 'success.type' => 'output', 'ignore_errors' => array('NoSuchBucket')), 'BucketNotExists' => array('operation' => 'HeadBucket', 'success.type' => 'error', 'success.value' => 'NoSuchBucket'), 'ObjectExists' => array('operation' => 'HeadObject', 'success.type' => 'output', 'ignore_errors' => array('NoSuchKey')), 'ObjectNotExists' => array('operation' => 'HeadObject', 'success.type' => 'error', 'success.value' => 'NoSuchKey'))); diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/ResumableDownload.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/ResumableDownload.php new file mode 100644 index 00000000..e90b3288 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/ResumableDownload.php @@ -0,0 +1,150 @@ +params = $params; + $this->client = $client; + $this->params['Bucket'] = $bucket; + $this->params['Key'] = $key; + // If a string is passed, then assume that the download should stream to a file on disk + if (is_string($target)) { + if (!($target = fopen($target, 'a+'))) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException("Unable to open {$target} for writing"); + } + // Always append to the file + fseek($target, 0, SEEK_END); + } + // Get the metadata and Content-MD5 of the object + $this->target = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory($target); + } + /** + * Get the bucket of the download + * + * @return string + */ + public function getBucket() + { + return $this->params['Bucket']; + } + /** + * Get the key of the download + * + * @return string + */ + public function getKey() + { + return $this->params['Key']; + } + /** + * Get the file to which the contents are downloaded + * + * @return string + */ + public function getFilename() + { + return $this->target->getUri(); + } + /** + * Download the remainder of the object from Amazon S3 + * + * Performs a message integrity check if possible + * + * @return Model + */ + public function __invoke() + { + $command = $this->client->getCommand('HeadObject', $this->params); + $this->meta = $command->execute(); + if ($this->target->ftell() >= $this->meta['ContentLength']) { + return false; + } + $this->meta['ContentMD5'] = (string) $command->getResponse()->getHeader('Content-MD5'); + // Use a ReadLimitEntityBody so that rewinding the stream after an error does not cause the file pointer + // to enter an inconsistent state with the data being downloaded + $this->params['SaveAs'] = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\ReadLimitEntityBody($this->target, $this->meta['ContentLength'], $this->target->ftell()); + $result = $this->getRemaining(); + $this->checkIntegrity(); + return $result; + } + /** + * Send the command to get the remainder of the object + * + * @return Model + */ + protected function getRemaining() + { + $current = $this->target->ftell(); + $targetByte = $this->meta['ContentLength'] - 1; + $this->params['Range'] = "bytes={$current}-{$targetByte}"; + // Set the starting offset so that the body is never seeked to before this point in the event of a retry + $this->params['SaveAs']->setOffset($current); + $command = $this->client->getCommand('GetObject', $this->params); + return $command->execute(); + } + /** + * Performs an MD5 message integrity check if possible + * + * @throws UnexpectedValueException if the message does not validate + */ + protected function checkIntegrity() + { + if ($this->target->isReadable() && ($expected = $this->meta['ContentMD5'])) { + $actual = $this->target->getContentMd5(); + if ($actual != $expected) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\UnexpectedValueException("Message integrity check failed. Expected {$expected} but got {$actual}."); + } + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/S3Client.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/S3Client.php new file mode 100644 index 00000000..506e6500 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/S3Client.php @@ -0,0 +1,524 @@ + 'ListBuckets', + 'GetBucket' => 'ListObjects', + 'PutBucket' => 'CreateBucket', + // SDK 1.x Aliases + 'GetBucketHeaders' => 'HeadBucket', + 'GetObjectHeaders' => 'HeadObject', + 'SetBucketAcl' => 'PutBucketAcl', + 'CreateObject' => 'PutObject', + 'DeleteObjects' => 'DeleteMultipleObjects', + 'PutObjectCopy' => 'CopyObject', + 'SetObjectAcl' => 'PutObjectAcl', + 'GetLogs' => 'GetBucketLogging', + 'GetVersioningStatus' => 'GetBucketVersioning', + 'SetBucketPolicy' => 'PutBucketPolicy', + 'CreateBucketNotification' => 'PutBucketNotification', + 'GetBucketNotifications' => 'GetBucketNotification', + 'CopyPart' => 'UploadPartCopy', + 'CreateWebsiteConfig' => 'PutBucketWebsite', + 'GetWebsiteConfig' => 'GetBucketWebsite', + 'DeleteWebsiteConfig' => 'DeleteBucketWebsite', + 'CreateObjectExpirationConfig' => 'PutBucketLifecycle', + 'GetObjectExpirationConfig' => 'GetBucketLifecycle', + 'DeleteObjectExpirationConfig' => 'DeleteBucketLifecycle', + ); + protected $directory = __DIR__; + /** + * Factory method to create a new Amazon S3 client using an array of configuration options. + * + * @param array|Collection $config Client configuration data + * + * @return S3Client + * @link http://docs.aws.amazon.com/aws-sdk-php/v2/guide/configuration.html#client-configuration-options + */ + public static function factory($config = array()) + { + $exceptionParser = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Exception\Parser\S3ExceptionParser(); + // Configure the custom exponential backoff plugin for retrying S3 specific errors + if (!isset($config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BACKOFF])) { + $retries = isset($config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BACKOFF_RETRIES]) ? $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BACKOFF_RETRIES] : 3; + $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::BACKOFF] = static::createBackoffPlugin($exceptionParser, $retries); + } + $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SIGNATURE] = $signature = static::createSignature($config); + $client = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Client\ClientBuilder::factory(__NAMESPACE__)->setConfig($config)->setConfigDefaults(array(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::VERSION => self::LATEST_API_VERSION, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SERVICE_DESCRIPTION => __DIR__ . '/Resources/s3-%s.php'))->setExceptionParser($exceptionParser)->setIteratorsConfig(array('more_key' => 'IsTruncated', 'operations' => array('ListBuckets', 'ListMultipartUploads' => array('limit_param' => 'MaxUploads', 'token_param' => array('KeyMarker', 'UploadIdMarker'), 'token_key' => array('NextKeyMarker', 'NextUploadIdMarker')), 'ListObjects' => array('limit_param' => 'MaxKeys', 'token_param' => 'Marker', 'token_key' => 'NextMarker'), 'ListObjectVersions' => array('limit_param' => 'MaxKeys', 'token_param' => array('KeyMarker', 'VersionIdMarker'), 'token_key' => array('nextKeyMarker', 'nextVersionIdMarker')), 'ListParts' => array('limit_param' => 'MaxParts', 'result_key' => 'Parts', 'token_param' => 'PartNumberMarker', 'token_key' => 'NextPartNumberMarker'))))->build(); + // Use virtual hosted buckets when possible + $client->addSubscriber(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\BucketStyleListener()); + // Ensure that ACP headers are applied when needed + $client->addSubscriber(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\AcpListener()); + // Validate and add required Content-MD5 hashes (e.g. DeleteObjects) + $client->addSubscriber(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\S3Md5Listener($signature)); + // Allow for specifying bodies with file paths and file handles + $client->addSubscriber(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Client\UploadBodyListener(array('PutObject', 'UploadPart'))); + // Ensures that if a SSE-CPK key is provided, the key and md5 are formatted correctly + $client->addSubscriber(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\SseCpkListener()); + // Add aliases for some S3 operations + $default = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\Factory\CompositeFactory::getDefaultChain($client); + $default->add(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\Factory\AliasFactory($client, static::$commandAliases), 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\ServiceDescriptionFactory'); + $client->setCommandFactory($default); + return $client; + } + /** + * Create an Amazon S3 specific backoff plugin + * + * @param S3ExceptionParser $exceptionParser + * + * @return BackoffPlugin + */ + private static function createBackoffPlugin(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Exception\Parser\S3ExceptionParser $exceptionParser, $retries = 3) + { + return new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\BackoffPlugin(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\TruncatedBackoffStrategy($retries, new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\IncompleteMultipartUploadChecker(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\CurlBackoffStrategy(null, new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\HttpBackoffStrategy(null, new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\SocketTimeoutChecker(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Client\ExpiredCredentialsChecker($exceptionParser, new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\ExponentialBackoffStrategy()))))))); + } + /** + * Create an appropriate signature based on the configuration settings + * + * @param $config + * + * @return \Aws\Common\Signature\SignatureInterface + * @throws InvalidArgumentException + */ + private static function createSignature($config) + { + $currentValue = isset($config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SIGNATURE]) ? $config[\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Enum\ClientOptions::SIGNATURE] : null; + // Force v4 if no value is provided, a region is in the config, and + // the region starts with "cn-" or "eu-central-". + $requiresV4 = !$currentValue && isset($config['region']) && (strpos($config['region'], 'eu-central-') === 0 || strpos($config['region'], 'cn-') === 0); + // Use the Amazon S3 signature V4 when the value is set to "v4" or when + // the value is not set and the region starts with "cn-". + if ($currentValue == 'v4' || $requiresV4) { + // Force SignatureV4 for specific regions or if specified in the config + $currentValue = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\S3SignatureV4('s3'); + } elseif (!$currentValue || $currentValue == 's3') { + // Use the Amazon S3 signature by default + $currentValue = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\S3Signature(); + } + // A region is require with v4 + if ($currentValue instanceof SignatureV4 && !isset($config['region'])) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('A region must be specified ' . 'when using signature version 4'); + } + return $currentValue; + } + /** + * Determine if a string is a valid name for a DNS compatible Amazon S3 + * bucket, meaning the bucket can be used as a subdomain in a URL (e.g., + * ".s3.amazonaws.com"). + * + * @param string $bucket The name of the bucket to check. + * + * @return bool TRUE if the bucket name is valid or FALSE if it is invalid. + */ + public static function isValidBucketName($bucket) + { + $bucketLen = strlen($bucket); + if ($bucketLen < 3 || $bucketLen > 63 || preg_match('/(\\d+\\.){3}\\d+$/', $bucket) || !preg_match('/^[a-z0-9]([a-z0-9\\-\\.]*[a-z0-9])?$/', $bucket)) { + return false; + } + return true; + } + /** + * Create a pre-signed URL for a request + * + * @param RequestInterface $request Request to generate the URL for. Use the factory methods of the client to + * create this request object + * @param int|string|\DateTime $expires The time at which the URL should expire. This can be a Unix timestamp, a + * PHP DateTime object, or a string that can be evaluated by strtotime + * + * @return string + * @throws InvalidArgumentException if the request is not associated with this client object + */ + public function createPresignedUrl(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $expires) + { + if ($request->getClient() !== $this) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\InvalidArgumentException('The request object must be associated with the client. Use the ' . '$client->get(), $client->head(), $client->post(), $client->put(), etc. methods when passing in a ' . 'request object'); + } + return $this->signature->createPresignedUrl($request, $this->credentials, $expires); + } + /** + * Returns the URL to an object identified by its bucket and key. If an expiration time is provided, the URL will + * be signed and set to expire at the provided time. + * + * Note: This method does not ensure that the generated URL is valid. For example, the bucket referenced may not + * exist, the key referenced may not exist, and the URL might include parameters that require it to be signed. + * If you need to use parameters that require a signed URL (e.g., ResponseCacheControl), then you must sign the + * URL either by providing an $expires argument or by signing the URL returned by this method in some other + * manner. + * + * @param string $bucket The name of the bucket where the object is located + * @param string $key The key of the object + * @param mixed $expires The time at which the URL should expire + * @param array $args Arguments to the GetObject command. Additionally you can specify a "Scheme" if you would + * like the URL to use a different scheme than what the client is configured to use + * + * @return string The URL to the object + */ + public function getObjectUrl($bucket, $key, $expires = null, array $args = array()) + { + $command = $this->getCommand('GetObject', $args + array('Bucket' => $bucket, 'Key' => $key)); + if ($command->hasKey('Scheme')) { + $scheme = $command['Scheme']; + $request = $command->remove('Scheme')->prepare()->setScheme($scheme)->setPort(null); + } else { + $request = $command->prepare(); + } + return $expires ? $this->createPresignedUrl($request, $expires) : $request->getUrl(); + } + /** + * Helper used to clear the contents of a bucket. Use the {@see ClearBucket} object directly + * for more advanced options and control. + * + * @param string $bucket Name of the bucket to clear. + * + * @return int Returns the number of deleted keys + */ + public function clearBucket($bucket) + { + $clear = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\ClearBucket($this, $bucket); + return $clear->clear(); + } + /** + * Determines whether or not a bucket exists by name + * + * @param string $bucket The name of the bucket + * @param bool $accept403 Set to true if 403s are acceptable + * @param array $options Additional options to add to the executed command + * + * @return bool + */ + public function doesBucketExist($bucket, $accept403 = true, array $options = array()) + { + return $this->checkExistenceWithCommand($this->getCommand('HeadBucket', array_merge($options, array('Bucket' => $bucket))), $accept403); + } + /** + * Determines whether or not an object exists by name + * + * @param string $bucket The name of the bucket + * @param string $key The key of the object + * @param array $options Additional options to add to the executed command + * + * @return bool + */ + public function doesObjectExist($bucket, $key, array $options = array()) + { + return $this->checkExistenceWithCommand($this->getCommand('HeadObject', array_merge($options, array('Bucket' => $bucket, 'Key' => $key)))); + } + /** + * Determines whether or not a bucket policy exists for a bucket + * + * @param string $bucket The name of the bucket + * @param array $options Additional options to add to the executed command + * + * @return bool + */ + public function doesBucketPolicyExist($bucket, array $options = array()) + { + return $this->checkExistenceWithCommand($this->getCommand('GetBucketPolicy', array_merge($options, array('Bucket' => $bucket)))); + } + /** + * Raw URL encode a key and allow for '/' characters + * + * @param string $key Key to encode + * + * @return string Returns the encoded key + */ + public static function encodeKey($key) + { + return str_replace('%2F', '/', rawurlencode($key)); + } + /** + * Explode a prefixed key into an array of values + * + * @param string $key Key to explode + * + * @return array Returns the exploded + */ + public static function explodeKey($key) + { + // Remove a leading slash if one is found + return explode('/', $key && $key[0] == '/' ? substr($key, 1) : $key); + } + /** + * Register the Amazon S3 stream wrapper and associates it with this client object + * + * @return $this + */ + public function registerStreamWrapper() + { + \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\StreamWrapper::register($this); + return $this; + } + /** + * Upload a file, stream, or string to a bucket. If the upload size exceeds the specified threshold, the upload + * will be performed using parallel multipart uploads. + * + * @param string $bucket Bucket to upload the object + * @param string $key Key of the object + * @param mixed $body Object data to upload. Can be a Guzzle\Http\EntityBodyInterface, stream resource, or + * string of data to upload. + * @param string $acl ACL to apply to the object + * @param array $options Custom options used when executing commands: + * - params: Custom parameters to use with the upload. The parameters must map to a PutObject + * or InitiateMultipartUpload operation parameters. + * - min_part_size: Minimum size to allow for each uploaded part when performing a multipart upload. + * - concurrency: Maximum number of concurrent multipart uploads. + * - before_upload: Callback to invoke before each multipart upload. The callback will receive a + * Guzzle\Common\Event object with context. + * + * @see Aws\S3\Model\MultipartUpload\UploadBuilder for more options and customization + * @return \Guzzle\Service\Resource\Model Returns the modeled result of the performed operation + */ + public function upload($bucket, $key, $body, $acl = 'private', array $options = array()) + { + $body = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory($body); + $options = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection::fromConfig(array_change_key_case($options), array('min_part_size' => \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\AbstractTransfer::MIN_PART_SIZE, 'params' => array(), 'concurrency' => $body->getWrapper() == 'plainfile' ? 3 : 1)); + if ($body->getSize() < $options['min_part_size']) { + // Perform a simple PutObject operation + return $this->putObject(array('Bucket' => $bucket, 'Key' => $key, 'Body' => $body, 'ACL' => $acl) + $options['params']); + } + // Perform a multipart upload if the file is large enough + $transfer = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\UploadBuilder::newInstance()->setBucket($bucket)->setKey($key)->setMinPartSize($options['min_part_size'])->setConcurrency($options['concurrency'])->setClient($this)->setSource($body)->setTransferOptions($options->toArray())->addOptions($options['params'])->setOption('ACL', $acl)->build(); + if ($options['before_upload']) { + $transfer->getEventDispatcher()->addListener(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Model\MultipartUpload\AbstractTransfer::BEFORE_PART_UPLOAD, $options['before_upload']); + } + return $transfer->upload(); + } + /** + * Recursively uploads all files in a given directory to a given bucket. + * + * @param string $directory Full path to a directory to upload + * @param string $bucket Name of the bucket + * @param string $keyPrefix Virtual directory key prefix to add to each upload + * @param array $options Associative array of upload options + * - params: Array of parameters to use with each PutObject operation performed during the transfer + * - base_dir: Base directory to remove from each object key + * - force: Set to true to upload every file, even if the file is already in Amazon S3 and has not changed + * - concurrency: Maximum number of parallel uploads (defaults to 10) + * - debug: Set to true or an fopen resource to enable debug mode to print information about each upload + * - multipart_upload_size: When the size of a file exceeds this value, the file will be uploaded using a + * multipart upload. + * + * @see Aws\S3\S3Sync\S3Sync for more options and customization + */ + public function uploadDirectory($directory, $bucket, $keyPrefix = null, array $options = array()) + { + $options = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection::fromConfig($options, array('base_dir' => realpath($directory) ?: $directory)); + $builder = $options['builder'] ?: \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\UploadSyncBuilder::getInstance(); + $builder->uploadFromDirectory($directory)->setClient($this)->setBucket($bucket)->setKeyPrefix($keyPrefix)->setConcurrency($options['concurrency'] ?: 5)->setBaseDir($options['base_dir'])->force($options['force'])->setOperationParams($options['params'] ?: array())->enableDebugOutput($options['debug']); + if ($options->hasKey('multipart_upload_size')) { + $builder->setMultipartUploadSize($options['multipart_upload_size']); + } + $builder->build()->transfer(); + } + /** + * Downloads a bucket to the local filesystem + * + * @param string $directory Directory to download to + * @param string $bucket Bucket to download from + * @param string $keyPrefix Only download objects that use this key prefix + * @param array $options Associative array of download options + * - params: Array of parameters to use with each GetObject operation performed during the transfer + * - base_dir: Base directory to remove from each object key when storing in the local filesystem + * - force: Set to true to download every file, even if the file is already on the local filesystem and has not + * changed + * - concurrency: Maximum number of parallel downloads (defaults to 10) + * - debug: Set to true or a fopen resource to enable debug mode to print information about each download + * - allow_resumable: Set to true to allow previously interrupted downloads to be resumed using a Range GET + */ + public function downloadBucket($directory, $bucket, $keyPrefix = '', array $options = array()) + { + $options = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection($options); + $builder = $options['builder'] ?: \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\DownloadSyncBuilder::getInstance(); + $builder->setDirectory($directory)->setClient($this)->setBucket($bucket)->setKeyPrefix($keyPrefix)->setConcurrency($options['concurrency'] ?: 10)->setBaseDir($options['base_dir'])->force($options['force'])->setOperationParams($options['params'] ?: array())->enableDebugOutput($options['debug']); + if ($options['allow_resumable']) { + $builder->allowResumableDownloads(); + } + $builder->build()->transfer(); + } + /** + * Deletes objects from Amazon S3 that match the result of a ListObjects operation. For example, this allows you + * to do things like delete all objects that match a specific key prefix. + * + * @param string $bucket Bucket that contains the object keys + * @param string $prefix Optionally delete only objects under this key prefix + * @param string $regex Delete only objects that match this regex + * @param array $options Options used when deleting the object: + * - before_delete: Callback to invoke before each delete. The callback will receive a + * Guzzle\Common\Event object with context. + * + * @see Aws\S3\S3Client::listObjects + * @see Aws\S3\Model\ClearBucket For more options or customization + * @return int Returns the number of deleted keys + * @throws RuntimeException if no prefix and no regex is given + */ + public function deleteMatchingObjects($bucket, $prefix = '', $regex = '', array $options = array()) + { + if (!$prefix && !$regex) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('A prefix or regex is required, or use S3Client::clearBucket().'); + } + $clear = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\ClearBucket($this, $bucket); + $iterator = $this->getIterator('ListObjects', array('Bucket' => $bucket, 'Prefix' => $prefix)); + if ($regex) { + $iterator = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Iterator\FilterIterator($iterator, function ($current) use($regex) { + return preg_match($regex, $current['Key']); + }); + } + $clear->setIterator($iterator); + if (isset($options['before_delete'])) { + $clear->getEventDispatcher()->addListener(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\ClearBucket::BEFORE_CLEAR, $options['before_delete']); + } + return $clear->clear(); + } + /** + * Determines whether or not a resource exists using a command + * + * @param CommandInterface $command Command used to poll for the resource + * @param bool $accept403 Set to true if 403s are acceptable + * + * @return bool + * @throws S3Exception|\Exception if there is an unhandled exception + */ + protected function checkExistenceWithCommand(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, $accept403 = false) + { + try { + $command->execute(); + $exists = true; + } catch (AccessDeniedException $e) { + $exists = (bool) $accept403; + } catch (S3Exception $e) { + $exists = false; + if ($e->getResponse()->getStatusCode() >= 500) { + // @codeCoverageIgnoreStart + throw $e; + // @codeCoverageIgnoreEnd + } + } + return $exists; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/S3Md5Listener.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/S3Md5Listener.php new file mode 100644 index 00000000..e5e6a175 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/S3Md5Listener.php @@ -0,0 +1,65 @@ + 'onCommandAfterPrepare'); + } + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Signature\SignatureInterface $signature) + { + $this->signature = $signature; + } + public function onCommandAfterPrepare(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $command = $event['command']; + $operation = $command->getOperation(); + if ($operation->getData('contentMd5')) { + // Add the MD5 if it is required for all signers + $this->addMd5($command); + } elseif ($operation->hasParam('ContentMD5')) { + $value = $command['ContentMD5']; + // Add a computed MD5 if the parameter is set to true or if + // not using Signature V4 and the value is not set (null). + if ($value === true || $value === null && !$this->signature instanceof SignatureV4) { + $this->addMd5($command); + } + } + } + private function addMd5(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + $request = $command->getRequest(); + $body = $request->getBody(); + if ($body && $body->getSize() > 0) { + if (false !== ($md5 = $body->getContentMd5(true, true))) { + $request->setHeader('Content-MD5', $md5); + } + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/S3Signature.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/S3Signature.php new file mode 100644 index 00000000..f01362cd --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/S3Signature.php @@ -0,0 +1,191 @@ +signableQueryString); + // Add the security token header if one is being used by the credentials + if ($token = $credentials->getSecurityToken()) { + $request->setHeader('x-amz-security-token', $token); + } + $request->removeHeader('x-amz-date'); + $request->setHeader('Date', gmdate(\DateTime::RFC2822)); + $stringToSign = $this->createCanonicalizedString($request); + $request->getParams()->set('aws.string_to_sign', $stringToSign); + $request->setHeader('Authorization', 'AWS ' . $credentials->getAccessKeyId() . ':' . $this->signString($stringToSign, $credentials)); + } + public function createPresignedUrl(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\CredentialsInterface $credentials, $expires) + { + if ($expires instanceof \DateTime) { + $expires = $expires->getTimestamp(); + } elseif (!is_numeric($expires)) { + $expires = strtotime($expires); + } + // Operate on a clone of the request, so the original is not altered + $request = clone $request; + // URL encoding already occurs in the URI template expansion. Undo that and encode using the same encoding as + // GET object, PUT object, etc. + $path = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\S3Client::encodeKey(rawurldecode($request->getPath())); + $request->setPath($path); + // Make sure to handle temporary credentials + if ($token = $credentials->getSecurityToken()) { + $request->setHeader('x-amz-security-token', $token); + $request->getQuery()->set('x-amz-security-token', $token); + } + // Set query params required for pre-signed URLs + $request->getQuery()->set('AWSAccessKeyId', $credentials->getAccessKeyId())->set('Expires', $expires)->set('Signature', $this->signString($this->createCanonicalizedString($request, $expires), $credentials)); + // Move X-Amz-* headers to the query string + foreach ($request->getHeaders() as $name => $header) { + $name = strtolower($name); + if (strpos($name, 'x-amz-') === 0) { + $request->getQuery()->set($name, (string) $header); + $request->removeHeader($name); + } + } + return $request->getUrl(); + } + public function signString($string, \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Credentials\CredentialsInterface $credentials) + { + return base64_encode(hash_hmac('sha1', $string, $credentials->getSecretKey(), true)); + } + public function createCanonicalizedString(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $expires = null) + { + $buffer = $request->getMethod() . "\n"; + // Add the interesting headers + foreach ($this->signableHeaders as $header) { + $buffer .= (string) $request->getHeader($header) . "\n"; + } + // Choose dates from left to right based on what's set + $date = $expires ?: (string) $request->getHeader('date'); + $buffer .= "{$date}\n" . $this->createCanonicalizedAmzHeaders($request) . $this->createCanonicalizedResource($request); + return $buffer; + } + /** + * Create a canonicalized AmzHeaders string for a signature. + * + * @param RequestInterface $request Request from which to gather headers + * + * @return string Returns canonicalized AMZ headers. + */ + private function createCanonicalizedAmzHeaders(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $headers = array(); + foreach ($request->getHeaders() as $name => $header) { + $name = strtolower($name); + if (strpos($name, 'x-amz-') === 0) { + $value = trim((string) $header); + if ($value || $value === '0') { + $headers[$name] = $name . ':' . $value; + } + } + } + if (!$headers) { + return ''; + } + ksort($headers); + return implode("\n", $headers) . "\n"; + } + /** + * Create a canonicalized resource for a request + * + * @param RequestInterface $request Request for the resource + * + * @return string + */ + private function createCanonicalizedResource(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $buffer = $request->getParams()->get('s3.resource'); + // When sending a raw HTTP request (e.g. $client->get()) + if (null === $buffer) { + $bucket = $request->getParams()->get('bucket') ?: $this->parseBucketName($request); + // Use any specified bucket name, the parsed bucket name, or no bucket name when interacting with GetService + $buffer = $bucket ? "/{$bucket}" : ''; + // Remove encoding from the path and use the S3 specific encoding + $path = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\S3Client::encodeKey(rawurldecode($request->getPath())); + // if the bucket was path style, then ensure that the bucket wasn't duplicated in the resource + $buffer .= preg_replace("#^/{$bucket}/{$bucket}#", "/{$bucket}", $path); + } + // Remove double slashes + $buffer = str_replace('//', '/', $buffer); + // Add sub resource parameters + $query = $request->getQuery(); + $first = true; + foreach ($this->signableQueryString as $key) { + if ($query->hasKey($key)) { + $value = $query[$key]; + $buffer .= $first ? '?' : '&'; + $first = false; + $buffer .= $key; + // Don't add values for empty sub-resources + if ($value !== '' && $value !== false && $value !== null && $value !== \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryString::BLANK) { + $buffer .= "={$value}"; + } + } + } + return $buffer; + } + /** + * Parse the bucket name from a request object + * + * @param RequestInterface $request Request to parse + * + * @return string + */ + private function parseBucketName(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $baseUrl = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Url::factory($request->getClient()->getBaseUrl()); + $baseHost = $baseUrl->getHost(); + $host = $request->getHost(); + if (strpos($host, $baseHost) === false) { + // Does not contain the base URL, so it's either a redirect, CNAME, or using a different region + $baseHost = ''; + // For every known S3 host, check if that host is present on the request + $regions = $request->getClient()->getDescription()->getData('regions'); + foreach ($regions as $region) { + if (strpos($host, $region['hostname']) !== false) { + // This host matches the request host. Tells use the region and endpoint-- we can derive the bucket + $baseHost = $region['hostname']; + break; + } + } + // If no matching base URL was found, then assume that this is a CNAME, and the CNAME is the bucket + if (!$baseHost) { + return $host; + } + } + // Remove the baseURL from the host of the request to attempt to determine the bucket name + return trim(str_replace($baseHost, '', $request->getHost()), ' .'); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/S3SignatureInterface.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/S3SignatureInterface.php new file mode 100644 index 00000000..b9270505 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/S3SignatureInterface.php @@ -0,0 +1,25 @@ +hasHeader('x-amz-content-sha256')) { + $request->setHeader('x-amz-content-sha256', $this->getPayload($request)); + } + parent::signRequest($request, $credentials); + } + /** + * Override used to allow pre-signed URLs to be created for an + * in-determinate request payload. + */ + protected function getPresignedPayload(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + return 'UNSIGNED-PAYLOAD'; + } + /** + * Amazon S3 does not double-encode the path component in the canonical req + */ + protected function createCanonicalizedPath(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + return '/' . ltrim($request->getPath(), '/'); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/SocketTimeoutChecker.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/SocketTimeoutChecker.php new file mode 100644 index 00000000..e960038c --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/SocketTimeoutChecker.php @@ -0,0 +1,60 @@ +setNext($next); + } + } + /** + * {@inheridoc} + */ + public function makesDecision() + { + return true; + } + /** + * {@inheritdoc} + */ + protected function getDelay($retries, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response = null, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\HttpException $e = null) + { + if ($response && $response->getStatusCode() == 400 && strpos($response->getBody(), self::ERR)) { + return true; + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/SseCpkListener.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/SseCpkListener.php new file mode 100644 index 00000000..9b48483d --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/SseCpkListener.php @@ -0,0 +1,54 @@ + 'onCommandBeforePrepare'); + } + public function onCommandBeforePrepare(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + /** @var CommandInterface $command */ + $command = $event['command']; + // Allows only HTTPS connections when using SSE-C + if ($command['SSECustomerKey'] || $command['CopySourceSSECustomerKey']) { + $this->validateScheme($command); + } + // Prepare the normal SSE-CPK headers + if ($command['SSECustomerKey']) { + $this->prepareSseParams($command); + } + // If it's a copy operation, prepare the SSE-CPK headers for the source. + if ($command['CopySourceSSECustomerKey']) { + $this->prepareSseParams($command, true); + } + } + private function validateScheme(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + if ($command->getClient()->getConfig('scheme') !== 'https') { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('You must configure your S3 client to ' . 'use HTTPS in order to use the SSE-C features.'); + } + } + private function prepareSseParams(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, $isCopy = false) + { + $prefix = $isCopy ? 'CopySource' : ''; + // Base64 encode the provided key + $key = $command[$prefix . 'SSECustomerKey']; + $command[$prefix . 'SSECustomerKey'] = base64_encode($key); + // Base64 the provided MD5 or, generate an MD5 if not provided + if ($md5 = $command[$prefix . 'SSECustomerKeyMD5']) { + $command[$prefix . 'SSECustomerKeyMD5'] = base64_encode($md5); + } else { + $command[$prefix . 'SSECustomerKeyMD5'] = base64_encode(md5($key, true)); + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/StreamWrapper.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/StreamWrapper.php new file mode 100644 index 00000000..0abe7149 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/StreamWrapper.php @@ -0,0 +1,757 @@ +/" files with PHP streams, supporting "r", "w", "a", "x". + * + * # Supported stream related PHP functions: + * - fopen, fclose, fread, fwrite, fseek, ftell, feof, fflush + * - opendir, closedir, readdir, rewinddir + * - copy, rename, unlink + * - mkdir, rmdir, rmdir (recursive) + * - file_get_contents, file_put_contents + * - file_exists, filesize, is_file, is_dir + * + * # Opening "r" (read only) streams: + * + * Read only streams are truly streaming by default and will not allow you to seek. This is because data + * read from the stream is not kept in memory or on the local filesystem. You can force a "r" stream to be seekable + * by setting the "seekable" stream context option true. This will allow true streaming of data from Amazon S3, but + * will maintain a buffer of previously read bytes in a 'php://temp' stream to allow seeking to previously read bytes + * from the stream. + * + * You may pass any GetObject parameters as 's3' stream context options. These options will affect how the data is + * downloaded from Amazon S3. + * + * # Opening "w" and "x" (write only) streams: + * + * Because Amazon S3 requires a Content-Length header, write only streams will maintain a 'php://temp' stream to buffer + * data written to the stream until the stream is flushed (usually by closing the stream with fclose). + * + * You may pass any PutObject parameters as 's3' stream context options. These options will affect how the data is + * uploaded to Amazon S3. + * + * When opening an "x" stream, the file must exist on Amazon S3 for the stream to open successfully. + * + * # Opening "a" (write only append) streams: + * + * Similar to "w" streams, opening append streams requires that the data be buffered in a "php://temp" stream. Append + * streams will attempt to download the contents of an object in Amazon S3, seek to the end of the object, then allow + * you to append to the contents of the object. The data will then be uploaded using a PutObject operation when the + * stream is flushed (usually with fclose). + * + * You may pass any GetObject and/or PutObject parameters as 's3' stream context options. These options will affect how + * the data is downloaded and uploaded from Amazon S3. + * + * Stream context options: + * + * - "seekable": Set to true to create a seekable "r" (read only) stream by using a php://temp stream buffer + * - For "unlink" only: Any option that can be passed to the DeleteObject operation + */ +class StreamWrapper +{ + /** + * @var resource|null Stream context (this is set by PHP when a context is used) + */ + public $context; + /** + * @var S3Client Client used to send requests + */ + protected static $client; + /** + * @var string Mode the stream was opened with + */ + protected $mode; + /** + * @var EntityBody Underlying stream resource + */ + protected $body; + /** + * @var array Current parameters to use with the flush operation + */ + protected $params; + /** + * @var ListObjectsIterator Iterator used with opendir() and subsequent readdir() calls + */ + protected $objectIterator; + /** + * @var string The bucket that was opened when opendir() was called + */ + protected $openedBucket; + /** + * @var string The prefix of the bucket that was opened with opendir() + */ + protected $openedBucketPrefix; + /** + * @var array The next key to retrieve when using a directory iterator. Helps for fast directory traversal. + */ + protected static $nextStat = array(); + /** + * Register the 's3://' stream wrapper + * + * @param S3Client $client Client to use with the stream wrapper + */ + public static function register(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\S3Client $client) + { + if (in_array('s3', stream_get_wrappers())) { + stream_wrapper_unregister('s3'); + } + stream_wrapper_register('s3', get_called_class(), STREAM_IS_URL); + static::$client = $client; + } + /** + * Close the stream + */ + public function stream_close() + { + $this->body = null; + } + /** + * @param string $path + * @param string $mode + * @param int $options + * @param string $opened_path + * + * @return bool + */ + public function stream_open($path, $mode, $options, &$opened_path) + { + // We don't care about the binary flag + $this->mode = $mode = rtrim($mode, 'bt'); + $this->params = $params = $this->getParams($path); + $errors = array(); + if (!$params['Key']) { + $errors[] = 'Cannot open a bucket. You must specify a path in the form of s3://bucket/key'; + } + if (strpos($mode, '+')) { + $errors[] = 'The Amazon S3 stream wrapper does not allow simultaneous reading and writing.'; + } + if (!in_array($mode, array('r', 'w', 'a', 'x'))) { + $errors[] = "Mode not supported: {$mode}. Use one 'r', 'w', 'a', or 'x'."; + } + // When using mode "x" validate if the file exists before attempting to read + if ($mode == 'x' && static::$client->doesObjectExist($params['Bucket'], $params['Key'], $this->getOptions())) { + $errors[] = "{$path} already exists on Amazon S3"; + } + if (!$errors) { + if ($mode == 'r') { + return $this->openReadStream($params, $errors); + } elseif ($mode == 'a') { + return $this->openAppendStream($params, $errors); + } else { + return $this->openWriteStream($params, $errors); + } + } + return $this->triggerError($errors); + } + /** + * @return bool + */ + public function stream_eof() + { + return $this->body->feof(); + } + /** + * @return bool + */ + public function stream_flush() + { + if ($this->mode == 'r') { + return false; + } + $this->body->rewind(); + $params = $this->params; + $params['Body'] = $this->body; + // Attempt to guess the ContentType of the upload based on the + // file extension of the key + if (!isset($params['ContentType']) && ($type = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Mimetypes::getInstance()->fromFilename($params['Key']))) { + $params['ContentType'] = $type; + } + try { + static::$client->putObject($params); + return true; + } catch (\Exception $e) { + return $this->triggerError($e->getMessage()); + } + } + /** + * Read data from the underlying stream + * + * @param int $count Amount of bytes to read + * + * @return string + */ + public function stream_read($count) + { + return $this->body->read($count); + } + /** + * Seek to a specific byte in the stream + * + * @param int $offset Seek offset + * @param int $whence Whence (SEEK_SET, SEEK_CUR, SEEK_END) + * + * @return bool + */ + public function stream_seek($offset, $whence = SEEK_SET) + { + return $this->body->seek($offset, $whence); + } + /** + * Get the current position of the stream + * + * @return int Returns the current position in the stream + */ + public function stream_tell() + { + return $this->body->ftell(); + } + /** + * Write data the to the stream + * + * @param string $data + * + * @return int Returns the number of bytes written to the stream + */ + public function stream_write($data) + { + return $this->body->write($data); + } + /** + * Delete a specific object + * + * @param string $path + * @return bool + */ + public function unlink($path) + { + try { + $this->clearStatInfo($path); + static::$client->deleteObject($this->getParams($path)); + return true; + } catch (\Exception $e) { + return $this->triggerError($e->getMessage()); + } + } + /** + * @return array + */ + public function stream_stat() + { + $stat = fstat($this->body->getStream()); + // Add the size of the underlying stream if it is known + if ($this->mode == 'r' && $this->body->getSize()) { + $stat[7] = $stat['size'] = $this->body->getSize(); + } + return $stat; + } + /** + * Provides information for is_dir, is_file, filesize, etc. Works on buckets, keys, and prefixes + * + * @param string $path + * @param int $flags + * + * @return array Returns an array of stat data + * @link http://www.php.net/manual/en/streamwrapper.url-stat.php + */ + public function url_stat($path, $flags) + { + // Check if this path is in the url_stat cache + if (isset(static::$nextStat[$path])) { + return static::$nextStat[$path]; + } + $parts = $this->getParams($path); + if (!$parts['Key']) { + // Stat "directories": buckets, or "s3://" + if (!$parts['Bucket'] || static::$client->doesBucketExist($parts['Bucket'])) { + return $this->formatUrlStat($path); + } else { + return $this->triggerError("File or directory not found: {$path}", $flags); + } + } + try { + try { + $result = static::$client->headObject($parts)->toArray(); + if (substr($parts['Key'], -1, 1) == '/' && $result['ContentLength'] == 0) { + // Return as if it is a bucket to account for console bucket objects (e.g., zero-byte object "foo/") + return $this->formatUrlStat($path); + } else { + // Attempt to stat and cache regular object + return $this->formatUrlStat($result); + } + } catch (NoSuchKeyException $e) { + // Maybe this isn't an actual key, but a prefix. Do a prefix listing of objects to determine. + $result = static::$client->listObjects(array('Bucket' => $parts['Bucket'], 'Prefix' => rtrim($parts['Key'], '/') . '/', 'MaxKeys' => 1)); + if (!$result['Contents'] && !$result['CommonPrefixes']) { + return $this->triggerError("File or directory not found: {$path}", $flags); + } + // This is a directory prefix + return $this->formatUrlStat($path); + } + } catch (\Exception $e) { + return $this->triggerError($e->getMessage(), $flags); + } + } + /** + * Support for mkdir(). + * + * @param string $path Directory which should be created. + * @param int $mode Permissions. 700-range permissions map to ACL_PUBLIC. 600-range permissions map to + * ACL_AUTH_READ. All other permissions map to ACL_PRIVATE. Expects octal form. + * @param int $options A bitwise mask of values, such as STREAM_MKDIR_RECURSIVE. + * + * @return bool + * @link http://www.php.net/manual/en/streamwrapper.mkdir.php + */ + public function mkdir($path, $mode, $options) + { + $params = $this->getParams($path); + if (!$params['Bucket']) { + return false; + } + if (!isset($params['ACL'])) { + $params['ACL'] = $this->determineAcl($mode); + } + return !isset($params['Key']) || $params['Key'] === '/' ? $this->createBucket($path, $params) : $this->createPseudoDirectory($path, $params); + } + /** + * Remove a bucket from Amazon S3 + * + * @param string $path the directory path + * @param int $options A bitwise mask of values + * + * @return bool true if directory was successfully removed + * @link http://www.php.net/manual/en/streamwrapper.rmdir.php + */ + public function rmdir($path, $options) + { + $params = $this->getParams($path); + if (!$params['Bucket']) { + return $this->triggerError('You cannot delete s3://. Please specify a bucket.'); + } + try { + if (!$params['Key']) { + static::$client->deleteBucket(array('Bucket' => $params['Bucket'])); + $this->clearStatInfo($path); + return true; + } + // Use a key that adds a trailing slash if needed. + $prefix = rtrim($params['Key'], '/') . '/'; + $result = static::$client->listObjects(array('Bucket' => $params['Bucket'], 'Prefix' => $prefix, 'MaxKeys' => 1)); + // Check if the bucket contains keys other than the placeholder + if ($result['Contents']) { + foreach ($result['Contents'] as $key) { + if ($key['Key'] == $prefix) { + continue; + } + return $this->triggerError('Psuedo folder is not empty'); + } + return $this->unlink(rtrim($path, '/') . '/'); + } + return $result['CommonPrefixes'] ? $this->triggerError('Pseudo folder contains nested folders') : true; + } catch (\Exception $e) { + return $this->triggerError($e->getMessage()); + } + } + /** + * Support for opendir(). + * + * The opendir() method of the Amazon S3 stream wrapper supports a stream + * context option of "listFilter". listFilter must be a callable that + * accepts an associative array of object data and returns true if the + * object should be yielded when iterating the keys in a bucket. + * + * @param string $path The path to the directory (e.g. "s3://dir[]") + * @param string $options Whether or not to enforce safe_mode (0x04). Unused. + * + * @return bool true on success + * @see http://www.php.net/manual/en/function.opendir.php + */ + public function dir_opendir($path, $options) + { + // Reset the cache + $this->clearStatInfo(); + $params = $this->getParams($path); + $delimiter = $this->getOption('delimiter'); + $filterFn = $this->getOption('listFilter'); + if ($delimiter === null) { + $delimiter = '/'; + } + if ($params['Key']) { + $params['Key'] = rtrim($params['Key'], $delimiter) . $delimiter; + } + $this->openedBucket = $params['Bucket']; + $this->openedBucketPrefix = $params['Key']; + $operationParams = array('Bucket' => $params['Bucket'], 'Prefix' => $params['Key']); + if ($delimiter) { + $operationParams['Delimiter'] = $delimiter; + } + $objectIterator = static::$client->getIterator('ListObjects', $operationParams, array('return_prefixes' => true, 'sort_results' => true)); + // Filter our "/" keys added by the console as directories, and ensure + // that if a filter function is provided that it passes the filter. + $this->objectIterator = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Iterator\FilterIterator($objectIterator, function ($key) use($filterFn) { + // Each yielded results can contain a "Key" or "Prefix" + return (!$filterFn || call_user_func($filterFn, $key)) && (!isset($key['Key']) || substr($key['Key'], -1, 1) !== '/'); + }); + $this->objectIterator->next(); + return true; + } + /** + * Close the directory listing handles + * + * @return bool true on success + */ + public function dir_closedir() + { + $this->objectIterator = null; + return true; + } + /** + * This method is called in response to rewinddir() + * + * @return boolean true on success + */ + public function dir_rewinddir() + { + $this->clearStatInfo(); + $this->objectIterator->rewind(); + return true; + } + /** + * This method is called in response to readdir() + * + * @return string Should return a string representing the next filename, or false if there is no next file. + * + * @link http://www.php.net/manual/en/function.readdir.php + */ + public function dir_readdir() + { + // Skip empty result keys + if (!$this->objectIterator->valid()) { + return false; + } + $current = $this->objectIterator->current(); + if (isset($current['Prefix'])) { + // Include "directories". Be sure to strip a trailing "/" + // on prefixes. + $prefix = rtrim($current['Prefix'], '/'); + $result = str_replace($this->openedBucketPrefix, '', $prefix); + $key = "s3://{$this->openedBucket}/{$prefix}"; + $stat = $this->formatUrlStat($prefix); + } else { + // Remove the prefix from the result to emulate other + // stream wrappers. + $result = str_replace($this->openedBucketPrefix, '', $current['Key']); + $key = "s3://{$this->openedBucket}/{$current['Key']}"; + $stat = $this->formatUrlStat($current); + } + // Cache the object data for quick url_stat lookups used with + // RecursiveDirectoryIterator. + static::$nextStat = array($key => $stat); + $this->objectIterator->next(); + return $result; + } + /** + * Called in response to rename() to rename a file or directory. Currently only supports renaming objects. + * + * @param string $path_from the path to the file to rename + * @param string $path_to the new path to the file + * + * @return bool true if file was successfully renamed + * @link http://www.php.net/manual/en/function.rename.php + */ + public function rename($path_from, $path_to) + { + $partsFrom = $this->getParams($path_from); + $partsTo = $this->getParams($path_to); + $this->clearStatInfo($path_from); + $this->clearStatInfo($path_to); + if (!$partsFrom['Key'] || !$partsTo['Key']) { + return $this->triggerError('The Amazon S3 stream wrapper only supports copying objects'); + } + try { + // Copy the object and allow overriding default parameters if desired, but by default copy metadata + static::$client->copyObject($this->getOptions() + array('Bucket' => $partsTo['Bucket'], 'Key' => $partsTo['Key'], 'CopySource' => '/' . $partsFrom['Bucket'] . '/' . rawurlencode($partsFrom['Key']), 'MetadataDirective' => 'COPY')); + // Delete the original object + static::$client->deleteObject(array('Bucket' => $partsFrom['Bucket'], 'Key' => $partsFrom['Key']) + $this->getOptions()); + } catch (\Exception $e) { + return $this->triggerError($e->getMessage()); + } + return true; + } + /** + * Cast the stream to return the underlying file resource + * + * @param int $cast_as STREAM_CAST_FOR_SELECT or STREAM_CAST_AS_STREAM + * + * @return resource + */ + public function stream_cast($cast_as) + { + return $this->body->getStream(); + } + /** + * Get the stream context options available to the current stream + * + * @return array + */ + protected function getOptions() + { + $context = $this->context ?: stream_context_get_default(); + $options = stream_context_get_options($context); + return isset($options['s3']) ? $options['s3'] : array(); + } + /** + * Get a specific stream context option + * + * @param string $name Name of the option to retrieve + * + * @return mixed|null + */ + protected function getOption($name) + { + $options = $this->getOptions(); + return isset($options[$name]) ? $options[$name] : null; + } + /** + * Get the bucket and key from the passed path (e.g. s3://bucket/key) + * + * @param string $path Path passed to the stream wrapper + * + * @return array Hash of 'Bucket', 'Key', and custom params + */ + protected function getParams($path) + { + $parts = explode('/', substr($path, 5), 2); + $params = $this->getOptions(); + unset($params['seekable']); + return array('Bucket' => $parts[0], 'Key' => isset($parts[1]) ? $parts[1] : null) + $params; + } + /** + * Serialize and sign a command, returning a request object + * + * @param CommandInterface $command Command to sign + * + * @return RequestInterface + */ + protected function getSignedRequest($command) + { + $request = $command->prepare(); + $request->dispatch('request.before_send', array('request' => $request)); + return $request; + } + /** + * Initialize the stream wrapper for a read only stream + * + * @param array $params Operation parameters + * @param array $errors Any encountered errors to append to + * + * @return bool + */ + protected function openReadStream(array $params, array &$errors) + { + // Create the command and serialize the request + $request = $this->getSignedRequest(static::$client->getCommand('GetObject', $params)); + // Create a stream that uses the EntityBody object + $factory = $this->getOption('stream_factory') ?: new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Stream\PhpStreamRequestFactory(); + $this->body = $factory->fromRequest($request, array(), array('stream_class' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\EntityBody')); + // Headers are placed in the "wrapper_data" array. The array of headers + // is simply an array of header lines of which the first line is the + // status line of the HTTP response. + $headers = $this->body->getMetaData('wrapper_data'); + if ($headers && isset($headers[0])) { + $statusParts = explode(' ', $headers[0]); + $status = $statusParts[1]; + if ($status != 200) { + return $this->triggerError('Cannot open file: ' . $this->body); + } + } + // Wrap the body in a caching entity body if seeking is allowed + if ($this->getOption('seekable')) { + $this->body = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\CachingEntityBody($this->body); + } + return true; + } + /** + * Initialize the stream wrapper for a write only stream + * + * @param array $params Operation parameters + * @param array $errors Any encountered errors to append to + * + * @return bool + */ + protected function openWriteStream(array $params, array &$errors) + { + $this->body = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody(fopen('php://temp', 'r+')); + return true; + } + /** + * Initialize the stream wrapper for an append stream + * + * @param array $params Operation parameters + * @param array $errors Any encountered errors to append to + * + * @return bool + */ + protected function openAppendStream(array $params, array &$errors) + { + try { + // Get the body of the object + $this->body = static::$client->getObject($params)->get('Body'); + $this->body->seek(0, SEEK_END); + } catch (S3Exception $e) { + // The object does not exist, so use a simple write stream + $this->openWriteStream($params, $errors); + } + return true; + } + /** + * Trigger one or more errors + * + * @param string|array $errors Errors to trigger + * @param mixed $flags If set to STREAM_URL_STAT_QUIET, then no error or exception occurs + * + * @return bool Returns false + * @throws RuntimeException if throw_errors is true + */ + protected function triggerError($errors, $flags = null) + { + if ($flags & STREAM_URL_STAT_QUIET) { + // This is triggered with things like file_exists() + if ($flags & STREAM_URL_STAT_LINK) { + // This is triggered for things like is_link() + return $this->formatUrlStat(false); + } + return false; + } + // This is triggered when doing things like lstat() or stat() + trigger_error(implode("\n", (array) $errors), E_USER_WARNING); + return false; + } + /** + * Prepare a url_stat result array + * + * @param string|array $result Data to add + * + * @return array Returns the modified url_stat result + */ + protected function formatUrlStat($result = null) + { + static $statTemplate = array(0 => 0, 'dev' => 0, 1 => 0, 'ino' => 0, 2 => 0, 'mode' => 0, 3 => 0, 'nlink' => 0, 4 => 0, 'uid' => 0, 5 => 0, 'gid' => 0, 6 => -1, 'rdev' => -1, 7 => 0, 'size' => 0, 8 => 0, 'atime' => 0, 9 => 0, 'mtime' => 0, 10 => 0, 'ctime' => 0, 11 => -1, 'blksize' => -1, 12 => -1, 'blocks' => -1); + $stat = $statTemplate; + $type = gettype($result); + // Determine what type of data is being cached + if ($type == 'NULL' || $type == 'string') { + // Directory with 0777 access - see "man 2 stat". + $stat['mode'] = $stat[2] = 040777; + } elseif ($type == 'array' && isset($result['LastModified'])) { + // ListObjects or HeadObject result + $stat['mtime'] = $stat[9] = $stat['ctime'] = $stat[10] = strtotime($result['LastModified']); + $stat['size'] = $stat[7] = isset($result['ContentLength']) ? $result['ContentLength'] : $result['Size']; + // Regular file with 0777 access - see "man 2 stat". + $stat['mode'] = $stat[2] = 0100777; + } + return $stat; + } + /** + * Clear the next stat result from the cache + * + * @param string $path If a path is specific, clearstatcache() will be called + */ + protected function clearStatInfo($path = null) + { + static::$nextStat = array(); + if ($path) { + clearstatcache(true, $path); + } + } + /** + * Creates a bucket for the given parameters. + * + * @param string $path Stream wrapper path + * @param array $params A result of StreamWrapper::getParams() + * + * @return bool Returns true on success or false on failure + */ + private function createBucket($path, array $params) + { + if (static::$client->doesBucketExist($params['Bucket'])) { + return $this->triggerError("Directory already exists: {$path}"); + } + try { + static::$client->createBucket($params); + $this->clearStatInfo($path); + return true; + } catch (\Exception $e) { + return $this->triggerError($e->getMessage()); + } + } + /** + * Creates a pseudo-folder by creating an empty "/" suffixed key + * + * @param string $path Stream wrapper path + * @param array $params A result of StreamWrapper::getParams() + * + * @return bool + */ + private function createPseudoDirectory($path, array $params) + { + // Ensure the path ends in "/" and the body is empty. + $params['Key'] = rtrim($params['Key'], '/') . '/'; + $params['Body'] = ''; + // Fail if this pseudo directory key already exists + if (static::$client->doesObjectExist($params['Bucket'], $params['Key'])) { + return $this->triggerError("Directory already exists: {$path}"); + } + try { + static::$client->putObject($params); + $this->clearStatInfo($path); + return true; + } catch (\Exception $e) { + return $this->triggerError($e->getMessage()); + } + } + /** + * Determine the most appropriate ACL based on a file mode. + * + * @param int $mode File mode + * + * @return string + */ + private function determineAcl($mode) + { + $mode = decoct($mode); + if ($mode >= 700 && $mode <= 799) { + return 'public-read'; + } + if ($mode >= 600 && $mode <= 699) { + return 'authenticated-read'; + } + return 'private'; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/AbstractSync.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/AbstractSync.php new file mode 100644 index 00000000..794d5854 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/AbstractSync.php @@ -0,0 +1,114 @@ +options = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection::fromConfig($options, array('concurrency' => 10), array('client', 'bucket', 'iterator', 'source_converter')); + $this->init(); + } + public static function getAllEvents() + { + return array(self::BEFORE_TRANSFER, self::AFTER_TRANSFER); + } + /** + * Begin transferring files + */ + public function transfer() + { + // Pull out chunks of uploads to upload in parallel + $iterator = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Iterator\ChunkedIterator($this->options['iterator'], $this->options['concurrency']); + foreach ($iterator as $files) { + $this->transferFiles($files); + } + } + /** + * Create a command or special transfer action for the + * + * @param \SplFileInfo $file File used to build the transfer + * + * @return CommandInterface|callable + */ + protected abstract function createTransferAction(\SplFileInfo $file); + /** + * Hook to initialize subclasses + * @codeCoverageIgnore + */ + protected function init() + { + } + /** + * Process and transfer a group of files + * + * @param array $files Files to transfer + */ + protected function transferFiles(array $files) + { + // Create the base event data object + $event = array('sync' => $this, 'client' => $this->options['client']); + $commands = array(); + foreach ($files as $file) { + if ($action = $this->createTransferAction($file)) { + $event = array('command' => $action, 'file' => $file) + $event; + $this->dispatch(self::BEFORE_TRANSFER, $event); + if ($action instanceof CommandInterface) { + $commands[] = $action; + } elseif (is_callable($action)) { + $action(); + $this->dispatch(self::AFTER_TRANSFER, $event); + } + } + } + $this->transferCommands($commands); + } + /** + * Transfer an array of commands in parallel + * + * @param array $commands Commands to transfer + */ + protected function transferCommands(array $commands) + { + if ($commands) { + $this->options['client']->execute($commands); + // Notify listeners that each command finished + $event = array('sync' => $this, 'client' => $this->options['client']); + foreach ($commands as $command) { + $event['command'] = $command; + $this->dispatch(self::AFTER_TRANSFER, $event); + } + } + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/AbstractSyncBuilder.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/AbstractSyncBuilder.php new file mode 100644 index 00000000..89f12065 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/AbstractSyncBuilder.php @@ -0,0 +1,359 @@ +bucket = $bucket; + return $this; + } + /** + * Set the Amazon S3 client object that will send requests + * + * @param S3Client $client Amazon S3 client + * + * @return $this + */ + public function setClient(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\S3Client $client) + { + $this->client = $client; + return $this; + } + /** + * Set a custom iterator that returns \SplFileInfo objects for the source data + * + * @param \Iterator $iterator + * + * @return $this + */ + public function setSourceIterator(\Iterator $iterator) + { + $this->sourceIterator = $iterator; + return $this; + } + /** + * Set a custom object key provider instead of building one internally + * + * @param FileNameConverterInterface $converter Filename to object key provider + * + * @return $this + */ + public function setSourceFilenameConverter(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\FilenameConverterInterface $converter) + { + $this->sourceConverter = $converter; + return $this; + } + /** + * Set a custom object key provider instead of building one internally + * + * @param FileNameConverterInterface $converter Filename to object key provider + * + * @return $this + */ + public function setTargetFilenameConverter(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\FilenameConverterInterface $converter) + { + $this->targetConverter = $converter; + return $this; + } + /** + * Set the base directory of the files being transferred. The base directory is removed from each file path before + * converting the file path to an object key or vice versa. + * + * @param string $baseDir Base directory, which will be deleted from each uploaded object key + * + * @return $this + */ + public function setBaseDir($baseDir) + { + $this->baseDir = $baseDir; + return $this; + } + /** + * Specify a prefix to prepend to each Amazon S3 object key or the prefix where object are stored in a bucket + * + * Can be used to upload files to a pseudo sub-folder key or only download files from a pseudo sub-folder + * + * @param string $keyPrefix Prefix for each uploaded key + * + * @return $this + */ + public function setKeyPrefix($keyPrefix) + { + // Removing leading slash + $this->keyPrefix = ltrim($keyPrefix, '/'); + return $this; + } + /** + * Specify the delimiter used for the targeted filesystem (default delimiter is "/") + * + * @param string $delimiter Delimiter to use to separate paths + * + * @return $this + */ + public function setDelimiter($delimiter) + { + $this->delimiter = $delimiter; + return $this; + } + /** + * Specify an array of operation parameters to apply to each operation executed by the sync object + * + * @param array $params Associative array of PutObject (upload) GetObject (download) parameters + * + * @return $this + */ + public function setOperationParams(array $params) + { + $this->params = $params; + return $this; + } + /** + * Set the number of files that can be transferred concurrently + * + * @param int $concurrency Number of concurrent transfers + * + * @return $this + */ + public function setConcurrency($concurrency) + { + $this->concurrency = $concurrency; + return $this; + } + /** + * Set to true to force transfers even if a file already exists and has not changed + * + * @param bool $force Set to true to force transfers without checking if it has changed + * + * @return $this + */ + public function force($force = false) + { + $this->forcing = (bool) $force; + return $this; + } + /** + * Enable debug mode + * + * @param bool|resource $enabledOrResource Set to true or false to enable or disable debug output. Pass an opened + * fopen resource to write to instead of writing to standard out. + * @return $this + */ + public function enableDebugOutput($enabledOrResource = true) + { + $this->debug = $enabledOrResource; + return $this; + } + /** + * Add a filename filter that uses a regular expression to filter out files that you do not wish to transfer. + * + * @param string $search Regular expression search (in preg_match format). Any filename that matches this regex + * will not be transferred. + * @return $this + */ + public function addRegexFilter($search) + { + $this->assertFileIteratorSet(); + $this->sourceIterator = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Iterator\FilterIterator($this->sourceIterator, function ($i) use($search) { + return !preg_match($search, (string) $i); + }); + $this->sourceIterator->rewind(); + return $this; + } + /** + * Builds a UploadSync or DownloadSync object + * + * @return AbstractSync + */ + public function build() + { + $this->validateRequirements(); + $this->sourceConverter = $this->sourceConverter ?: $this->getDefaultSourceConverter(); + $this->targetConverter = $this->targetConverter ?: $this->getDefaultTargetConverter(); + // Only wrap the source iterator in a changed files iterator if we are not forcing the transfers + if (!$this->forcing) { + $this->sourceIterator->rewind(); + $this->sourceIterator = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\ChangedFilesIterator(new \NoRewindIterator($this->sourceIterator), $this->getTargetIterator(), $this->sourceConverter, $this->targetConverter); + $this->sourceIterator->rewind(); + } + $sync = $this->specificBuild(); + if ($this->params) { + $this->addCustomParamListener($sync); + } + if ($this->debug) { + $this->addDebugListener($sync, is_bool($this->debug) ? STDOUT : $this->debug); + } + return $sync; + } + /** + * Hook to implement in subclasses + * + * @return AbstractSync + */ + protected abstract function specificBuild(); + /** + * @return \Iterator + */ + protected abstract function getTargetIterator(); + /** + * @return FilenameConverterInterface + */ + protected abstract function getDefaultSourceConverter(); + /** + * @return FilenameConverterInterface + */ + protected abstract function getDefaultTargetConverter(); + /** + * Add a listener to the sync object to output debug information while transferring + * + * @param AbstractSync $sync Sync object to listen to + * @param resource $resource Where to write debug messages + */ + protected abstract function addDebugListener(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\AbstractSync $sync, $resource); + /** + * Validate that the builder has the minimal requirements + * + * @throws RuntimeException if the builder is not configured completely + */ + protected function validateRequirements() + { + if (!$this->client) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('No client was provided'); + } + if (!$this->bucket) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('No bucket was provided'); + } + $this->assertFileIteratorSet(); + } + /** + * Ensure that the base file iterator has been provided + * + * @throws RuntimeException + */ + protected function assertFileIteratorSet() + { + // Interesting... Need to use isset because: Object of class GlobIterator could not be converted to boolean + if (!isset($this->sourceIterator)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('A source file iterator must be specified'); + } + } + /** + * Wraps a generated iterator in a filter iterator that removes directories + * + * @param \Iterator $iterator Iterator to wrap + * + * @return \Iterator + * @throws UnexpectedValueException + */ + protected function filterIterator(\Iterator $iterator) + { + $f = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Iterator\FilterIterator($iterator, function ($i) { + if (!$i instanceof \SplFileInfo) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\UnexpectedValueException('All iterators for UploadSync must return SplFileInfo objects'); + } + return $i->isFile(); + }); + $f->rewind(); + return $f; + } + /** + * Add the custom param listener to a transfer object + * + * @param HasDispatcherInterface $sync + */ + protected function addCustomParamListener(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\HasDispatcherInterface $sync) + { + $params = $this->params; + $sync->getEventDispatcher()->addListener(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\UploadSync::BEFORE_TRANSFER, function (\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $e) use($params) { + if ($e['command'] instanceof CommandInterface) { + $e['command']->overwriteWith($params); + } + }); + } + /** + * Create an Amazon S3 file iterator based on the given builder settings + * + * @return OpendirIterator + */ + protected function createS3Iterator() + { + // Ensure that the stream wrapper is registered + $this->client->registerStreamWrapper(); + // Calculate the opendir() bucket and optional key prefix location + $dir = "s3://{$this->bucket}"; + if ($this->keyPrefix) { + $dir .= '/' . ltrim($this->keyPrefix, '/ '); + } + // Use opendir so that we can pass stream context to the iterator + $dh = opendir($dir, stream_context_create(array('s3' => array('delimiter' => '', 'listFilter' => function ($obj) { + // Ensure that we do not try to download a glacier object. + return !isset($obj['StorageClass']) || $obj['StorageClass'] != 'GLACIER'; + })))); + // Add the trailing slash for the OpendirIterator concatenation + if (!$this->keyPrefix) { + $dir .= '/'; + } + return $this->filterIterator(new \NoRewindIterator(new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Iterator\OpendirIterator($dh, $dir))); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/ChangedFilesIterator.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/ChangedFilesIterator.php new file mode 100644 index 00000000..a1ae526b --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/ChangedFilesIterator.php @@ -0,0 +1,105 @@ +targetIterator = $targetIterator; + $this->sourceConverter = $sourceConverter; + $this->targetConverter = $targetConverter; + parent::__construct($sourceIterator); + } + public function accept() + { + $current = $this->current(); + $key = $this->sourceConverter->convert($this->normalize($current)); + if (!($data = $this->getTargetData($key))) { + return true; + } + // Ensure the Content-Length matches and it hasn't been modified since the mtime + return $current->getSize() != $data[0] || $current->getMTime() > $data[1]; + } + /** + * Returns an array of the files from the target iterator that were not found in the source iterator + * + * @return array + */ + public function getUnmatched() + { + return array_keys($this->cache); + } + /** + * Get key information from the target iterator for a particular filename + * + * @param string $key Target iterator filename + * + * @return array|bool Returns an array of data, or false if the key is not in the iterator + */ + protected function getTargetData($key) + { + $key = $this->cleanKey($key); + if (isset($this->cache[$key])) { + $result = $this->cache[$key]; + unset($this->cache[$key]); + return $result; + } + $it = $this->targetIterator; + while ($it->valid()) { + $value = $it->current(); + $data = array($value->getSize(), $value->getMTime()); + $filename = $this->targetConverter->convert($this->normalize($value)); + $filename = $this->cleanKey($filename); + if ($filename == $key) { + return $data; + } + $this->cache[$filename] = $data; + $it->next(); + } + return false; + } + private function normalize($current) + { + $asString = (string) $current; + return strpos($asString, 's3://') === 0 ? $asString : $current->getRealPath(); + } + private function cleanKey($key) + { + return ltrim($key, '/'); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/DownloadSync.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/DownloadSync.php new file mode 100644 index 00000000..bc1b23a6 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/DownloadSync.php @@ -0,0 +1,83 @@ +getPathname(); + list($bucket, $key) = explode('/', substr($sourceFilename, 5), 2); + $filename = $this->options['source_converter']->convert($sourceFilename); + $this->createDirectory($filename); + // Some S3 buckets contains nested files under the same name as a directory + if (is_dir($filename)) { + return false; + } + // Allow a previously interrupted download to resume + if (file_exists($filename) && $this->options['resumable']) { + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\ResumableDownload($this->options['client'], $bucket, $key, $filename); + } + return $this->options['client']->getCommand('GetObject', array('Bucket' => $bucket, 'Key' => $key, 'SaveAs' => $filename)); + } + /** + * @codeCoverageIgnore + */ + protected function createDirectory($filename) + { + $directory = dirname($filename); + // Some S3 clients create empty files to denote directories. Remove these so that we can create the directory. + if (is_file($directory) && filesize($directory) == 0) { + unlink($directory); + } + // Create the directory if it does not exist + if (!is_dir($directory) && !mkdir($directory, 0777, true)) { + $errors = error_get_last(); + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('Could not create directory: ' . $directory . ' - ' . $errors['message']); + } + } + protected function filterCommands(array $commands) + { + // Build a list of all of the directories in each command so that we don't attempt to create an empty dir in + // the same parallel transfer as attempting to create a file in that dir + $dirs = array(); + foreach ($commands as $command) { + $parts = array_values(array_filter(explode('/', $command['SaveAs']))); + for ($i = 0, $total = count($parts); $i < $total; $i++) { + $dir = ''; + for ($j = 0; $j < $i; $j++) { + $dir .= '/' . $parts[$j]; + } + if ($dir && !in_array($dir, $dirs)) { + $dirs[] = $dir; + } + } + } + return array_filter($commands, function ($command) use($dirs) { + return !in_array($command['SaveAs'], $dirs); + }); + } + protected function transferCommands(array $commands) + { + parent::transferCommands($this->filterCommands($commands)); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/DownloadSyncBuilder.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/DownloadSyncBuilder.php new file mode 100644 index 00000000..6bbac233 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/DownloadSyncBuilder.php @@ -0,0 +1,97 @@ +directory = $directory; + return $this; + } + /** + * Call this function to allow partial downloads to be resumed if the download was previously interrupted + * + * @return self + */ + public function allowResumableDownloads() + { + $this->resumable = true; + return $this; + } + protected function specificBuild() + { + $sync = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\DownloadSync(array('client' => $this->client, 'bucket' => $this->bucket, 'iterator' => $this->sourceIterator, 'source_converter' => $this->sourceConverter, 'target_converter' => $this->targetConverter, 'concurrency' => $this->concurrency, 'resumable' => $this->resumable, 'directory' => $this->directory)); + return $sync; + } + protected function getTargetIterator() + { + if (!$this->directory) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('A directory is required'); + } + if (!is_dir($this->directory) && !mkdir($this->directory, 0777, true)) { + // @codeCoverageIgnoreStart + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('Unable to create root download directory: ' . $this->directory); + // @codeCoverageIgnoreEnd + } + return $this->filterIterator(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->directory))); + } + protected function getDefaultSourceConverter() + { + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\KeyConverter("s3://{$this->bucket}/{$this->baseDir}", $this->directory . DIRECTORY_SEPARATOR, $this->delimiter); + } + protected function getDefaultTargetConverter() + { + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\KeyConverter("s3://{$this->bucket}/{$this->baseDir}", '', $this->delimiter); + } + protected function assertFileIteratorSet() + { + $this->sourceIterator = $this->sourceIterator ?: $this->createS3Iterator(); + } + protected function addDebugListener(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\AbstractSync $sync, $resource) + { + $sync->getEventDispatcher()->addListener(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\UploadSync::BEFORE_TRANSFER, function (\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $e) use($resource) { + if ($e['command'] instanceof CommandInterface) { + $from = $e['command']['Bucket'] . '/' . $e['command']['Key']; + $to = $e['command']['SaveAs'] instanceof EntityBodyInterface ? $e['command']['SaveAs']->getUri() : $e['command']['SaveAs']; + fwrite($resource, "Downloading {$from} -> {$to}\n"); + } elseif ($e['command'] instanceof ResumableDownload) { + $from = $e['command']->getBucket() . '/' . $e['command']->getKey(); + $to = $e['command']->getFilename(); + fwrite($resource, "Resuming {$from} -> {$to}\n"); + } + }); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/FilenameConverterInterface.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/FilenameConverterInterface.php new file mode 100644 index 00000000..098ab274 --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/FilenameConverterInterface.php @@ -0,0 +1,32 @@ +baseDir = (string) $baseDir; + $this->prefix = $prefix; + $this->delimiter = $delimiter; + } + public function convert($filename) + { + $key = $filename; + // Remove base directory from the key (only the first occurrence) + if ($this->baseDir && false !== ($pos = strpos($filename, $this->baseDir))) { + $key = substr_replace($key, '', $pos, strlen($this->baseDir)); + } + // Replace Windows directory separators to become Unix style, and convert that to the custom dir separator + $key = str_replace('/', $this->delimiter, str_replace('\\', '/', $key)); + // Add the key prefix and remove double slashes that are not in the protocol (e.g. prefixed with ":") + $delim = preg_quote($this->delimiter); + $key = preg_replace("#(?delimiter, $this->prefix . $key); + return $key; + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/UploadSync.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/UploadSync.php new file mode 100644 index 00000000..6c47bede --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/UploadSync.php @@ -0,0 +1,61 @@ +options['multipart_upload_size']) { + $this->options['multipart_upload_size'] = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\AbstractTransfer::MIN_PART_SIZE; + } + } + protected function createTransferAction(\SplFileInfo $file) + { + // Open the file for reading + $filename = $file->getRealPath() ?: $file->getPathName(); + if (!($resource = fopen($filename, 'r'))) { + // @codeCoverageIgnoreStart + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Exception\RuntimeException('Could not open ' . $file->getPathname() . ' for reading'); + // @codeCoverageIgnoreEnd + } + $key = $this->options['source_converter']->convert($filename); + $body = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory($resource); + // Determine how the ACL should be applied + if ($acl = $this->options['acl']) { + $aclType = is_string($this->options['acl']) ? 'ACL' : 'ACP'; + } else { + $acl = 'private'; + $aclType = 'ACL'; + } + // Use a multi-part upload if the file is larger than the cutoff size and is a regular file + if ($body->getWrapper() == 'plainfile' && $file->getSize() >= $this->options['multipart_upload_size']) { + $builder = \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\MultipartUpload\UploadBuilder::newInstance()->setBucket($this->options['bucket'])->setKey($key)->setMinPartSize($this->options['multipart_upload_size'])->setOption($aclType, $acl)->setClient($this->options['client'])->setSource($body)->setConcurrency($this->options['concurrency']); + $this->dispatch(self::BEFORE_MULTIPART_BUILD, array('builder' => $builder, 'file' => $file)); + return $builder->build(); + } + return $this->options['client']->getCommand('PutObject', array('Bucket' => $this->options['bucket'], 'Key' => $key, 'Body' => $body, $aclType => $acl)); + } +} diff --git a/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/UploadSyncBuilder.php b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/UploadSyncBuilder.php new file mode 100644 index 00000000..ae81f04a --- /dev/null +++ b/vendor/Aws2/aws/aws-sdk-php/src/Aws/S3/Sync/UploadSyncBuilder.php @@ -0,0 +1,147 @@ +baseDir = realpath($path); + $this->sourceIterator = $this->filterIterator(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS | \FilesystemIterator::FOLLOW_SYMLINKS))); + return $this; + } + /** + * Set a glob expression that will match files to upload to Amazon S3 + * + * @param string $glob Glob expression + * + * @return $this + * @link http://www.php.net/manual/en/function.glob.php + */ + public function uploadFromGlob($glob) + { + $this->sourceIterator = $this->filterIterator(new \GlobIterator($glob, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS | \FilesystemIterator::FOLLOW_SYMLINKS)); + return $this; + } + /** + * Set a canned ACL to apply to each uploaded object + * + * @param string $acl Canned ACL for each upload + * + * @return $this + */ + public function setAcl($acl) + { + $this->acp = $acl; + return $this; + } + /** + * Set an Access Control Policy to apply to each uploaded object + * + * @param Acp $acp Access control policy + * + * @return $this + */ + public function setAcp(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Model\Acp $acp) + { + $this->acp = $acp; + return $this; + } + /** + * Set the multipart upload size threshold. When the size of a file exceeds this value, the file will be uploaded + * using a multipart upload. + * + * @param int $size Size threshold + * + * @return $this + */ + public function setMultipartUploadSize($size) + { + $this->multipartUploadSize = $size; + return $this; + } + protected function specificBuild() + { + $sync = new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\UploadSync(array('client' => $this->client, 'bucket' => $this->bucket, 'iterator' => $this->sourceIterator, 'source_converter' => $this->sourceConverter, 'target_converter' => $this->targetConverter, 'concurrency' => $this->concurrency, 'multipart_upload_size' => $this->multipartUploadSize, 'acl' => $this->acp)); + return $sync; + } + protected function addCustomParamListener(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\HasDispatcherInterface $sync) + { + // Handle the special multi-part upload event + parent::addCustomParamListener($sync); + $params = $this->params; + $sync->getEventDispatcher()->addListener(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\UploadSync::BEFORE_MULTIPART_BUILD, function (\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $e) use($params) { + foreach ($params as $k => $v) { + $e['builder']->setOption($k, $v); + } + }); + } + protected function getTargetIterator() + { + return $this->createS3Iterator(); + } + protected function getDefaultSourceConverter() + { + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\KeyConverter($this->baseDir, $this->keyPrefix . $this->delimiter, $this->delimiter); + } + protected function getDefaultTargetConverter() + { + return new \DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\KeyConverter('s3://' . $this->bucket . '/', '', DIRECTORY_SEPARATOR); + } + protected function addDebugListener(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\AbstractSync $sync, $resource) + { + $sync->getEventDispatcher()->addListener(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\S3\Sync\UploadSync::BEFORE_TRANSFER, function (\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $e) use($resource) { + $c = $e['command']; + if ($c instanceof CommandInterface) { + $uri = $c['Body']->getUri(); + $size = $c['Body']->getSize(); + fwrite($resource, "Uploading {$uri} -> {$c['Key']} ({$size} bytes)\n"); + return; + } + // Multipart upload + $body = $c->getSource(); + $totalSize = $body->getSize(); + $progress = 0; + fwrite($resource, "Beginning multipart upload: " . $body->getUri() . ' -> '); + fwrite($resource, $c->getState()->getFromId('Key') . " ({$totalSize} bytes)\n"); + $c->getEventDispatcher()->addListener(\DeliciousBrains\WP_Offload_S3\Aws2\Aws\Common\Model\MultipartUpload\AbstractTransfer::BEFORE_PART_UPLOAD, function ($e) use(&$progress, $totalSize, $resource) { + $command = $e['command']; + $size = $command['Body']->getContentLength(); + $percentage = number_format($progress / $totalSize * 100, 2); + fwrite($resource, "- Part {$command['PartNumber']} ({$size} bytes, {$percentage}%)\n"); + $progress += $size; + }); + }); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/CHANGELOG.md b/vendor/Aws2/guzzle/guzzle/CHANGELOG.md new file mode 100644 index 00000000..f0dc5444 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/CHANGELOG.md @@ -0,0 +1,751 @@ +# CHANGELOG + +## 3.9.3 - 2015-03-18 + +* Ensuring Content-Length is not stripped from a request when it is `0`. +* Added more information to stream wrapper exceptions. +* Message parser will no longer throw warnings for malformed messages. +* Giving a valid cache TTL when max-age is 0. + +## 3.9.2 - 2014-09-10 + +* Retrying "Connection died, retrying a fresh connect" curl errors. +* Automatically extracting the cacert from the phar in client constructor. +* Added EntityBody support for OPTIONS requests. + +## 3.9.1 - 2014-05-07 + +* Added a fix to ReadLimitEntityBody to ensure it doesn't infinitely loop. +* Added a fix to the stream checksum function so that when the first read + returns a falsey value, it still continues to consume the stream until EOF. + +## 3.9.0 - 2014-04-23 + +* `null`, `false`, and `"_guzzle_blank_"` all now serialize as an empty value + with no trailing "=". See dc1d824277. +* No longer performing an MD5 check on the cacert each time the phar is used, + but rather copying the cacert to the temp directory. +* `"0"` can now be added as a URL path +* Deleting cookies that are set to empty +* If-Modified-Since is no longer unnecessarily added to the CachePlugin +* Cookie path matching now follows RFC 6265 s5.1.4 +* Updated service descriptions are now added to a service client's composite + factory. +* MockPlugin now throws an exception if the queue is empty. +* Properly parsing URLs that start with "http" but are not absolute +* Added the ability to configure the curl_multi_select timeout setting +* OAuth parameters are now sorted using lexicographical byte value ordering +* Fixing invalid usage of an out of range PHP feature in the ErrorResponsePlugin + +## 3.8.1 -2014-01-28 + +* Bug: Always using GET requests when redirecting from a 303 response +* Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in + `Guzzle\Http\ClientInterface::setSslVerification()` +* Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL +* Bug: The body of a request can now be set to `"0"` +* Sending PHP stream requests no longer forces `HTTP/1.0` +* Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of + each sub-exception +* Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than + clobbering everything). +* Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators) +* Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`. + For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`. +* Now properly escaping the regular expression delimiter when matching Cookie domains. +* Network access is now disabled when loading XML documents + +## 3.8.0 - 2013-12-05 + +* Added the ability to define a POST name for a file +* JSON response parsing now properly walks additionalProperties +* cURL error code 18 is now retried automatically in the BackoffPlugin +* Fixed a cURL error when URLs contain fragments +* Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were + CurlExceptions +* CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e) +* Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS` +* Fixed a bug that was encountered when parsing empty header parameters +* UriTemplate now has a `setRegex()` method to match the docs +* The `debug` request parameter now checks if it is truthy rather than if it exists +* Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin +* Added the ability to combine URLs using strict RFC 3986 compliance +* Command objects can now return the validation errors encountered by the command +* Various fixes to cache revalidation (#437 and 29797e5) +* Various fixes to the AsyncPlugin +* Cleaned up build scripts + +## 3.7.4 - 2013-10-02 + +* Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430) +* Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp + (see https://github.com/aws/aws-sdk-php/issues/147) +* Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots +* Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420) +* Updated the bundled cacert.pem (#419) +* OauthPlugin now supports adding authentication to headers or query string (#425) + +## 3.7.3 - 2013-09-08 + +* Added the ability to get the exception associated with a request/command when using `MultiTransferException` and + `CommandTransferException`. +* Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description +* Schemas are only injected into response models when explicitly configured. +* No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of + an EntityBody. +* Bug fix: ChunkedIterator can now properly chunk a \Traversable as well as an \Iterator. +* Bug fix: FilterIterator now relies on `\Iterator` instead of `\Traversable`. +* Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody() +* Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin +* Bug fix: Visiting XML attributes first before visting XML children when serializing requests +* Bug fix: Properly parsing headers that contain commas contained in quotes +* Bug fix: mimetype guessing based on a filename is now case-insensitive + +## 3.7.2 - 2013-08-02 + +* Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander + See https://github.com/guzzle/guzzle/issues/371 +* Bug fix: Cookie domains are now matched correctly according to RFC 6265 + See https://github.com/guzzle/guzzle/issues/377 +* Bug fix: GET parameters are now used when calculating an OAuth signature +* Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted +* `Guzzle\Common\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched +* `Guzzle\Http\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input. + See https://github.com/guzzle/guzzle/issues/379 +* Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See + https://github.com/guzzle/guzzle/pull/380 +* cURL multi cleanup and optimizations + +## 3.7.1 - 2013-07-05 + +* Bug fix: Setting default options on a client now works +* Bug fix: Setting options on HEAD requests now works. See #352 +* Bug fix: Moving stream factory before send event to before building the stream. See #353 +* Bug fix: Cookies no longer match on IP addresses per RFC 6265 +* Bug fix: Correctly parsing header parameters that are in `<>` and quotes +* Added `cert` and `ssl_key` as request options +* `Host` header can now diverge from the host part of a URL if the header is set manually +* `Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter +* OAuth parameters are only added via the plugin if they aren't already set +* Exceptions are now thrown when a URL cannot be parsed +* Returning `false` if `Guzzle\Http\EntityBody::getContentMd5()` fails +* Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin + +## 3.7.0 - 2013-06-10 + +* See UPGRADING.md for more information on how to upgrade. +* Requests now support the ability to specify an array of $options when creating a request to more easily modify a + request. You can pass a 'request.options' configuration setting to a client to apply default request options to + every request created by a client (e.g. default query string variables, headers, curl options, etc). +* Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\Guzzle`. + See `Guzzle\Http\StaticClient::mount`. +* Added `command.request_options` to `Guzzle\Service\Command\AbstractCommand` to pass request options to requests + created by a command (e.g. custom headers, query string variables, timeout settings, etc). +* Stream size in `Guzzle\Stream\PhpStreamRequestFactory` will now be set if Content-Length is returned in the + headers of a response +* Added `Guzzle\Common\Collection::setPath($path, $value)` to set a value into an array using a nested key + (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`) +* ServiceBuilders now support storing and retrieving arbitrary data +* CachePlugin can now purge all resources for a given URI +* CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource +* CachePlugin now uses the Vary header to determine if a resource is a cache hit +* `Guzzle\Http\Message\Response` now implements `\Serializable` +* Added `Guzzle\Cache\CacheAdapterFactory::fromCache()` to more easily create cache adapters +* `Guzzle\Service\ClientInterface::execute()` now accepts an array, single command, or Traversable +* Fixed a bug in `Guzzle\Http\Message\Header\Link::addLink()` +* Better handling of calculating the size of a stream in `Guzzle\Stream\Stream` using fstat() and caching the size +* `Guzzle\Common\Exception\ExceptionCollection` now creates a more readable exception message +* Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older + Symfony users can still use the old version of Monolog. +* Fixing BC break: Added the implementation back in for `Guzzle\Http\Message\AbstractMessage::getTokenizedHeader()`. + Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`. +* Several performance improvements to `Guzzle\Common\Collection` +* Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: + createRequest, head, delete, put, patch, post, options, prepareRequest +* Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` +* Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` +* Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to + `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a + resource, string, or EntityBody into the $options parameter to specify the download location of the response. +* Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a + default `array()` +* Added `Guzzle\Stream\StreamInterface::isRepeatable` +* Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use + $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or + $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`. +* Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`. +* Removed `Guzzle\Http\ClientInterface::expandTemplate()` +* Removed `Guzzle\Http\ClientInterface::setRequestFactory()` +* Removed `Guzzle\Http\ClientInterface::getCurlMulti()` +* Removed `Guzzle\Http\Message\RequestInterface::canCache` +* Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect` +* Removed `Guzzle\Http\Message\RequestInterface::isRedirect` +* Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. +* You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting + `Guzzle\Common\Version::$emitWarnings` to true. +* Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use + `$request->getResponseBody()->isRepeatable()` instead. +* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use + `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use + `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +* Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. +* Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. +* Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated +* Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. + These will work through Guzzle 4.0 +* Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use [request.options][params]. +* Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. +* Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`. +* Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. +* Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. +* Marked `Guzzle\Common\Collection::inject()` as deprecated. +* Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');` +* CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a + CacheStorageInterface. These two objects and interface will be removed in a future version. +* Always setting X-cache headers on cached responses +* Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin +* `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface + $request, Response $response);` +* `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` +* `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` +* Added `CacheStorageInterface::purge($url)` +* `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin + $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, + CanCacheStrategyInterface $canCache = null)` +* Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` + +## 3.6.0 - 2013-05-29 + +* ServiceDescription now implements ToArrayInterface +* Added command.hidden_params to blacklist certain headers from being treated as additionalParameters +* Guzzle can now correctly parse incomplete URLs +* Mixed casing of headers are now forced to be a single consistent casing across all values for that header. +* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution +* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). +* Specific header implementations can be created for complex headers. When a message creates a header, it uses a + HeaderFactory which can map specific headers to specific header classes. There is now a Link header and + CacheControl header implementation. +* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate +* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() +* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in + Guzzle\Http\Curl\RequestMediator +* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. +* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface +* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() +* Removed Guzzle\Parser\ParserRegister::get(). Use getParser() +* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). +* All response header helper functions return a string rather than mixing Header objects and strings inconsistently +* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc are managed by Guzzle + directly via interfaces +* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist + but are a no-op until removed. +* Most classes that used to require a ``Guzzle\Service\Command\CommandInterface` typehint now request a + `Guzzle\Service\Command\ArrayCommandInterface`. +* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response + on a request while the request is still being transferred +* The ability to case-insensitively search for header values +* Guzzle\Http\Message\Header::hasExactHeader +* Guzzle\Http\Message\Header::raw. Use getAll() +* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object + instead. +* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess +* Added the ability to cast Model objects to a string to view debug information. + +## 3.5.0 - 2013-05-13 + +* Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times +* Bug: Better cleanup of one-time events accross the board (when an event is meant to fire once, it will now remove + itself from the EventDispatcher) +* Bug: `Guzzle\Log\MessageFormatter` now properly writes "total_time" and "connect_time" values +* Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too +* Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a + non-existent key +* Bug: All __call() method arguments are now required (helps with mocking frameworks) +* Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference + to help with refcount based garbage collection of resources created by sending a request +* Deprecating ZF1 cache and log adapters. These will be removed in the next major version. +* Deprecating `Response::getPreviousResponse()` (method signature still exists, but it'sdeprecated). Use the + HistoryPlugin for a history. +* Added a `responseBody` alias for the `response_body` location +* Refactored internals to no longer rely on Response::getRequest() +* HistoryPlugin can now be cast to a string +* HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests + and responses that are sent over the wire +* Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects + +## 3.4.3 - 2013-04-30 + +* Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response +* Added a check to re-extract the temp cacert bundle from the phar before sending each request + +## 3.4.2 - 2013-04-29 + +* Bug fix: Stream objects now work correctly with "a" and "a+" modes +* Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present +* Bug fix: AsyncPlugin no longer forces HEAD requests +* Bug fix: DateTime timezones are now properly handled when using the service description schema formatter +* Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails +* Setting a response on a request will write to the custom request body from the response body if one is specified +* LogPlugin now writes to php://output when STDERR is undefined +* Added the ability to set multiple POST files for the same key in a single call +* application/x-www-form-urlencoded POSTs now use the utf-8 charset by default +* Added the ability to queue CurlExceptions to the MockPlugin +* Cleaned up how manual responses are queued on requests (removed "queued_response" and now using request.before_send) +* Configuration loading now allows remote files + +## 3.4.1 - 2013-04-16 + +* Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti + handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost. +* Exceptions are now properly grouped when sending requests in parallel +* Redirects are now properly aggregated when a multi transaction fails +* Redirects now set the response on the original object even in the event of a failure +* Bug fix: Model names are now properly set even when using $refs +* Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax +* Added support for oauth_callback in OAuth signatures +* Added support for oauth_verifier in OAuth signatures +* Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection + +## 3.4.0 - 2013-04-11 + +* Bug fix: URLs are now resolved correctly based on http://tools.ietf.org/html/rfc3986#section-5.2. #289 +* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289 +* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263 +* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264. +* Bug fix: Added `number` type to service descriptions. +* Bug fix: empty parameters are removed from an OAuth signature +* Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header +* Bug fix: Fixed "array to string" error when validating a union of types in a service description +* Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream +* Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin. +* Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs. +* The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections. +* Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if + the Content-Type can be determined based on the entity body or the path of the request. +* Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder. +* Added support for a PSR-3 LogAdapter. +* Added a `command.after_prepare` event +* Added `oauth_callback` parameter to the OauthPlugin +* Added the ability to create a custom stream class when using a stream factory +* Added a CachingEntityBody decorator +* Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized. +* The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar. +* You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies +* POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This + means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use + POST fields or files (the latter is only used when emulating a form POST in the browser). +* Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest + +## 3.3.1 - 2013-03-10 + +* Added the ability to create PHP streaming responses from HTTP requests +* Bug fix: Running any filters when parsing response headers with service descriptions +* Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing +* Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across + response location visitors. +* Bug fix: Removed the possibility of creating configuration files with circular dependencies +* RequestFactory::create() now uses the key of a POST file when setting the POST file name +* Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set + +## 3.3.0 - 2013-03-03 + +* A large number of performance optimizations have been made +* Bug fix: Added 'wb' as a valid write mode for streams +* Bug fix: `Guzzle\Http\Message\Response::json()` now allows scalar values to be returned +* Bug fix: Fixed bug in `Guzzle\Http\Message\Response` where wrapping quotes were stripped from `getEtag()` +* BC: Removed `Guzzle\Http\Utils` class +* BC: Setting a service description on a client will no longer modify the client's command factories. +* BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using + the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' +* BC: `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to + lowercase +* Operation parameter objects are now lazy loaded internally +* Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses +* Added support for instantiating responseType=class responseClass classes. Classes must implement + `Guzzle\Service\Command\ResponseClassInterface` +* Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These + additional properties also support locations and can be used to parse JSON responses where the outermost part of the + JSON is an array +* Added support for nested renaming of JSON models (rename sentAs to name) +* CachePlugin + * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error + * Debug headers can now added to cached response in the CachePlugin + +## 3.2.0 - 2013-02-14 + +* CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients. +* URLs with no path no longer contain a "/" by default +* Guzzle\Http\QueryString does no longer manages the leading "?". This is now handled in Guzzle\Http\Url. +* BadResponseException no longer includes the full request and response message +* Adding setData() to Guzzle\Service\Description\ServiceDescriptionInterface +* Adding getResponseBody() to Guzzle\Http\Message\RequestInterface +* Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription +* Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list +* xmlEncoding can now be customized for the XML declaration of a XML service description operation +* Guzzle\Http\QueryString now uses Guzzle\Http\QueryAggregator\QueryAggregatorInterface objects to add custom value + aggregation and no longer uses callbacks +* The URL encoding implementation of Guzzle\Http\QueryString can now be customized +* Bug fix: Filters were not always invoked for array service description parameters +* Bug fix: Redirects now use a target response body rather than a temporary response body +* Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded +* Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives + +## 3.1.2 - 2013-01-27 + +* Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the + response body. For example, the XmlVisitor now parses the XML response into an array in the before() method. +* Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent +* CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444) +* Fixed a bug where redirect responses were not chained correctly using getPreviousResponse() +* Setting default headers on a client after setting the user-agent will not erase the user-agent setting + +## 3.1.1 - 2013-01-20 + +* Adding wildcard support to Guzzle\Common\Collection::getPath() +* Adding alias support to ServiceBuilder configs +* Adding Guzzle\Service\Resource\CompositeResourceIteratorFactory and cleaning up factory interface + +## 3.1.0 - 2013-01-12 + +* BC: CurlException now extends from RequestException rather than BadResponseException +* BC: Renamed Guzzle\Plugin\Cache\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse() +* Added getData to ServiceDescriptionInterface +* Added context array to RequestInterface::setState() +* Bug: Removing hard dependency on the BackoffPlugin from Guzzle\Http +* Bug: Adding required content-type when JSON request visitor adds JSON to a command +* Bug: Fixing the serialization of a service description with custom data +* Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing + an array of successful and failed responses +* Moved getPath from Guzzle\Service\Resource\Model to Guzzle\Common\Collection +* Added Guzzle\Http\IoEmittingEntityBody +* Moved command filtration from validators to location visitors +* Added `extends` attributes to service description parameters +* Added getModels to ServiceDescriptionInterface + +## 3.0.7 - 2012-12-19 + +* Fixing phar detection when forcing a cacert to system if null or true +* Allowing filename to be passed to `Guzzle\Http\Message\Request::setResponseBody()` +* Cleaning up `Guzzle\Common\Collection::inject` method +* Adding a response_body location to service descriptions + +## 3.0.6 - 2012-12-09 + +* CurlMulti performance improvements +* Adding setErrorResponses() to Operation +* composer.json tweaks + +## 3.0.5 - 2012-11-18 + +* Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin +* Bug: Response body can now be a string containing "0" +* Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert +* Bug: QueryString::fromString now properly parses query string parameters that contain equal signs +* Added support for XML attributes in service description responses +* DefaultRequestSerializer now supports array URI parameter values for URI template expansion +* Added better mimetype guessing to requests and post files + +## 3.0.4 - 2012-11-11 + +* Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value +* Bug: Cookies can now be added that have a name, domain, or value set to "0" +* Bug: Using the system cacert bundle when using the Phar +* Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures +* Enhanced cookie jar de-duplication +* Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added +* Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies +* Added the ability to create any sort of hash for a stream rather than just an MD5 hash + +## 3.0.3 - 2012-11-04 + +* Implementing redirects in PHP rather than cURL +* Added PECL URI template extension and using as default parser if available +* Bug: Fixed Content-Length parsing of Response factory +* Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams. +* Adding ToArrayInterface throughout library +* Fixing OauthPlugin to create unique nonce values per request + +## 3.0.2 - 2012-10-25 + +* Magic methods are enabled by default on clients +* Magic methods return the result of a command +* Service clients no longer require a base_url option in the factory +* Bug: Fixed an issue with URI templates where null template variables were being expanded + +## 3.0.1 - 2012-10-22 + +* Models can now be used like regular collection objects by calling filter, map, etc +* Models no longer require a Parameter structure or initial data in the constructor +* Added a custom AppendIterator to get around a PHP bug with the `\AppendIterator` + +## 3.0.0 - 2012-10-15 + +* Rewrote service description format to be based on Swagger + * Now based on JSON schema + * Added nested input structures and nested response models + * Support for JSON and XML input and output models + * Renamed `commands` to `operations` + * Removed dot class notation + * Removed custom types +* Broke the project into smaller top-level namespaces to be more component friendly +* Removed support for XML configs and descriptions. Use arrays or JSON files. +* Removed the Validation component and Inspector +* Moved all cookie code to Guzzle\Plugin\Cookie +* Magic methods on a Guzzle\Service\Client now return the command un-executed. +* Calling getResult() or getResponse() on a command will lazily execute the command if needed. +* Now shipping with cURL's CA certs and using it by default +* Added previousResponse() method to response objects +* No longer sending Accept and Accept-Encoding headers on every request +* Only sending an Expect header by default when a payload is greater than 1MB +* Added/moved client options: + * curl.blacklist to curl.option.blacklist + * Added ssl.certificate_authority +* Added a Guzzle\Iterator component +* Moved plugins from Guzzle\Http\Plugin to Guzzle\Plugin +* Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin) +* Added a more robust caching plugin +* Added setBody to response objects +* Updating LogPlugin to use a more flexible MessageFormatter +* Added a completely revamped build process +* Cleaning up Collection class and removing default values from the get method +* Fixed ZF2 cache adapters + +## 2.8.8 - 2012-10-15 + +* Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did + +## 2.8.7 - 2012-09-30 + +* Bug: Fixed config file aliases for JSON includes +* Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests +* Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload +* Bug: Hardening request and response parsing to account for missing parts +* Bug: Fixed PEAR packaging +* Bug: Fixed Request::getInfo +* Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail +* Adding the ability for the namespace Iterator factory to look in multiple directories +* Added more getters/setters/removers from service descriptions +* Added the ability to remove POST fields from OAuth signatures +* OAuth plugin now supports 2-legged OAuth + +## 2.8.6 - 2012-09-05 + +* Added the ability to modify and build service descriptions +* Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command +* Added a `json` parameter location +* Now allowing dot notation for classes in the CacheAdapterFactory +* Using the union of two arrays rather than an array_merge when extending service builder services and service params +* Ensuring that a service is a string before doing strpos() checks on it when substituting services for references + in service builder config files. +* Services defined in two different config files that include one another will by default replace the previously + defined service, but you can now create services that extend themselves and merge their settings over the previous +* The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like + '_default' with a default JSON configuration file. + +## 2.8.5 - 2012-08-29 + +* Bug: Suppressed empty arrays from URI templates +* Bug: Added the missing $options argument from ServiceDescription::factory to enable caching +* Added support for HTTP responses that do not contain a reason phrase in the start-line +* AbstractCommand commands are now invokable +* Added a way to get the data used when signing an Oauth request before a request is sent + +## 2.8.4 - 2012-08-15 + +* Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin +* Added the ability to transfer entity bodies as a string rather than streamed. This gets around curl error 65. Set `body_as_string` in a request's curl options to enable. +* Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\Common\Stream +* Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream +* Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5()) +* Added additional response status codes +* Removed SSL information from the default User-Agent header +* DELETE requests can now send an entity body +* Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries +* Added the ability of the MockPlugin to consume mocked request bodies +* LogPlugin now exposes request and response objects in the extras array + +## 2.8.3 - 2012-07-30 + +* Bug: Fixed a case where empty POST requests were sent as GET requests +* Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body +* Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new +* Added multiple inheritance to service description commands +* Added an ApiCommandInterface and added ``getParamNames()`` and ``hasParam()`` +* Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything +* Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles + +## 2.8.2 - 2012-07-24 + +* Bug: Query string values set to 0 are no longer dropped from the query string +* Bug: A Collection object is no longer created each time a call is made to ``Guzzle\Service\Command\AbstractCommand::getRequestHeaders()`` +* Bug: ``+`` is now treated as an encoded space when parsing query strings +* QueryString and Collection performance improvements +* Allowing dot notation for class paths in filters attribute of a service descriptions + +## 2.8.1 - 2012-07-16 + +* Loosening Event Dispatcher dependency +* POST redirects can now be customized using CURLOPT_POSTREDIR + +## 2.8.0 - 2012-07-15 + +* BC: Guzzle\Http\Query + * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl) + * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding() + * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool) + * Changed the aggregation functions of QueryString to be static methods + * Can now use fromString() with querystrings that have a leading ? +* cURL configuration values can be specified in service descriptions using ``curl.`` prefixed parameters +* Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body +* Cookies are no longer URL decoded by default +* Bug: URI template variables set to null are no longer expanded + +## 2.7.2 - 2012-07-02 + +* BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\Http\Parser to Guzzle\Parser. +* BC: Removing Guzzle\Common\Batch\Batch::count() and replacing it with isEmpty() +* CachePlugin now allows for a custom request parameter function to check if a request can be cached +* Bug fix: CachePlugin now only caches GET and HEAD requests by default +* Bug fix: Using header glue when transferring headers over the wire +* Allowing deeply nested arrays for composite variables in URI templates +* Batch divisors can now return iterators or arrays + +## 2.7.1 - 2012-06-26 + +* Minor patch to update version number in UA string +* Updating build process + +## 2.7.0 - 2012-06-25 + +* BC: Inflection classes moved to Guzzle\Inflection. No longer static methods. Can now inject custom inflectors into classes. +* BC: Removed magic setX methods from commands +* BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method +* Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable. +* Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity) +* Guzzle\Service\Resource\ResourceIteratorApplyBatched now internally uses the Guzzle\Common\Batch namespace +* Added Guzzle\Service\Plugin namespace and a PluginCollectionPlugin +* Added the ability to set POST fields and files in a service description +* Guzzle\Http\EntityBody::factory() now accepts objects with a __toString() method +* Adding a command.before_prepare event to clients +* Added BatchClosureTransfer and BatchClosureDivisor +* BatchTransferException now includes references to the batch divisor and transfer strategies +* Fixed some tests so that they pass more reliably +* Added Guzzle\Common\Log\ArrayLogAdapter + +## 2.6.6 - 2012-06-10 + +* BC: Removing Guzzle\Http\Plugin\BatchQueuePlugin +* BC: Removing Guzzle\Service\Command\CommandSet +* Adding generic batching system (replaces the batch queue plugin and command set) +* Updating ZF cache and log adapters and now using ZF's composer repository +* Bug: Setting the name of each ApiParam when creating through an ApiCommand +* Adding result_type, result_doc, deprecated, and doc_url to service descriptions +* Bug: Changed the default cookie header casing back to 'Cookie' + +## 2.6.5 - 2012-06-03 + +* BC: Renaming Guzzle\Http\Message\RequestInterface::getResourceUri() to getResource() +* BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from +* BC: Guzzle\Http\Cookie is now used to manage Set-Cookie data, not Cookie data +* BC: Renaming methods in the CookieJarInterface +* Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations +* Making the default glue for HTTP headers ';' instead of ',' +* Adding a removeValue to Guzzle\Http\Message\Header +* Adding getCookies() to request interface. +* Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber() + +## 2.6.4 - 2012-05-30 + +* BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class. +* BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand +* Bug: Fixing magic method command calls on clients +* Bug: Email constraint only validates strings +* Bug: Aggregate POST fields when POST files are present in curl handle +* Bug: Fixing default User-Agent header +* Bug: Only appending or prepending parameters in commands if they are specified +* Bug: Not requiring response reason phrases or status codes to match a predefined list of codes +* Allowing the use of dot notation for class namespaces when using instance_of constraint +* Added any_match validation constraint +* Added an AsyncPlugin +* Passing request object to the calculateWait method of the ExponentialBackoffPlugin +* Allowing the result of a command object to be changed +* Parsing location and type sub values when instantiating a service description rather than over and over at runtime + +## 2.6.3 - 2012-05-23 + +* [BC] Guzzle\Common\FromConfigInterface no longer requires any config options. +* [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields. +* You can now use an array of data when creating PUT request bodies in the request factory. +* Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable. +* [Http] Adding support for Content-Type in multipart POST uploads per upload +* [Http] Added support for uploading multiple files using the same name (foo[0], foo[1]) +* Adding more POST data operations for easier manipulation of POST data. +* You can now set empty POST fields. +* The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files. +* Split the Guzzle\Service\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate. +* CS updates + +## 2.6.2 - 2012-05-19 + +* [Http] Better handling of nested scope requests in CurlMulti. Requests are now always prepares in the send() method rather than the addRequest() method. + +## 2.6.1 - 2012-05-19 + +* [BC] Removing 'path' support in service descriptions. Use 'uri'. +* [BC] Guzzle\Service\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache. +* [BC] Removing Guzzle\Common\NullObject. Use https://github.com/mtdowling/NullObject if you need it. +* [BC] Removing Guzzle\Common\XmlElement. +* All commands, both dynamic and concrete, have ApiCommand objects. +* Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits. +* Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored. +* Making the method signature of Guzzle\Service\Builder\ServiceBuilder::factory more flexible. + +## 2.6.0 - 2012-05-15 + +* [BC] Moving Guzzle\Service\Builder to Guzzle\Service\Builder\ServiceBuilder +* [BC] Executing a Command returns the result of the command rather than the command +* [BC] Moving all HTTP parsing logic to Guzzle\Http\Parsers. Allows for faster C implementations if needed. +* [BC] Changing the Guzzle\Http\Message\Response::setProtocol() method to accept a protocol and version in separate args. +* [BC] Moving ResourceIterator* to Guzzle\Service\Resource +* [BC] Completely refactored ResourceIterators to iterate over a cloned command object +* [BC] Moved Guzzle\Http\UriTemplate to Guzzle\Http\Parser\UriTemplate\UriTemplate +* [BC] Guzzle\Guzzle is now deprecated +* Moving Guzzle\Common\Guzzle::inject to Guzzle\Common\Collection::inject +* Adding Guzzle\Version class to give version information about Guzzle +* Adding Guzzle\Http\Utils class to provide getDefaultUserAgent() and getHttpDate() +* Adding Guzzle\Curl\CurlVersion to manage caching curl_version() data +* ServiceDescription and ServiceBuilder are now cacheable using similar configs +* Changing the format of XML and JSON service builder configs. Backwards compatible. +* Cleaned up Cookie parsing +* Trimming the default Guzzle User-Agent header +* Adding a setOnComplete() method to Commands that is called when a command completes +* Keeping track of requests that were mocked in the MockPlugin +* Fixed a caching bug in the CacheAdapterFactory +* Inspector objects can be injected into a Command object +* Refactoring a lot of code and tests to be case insensitive when dealing with headers +* Adding Guzzle\Http\Message\HeaderComparison for easy comparison of HTTP headers using a DSL +* Adding the ability to set global option overrides to service builder configs +* Adding the ability to include other service builder config files from within XML and JSON files +* Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method. + +## 2.5.0 - 2012-05-08 + +* Major performance improvements +* [BC] Simplifying Guzzle\Common\Collection. Please check to see if you are using features that are now deprecated. +* [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component. +* [BC] No longer supporting "{{ }}" for injecting into command or UriTemplates. Use "{}" +* Added the ability to passed parameters to all requests created by a client +* Added callback functionality to the ExponentialBackoffPlugin +* Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies. +* Rewinding request stream bodies when retrying requests +* Exception is thrown when JSON response body cannot be decoded +* Added configurable magic method calls to clients and commands. This is off by default. +* Fixed a defect that added a hash to every parsed URL part +* Fixed duplicate none generation for OauthPlugin. +* Emitting an event each time a client is generated by a ServiceBuilder +* Using an ApiParams object instead of a Collection for parameters of an ApiCommand +* cache.* request parameters should be renamed to params.cache.* +* Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc). See CurlHandle. +* Added the ability to disable type validation of service descriptions +* ServiceDescriptions and ServiceBuilders are now Serializable diff --git a/vendor/Aws2/guzzle/guzzle/LICENSE b/vendor/Aws2/guzzle/guzzle/LICENSE new file mode 100644 index 00000000..d51aa698 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011 Michael Dowling, https://github.com/mtdowling + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/Aws2/guzzle/guzzle/README.md b/vendor/Aws2/guzzle/guzzle/README.md new file mode 100644 index 00000000..6be06bf4 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/README.md @@ -0,0 +1,57 @@ +Guzzle, PHP HTTP client and webservice framework +================================================ + +# This is an old version of Guzzle + +This repository is for Guzzle 3.x. Guzzle 5.x, the new version of Guzzle, has +been released and is available at +[https://github.com/guzzle/guzzle](https://github.com/guzzle/guzzle). The +documentation for Guzzle version 5+ can be found at +[http://guzzlephp.org](http://guzzlephp.org). + +Guzzle 3 is only maintained for bug and security fixes. Guzzle 3 will be EOL +at some point in late 2015. + +### About Guzzle 3 + +[![Composer Downloads](https://poser.pugx.org/guzzle/guzzle/d/total.png)](https://packagist.org/packages/guzzle/guzzle) + [![Build Status](https://secure.travis-ci.org/guzzle/guzzle3.png?branch=master)](http://travis-ci.org/guzzle/guzzle3) + +- Extremely powerful API provides all the power of cURL with a simple interface. +- Truly take advantage of HTTP/1.1 with persistent connections, connection pooling, and parallel requests. +- Service description DSL allows you build awesome web service clients faster. +- Symfony2 event-based plugin system allows you to completely modify the behavior of a request. + +Get answers with: [Documentation](http://guzzle3.readthedocs.org/en/latest/), [Forums](https://groups.google.com/forum/?hl=en#!forum/guzzle), IRC ([#guzzlephp](irc://irc.freenode.net/#guzzlephp) @ irc.freenode.net) + +### Installing via Composer + +The recommended way to install Guzzle is through [Composer](http://getcomposer.org). + +```bash +# Install Composer +curl -sS https://getcomposer.org/installer | php + +# Add Guzzle as a dependency +php composer.phar require guzzle/guzzle:~3.9 +``` + +After installing, you need to require Composer's autoloader: + +```php +require 'vendor/autoload.php'; +``` +## Known Issues + +1. Problem following a specific redirect: https://github.com/guzzle/guzzle/issues/385. + This has been fixed in Guzzle 4/5. +2. Root XML attributes not serialized in a service description: https://github.com/guzzle/guzzle3/issues/5. + This has been fixed in Guzzle 4/5. +3. Accept-Encoding not preserved when following redirect: https://github.com/guzzle/guzzle3/issues/9 + Fixed in Guzzle 4/5. +4. String "Array" Transmitted w/ PostFiles and Duplicate Aggregator: https://github.com/guzzle/guzzle3/issues/10 + Fixed in Guzzle 4/5. +5. Recursive model references with array items: https://github.com/guzzle/guzzle3/issues/13 + Fixed in Guzzle 4/5 +6. String "Array" Transmitted w/ PostFiles and Duplicate Aggregator: https://github.com/guzzle/guzzle3/issues/10 + Fixed in Guzzle 4/5. diff --git a/vendor/Aws2/guzzle/guzzle/UPGRADING.md b/vendor/Aws2/guzzle/guzzle/UPGRADING.md new file mode 100644 index 00000000..f58bf117 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/UPGRADING.md @@ -0,0 +1,537 @@ +Guzzle Upgrade Guide +==================== + +3.6 to 3.7 +---------- + +### Deprecations + +- You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.: + +```php +\Guzzle\Common\Version::$emitWarnings = true; +``` + +The following APIs and options have been marked as deprecated: + +- Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead. +- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +- Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. +- Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. +- Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated +- Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. +- Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. +- Marked `Guzzle\Common\Collection::inject()` as deprecated. +- Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use + `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or + `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` + +3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational +request methods. When paired with a client's configuration settings, these options allow you to specify default settings +for various aspects of a request. Because these options make other previous configuration options redundant, several +configuration options and methods of a client and AbstractCommand have been deprecated. + +- Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`. +- Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`. +- Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')` +- Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0 + + $command = $client->getCommand('foo', array( + 'command.headers' => array('Test' => '123'), + 'command.response_body' => '/path/to/file' + )); + + // Should be changed to: + + $command = $client->getCommand('foo', array( + 'command.request_options' => array( + 'headers' => array('Test' => '123'), + 'save_as' => '/path/to/file' + ) + )); + +### Interface changes + +Additions and changes (you will need to update any implementations or subclasses you may have created): + +- Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: + createRequest, head, delete, put, patch, post, options, prepareRequest +- Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` +- Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` +- Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to + `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a + resource, string, or EntityBody into the $options parameter to specify the download location of the response. +- Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a + default `array()` +- Added `Guzzle\Stream\StreamInterface::isRepeatable` +- Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. + +The following methods were removed from interfaces. All of these methods are still available in the concrete classes +that implement them, but you should update your code to use alternative methods: + +- Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use + `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or + `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or + `$client->setDefaultOption('headers/{header_name}', 'value')`. or + `$client->setDefaultOption('headers', array('header_name' => 'value'))`. +- Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`. +- Removed `Guzzle\Http\ClientInterface::expandTemplate()`. This is an implementation detail. +- Removed `Guzzle\Http\ClientInterface::setRequestFactory()`. This is an implementation detail. +- Removed `Guzzle\Http\ClientInterface::getCurlMulti()`. This is a very specific implementation detail. +- Removed `Guzzle\Http\Message\RequestInterface::canCache`. Use the CachePlugin. +- Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`. Use the HistoryPlugin. +- Removed `Guzzle\Http\Message\RequestInterface::isRedirect`. Use the HistoryPlugin. + +### Cache plugin breaking changes + +- CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a + CacheStorageInterface. These two objects and interface will be removed in a future version. +- Always setting X-cache headers on cached responses +- Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin +- `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface + $request, Response $response);` +- `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` +- `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` +- Added `CacheStorageInterface::purge($url)` +- `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin + $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, + CanCacheStrategyInterface $canCache = null)` +- Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` + +3.5 to 3.6 +---------- + +* Mixed casing of headers are now forced to be a single consistent casing across all values for that header. +* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution +* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). + For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader(). + Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request. +* Specific header implementations can be created for complex headers. When a message creates a header, it uses a + HeaderFactory which can map specific headers to specific header classes. There is now a Link header and + CacheControl header implementation. +* Moved getLinks() from Response to just be used on a Link header object. + +If you previously relied on Guzzle\Http\Message\Header::raw(), then you will need to update your code to use the +HeaderInterface (e.g. toArray(), getAll(), etc). + +### Interface changes + +* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate +* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() +* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in + Guzzle\Http\Curl\RequestMediator +* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. +* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface +* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() + +### Removed deprecated functions + +* Removed Guzzle\Parser\ParserRegister::get(). Use getParser() +* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). + +### Deprecations + +* The ability to case-insensitively search for header values +* Guzzle\Http\Message\Header::hasExactHeader +* Guzzle\Http\Message\Header::raw. Use getAll() +* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object + instead. + +### Other changes + +* All response header helper functions return a string rather than mixing Header objects and strings inconsistently +* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc are managed by Guzzle + directly via interfaces +* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist + but are a no-op until removed. +* Most classes that used to require a ``Guzzle\Service\Command\CommandInterface` typehint now request a + `Guzzle\Service\Command\ArrayCommandInterface`. +* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response + on a request while the request is still being transferred +* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess + +3.3 to 3.4 +---------- + +Base URLs of a client now follow the rules of http://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs. + +3.2 to 3.3 +---------- + +### Response::getEtag() quote stripping removed + +`Guzzle\Http\Message\Response::getEtag()` no longer strips quotes around the ETag response header + +### Removed `Guzzle\Http\Utils` + +The `Guzzle\Http\Utils` class was removed. This class was only used for testing. + +### Stream wrapper and type + +`Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to lowercase. + +### curl.emit_io became emit_io + +Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the +'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' + +3.1 to 3.2 +---------- + +### CurlMulti is no longer reused globally + +Before 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added +to a single client can pollute requests dispatched from other clients. + +If you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the +ServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is +created. + +```php +$multi = new Guzzle\Http\Curl\CurlMulti(); +$builder = Guzzle\Service\Builder\ServiceBuilder::factory('/path/to/config.json'); +$builder->addListener('service_builder.create_client', function ($event) use ($multi) { + $event['client']->setCurlMulti($multi); +} +}); +``` + +### No default path + +URLs no longer have a default path value of '/' if no path was specified. + +Before: + +```php +$request = $client->get('http://www.foo.com'); +echo $request->getUrl(); +// >> http://www.foo.com/ +``` + +After: + +```php +$request = $client->get('http://www.foo.com'); +echo $request->getUrl(); +// >> http://www.foo.com +``` + +### Less verbose BadResponseException + +The exception message for `Guzzle\Http\Exception\BadResponseException` no longer contains the full HTTP request and +response information. You can, however, get access to the request and response object by calling `getRequest()` or +`getResponse()` on the exception object. + +### Query parameter aggregation + +Multi-valued query parameters are no longer aggregated using a callback function. `Guzzle\Http\Query` now has a +setAggregator() method that accepts a `Guzzle\Http\QueryAggregator\QueryAggregatorInterface` object. This object is +responsible for handling the aggregation of multi-valued query string variables into a flattened hash. + +2.8 to 3.x +---------- + +### Guzzle\Service\Inspector + +Change `\Guzzle\Service\Inspector::fromConfig` to `\Guzzle\Common\Collection::fromConfig` + +**Before** + +```php +use Guzzle\Service\Inspector; + +class YourClient extends \Guzzle\Service\Client +{ + public static function factory($config = array()) + { + $default = array(); + $required = array('base_url', 'username', 'api_key'); + $config = Inspector::fromConfig($config, $default, $required); + + $client = new self( + $config->get('base_url'), + $config->get('username'), + $config->get('api_key') + ); + $client->setConfig($config); + + $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); + + return $client; + } +``` + +**After** + +```php +use Guzzle\Common\Collection; + +class YourClient extends \Guzzle\Service\Client +{ + public static function factory($config = array()) + { + $default = array(); + $required = array('base_url', 'username', 'api_key'); + $config = Collection::fromConfig($config, $default, $required); + + $client = new self( + $config->get('base_url'), + $config->get('username'), + $config->get('api_key') + ); + $client->setConfig($config); + + $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); + + return $client; + } +``` + +### Convert XML Service Descriptions to JSON + +**Before** + +```xml + + + + + + Get a list of groups + + + Uses a search query to get a list of groups + + + + Create a group + + + + + Delete a group by ID + + + + + + + Update a group + + + + + + +``` + +**After** + +```json +{ + "name": "Zendesk REST API v2", + "apiVersion": "2012-12-31", + "description":"Provides access to Zendesk views, groups, tickets, ticket fields, and users", + "operations": { + "list_groups": { + "httpMethod":"GET", + "uri": "groups.json", + "summary": "Get a list of groups" + }, + "search_groups":{ + "httpMethod":"GET", + "uri": "search.json?query=\"{query} type:group\"", + "summary": "Uses a search query to get a list of groups", + "parameters":{ + "query":{ + "location": "uri", + "description":"Zendesk Search Query", + "type": "string", + "required": true + } + } + }, + "create_group": { + "httpMethod":"POST", + "uri": "groups.json", + "summary": "Create a group", + "parameters":{ + "data": { + "type": "array", + "location": "body", + "description":"Group JSON", + "filters": "json_encode", + "required": true + }, + "Content-Type":{ + "type": "string", + "location":"header", + "static": "application/json" + } + } + }, + "delete_group": { + "httpMethod":"DELETE", + "uri": "groups/{id}.json", + "summary": "Delete a group", + "parameters":{ + "id":{ + "location": "uri", + "description":"Group to delete by ID", + "type": "integer", + "required": true + } + } + }, + "get_group": { + "httpMethod":"GET", + "uri": "groups/{id}.json", + "summary": "Get a ticket", + "parameters":{ + "id":{ + "location": "uri", + "description":"Group to get by ID", + "type": "integer", + "required": true + } + } + }, + "update_group": { + "httpMethod":"PUT", + "uri": "groups/{id}.json", + "summary": "Update a group", + "parameters":{ + "id": { + "location": "uri", + "description":"Group to update by ID", + "type": "integer", + "required": true + }, + "data": { + "type": "array", + "location": "body", + "description":"Group JSON", + "filters": "json_encode", + "required": true + }, + "Content-Type":{ + "type": "string", + "location":"header", + "static": "application/json" + } + } + } +} +``` + +### Guzzle\Service\Description\ServiceDescription + +Commands are now called Operations + +**Before** + +```php +use Guzzle\Service\Description\ServiceDescription; + +$sd = new ServiceDescription(); +$sd->getCommands(); // @returns ApiCommandInterface[] +$sd->hasCommand($name); +$sd->getCommand($name); // @returns ApiCommandInterface|null +$sd->addCommand($command); // @param ApiCommandInterface $command +``` + +**After** + +```php +use Guzzle\Service\Description\ServiceDescription; + +$sd = new ServiceDescription(); +$sd->getOperations(); // @returns OperationInterface[] +$sd->hasOperation($name); +$sd->getOperation($name); // @returns OperationInterface|null +$sd->addOperation($operation); // @param OperationInterface $operation +``` + +### Guzzle\Common\Inflection\Inflector + +Namespace is now `Guzzle\Inflection\Inflector` + +### Guzzle\Http\Plugin + +Namespace is now `Guzzle\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below. + +### Guzzle\Http\Plugin\LogPlugin and Guzzle\Common\Log + +Now `Guzzle\Plugin\Log\LogPlugin` and `Guzzle\Log` respectively. + +**Before** + +```php +use Guzzle\Common\Log\ClosureLogAdapter; +use Guzzle\Http\Plugin\LogPlugin; + +/** @var \Guzzle\Http\Client */ +$client; + +// $verbosity is an integer indicating desired message verbosity level +$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE); +``` + +**After** + +```php +use Guzzle\Log\ClosureLogAdapter; +use Guzzle\Log\MessageFormatter; +use Guzzle\Plugin\Log\LogPlugin; + +/** @var \Guzzle\Http\Client */ +$client; + +// $format is a string indicating desired message format -- @see MessageFormatter +$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT); +``` + +### Guzzle\Http\Plugin\CurlAuthPlugin + +Now `Guzzle\Plugin\CurlAuth\CurlAuthPlugin`. + +### Guzzle\Http\Plugin\ExponentialBackoffPlugin + +Now `Guzzle\Plugin\Backoff\BackoffPlugin`, and other changes. + +**Before** + +```php +use Guzzle\Http\Plugin\ExponentialBackoffPlugin; + +$backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge( + ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429) + )); + +$client->addSubscriber($backoffPlugin); +``` + +**After** + +```php +use Guzzle\Plugin\Backoff\BackoffPlugin; +use Guzzle\Plugin\Backoff\HttpBackoffStrategy; + +// Use convenient factory method instead -- see implementation for ideas of what +// you can do with chaining backoff strategies +$backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge( + HttpBackoffStrategy::getDefaultFailureCodes(), array(429) + )); +$client->addSubscriber($backoffPlugin); +``` + +### Known Issues + +#### [BUG] Accept-Encoding header behavior changed unintentionally. + +(See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e) + +In version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to +properly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen. +See issue #217 for a workaround, or use a version containing the fix. diff --git a/vendor/Aws2/guzzle/guzzle/build.xml b/vendor/Aws2/guzzle/guzzle/build.xml new file mode 100644 index 00000000..2aa62ba9 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/build.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/Aws2/guzzle/guzzle/composer.json b/vendor/Aws2/guzzle/guzzle/composer.json new file mode 100644 index 00000000..30876e35 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/composer.json @@ -0,0 +1,82 @@ +{ + "name": "guzzle\/guzzle", + "type": "library", + "description": "PHP HTTP client. This library is deprecated in favor of https:\/\/packagist.org\/packages\/guzzlehttp\/guzzle", + "keywords": [ + "framework", + "http", + "rest", + "web service", + "curl", + "client", + "HTTP client" + ], + "homepage": "http:\/\/guzzlephp.org\/", + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + }, + { + "name": "Guzzle Community", + "homepage": "https:\/\/github.com\/guzzle\/guzzle\/contributors" + } + ], + "replace": { + "guzzle\/batch": "self.version", + "guzzle\/cache": "self.version", + "guzzle\/common": "self.version", + "guzzle\/http": "self.version", + "guzzle\/inflection": "self.version", + "guzzle\/iterator": "self.version", + "guzzle\/log": "self.version", + "guzzle\/parser": "self.version", + "guzzle\/plugin": "self.version", + "guzzle\/plugin-async": "self.version", + "guzzle\/plugin-backoff": "self.version", + "guzzle\/plugin-cache": "self.version", + "guzzle\/plugin-cookie": "self.version", + "guzzle\/plugin-curlauth": "self.version", + "guzzle\/plugin-error-response": "self.version", + "guzzle\/plugin-history": "self.version", + "guzzle\/plugin-log": "self.version", + "guzzle\/plugin-md5": "self.version", + "guzzle\/plugin-mock": "self.version", + "guzzle\/plugin-oauth": "self.version", + "guzzle\/service": "self.version", + "guzzle\/stream": "self.version" + }, + "require": { + "php": ">=5.3.3", + "ext-curl": "*", + "symfony\/event-dispatcher": "~2.1" + }, + "autoload": { + "psr-0": { + "Guzzle": "src\/", + "Guzzle\\Tests": "tests\/" + } + }, + "suggest": { + "guzzlehttp\/guzzle": "Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated." + }, + "scripts": { + "test": "phpunit" + }, + "require-dev": { + "doctrine\/cache": "~1.3", + "symfony\/class-loader": "~2.1", + "monolog\/monolog": "~1.0", + "psr\/log": "~1.0", + "zendframework\/zend-cache": "2.*,<2.3", + "zendframework\/zend-log": "2.*,<2.3", + "phpunit\/phpunit": "3.7.*" + }, + "extra": { + "branch-alias": { + "dev-master": "3.9-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/phar-stub.php b/vendor/Aws2/guzzle/guzzle/phar-stub.php new file mode 100644 index 00000000..a0298b69 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/phar-stub.php @@ -0,0 +1,9 @@ +registerNamespaces(array('Guzzle' => 'phar://guzzle.phar/src', 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher' => 'phar://guzzle.phar/vendor/symfony/event-dispatcher', 'Doctrine' => 'phar://guzzle.phar/vendor/doctrine/common/lib', 'Monolog' => 'phar://guzzle.phar/vendor/monolog/monolog/src')); +$classLoader->register(); +__halt_compiler(); + diff --git a/vendor/Aws2/guzzle/guzzle/phing/build.properties.dist b/vendor/Aws2/guzzle/guzzle/phing/build.properties.dist new file mode 100644 index 00000000..c60d3d9c --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/phing/build.properties.dist @@ -0,0 +1,16 @@ +# you may need to update this if you're working on a fork. +guzzle.remote=git@github.com:guzzle/guzzle.git + +# github credentials -- only used by GitHub API calls to create subtree repos +github.basicauth=username:password +# for the subtree split and testing +github.org=guzzle + +# your git path +cmd.git=git + +# your composer command +cmd.composer=composer + +# test server start +cmd.testserver=node diff --git a/vendor/Aws2/guzzle/guzzle/phing/imports/dependencies.xml b/vendor/Aws2/guzzle/guzzle/phing/imports/dependencies.xml new file mode 100644 index 00000000..e40e037c --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/phing/imports/dependencies.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + using git at ${cmd.git} + + + + found git at ${cmd.git} + + + + + + + + + + diff --git a/vendor/Aws2/guzzle/guzzle/phing/imports/deploy.xml b/vendor/Aws2/guzzle/guzzle/phing/imports/deploy.xml new file mode 100644 index 00000000..109e5ec4 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/phing/imports/deploy.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + On branch ${head} + + + + + + + + + + working directory clean + + + ${git.status} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ChangeLog Match: ${version.changelog} + Guzzle\Common\Version Match: ${version.version} + + + + releasing: phing -Dnew.version=3.0.x -Dhead=master release + -- + + + + + + + + + + + + + + + BEGINNING RELEASE FOR ${new.version} + + + + + + + + + + + + + + + + + + + + + + + + Tip: to create a new release, do: phing -Dnew.version=[TAG] -Dhead=[BRANCH] release + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/Aws2/guzzle/guzzle/phing/tasks/ComposerLintTask.php b/vendor/Aws2/guzzle/guzzle/phing/tasks/ComposerLintTask.php new file mode 100644 index 00000000..cb63ce25 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/phing/tasks/ComposerLintTask.php @@ -0,0 +1,133 @@ + + * @license http://claylo.mit-license.org/2012/ MIT License + */ +require_once 'phing/Task.php'; +class ComposerLintTask extends \Task +{ + protected $dir = \null; + protected $file = \null; + protected $passthru = \false; + protected $composer = \null; + /** + * The setter for the dir + * + * @param string $str Directory to crawl recursively for composer files + */ + public function setDir($str) + { + $this->dir = $str; + } + /** + * The setter for the file + * + * @param string $str Individual file to validate + */ + public function setFile($str) + { + $this->file = $str; + } + /** + * Whether to use PHP's passthru() function instead of exec() + * + * @param boolean $passthru If passthru shall be used + */ + public function setPassthru($passthru) + { + $this->passthru = (bool) $passthru; + } + /** + * Composer to execute. If unset, will attempt composer.phar in project + * basedir, and if that fails, will attempt global composer + * installation. + * + * @param string $str Individual file to validate + */ + public function setComposer($str) + { + $this->file = $str; + } + /** + * The init method: do init steps + */ + public function init() + { + // nothing needed here + } + /** + * The main entry point + */ + public function main() + { + if ($this->composer === \null) { + $this->findComposer(); + } + $files = array(); + if (!empty($this->file) && \file_exists($this->file)) { + $files[] = $this->file; + } + if (!empty($this->dir)) { + $found = $this->findFiles(); + foreach ($found as $file) { + $files[] = $this->dir . \DIRECTORY_SEPARATOR . $file; + } + } + foreach ($files as $file) { + $cmd = $this->composer . ' validate ' . $file; + $cmd = \escapeshellcmd($cmd); + if ($this->passthru) { + $retval = \null; + \passthru($cmd, $retval); + if ($retval == 1) { + throw new \BuildException('invalid composer.json'); + } + } else { + $out = array(); + $retval = \null; + \exec($cmd, $out, $retval); + if ($retval == 1) { + $err = \join("\n", $out); + throw new \BuildException($err); + } else { + $this->log($out[0]); + } + } + } + } + /** + * Find the composer.json files using Phing's directory scanner + * + * @return array + */ + protected function findFiles() + { + $ds = new \DirectoryScanner(); + $ds->setBasedir($this->dir); + $ds->setIncludes(array('**/composer.json')); + $ds->scan(); + return $ds->getIncludedFiles(); + } + /** + * Find composer installation + * + */ + protected function findComposer() + { + $basedir = $this->project->getBasedir(); + $php = $this->project->getProperty('php.interpreter'); + if (\file_exists($basedir . '/composer.phar')) { + $this->composer = "{$php} {$basedir}/composer.phar"; + } else { + $out = array(); + \exec('which composer', $out); + if (empty($out)) { + throw new \BuildException('Could not determine composer location.'); + } + $this->composer = $out[0]; + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/phing/tasks/GuzzlePearPharPackageTask.php b/vendor/Aws2/guzzle/guzzle/phing/tasks/GuzzlePearPharPackageTask.php new file mode 100644 index 00000000..c6ae8ad6 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/phing/tasks/GuzzlePearPharPackageTask.php @@ -0,0 +1,286 @@ + + * @license http://claylo.mit-license.org/2012/ MIT License + */ +require_once 'phing/Task.php'; +require_once 'PEAR/PackageFileManager2.php'; +require_once 'PEAR/PackageFileManager/File.php'; +require_once 'PEAR/Packager.php'; +class GuzzlePearPharPackageTask extends \Task +{ + private $version; + private $deploy = \true; + private $makephar = \true; + private $subpackages = array(); + public function setVersion($str) + { + $this->version = $str; + } + public function getVersion() + { + return $this->version; + } + public function setDeploy($deploy) + { + $this->deploy = (bool) $deploy; + } + public function getDeploy() + { + return $this->deploy; + } + public function setMakephar($makephar) + { + $this->makephar = (bool) $makephar; + } + public function getMakephar() + { + return $this->makephar; + } + private $basedir; + private $guzzleinfo; + private $changelog_release_date; + private $changelog_notes = '-'; + public function main() + { + $this->basedir = $this->getProject()->getBasedir(); + if (!\is_dir((string) $this->basedir . '/.subsplit')) { + throw new \BuildException('PEAR packaging requires .subsplit directory'); + } + // main composer file + $composer_file = \file_get_contents((string) $this->basedir . '/.subsplit/composer.json'); + $this->guzzleinfo = \json_decode($composer_file, \true); + // make sure we have a target + $pearwork = (string) $this->basedir . '/build/pearwork'; + if (!\is_dir($pearwork)) { + \mkdir($pearwork, 0777, \true); + } + $pearlogs = (string) $this->basedir . '/build/artifacts/logs'; + if (!\is_dir($pearlogs)) { + \mkdir($pearlogs, 0777, \true); + } + $version = $this->getVersion(); + $this->grabChangelog(); + if ($version[0] == '2') { + $this->log('building single PEAR package'); + $this->buildSinglePackage(); + } else { + // $this->log("building PEAR subpackages"); + // $this->createSubPackages(); + // $this->log("building PEAR bundle package"); + $this->buildSinglePackage(); + } + if ($this->getMakephar()) { + $this->log("building PHAR"); + $this->getProject()->executeTarget('package-phar'); + } + if ($this->getDeploy()) { + $this->doDeployment(); + } + } + public function doDeployment() + { + $basedir = (string) $this->basedir; + $this->log('beginning PEAR/PHAR deployment'); + \chdir($basedir . '/build/pearwork'); + if (!\is_dir('./channel')) { + \mkdir('./channel'); + } + // Pull the PEAR channel down locally + \passthru('aws s3 sync s3://pear.guzzlephp.org ./channel'); + // add PEAR packages + foreach (\scandir('./') as $file) { + if (\substr($file, -4) == '.tgz') { + \passthru('pirum add ./channel ' . $file); + } + } + // if we have a new phar, add it + if ($this->getMakephar() && \file_exists($basedir . '/build/artifacts/guzzle.phar')) { + \rename($basedir . '/build/artifacts/guzzle.phar', './channel/guzzle.phar'); + } + // Sync up with the S3 bucket + \chdir($basedir . '/build/pearwork/channel'); + \passthru('aws s3 sync . s3://pear.guzzlephp.org'); + } + public function buildSinglePackage() + { + $v = $this->getVersion(); + $apiversion = $v[0] . '.0.0'; + $opts = array('packagedirectory' => (string) $this->basedir . '/.subsplit/src/', 'filelistgenerator' => 'file', 'ignore' => array('*composer.json'), 'baseinstalldir' => '/', 'packagefile' => 'package.xml'); + $pfm = new \PEAR_PackageFileManager2(); + $pfm->setOptions($opts); + $pfm->addRole('md', 'doc'); + $pfm->addRole('pem', 'php'); + $pfm->setPackage('Guzzle'); + $pfm->setSummary("Object-oriented PHP HTTP Client for PHP 5.3+"); + $pfm->setDescription($this->guzzleinfo['description']); + $pfm->setPackageType('php'); + $pfm->setChannel('guzzlephp.org/pear'); + $pfm->setAPIVersion($apiversion); + $pfm->setReleaseVersion($this->getVersion()); + $pfm->setAPIStability('stable'); + $pfm->setReleaseStability('stable'); + $pfm->setNotes($this->changelog_notes); + $pfm->setPackageType('php'); + $pfm->setLicense('MIT', 'http://github.com/guzzle/guzzle/blob/master/LICENSE'); + $pfm->addMaintainer('lead', 'mtdowling', 'Michael Dowling', 'mtdowling@gmail.com', 'yes'); + $pfm->setDate($this->changelog_release_date); + $pfm->generateContents(); + $phpdep = $this->guzzleinfo['require']['php']; + $phpdep = \str_replace('>=', '', $phpdep); + $pfm->setPhpDep($phpdep); + $pfm->addExtensionDep('required', 'curl'); + $pfm->setPearinstallerDep('1.4.6'); + $pfm->addPackageDepWithChannel('required', 'EventDispatcher', 'pear.symfony.com', '2.1.0'); + if (!empty($this->subpackages)) { + foreach ($this->subpackages as $package) { + $pkg = \dirname($package); + $pkg = \str_replace('/', '_', $pkg); + $pfm->addConflictingPackageDepWithChannel($pkg, 'guzzlephp.org/pear', \false, $apiversion); + } + } + \ob_start(); + $startdir = \getcwd(); + \chdir((string) $this->basedir . '/build/pearwork'); + echo "DEBUGGING GENERATED PACKAGE FILE\n"; + $result = $pfm->debugPackageFile(); + if ($result) { + $out = $pfm->writePackageFile(); + echo "\n\n\nWRITE PACKAGE FILE RESULT:\n"; + \var_dump($out); + // load up package file and build package + $packager = new \PEAR_Packager(); + echo "\n\n\nBUILDING PACKAGE FROM PACKAGE FILE:\n"; + $dest_package = $packager->package($opts['packagedirectory'] . 'package.xml'); + \var_dump($dest_package); + } else { + echo "\n\n\nDEBUGGING RESULT:\n"; + \var_dump($result); + } + echo "removing package.xml"; + \unlink($opts['packagedirectory'] . 'package.xml'); + $log = \ob_get_clean(); + \file_put_contents((string) $this->basedir . '/build/artifacts/logs/pear_package.log', $log); + \chdir($startdir); + } + public function createSubPackages() + { + $this->findComponents(); + foreach ($this->subpackages as $package) { + $baseinstalldir = \dirname($package); + $dir = (string) $this->basedir . '/.subsplit/src/' . $baseinstalldir; + $composer_file = \file_get_contents((string) $this->basedir . '/.subsplit/src/' . $package); + $package_info = \json_decode($composer_file, \true); + $this->log('building ' . $package_info['target-dir'] . ' subpackage'); + $this->buildSubPackage($dir, $baseinstalldir, $package_info); + } + } + public function buildSubPackage($dir, $baseinstalldir, $info) + { + $package = \str_replace('/', '_', $baseinstalldir); + $opts = array('packagedirectory' => $dir, 'filelistgenerator' => 'file', 'ignore' => array('*composer.json', '*package.xml'), 'baseinstalldir' => '/' . $info['target-dir'], 'packagefile' => 'package.xml'); + $pfm = new \PEAR_PackageFileManager2(); + $pfm->setOptions($opts); + $pfm->setPackage($package); + $pfm->setSummary($info['description']); + $pfm->setDescription($info['description']); + $pfm->setPackageType('php'); + $pfm->setChannel('guzzlephp.org/pear'); + $pfm->setAPIVersion('3.0.0'); + $pfm->setReleaseVersion($this->getVersion()); + $pfm->setAPIStability('stable'); + $pfm->setReleaseStability('stable'); + $pfm->setNotes($this->changelog_notes); + $pfm->setPackageType('php'); + $pfm->setLicense('MIT', 'http://github.com/guzzle/guzzle/blob/master/LICENSE'); + $pfm->addMaintainer('lead', 'mtdowling', 'Michael Dowling', 'mtdowling@gmail.com', 'yes'); + $pfm->setDate($this->changelog_release_date); + $pfm->generateContents(); + $phpdep = $this->guzzleinfo['require']['php']; + $phpdep = \str_replace('>=', '', $phpdep); + $pfm->setPhpDep($phpdep); + $pfm->setPearinstallerDep('1.4.6'); + foreach ($info['require'] as $type => $version) { + if ($type == 'php') { + continue; + } + if ($type == 'symfony/event-dispatcher') { + $pfm->addPackageDepWithChannel('required', 'EventDispatcher', 'pear.symfony.com', '2.1.0'); + } + if ($type == 'ext-curl') { + $pfm->addExtensionDep('required', 'curl'); + } + if (\substr($type, 0, 6) == 'guzzle') { + $gdep = \str_replace('/', ' ', $type); + $gdep = \ucwords($gdep); + $gdep = \str_replace(' ', '_', $gdep); + $pfm->addPackageDepWithChannel('required', $gdep, 'guzzlephp.org/pear', $this->getVersion()); + } + } + // can't have main Guzzle package AND sub-packages + $pfm->addConflictingPackageDepWithChannel('Guzzle', 'guzzlephp.org/pear', \false, $apiversion); + \ob_start(); + $startdir = \getcwd(); + \chdir((string) $this->basedir . '/build/pearwork'); + echo "DEBUGGING GENERATED PACKAGE FILE\n"; + $result = $pfm->debugPackageFile(); + if ($result) { + $out = $pfm->writePackageFile(); + echo "\n\n\nWRITE PACKAGE FILE RESULT:\n"; + \var_dump($out); + // load up package file and build package + $packager = new \PEAR_Packager(); + echo "\n\n\nBUILDING PACKAGE FROM PACKAGE FILE:\n"; + $dest_package = $packager->package($opts['packagedirectory'] . '/package.xml'); + \var_dump($dest_package); + } else { + echo "\n\n\nDEBUGGING RESULT:\n"; + \var_dump($result); + } + echo "removing package.xml"; + \unlink($opts['packagedirectory'] . '/package.xml'); + $log = \ob_get_clean(); + \file_put_contents((string) $this->basedir . '/build/artifacts/logs/pear_package_' . $package . '.log', $log); + \chdir($startdir); + } + public function findComponents() + { + $ds = new \DirectoryScanner(); + $ds->setBasedir((string) $this->basedir . '/.subsplit/src'); + $ds->setIncludes(array('**/composer.json')); + $ds->scan(); + $files = $ds->getIncludedFiles(); + $this->subpackages = $files; + } + public function grabChangelog() + { + $cl = \file((string) $this->basedir . '/.subsplit/CHANGELOG.md'); + $notes = ''; + $in_version = \false; + $release_date = \null; + foreach ($cl as $line) { + $line = \trim($line); + if (\preg_match('/^\\* ' . $this->getVersion() . ' \\(([0-9\\-]+)\\)$/', $line, $matches)) { + $release_date = $matches[1]; + $in_version = \true; + continue; + } + if ($in_version && empty($line) && empty($notes)) { + continue; + } + if ($in_version && !empty($line)) { + $notes .= $line . "\n"; + } + if ($in_version && empty($line) && !empty($notes)) { + $in_version = \false; + } + } + $this->changelog_release_date = $release_date; + if (!empty($notes)) { + $this->changelog_notes = $notes; + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/phing/tasks/GuzzleSubSplitTask.php b/vendor/Aws2/guzzle/guzzle/phing/tasks/GuzzleSubSplitTask.php new file mode 100644 index 00000000..e337bd1f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/phing/tasks/GuzzleSubSplitTask.php @@ -0,0 +1,315 @@ + + * @license http://claylo.mit-license.org/2012/ MIT License + */ +require_once 'phing/tasks/ext/git/GitBaseTask.php'; +// base - base of tree to split out +// subIndicatorFile - composer.json, package.xml? +class GuzzleSubSplitTask extends \GitBaseTask +{ + /** + * What git repository to pull from and publish to + */ + protected $remote = \null; + /** + * Publish for comma-separated heads instead of all heads + */ + protected $heads = \null; + /** + * Publish for comma-separated tags instead of all tags + */ + protected $tags = \null; + /** + * Base of the tree RELATIVE TO .subsplit working dir + */ + protected $base = \null; + /** + * The presence of this file will indicate that the directory it resides + * in is at the top level of a split. + */ + protected $subIndicatorFile = 'composer.json'; + /** + * Do everything except actually send the update. + */ + protected $dryRun = \null; + /** + * Do not sync any heads. + */ + protected $noHeads = \false; + /** + * Do not sync any tags. + */ + protected $noTags = \false; + /** + * The splits we found in the heads + */ + protected $splits; + public function setRemote($str) + { + $this->remote = $str; + } + public function getRemote() + { + return $this->remote; + } + public function setHeads($str) + { + $this->heads = \explode(',', $str); + } + public function getHeads() + { + return $this->heads; + } + public function setTags($str) + { + $this->tags = \explode(',', $str); + } + public function getTags() + { + return $this->tags; + } + public function setBase($str) + { + $this->base = $str; + } + public function getBase() + { + return $this->base; + } + public function setSubIndicatorFile($str) + { + $this->subIndicatorFile = $str; + } + public function getSubIndicatorFile() + { + return $this->subIndicatorFile; + } + public function setDryRun($bool) + { + $this->dryRun = (bool) $bool; + } + public function getDryRun() + { + return $this->dryRun; + } + public function setNoHeads($bool) + { + $this->noHeads = (bool) $bool; + } + public function getNoHeads() + { + return $this->noHeads; + } + public function setNoTags($bool) + { + $this->noTags = (bool) $bool; + } + public function getNoTags() + { + return $this->noTags; + } + /** + * GitClient from VersionControl_Git + */ + protected $client = \null; + /** + * The main entry point + */ + public function main() + { + $repo = $this->getRepository(); + if (empty($repo)) { + throw new \BuildException('"repository" is a required parameter'); + } + $remote = $this->getRemote(); + if (empty($remote)) { + throw new \BuildException('"remote" is a required parameter'); + } + \chdir($repo); + $this->client = $this->getGitClient(\false, $repo); + // initalized yet? + if (!\is_dir('.subsplit')) { + $this->subsplitInit(); + } else { + // update + $this->subsplitUpdate(); + } + // find all splits based on heads requested + $this->findSplits(); + // check that GitHub has the repos + $this->verifyRepos(); + // execute the subsplits + $this->publish(); + } + public function publish() + { + $this->log('DRY RUN ONLY FOR NOW'); + $base = $this->getBase(); + $base = \rtrim($base, '/') . '/'; + $org = $this->getOwningTarget()->getProject()->getProperty('github.org'); + $splits = array(); + $heads = $this->getHeads(); + foreach ($heads as $head) { + foreach ($this->splits[$head] as $component => $meta) { + $splits[] = $base . $component . ':git@github.com:' . $org . '/' . $meta['repo']; + } + $cmd = 'git subsplit publish '; + $cmd .= \escapeshellarg(\implode(' ', $splits)); + if ($this->getNoHeads()) { + $cmd .= ' --no-heads'; + } else { + $cmd .= ' --heads=' . $head; + } + if ($this->getNoTags()) { + $cmd .= ' --no-tags'; + } else { + if ($this->getTags()) { + $cmd .= ' --tags=' . \escapeshellarg(\implode(' ', $this->getTags())); + } + } + \passthru($cmd); + } + } + /** + * Runs `git subsplit update` + */ + public function subsplitUpdate() + { + $repo = $this->getRepository(); + $this->log('git-subsplit update...'); + $cmd = $this->client->getCommand('subsplit'); + $cmd->addArgument('update'); + try { + $cmd->execute(); + } catch (Exception $e) { + throw new \BuildException('git subsplit update failed' . $e); + } + \chdir($repo . '/.subsplit'); + \passthru('php ../composer.phar update --dev'); + \chdir($repo); + } + /** + * Runs `git subsplit init` based on the remote repository. + */ + public function subsplitInit() + { + $remote = $this->getRemote(); + $cmd = $this->client->getCommand('subsplit'); + $this->log('running git-subsplit init ' . $remote); + $cmd->setArguments(array('init', $remote)); + try { + $output = $cmd->execute(); + } catch (Exception $e) { + throw new \BuildException('git subsplit init failed' . $e); + } + $this->log(\trim($output), \Project::MSG_INFO); + $repo = $this->getRepository(); + \chdir($repo . '/.subsplit'); + \passthru('php ../composer.phar install --dev'); + \chdir($repo); + } + /** + * Find the composer.json files using Phing's directory scanner + * + * @return array + */ + protected function findSplits() + { + $this->log("checking heads for subsplits"); + $repo = $this->getRepository(); + $base = $this->getBase(); + $splits = array(); + $heads = $this->getHeads(); + if (!empty($base)) { + $base = '/' . \ltrim($base, '/'); + } else { + $base = '/'; + } + \chdir($repo . '/.subsplit'); + foreach ($heads as $head) { + $splits[$head] = array(); + // check each head requested *BEFORE* the actual subtree split command gets it + \passthru("git checkout '{$head}'"); + $ds = new \DirectoryScanner(); + $ds->setBasedir($repo . '/.subsplit' . $base); + $ds->setIncludes(array('**/' . $this->subIndicatorFile)); + $ds->scan(); + $files = $ds->getIncludedFiles(); + // Process the files we found + foreach ($files as $file) { + $pkg = \file_get_contents($repo . '/.subsplit' . $base . '/' . $file); + $pkg_json = \json_decode($pkg, \true); + $name = $pkg_json['name']; + $component = \str_replace('/composer.json', '', $file); + // keep this for split cmd + $tmpreponame = \explode('/', $name); + $reponame = $tmpreponame[1]; + $splits[$head][$component]['repo'] = $reponame; + $nscomponent = \str_replace('/', '\\', $component); + $splits[$head][$component]['desc'] = "[READ ONLY] Subtree split of {$nscomponent}: " . $pkg_json['description']; + } + } + // go back to how we found it + \passthru("git checkout master"); + \chdir($repo); + $this->splits = $splits; + } + /** + * Based on list of repositories we determined we *should* have, talk + * to GitHub and make sure they're all there. + * + */ + protected function verifyRepos() + { + $this->log('verifying GitHub target repos'); + $github_org = $this->getOwningTarget()->getProject()->getProperty('github.org'); + $github_creds = $this->getOwningTarget()->getProject()->getProperty('github.basicauth'); + if ($github_creds == 'username:password') { + $this->log('Skipping GitHub repo checks. Update github.basicauth in build.properties to verify repos.', 1); + return; + } + $ch = \curl_init('https://api.github.com/orgs/' . $github_org . '/repos?type=all'); + \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, 1); + \curl_setopt($ch, \CURLOPT_USERPWD, $github_creds); + // change this when we know we can use our bundled CA bundle! + \curl_setopt($ch, \CURLOPT_SSL_VERIFYPEER, \false); + $result = \curl_exec($ch); + \curl_close($ch); + $repos = \json_decode($result, \true); + $existing_repos = array(); + // parse out the repos we found on GitHub + foreach ($repos as $repo) { + $tmpreponame = \explode('/', $repo['full_name']); + $reponame = $tmpreponame[1]; + $existing_repos[$reponame] = $repo['description']; + } + $heads = $this->getHeads(); + foreach ($heads as $head) { + foreach ($this->splits[$head] as $component => $meta) { + $reponame = $meta['repo']; + if (!isset($existing_repos[$reponame])) { + $this->log("Creating missing repo {$reponame}"); + $payload = array('name' => $reponame, 'description' => $meta['desc'], 'homepage' => 'http://www.guzzlephp.org/', 'private' => \true, 'has_issues' => \false, 'has_wiki' => \false, 'has_downloads' => \true, 'auto_init' => \false); + $ch = \curl_init('https://api.github.com/orgs/' . $github_org . '/repos'); + \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, 1); + \curl_setopt($ch, \CURLOPT_USERPWD, $github_creds); + \curl_setopt($ch, \CURLOPT_HTTPHEADER, array('Content-Type: application/json')); + \curl_setopt($ch, \CURLOPT_POST, 1); + \curl_setopt($ch, \CURLOPT_POSTFIELDS, \json_encode($payload)); + // change this when we know we can use our bundled CA bundle! + \curl_setopt($ch, \CURLOPT_SSL_VERIFYPEER, \false); + $result = \curl_exec($ch); + echo "Response code: " . \curl_getinfo($ch, \CURLINFO_HTTP_CODE) . "\n"; + \curl_close($ch); + } else { + $this->log("Repo {$reponame} exists", 2); + } + } + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/phpunit.xml.dist b/vendor/Aws2/guzzle/guzzle/phpunit.xml.dist new file mode 100644 index 00000000..208fdc08 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/phpunit.xml.dist @@ -0,0 +1,48 @@ + + + + + + ./tests/Guzzle/Tests + + + + + + + + + + ./src/Guzzle + + ./src/Guzzle + ./src/Guzzle/Common/Exception/GuzzleException.php + ./src/Guzzle/Http/Exception/HttpException.php + ./src/Guzzle/Http/Exception/ServerErrorResponseException.php + ./src/Guzzle/Http/Exception/ClientErrorResponseException.php + ./src/Guzzle/Http/Exception/TooManyRedirectsException.php + ./src/Guzzle/Http/Exception/CouldNotRewindStreamException.php + ./src/Guzzle/Common/Exception/BadMethodCallException.php + ./src/Guzzle/Common/Exception/InvalidArgumentException.php + ./src/Guzzle/Common/Exception/RuntimeException.php + ./src/Guzzle/Common/Exception/UnexpectedValueException.php + ./src/Guzzle/Service/Exception/ClientNotFoundException.php + ./src/Guzzle/Service/Exception/CommandException.php + ./src/Guzzle/Service/Exception/DescriptionBuilderException.php + ./src/Guzzle/Service/Exception/ServiceBuilderException.php + ./src/Guzzle/Service/Exception/ServiceNotFoundException.php + ./src/Guzzle/Service/Exception/ValidationException.php + ./src/Guzzle/Service/Exception/JsonException.php + + + + + diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/AbstractBatchDecorator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/AbstractBatchDecorator.php new file mode 100644 index 00000000..45b70ce6 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/AbstractBatchDecorator.php @@ -0,0 +1,58 @@ +decoratedBatch = $decoratedBatch; + } + /** + * Allow decorators to implement custom methods + * + * @param string $method Missing method name + * @param array $args Method arguments + * + * @return mixed + * @codeCoverageIgnore + */ + public function __call($method, array $args) + { + return call_user_func_array(array($this->decoratedBatch, $method), $args); + } + public function add($item) + { + $this->decoratedBatch->add($item); + return $this; + } + public function flush() + { + return $this->decoratedBatch->flush(); + } + public function isEmpty() + { + return $this->decoratedBatch->isEmpty(); + } + /** + * Trace the decorators associated with the batch + * + * @return array + */ + public function getDecorators() + { + $found = array($this); + if (method_exists($this->decoratedBatch, 'getDecorators')) { + $found = array_merge($found, $this->decoratedBatch->getDecorators()); + } + return $found; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/Batch.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/Batch.php new file mode 100644 index 00000000..3c62aabc --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/Batch.php @@ -0,0 +1,80 @@ +transferStrategy = $transferStrategy; + $this->divisionStrategy = $divisionStrategy; + $this->queue = new \SplQueue(); + $this->queue->setIteratorMode(\SplQueue::IT_MODE_DELETE); + $this->dividedBatches = array(); + } + public function add($item) + { + $this->queue->enqueue($item); + return $this; + } + public function flush() + { + $this->createBatches(); + $items = array(); + foreach ($this->dividedBatches as $batchIndex => $dividedBatch) { + while ($dividedBatch->valid()) { + $batch = $dividedBatch->current(); + $dividedBatch->next(); + try { + $this->transferStrategy->transfer($batch); + $items = array_merge($items, $batch); + } catch (\Exception $e) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\Exception\BatchTransferException($batch, $items, $e, $this->transferStrategy, $this->divisionStrategy); + } + } + // Keep the divided batch down to a minimum in case of a later exception + unset($this->dividedBatches[$batchIndex]); + } + return $items; + } + public function isEmpty() + { + return count($this->queue) == 0 && count($this->dividedBatches) == 0; + } + /** + * Create batches for any queued items + */ + protected function createBatches() + { + if (count($this->queue)) { + if ($batches = $this->divisionStrategy->createBatches($this->queue)) { + // Convert arrays into iterators + if (is_array($batches)) { + $batches = new \ArrayIterator($batches); + } + $this->dividedBatches[] = $batches; + } + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchBuilder.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchBuilder.php new file mode 100644 index 00000000..1117c2de --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchBuilder.php @@ -0,0 +1,164 @@ + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchRequestTransfer', 'command' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchCommandTransfer'); + /** + * Create a new instance of the BatchBuilder + * + * @return BatchBuilder + */ + public static function factory() + { + return new self(); + } + /** + * Automatically flush the batch when the size of the queue reaches a certain threshold. Adds {@see FlushingBatch}. + * + * @param $threshold Number of items to allow in the queue before a flush + * + * @return BatchBuilder + */ + public function autoFlushAt($threshold) + { + $this->autoFlush = $threshold; + return $this; + } + /** + * Maintain a history of all items that have been transferred using the batch. Adds {@see HistoryBatch}. + * + * @return BatchBuilder + */ + public function keepHistory() + { + $this->history = true; + return $this; + } + /** + * Buffer exceptions thrown during transfer so that you can transfer as much as possible, and after a transfer + * completes, inspect each exception that was thrown. Enables the {@see ExceptionBufferingBatch} decorator. + * + * @return BatchBuilder + */ + public function bufferExceptions() + { + $this->exceptionBuffering = true; + return $this; + } + /** + * Notify a callable each time a batch flush completes. Enables the {@see NotifyingBatch} decorator. + * + * @param mixed $callable Callable function to notify + * + * @return BatchBuilder + * @throws InvalidArgumentException if the argument is not callable + */ + public function notify($callable) + { + $this->afterFlush = $callable; + return $this; + } + /** + * Configures the batch to transfer batches of requests. Associates a {@see \Guzzle\Http\BatchRequestTransfer} + * object as both the transfer and divisor strategy. + * + * @param int $batchSize Batch size for each batch of requests + * + * @return BatchBuilder + */ + public function transferRequests($batchSize = 50) + { + $className = self::$mapping['request']; + $this->transferStrategy = new $className($batchSize); + $this->divisorStrategy = $this->transferStrategy; + return $this; + } + /** + * Configures the batch to transfer batches commands. Associates as + * {@see \Guzzle\Service\Command\BatchCommandTransfer} as both the transfer and divisor strategy. + * + * @param int $batchSize Batch size for each batch of commands + * + * @return BatchBuilder + */ + public function transferCommands($batchSize = 50) + { + $className = self::$mapping['command']; + $this->transferStrategy = new $className($batchSize); + $this->divisorStrategy = $this->transferStrategy; + return $this; + } + /** + * Specify the strategy used to divide the queue into an array of batches + * + * @param BatchDivisorInterface $divisorStrategy Strategy used to divide a batch queue into batches + * + * @return BatchBuilder + */ + public function createBatchesWith(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\BatchDivisorInterface $divisorStrategy) + { + $this->divisorStrategy = $divisorStrategy; + return $this; + } + /** + * Specify the strategy used to transport the items when flush is called + * + * @param BatchTransferInterface $transferStrategy How items are transferred + * + * @return BatchBuilder + */ + public function transferWith(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\BatchTransferInterface $transferStrategy) + { + $this->transferStrategy = $transferStrategy; + return $this; + } + /** + * Create and return the instantiated batch + * + * @return BatchInterface + * @throws RuntimeException if no transfer strategy has been specified + */ + public function build() + { + if (!$this->transferStrategy) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException('No transfer strategy has been specified'); + } + if (!$this->divisorStrategy) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException('No divisor strategy has been specified'); + } + $batch = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\Batch($this->transferStrategy, $this->divisorStrategy); + if ($this->exceptionBuffering) { + $batch = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\ExceptionBufferingBatch($batch); + } + if ($this->afterFlush) { + $batch = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\NotifyingBatch($batch, $this->afterFlush); + } + if ($this->autoFlush) { + $batch = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\FlushingBatch($batch, $this->autoFlush); + } + if ($this->history) { + $batch = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\HistoryBatch($batch); + } + return $batch; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchClosureDivisor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchClosureDivisor.php new file mode 100644 index 00000000..876c20bc --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchClosureDivisor.php @@ -0,0 +1,34 @@ +callable = $callable; + $this->context = $context; + } + public function createBatches(\SplQueue $queue) + { + return call_user_func($this->callable, $queue, $this->context); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchClosureTransfer.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchClosureTransfer.php new file mode 100644 index 00000000..7a08ae8f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchClosureTransfer.php @@ -0,0 +1,35 @@ +callable = $callable; + $this->context = $context; + } + public function transfer(array $batch) + { + return empty($batch) ? null : call_user_func($this->callable, $batch, $this->context); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchCommandTransfer.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchCommandTransfer.php new file mode 100644 index 00000000..05b28dd6 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchCommandTransfer.php @@ -0,0 +1,65 @@ +batchSize = $batchSize; + } + /** + * Creates batches by grouping commands by their associated client + * {@inheritdoc} + */ + public function createBatches(\SplQueue $queue) + { + $groups = new \SplObjectStorage(); + foreach ($queue as $item) { + if (!$item instanceof CommandInterface) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('All items must implement Guzzle\\Service\\Command\\CommandInterface'); + } + $client = $item->getClient(); + if (!$groups->contains($client)) { + $groups->attach($client, new \ArrayObject(array($item))); + } else { + $groups[$client]->append($item); + } + } + $batches = array(); + foreach ($groups as $batch) { + $batches = array_merge($batches, array_chunk($groups[$batch]->getArrayCopy(), $this->batchSize)); + } + return $batches; + } + public function transfer(array $batch) + { + if (empty($batch)) { + return; + } + // Get the client of the first found command + $client = reset($batch)->getClient(); + // Keep a list of all commands with invalid clients + $invalid = array_filter($batch, function ($command) use($client) { + return $command->getClient() !== $client; + }); + if (!empty($invalid)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Exception\InconsistentClientTransferException($invalid); + } + $client->execute($batch); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchDivisorInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchDivisorInterface.php new file mode 100644 index 00000000..0b15fb74 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchDivisorInterface.php @@ -0,0 +1,18 @@ +batchSize = $batchSize; + } + /** + * Creates batches of requests by grouping requests by their associated curl multi object. + * {@inheritdoc} + */ + public function createBatches(\SplQueue $queue) + { + // Create batches by client objects + $groups = new \SplObjectStorage(); + foreach ($queue as $item) { + if (!$item instanceof RequestInterface) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('All items must implement Guzzle\\Http\\Message\\RequestInterface'); + } + $client = $item->getClient(); + if (!$groups->contains($client)) { + $groups->attach($client, array($item)); + } else { + $current = $groups[$client]; + $current[] = $item; + $groups[$client] = $current; + } + } + $batches = array(); + foreach ($groups as $batch) { + $batches = array_merge($batches, array_chunk($groups[$batch], $this->batchSize)); + } + return $batches; + } + public function transfer(array $batch) + { + if ($batch) { + reset($batch)->getClient()->send($batch); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchSizeDivisor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchSizeDivisor.php new file mode 100644 index 00000000..12ee7e70 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchSizeDivisor.php @@ -0,0 +1,42 @@ +size = $size; + } + /** + * Set the size of each batch + * + * @param int $size Size of each batch + * + * @return BatchSizeDivisor + */ + public function setSize($size) + { + $this->size = $size; + return $this; + } + /** + * Get the size of each batch + * + * @return int + */ + public function getSize() + { + return $this->size; + } + public function createBatches(\SplQueue $queue) + { + return array_chunk(iterator_to_array($queue, false), $this->size); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchTransferInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchTransferInterface.php new file mode 100644 index 00000000..2541c760 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/BatchTransferInterface.php @@ -0,0 +1,16 @@ +batch = $batch; + $this->transferredItems = $transferredItems; + $this->transferStrategy = $transferStrategy; + $this->divisorStrategy = $divisorStrategy; + parent::__construct('Exception encountered while transferring batch: ' . $exception->getMessage(), $exception->getCode(), $exception); + } + /** + * Get the batch that we being sent when the exception occurred + * + * @return array + */ + public function getBatch() + { + return $this->batch; + } + /** + * Get the items transferred at the point in which the exception was encountered + * + * @return array + */ + public function getTransferredItems() + { + return $this->transferredItems; + } + /** + * Get the transfer strategy + * + * @return TransferStrategy + */ + public function getTransferStrategy() + { + return $this->transferStrategy; + } + /** + * Get the divisor strategy + * + * @return DivisorStrategy + */ + public function getDivisorStrategy() + { + return $this->divisorStrategy; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/ExceptionBufferingBatch.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/ExceptionBufferingBatch.php new file mode 100644 index 00000000..fe6cea3b --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/ExceptionBufferingBatch.php @@ -0,0 +1,44 @@ +decoratedBatch->isEmpty()) { + try { + $transferredItems = $this->decoratedBatch->flush(); + } catch (BatchTransferException $e) { + $this->exceptions[] = $e; + $transferredItems = $e->getTransferredItems(); + } + $items = array_merge($items, $transferredItems); + } + return $items; + } + /** + * Get the buffered exceptions + * + * @return array Array of BatchTransferException objects + */ + public function getExceptions() + { + return $this->exceptions; + } + /** + * Clear the buffered exceptions + */ + public function clearExceptions() + { + $this->exceptions = array(); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/FlushingBatch.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/FlushingBatch.php new file mode 100644 index 00000000..d916dfec --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/FlushingBatch.php @@ -0,0 +1,53 @@ +threshold = $threshold; + parent::__construct($decoratedBatch); + } + /** + * Set the auto-flush threshold + * + * @param int $threshold The auto-flush threshold + * + * @return FlushingBatch + */ + public function setThreshold($threshold) + { + $this->threshold = $threshold; + return $this; + } + /** + * Get the auto-flush threshold + * + * @return int + */ + public function getThreshold() + { + return $this->threshold; + } + public function add($item) + { + $this->decoratedBatch->add($item); + if (++$this->currentTotal >= $this->threshold) { + $this->currentTotal = 0; + $this->decoratedBatch->flush(); + } + return $this; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/HistoryBatch.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/HistoryBatch.php new file mode 100644 index 00000000..4b949e71 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/HistoryBatch.php @@ -0,0 +1,35 @@ +history[] = $item; + $this->decoratedBatch->add($item); + return $this; + } + /** + * Get the batch history + * + * @return array + */ + public function getHistory() + { + return $this->history; + } + /** + * Clear the batch history + */ + public function clearHistory() + { + $this->history = array(); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/NotifyingBatch.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/NotifyingBatch.php new file mode 100644 index 00000000..a8ac10cb --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/NotifyingBatch.php @@ -0,0 +1,33 @@ +callable = $callable; + parent::__construct($decoratedBatch); + } + public function flush() + { + $items = $this->decoratedBatch->flush(); + call_user_func($this->callable, $items); + return $items; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/composer.json new file mode 100644 index 00000000..cec41b94 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Batch/composer.json @@ -0,0 +1,38 @@ +{ + "name": "guzzle\/batch", + "description": "Guzzle batch component for batching requests, commands, or custom transfers", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "batch", + "HTTP", + "REST", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/common": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Batch": "" + } + }, + "suggest": { + "guzzle\/http": "self.version", + "guzzle\/service": "self.version" + }, + "target-dir": "Guzzle\/Batch", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/AbstractCacheAdapter.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/AbstractCacheAdapter.php new file mode 100644 index 00000000..22421137 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/AbstractCacheAdapter.php @@ -0,0 +1,20 @@ +cache; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterFactory.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterFactory.php new file mode 100644 index 00000000..0bf7ca5f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterFactory.php @@ -0,0 +1,110 @@ +newInstanceArgs($args); + } + } catch (\Exception $e) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException($e->getMessage(), $e->getCode(), $e); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterInterface.php new file mode 100644 index 00000000..0347b1f9 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterInterface.php @@ -0,0 +1,52 @@ +callables = $callables; + } + public function contains($id, array $options = null) + { + return call_user_func($this->callables['contains'], $id, $options); + } + public function delete($id, array $options = null) + { + return call_user_func($this->callables['delete'], $id, $options); + } + public function fetch($id, array $options = null) + { + return call_user_func($this->callables['fetch'], $id, $options); + } + public function save($id, $data, $lifeTime = false, array $options = null) + { + return call_user_func($this->callables['save'], $id, $data, $lifeTime, $options); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/DoctrineCacheAdapter.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/DoctrineCacheAdapter.php new file mode 100644 index 00000000..93da598a --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/DoctrineCacheAdapter.php @@ -0,0 +1,36 @@ +cache = $cache; + } + public function contains($id, array $options = null) + { + return $this->cache->contains($id); + } + public function delete($id, array $options = null) + { + return $this->cache->delete($id); + } + public function fetch($id, array $options = null) + { + return $this->cache->fetch($id); + } + public function save($id, $data, $lifeTime = false, array $options = null) + { + return $this->cache->save($id, $data, $lifeTime !== false ? $lifeTime : 0); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/NullCacheAdapter.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/NullCacheAdapter.php new file mode 100644 index 00000000..ee65f51a --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/NullCacheAdapter.php @@ -0,0 +1,29 @@ +cache = $cache; + } + public function contains($id, array $options = null) + { + return $this->cache->test($id); + } + public function delete($id, array $options = null) + { + return $this->cache->remove($id); + } + public function fetch($id, array $options = null) + { + return $this->cache->load($id); + } + public function save($id, $data, $lifeTime = false, array $options = null) + { + return $this->cache->save($data, $id, array(), $lifeTime); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/Zf2CacheAdapter.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/Zf2CacheAdapter.php new file mode 100644 index 00000000..ddb3462b --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/Zf2CacheAdapter.php @@ -0,0 +1,36 @@ +cache = $cache; + } + public function contains($id, array $options = null) + { + return $this->cache->hasItem($id); + } + public function delete($id, array $options = null) + { + return $this->cache->removeItem($id); + } + public function fetch($id, array $options = null) + { + return $this->cache->getItem($id); + } + public function save($id, $data, $lifeTime = false, array $options = null) + { + return $this->cache->setItem($id, $data); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/composer.json new file mode 100644 index 00000000..64f32fe8 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Cache/composer.json @@ -0,0 +1,35 @@ +{ + "name": "guzzle\/cache", + "description": "Guzzle cache adapter component", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "cache", + "adapter", + "zf", + "doctrine", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/common": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Cache": "" + } + }, + "target-dir": "Guzzle\/Cache", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/AbstractHasDispatcher.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/AbstractHasDispatcher.php new file mode 100644 index 00000000..c9de60c9 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/AbstractHasDispatcher.php @@ -0,0 +1,40 @@ +eventDispatcher = $eventDispatcher; + return $this; + } + public function getEventDispatcher() + { + if (!$this->eventDispatcher) { + $this->eventDispatcher = new \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcher(); + } + return $this->eventDispatcher; + } + public function dispatch($eventName, array $context = array()) + { + return $this->getEventDispatcher()->dispatch($eventName, new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event($context)); + } + public function addSubscriber(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface $subscriber) + { + $this->getEventDispatcher()->addSubscriber($subscriber); + return $this; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/Collection.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/Collection.php new file mode 100644 index 00000000..30bc5038 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/Collection.php @@ -0,0 +1,359 @@ +data = $data; + } + /** + * Create a new collection from an array, validate the keys, and add default values where missing + * + * @param array $config Configuration values to apply. + * @param array $defaults Default parameters + * @param array $required Required parameter names + * + * @return self + * @throws InvalidArgumentException if a parameter is missing + */ + public static function fromConfig(array $config = array(), array $defaults = array(), array $required = array()) + { + $data = $config + $defaults; + if ($missing = array_diff($required, array_keys($data))) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Config is missing the following keys: ' . implode(', ', $missing)); + } + return new self($data); + } + public function count() + { + return count($this->data); + } + public function getIterator() + { + return new \ArrayIterator($this->data); + } + public function toArray() + { + return $this->data; + } + /** + * Removes all key value pairs + * + * @return Collection + */ + public function clear() + { + $this->data = array(); + return $this; + } + /** + * Get all or a subset of matching key value pairs + * + * @param array $keys Pass an array of keys to retrieve only a subset of key value pairs + * + * @return array Returns an array of all matching key value pairs + */ + public function getAll(array $keys = null) + { + return $keys ? array_intersect_key($this->data, array_flip($keys)) : $this->data; + } + /** + * Get a specific key value. + * + * @param string $key Key to retrieve. + * + * @return mixed|null Value of the key or NULL + */ + public function get($key) + { + return isset($this->data[$key]) ? $this->data[$key] : null; + } + /** + * Set a key value pair + * + * @param string $key Key to set + * @param mixed $value Value to set + * + * @return Collection Returns a reference to the object + */ + public function set($key, $value) + { + $this->data[$key] = $value; + return $this; + } + /** + * Add a value to a key. If a key of the same name has already been added, the key value will be converted into an + * array and the new value will be pushed to the end of the array. + * + * @param string $key Key to add + * @param mixed $value Value to add to the key + * + * @return Collection Returns a reference to the object. + */ + public function add($key, $value) + { + if (!array_key_exists($key, $this->data)) { + $this->data[$key] = $value; + } elseif (is_array($this->data[$key])) { + $this->data[$key][] = $value; + } else { + $this->data[$key] = array($this->data[$key], $value); + } + return $this; + } + /** + * Remove a specific key value pair + * + * @param string $key A key to remove + * + * @return Collection + */ + public function remove($key) + { + unset($this->data[$key]); + return $this; + } + /** + * Get all keys in the collection + * + * @return array + */ + public function getKeys() + { + return array_keys($this->data); + } + /** + * Returns whether or not the specified key is present. + * + * @param string $key The key for which to check the existence. + * + * @return bool + */ + public function hasKey($key) + { + return array_key_exists($key, $this->data); + } + /** + * Case insensitive search the keys in the collection + * + * @param string $key Key to search for + * + * @return bool|string Returns false if not found, otherwise returns the key + */ + public function keySearch($key) + { + foreach (array_keys($this->data) as $k) { + if (!strcasecmp($k, $key)) { + return $k; + } + } + return false; + } + /** + * Checks if any keys contains a certain value + * + * @param string $value Value to search for + * + * @return mixed Returns the key if the value was found FALSE if the value was not found. + */ + public function hasValue($value) + { + return array_search($value, $this->data); + } + /** + * Replace the data of the object with the value of an array + * + * @param array $data Associative array of data + * + * @return Collection Returns a reference to the object + */ + public function replace(array $data) + { + $this->data = $data; + return $this; + } + /** + * Add and merge in a Collection or array of key value pair data. + * + * @param Collection|array $data Associative array of key value pair data + * + * @return Collection Returns a reference to the object. + */ + public function merge($data) + { + foreach ($data as $key => $value) { + $this->add($key, $value); + } + return $this; + } + /** + * Over write key value pairs in this collection with all of the data from an array or collection. + * + * @param array|\Traversable $data Values to override over this config + * + * @return self + */ + public function overwriteWith($data) + { + if (is_array($data)) { + $this->data = $data + $this->data; + } elseif ($data instanceof Collection) { + $this->data = $data->toArray() + $this->data; + } else { + foreach ($data as $key => $value) { + $this->data[$key] = $value; + } + } + return $this; + } + /** + * Returns a Collection containing all the elements of the collection after applying the callback function to each + * one. The Closure should accept three parameters: (string) $key, (string) $value, (array) $context and return a + * modified value + * + * @param \Closure $closure Closure to apply + * @param array $context Context to pass to the closure + * @param bool $static Set to TRUE to use the same class as the return rather than returning a Collection + * + * @return Collection + */ + public function map(\Closure $closure, array $context = array(), $static = true) + { + $collection = $static ? new static() : new self(); + foreach ($this as $key => $value) { + $collection->add($key, $closure($key, $value, $context)); + } + return $collection; + } + /** + * Iterates over each key value pair in the collection passing them to the Closure. If the Closure function returns + * true, the current value from input is returned into the result Collection. The Closure must accept three + * parameters: (string) $key, (string) $value and return Boolean TRUE or FALSE for each value. + * + * @param \Closure $closure Closure evaluation function + * @param bool $static Set to TRUE to use the same class as the return rather than returning a Collection + * + * @return Collection + */ + public function filter(\Closure $closure, $static = true) + { + $collection = $static ? new static() : new self(); + foreach ($this->data as $key => $value) { + if ($closure($key, $value)) { + $collection->add($key, $value); + } + } + return $collection; + } + public function offsetExists($offset) + { + return isset($this->data[$offset]); + } + public function offsetGet($offset) + { + return isset($this->data[$offset]) ? $this->data[$offset] : null; + } + public function offsetSet($offset, $value) + { + $this->data[$offset] = $value; + } + public function offsetUnset($offset) + { + unset($this->data[$offset]); + } + /** + * Set a value into a nested array key. Keys will be created as needed to set the value. + * + * @param string $path Path to set + * @param mixed $value Value to set at the key + * + * @return self + * @throws RuntimeException when trying to setPath using a nested path that travels through a scalar value + */ + public function setPath($path, $value) + { + $current =& $this->data; + $queue = explode('/', $path); + while (null !== ($key = array_shift($queue))) { + if (!is_array($current)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException("Trying to setPath {$path}, but {$key} is set and is not an array"); + } elseif (!$queue) { + $current[$key] = $value; + } elseif (isset($current[$key])) { + $current =& $current[$key]; + } else { + $current[$key] = array(); + $current =& $current[$key]; + } + } + return $this; + } + /** + * Gets a value from the collection using an array path (e.g. foo/baz/bar would retrieve bar from two nested arrays) + * Allows for wildcard searches which recursively combine matches up to the level at which the wildcard occurs. This + * can be useful for accepting any key of a sub-array and combining matching keys from each diverging path. + * + * @param string $path Path to traverse and retrieve a value from + * @param string $separator Character used to add depth to the search + * @param mixed $data Optional data to descend into (used when wildcards are encountered) + * + * @return mixed|null + */ + public function getPath($path, $separator = '/', $data = null) + { + if ($data === null) { + $data =& $this->data; + } + $path = is_array($path) ? $path : explode($separator, $path); + while (null !== ($part = array_shift($path))) { + if (!is_array($data)) { + return null; + } elseif (isset($data[$part])) { + $data =& $data[$part]; + } elseif ($part != '*') { + return null; + } else { + // Perform a wildcard search by diverging and merging paths + $result = array(); + foreach ($data as $value) { + if (!$path) { + $result = array_merge_recursive($result, (array) $value); + } elseif (null !== ($test = $this->getPath($path, $separator, $value))) { + $result = array_merge_recursive($result, (array) $test); + } + } + return $result; + } + } + return $data; + } + /** + * Inject configuration settings into an input string + * + * @param string $input Input to inject + * + * @return string + * @deprecated + */ + public function inject($input) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated'); + $replace = array(); + foreach ($this->data as $key => $val) { + $replace['{' . $key . '}'] = $val; + } + return strtr($input, $replace); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/Event.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/Event.php new file mode 100644 index 00000000..2bfda704 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/Event.php @@ -0,0 +1,44 @@ +context = $context; + } + public function getIterator() + { + return new \ArrayIterator($this->context); + } + public function offsetGet($offset) + { + return isset($this->context[$offset]) ? $this->context[$offset] : null; + } + public function offsetSet($offset, $value) + { + $this->context[$offset] = $value; + } + public function offsetExists($offset) + { + return isset($this->context[$offset]); + } + public function offsetUnset($offset) + { + unset($this->context[$offset]); + } + public function toArray() + { + return $this->context; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/Exception/BadMethodCallException.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/Exception/BadMethodCallException.php new file mode 100644 index 00000000..38e8504b --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/Exception/BadMethodCallException.php @@ -0,0 +1,7 @@ +shortMessage = $message; + } + /** + * Set all of the exceptions + * + * @param array $exceptions Array of exceptions + * + * @return self + */ + public function setExceptions(array $exceptions) + { + $this->exceptions = array(); + foreach ($exceptions as $exception) { + $this->add($exception); + } + return $this; + } + /** + * Add exceptions to the collection + * + * @param ExceptionCollection|\Exception $e Exception to add + * + * @return ExceptionCollection; + */ + public function add($e) + { + $this->exceptions[] = $e; + if ($this->message) { + $this->message .= "\n"; + } + $this->message .= $this->getExceptionMessage($e, 0); + return $this; + } + /** + * Get the total number of request exceptions + * + * @return int + */ + public function count() + { + return count($this->exceptions); + } + /** + * Allows array-like iteration over the request exceptions + * + * @return \ArrayIterator + */ + public function getIterator() + { + return new \ArrayIterator($this->exceptions); + } + /** + * Get the first exception in the collection + * + * @return \Exception + */ + public function getFirst() + { + return $this->exceptions ? $this->exceptions[0] : null; + } + private function getExceptionMessage(\Exception $e, $depth = 0) + { + static $sp = ' '; + $prefix = $depth ? str_repeat($sp, $depth) : ''; + $message = "{$prefix}(" . get_class($e) . ') ' . $e->getFile() . ' line ' . $e->getLine() . "\n"; + if ($e instanceof self) { + if ($e->shortMessage) { + $message .= "\n{$prefix}{$sp}" . str_replace("\n", "\n{$prefix}{$sp}", $e->shortMessage) . "\n"; + } + foreach ($e as $ee) { + $message .= "\n" . $this->getExceptionMessage($ee, $depth + 1); + } + } else { + $message .= "\n{$prefix}{$sp}" . str_replace("\n", "\n{$prefix}{$sp}", $e->getMessage()) . "\n"; + $message .= "\n{$prefix}{$sp}" . str_replace("\n", "\n{$prefix}{$sp}", $e->getTraceAsString()) . "\n"; + } + return str_replace(getcwd(), '.', $message); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/Exception/GuzzleException.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/Exception/GuzzleException.php new file mode 100644 index 00000000..b5a1ec2c --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Common/Exception/GuzzleException.php @@ -0,0 +1,10 @@ +=5.3.2", + "symfony\/event-dispatcher": ">=2.1" + }, + "autoload": { + "psr-0": { + "Guzzle\\Common": "" + } + }, + "target-dir": "Guzzle\/Common", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/AbstractEntityBodyDecorator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/AbstractEntityBodyDecorator.php new file mode 100644 index 00000000..a53ef3e8 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/AbstractEntityBodyDecorator.php @@ -0,0 +1,178 @@ +body = $body; + } + public function __toString() + { + return (string) $this->body; + } + /** + * Allow decorators to implement custom methods + * + * @param string $method Missing method name + * @param array $args Method arguments + * + * @return mixed + */ + public function __call($method, array $args) + { + return call_user_func_array(array($this->body, $method), $args); + } + public function close() + { + return $this->body->close(); + } + public function setRewindFunction($callable) + { + $this->body->setRewindFunction($callable); + return $this; + } + public function rewind() + { + return $this->body->rewind(); + } + public function compress($filter = 'zlib.deflate') + { + return $this->body->compress($filter); + } + public function uncompress($filter = 'zlib.inflate') + { + return $this->body->uncompress($filter); + } + public function getContentLength() + { + return $this->getSize(); + } + public function getContentType() + { + return $this->body->getContentType(); + } + public function getContentMd5($rawOutput = false, $base64Encode = false) + { + $hash = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Stream\Stream::getHash($this, 'md5', $rawOutput); + return $hash && $base64Encode ? base64_encode($hash) : $hash; + } + public function getContentEncoding() + { + return $this->body->getContentEncoding(); + } + public function getMetaData($key = null) + { + return $this->body->getMetaData($key); + } + public function getStream() + { + return $this->body->getStream(); + } + public function setStream($stream, $size = 0) + { + $this->body->setStream($stream, $size); + return $this; + } + public function detachStream() + { + $this->body->detachStream(); + return $this; + } + public function getWrapper() + { + return $this->body->getWrapper(); + } + public function getWrapperData() + { + return $this->body->getWrapperData(); + } + public function getStreamType() + { + return $this->body->getStreamType(); + } + public function getUri() + { + return $this->body->getUri(); + } + public function getSize() + { + return $this->body->getSize(); + } + public function isReadable() + { + return $this->body->isReadable(); + } + public function isRepeatable() + { + return $this->isSeekable() && $this->isReadable(); + } + public function isWritable() + { + return $this->body->isWritable(); + } + public function isConsumed() + { + return $this->body->isConsumed(); + } + /** + * Alias of isConsumed() + * {@inheritdoc} + */ + public function feof() + { + return $this->isConsumed(); + } + public function isLocal() + { + return $this->body->isLocal(); + } + public function isSeekable() + { + return $this->body->isSeekable(); + } + public function setSize($size) + { + $this->body->setSize($size); + return $this; + } + public function seek($offset, $whence = SEEK_SET) + { + return $this->body->seek($offset, $whence); + } + public function read($length) + { + return $this->body->read($length); + } + public function write($string) + { + return $this->body->write($string); + } + public function readLine($maxLength = null) + { + return $this->body->readLine($maxLength); + } + public function ftell() + { + return $this->body->ftell(); + } + public function getCustomData($key) + { + return $this->body->getCustomData($key); + } + public function setCustomData($key, $value) + { + $this->body->setCustomData($key, $value); + return $this; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/CachingEntityBody.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/CachingEntityBody.php new file mode 100644 index 00000000..b10264a9 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/CachingEntityBody.php @@ -0,0 +1,191 @@ +remoteStream = $body; + $this->body = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody(fopen('php://temp', 'r+')); + } + /** + * Will give the contents of the buffer followed by the exhausted remote stream. + * + * Warning: Loads the entire stream into memory + * + * @return string + */ + public function __toString() + { + $pos = $this->ftell(); + $this->rewind(); + $str = ''; + while (!$this->isConsumed()) { + $str .= $this->read(16384); + } + $this->seek($pos); + return $str; + } + public function getSize() + { + return max($this->body->getSize(), $this->remoteStream->getSize()); + } + /** + * {@inheritdoc} + * @throws RuntimeException When seeking with SEEK_END or when seeking past the total size of the buffer stream + */ + public function seek($offset, $whence = SEEK_SET) + { + if ($whence == SEEK_SET) { + $byte = $offset; + } elseif ($whence == SEEK_CUR) { + $byte = $offset + $this->ftell(); + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException(__CLASS__ . ' supports only SEEK_SET and SEEK_CUR seek operations'); + } + // You cannot skip ahead past where you've read from the remote stream + if ($byte > $this->body->getSize()) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException("Cannot seek to byte {$byte} when the buffered stream only contains {$this->body->getSize()} bytes"); + } + return $this->body->seek($byte); + } + public function rewind() + { + return $this->seek(0); + } + /** + * Does not support custom rewind functions + * + * @throws RuntimeException + */ + public function setRewindFunction($callable) + { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException(__CLASS__ . ' does not support custom stream rewind functions'); + } + public function read($length) + { + // Perform a regular read on any previously read data from the buffer + $data = $this->body->read($length); + $remaining = $length - strlen($data); + // More data was requested so read from the remote stream + if ($remaining) { + // If data was written to the buffer in a position that would have been filled from the remote stream, + // then we must skip bytes on the remote stream to emulate overwriting bytes from that position. This + // mimics the behavior of other PHP stream wrappers. + $remoteData = $this->remoteStream->read($remaining + $this->skipReadBytes); + if ($this->skipReadBytes) { + $len = strlen($remoteData); + $remoteData = substr($remoteData, $this->skipReadBytes); + $this->skipReadBytes = max(0, $this->skipReadBytes - $len); + } + $data .= $remoteData; + $this->body->write($remoteData); + } + return $data; + } + public function write($string) + { + // When appending to the end of the currently read stream, you'll want to skip bytes from being read from + // the remote stream to emulate other stream wrappers. Basically replacing bytes of data of a fixed length. + $overflow = strlen($string) + $this->ftell() - $this->remoteStream->ftell(); + if ($overflow > 0) { + $this->skipReadBytes += $overflow; + } + return $this->body->write($string); + } + /** + * {@inheritdoc} + * @link http://php.net/manual/en/function.fgets.php + */ + public function readLine($maxLength = null) + { + $buffer = ''; + $size = 0; + while (!$this->isConsumed()) { + $byte = $this->read(1); + $buffer .= $byte; + // Break when a new line is found or the max length - 1 is reached + if ($byte == PHP_EOL || ++$size == $maxLength - 1) { + break; + } + } + return $buffer; + } + public function isConsumed() + { + return $this->body->isConsumed() && $this->remoteStream->isConsumed(); + } + /** + * Close both the remote stream and buffer stream + */ + public function close() + { + return $this->remoteStream->close() && $this->body->close(); + } + public function setStream($stream, $size = 0) + { + $this->remoteStream->setStream($stream, $size); + } + public function getContentType() + { + return $this->remoteStream->getContentType(); + } + public function getContentEncoding() + { + return $this->remoteStream->getContentEncoding(); + } + public function getMetaData($key = null) + { + return $this->remoteStream->getMetaData($key); + } + public function getStream() + { + return $this->remoteStream->getStream(); + } + public function getWrapper() + { + return $this->remoteStream->getWrapper(); + } + public function getWrapperData() + { + return $this->remoteStream->getWrapperData(); + } + public function getStreamType() + { + return $this->remoteStream->getStreamType(); + } + public function getUri() + { + return $this->remoteStream->getUri(); + } + /** + * Always retrieve custom data from the remote stream + * {@inheritdoc} + */ + public function getCustomData($key) + { + return $this->remoteStream->getCustomData($key); + } + /** + * Always set custom data on the remote stream + * {@inheritdoc} + */ + public function setCustomData($key, $value) + { + $this->remoteStream->setCustomData($key, $value); + return $this; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Client.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Client.php new file mode 100644 index 00000000..599eba12 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Client.php @@ -0,0 +1,434 @@ +setConfig($config ?: new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection()); + $this->initSsl(); + $this->setBaseUrl($baseUrl); + $this->defaultHeaders = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection(); + $this->setRequestFactory(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestFactory::getInstance()); + $this->userAgent = $this->getDefaultUserAgent(); + if (!$this->config[self::DISABLE_REDIRECTS]) { + $this->addSubscriber(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\RedirectPlugin()); + } + } + public final function setConfig($config) + { + if ($config instanceof Collection) { + $this->config = $config; + } elseif (is_array($config)) { + $this->config = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection($config); + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Config must be an array or Collection'); + } + return $this; + } + public final function getConfig($key = false) + { + return $key ? $this->config[$key] : $this->config; + } + /** + * Set a default request option on the client that will be used as a default for each request + * + * @param string $keyOrPath request.options key (e.g. allow_redirects) or path to a nested key (e.g. headers/foo) + * @param mixed $value Value to set + * + * @return $this + */ + public function setDefaultOption($keyOrPath, $value) + { + $keyOrPath = self::REQUEST_OPTIONS . '/' . $keyOrPath; + $this->config->setPath($keyOrPath, $value); + return $this; + } + /** + * Retrieve a default request option from the client + * + * @param string $keyOrPath request.options key (e.g. allow_redirects) or path to a nested key (e.g. headers/foo) + * + * @return mixed|null + */ + public function getDefaultOption($keyOrPath) + { + $keyOrPath = self::REQUEST_OPTIONS . '/' . $keyOrPath; + return $this->config->getPath($keyOrPath); + } + public final function setSslVerification($certificateAuthority = true, $verifyPeer = true, $verifyHost = 2) + { + $opts = $this->config[self::CURL_OPTIONS] ?: array(); + if ($certificateAuthority === true) { + // use bundled CA bundle, set secure defaults + $opts[CURLOPT_CAINFO] = __DIR__ . '/Resources/cacert.pem'; + $opts[CURLOPT_SSL_VERIFYPEER] = true; + $opts[CURLOPT_SSL_VERIFYHOST] = 2; + } elseif ($certificateAuthority === false) { + unset($opts[CURLOPT_CAINFO]); + $opts[CURLOPT_SSL_VERIFYPEER] = false; + $opts[CURLOPT_SSL_VERIFYHOST] = 0; + } elseif ($verifyPeer !== true && $verifyPeer !== false && $verifyPeer !== 1 && $verifyPeer !== 0) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('verifyPeer must be 1, 0 or boolean'); + } elseif ($verifyHost !== 0 && $verifyHost !== 1 && $verifyHost !== 2) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('verifyHost must be 0, 1 or 2'); + } else { + $opts[CURLOPT_SSL_VERIFYPEER] = $verifyPeer; + $opts[CURLOPT_SSL_VERIFYHOST] = $verifyHost; + if (is_file($certificateAuthority)) { + unset($opts[CURLOPT_CAPATH]); + $opts[CURLOPT_CAINFO] = $certificateAuthority; + } elseif (is_dir($certificateAuthority)) { + unset($opts[CURLOPT_CAINFO]); + $opts[CURLOPT_CAPATH] = $certificateAuthority; + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException('Invalid option passed to ' . self::SSL_CERT_AUTHORITY . ': ' . $certificateAuthority); + } + } + $this->config->set(self::CURL_OPTIONS, $opts); + return $this; + } + public function createRequest($method = 'GET', $uri = null, $headers = null, $body = null, array $options = array()) + { + if (!$uri) { + $url = $this->getBaseUrl(); + } else { + if (!is_array($uri)) { + $templateVars = null; + } else { + list($uri, $templateVars) = $uri; + } + if (strpos($uri, '://')) { + // Use absolute URLs as-is + $url = $this->expandTemplate($uri, $templateVars); + } else { + $url = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Url::factory($this->getBaseUrl())->combine($this->expandTemplate($uri, $templateVars)); + } + } + // If default headers are provided, then merge them under any explicitly provided headers for the request + if (count($this->defaultHeaders)) { + if (!$headers) { + $headers = $this->defaultHeaders->toArray(); + } elseif (is_array($headers)) { + $headers += $this->defaultHeaders->toArray(); + } elseif ($headers instanceof Collection) { + $headers = $headers->toArray() + $this->defaultHeaders->toArray(); + } + } + return $this->prepareRequest($this->requestFactory->create($method, (string) $url, $headers, $body), $options); + } + public function getBaseUrl($expand = true) + { + return $expand ? $this->expandTemplate($this->baseUrl) : $this->baseUrl; + } + public function setBaseUrl($url) + { + $this->baseUrl = $url; + return $this; + } + public function setUserAgent($userAgent, $includeDefault = false) + { + if ($includeDefault) { + $userAgent .= ' ' . $this->getDefaultUserAgent(); + } + $this->userAgent = $userAgent; + return $this; + } + /** + * Get the default User-Agent string to use with Guzzle + * + * @return string + */ + public function getDefaultUserAgent() + { + return 'Guzzle/' . \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::VERSION . ' curl/' . \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlVersion::getInstance()->get('version') . ' PHP/' . PHP_VERSION; + } + public function get($uri = null, $headers = null, $options = array()) + { + // BC compat: $options can be a string, resource, etc to specify where the response body is downloaded + return is_array($options) ? $this->createRequest('GET', $uri, $headers, null, $options) : $this->createRequest('GET', $uri, $headers, $options); + } + public function head($uri = null, $headers = null, array $options = array()) + { + return $this->createRequest('HEAD', $uri, $headers, null, $options); + } + public function delete($uri = null, $headers = null, $body = null, array $options = array()) + { + return $this->createRequest('DELETE', $uri, $headers, $body, $options); + } + public function put($uri = null, $headers = null, $body = null, array $options = array()) + { + return $this->createRequest('PUT', $uri, $headers, $body, $options); + } + public function patch($uri = null, $headers = null, $body = null, array $options = array()) + { + return $this->createRequest('PATCH', $uri, $headers, $body, $options); + } + public function post($uri = null, $headers = null, $postBody = null, array $options = array()) + { + return $this->createRequest('POST', $uri, $headers, $postBody, $options); + } + public function options($uri = null, array $options = array()) + { + return $this->createRequest('OPTIONS', $uri, $options); + } + public function send($requests) + { + if (!$requests instanceof RequestInterface) { + return $this->sendMultiple($requests); + } + try { + /** @var $requests RequestInterface */ + $this->getCurlMulti()->add($requests)->send(); + return $requests->getResponse(); + } catch (ExceptionCollection $e) { + throw $e->getFirst(); + } + } + /** + * Set a curl multi object to be used internally by the client for transferring requests. + * + * @param CurlMultiInterface $curlMulti Multi object + * + * @return self + */ + public function setCurlMulti(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlMultiInterface $curlMulti) + { + $this->curlMulti = $curlMulti; + return $this; + } + /** + * @return CurlMultiInterface|CurlMultiProxy + */ + public function getCurlMulti() + { + if (!$this->curlMulti) { + $this->curlMulti = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlMultiProxy(self::MAX_HANDLES, $this->getConfig('select_timeout') ?: self::DEFAULT_SELECT_TIMEOUT); + } + return $this->curlMulti; + } + public function setRequestFactory(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestFactoryInterface $factory) + { + $this->requestFactory = $factory; + return $this; + } + /** + * Set the URI template expander to use with the client + * + * @param UriTemplateInterface $uriTemplate URI template expander + * + * @return self + */ + public function setUriTemplate(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Parser\UriTemplate\UriTemplateInterface $uriTemplate) + { + $this->uriTemplate = $uriTemplate; + return $this; + } + /** + * Expand a URI template while merging client config settings into the template variables + * + * @param string $template Template to expand + * @param array $variables Variables to inject + * + * @return string + */ + protected function expandTemplate($template, array $variables = null) + { + $expansionVars = $this->getConfig()->toArray(); + if ($variables) { + $expansionVars = $variables + $expansionVars; + } + return $this->getUriTemplate()->expand($template, $expansionVars); + } + /** + * Get the URI template expander used by the client + * + * @return UriTemplateInterface + */ + protected function getUriTemplate() + { + if (!$this->uriTemplate) { + $this->uriTemplate = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Parser\ParserRegistry::getInstance()->getParser('uri_template'); + } + return $this->uriTemplate; + } + /** + * Send multiple requests in parallel + * + * @param array $requests Array of RequestInterface objects + * + * @return array Returns an array of Response objects + */ + protected function sendMultiple(array $requests) + { + $curlMulti = $this->getCurlMulti(); + foreach ($requests as $request) { + $curlMulti->add($request); + } + $curlMulti->send(); + /** @var $request RequestInterface */ + $result = array(); + foreach ($requests as $request) { + $result[] = $request->getResponse(); + } + return $result; + } + /** + * Prepare a request to be sent from the Client by adding client specific behaviors and properties to the request. + * + * @param RequestInterface $request Request to prepare for the client + * @param array $options Options to apply to the request + * + * @return RequestInterface + */ + protected function prepareRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, array $options = array()) + { + $request->setClient($this)->setEventDispatcher(clone $this->getEventDispatcher()); + if ($curl = $this->config[self::CURL_OPTIONS]) { + $request->getCurlOptions()->overwriteWith(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlHandle::parseCurlConfig($curl)); + } + if ($params = $this->config[self::REQUEST_PARAMS]) { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn('request.params is deprecated. Use request.options to add default request options.'); + $request->getParams()->overwriteWith($params); + } + if ($this->userAgent && !$request->hasHeader('User-Agent')) { + $request->setHeader('User-Agent', $this->userAgent); + } + if ($defaults = $this->config[self::REQUEST_OPTIONS]) { + $this->requestFactory->applyOptions($request, $defaults, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestFactoryInterface::OPTIONS_AS_DEFAULTS); + } + if ($options) { + $this->requestFactory->applyOptions($request, $options); + } + $this->dispatch('client.create_request', array('client' => $this, 'request' => $request)); + return $request; + } + /** + * Initializes SSL settings + */ + protected function initSsl() + { + $authority = $this->config[self::SSL_CERT_AUTHORITY]; + if ($authority === 'system') { + return; + } + if ($authority === null) { + $authority = true; + } + if ($authority === true && substr(__FILE__, 0, 7) == 'phar://') { + $authority = self::extractPharCacert(__DIR__ . '/Resources/cacert.pem'); + } + $this->setSslVerification($authority); + } + /** + * @deprecated + */ + public function getDefaultHeaders() + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use the request.options array to retrieve default request options'); + return $this->defaultHeaders; + } + /** + * @deprecated + */ + public function setDefaultHeaders($headers) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use the request.options array to specify default request options'); + if ($headers instanceof Collection) { + $this->defaultHeaders = $headers; + } elseif (is_array($headers)) { + $this->defaultHeaders = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection($headers); + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Headers must be an array or Collection'); + } + return $this; + } + /** + * @deprecated + */ + public function preparePharCacert($md5Check = true) + { + return sys_get_temp_dir() . '/guzzle-cacert.pem'; + } + /** + * Copies the phar cacert from a phar into the temp directory. + * + * @param string $pharCacertPath Path to the phar cacert. For example: + * 'phar://aws.phar/Guzzle/Http/Resources/cacert.pem' + * + * @return string Returns the path to the extracted cacert file. + * @throws \RuntimeException Throws if the phar cacert cannot be found or + * the file cannot be copied to the temp dir. + */ + public static function extractPharCacert($pharCacertPath) + { + // Copy the cacert.pem file from the phar if it is not in the temp + // folder. + $certFile = sys_get_temp_dir() . '/guzzle-cacert.pem'; + if (!file_exists($pharCacertPath)) { + throw new \RuntimeException("Could not find {$pharCacertPath}"); + } + if (!file_exists($certFile) || filesize($certFile) != filesize($pharCacertPath)) { + if (!copy($pharCacertPath, $certFile)) { + throw new \RuntimeException("Could not copy {$pharCacertPath} to {$certFile}: " . var_export(error_get_last(), true)); + } + } + return $certFile; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/ClientInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/ClientInterface.php new file mode 100644 index 00000000..62c29946 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/ClientInterface.php @@ -0,0 +1,200 @@ +getCurlOptions(); + $mediator = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\RequestMediator($request, $requestCurlOptions->get('emit_io')); + $tempContentLength = null; + $method = $request->getMethod(); + $bodyAsString = $requestCurlOptions->get(self::BODY_AS_STRING); + // Prepare url + $url = (string) $request->getUrl(); + if (($pos = strpos($url, '#')) !== false) { + // strip fragment from url + $url = substr($url, 0, $pos); + } + // Array of default cURL options. + $curlOptions = array( + CURLOPT_URL => $url, + CURLOPT_CONNECTTIMEOUT => 150, + CURLOPT_RETURNTRANSFER => false, + CURLOPT_HEADER => false, + CURLOPT_PORT => $request->getPort(), + CURLOPT_HTTPHEADER => array(), + CURLOPT_WRITEFUNCTION => array($mediator, 'writeResponseBody'), + CURLOPT_HEADERFUNCTION => array($mediator, 'receiveResponseHeader'), + CURLOPT_HTTP_VERSION => $request->getProtocolVersion() === '1.0' ? CURL_HTTP_VERSION_1_0 : CURL_HTTP_VERSION_1_1, + // Verifies the authenticity of the peer's certificate + CURLOPT_SSL_VERIFYPEER => 1, + // Certificate must indicate that the server is the server to which you meant to connect + CURLOPT_SSL_VERIFYHOST => 2, + ); + if (defined('CURLOPT_PROTOCOLS')) { + // Allow only HTTP and HTTPS protocols + $curlOptions[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS; + } + // Add CURLOPT_ENCODING if Accept-Encoding header is provided + if ($acceptEncodingHeader = $request->getHeader('Accept-Encoding')) { + $curlOptions[CURLOPT_ENCODING] = (string) $acceptEncodingHeader; + // Let cURL set the Accept-Encoding header, prevents duplicate values + $request->removeHeader('Accept-Encoding'); + } + // Enable curl debug information if the 'debug' param was set + if ($requestCurlOptions->get('debug')) { + $curlOptions[CURLOPT_STDERR] = fopen('php://temp', 'r+'); + // @codeCoverageIgnoreStart + if (false === $curlOptions[CURLOPT_STDERR]) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException('Unable to create a stream for CURLOPT_STDERR'); + } + // @codeCoverageIgnoreEnd + $curlOptions[CURLOPT_VERBOSE] = true; + } + // Specify settings according to the HTTP method + if ($method == 'GET') { + $curlOptions[CURLOPT_HTTPGET] = true; + } elseif ($method == 'HEAD') { + $curlOptions[CURLOPT_NOBODY] = true; + // HEAD requests do not use a write function + unset($curlOptions[CURLOPT_WRITEFUNCTION]); + } elseif (!$request instanceof EntityEnclosingRequest) { + $curlOptions[CURLOPT_CUSTOMREQUEST] = $method; + } else { + $curlOptions[CURLOPT_CUSTOMREQUEST] = $method; + // Handle sending raw bodies in a request + if ($request->getBody()) { + // You can send the body as a string using curl's CURLOPT_POSTFIELDS + if ($bodyAsString) { + $curlOptions[CURLOPT_POSTFIELDS] = (string) $request->getBody(); + // Allow curl to add the Content-Length for us to account for the times when + // POST redirects are followed by GET requests + if ($tempContentLength = $request->getHeader('Content-Length')) { + $tempContentLength = (int) (string) $tempContentLength; + } + // Remove the curl generated Content-Type header if none was set manually + if (!$request->hasHeader('Content-Type')) { + $curlOptions[CURLOPT_HTTPHEADER][] = 'Content-Type:'; + } + } else { + $curlOptions[CURLOPT_UPLOAD] = true; + // Let cURL handle setting the Content-Length header + if ($tempContentLength = $request->getHeader('Content-Length')) { + $tempContentLength = (int) (string) $tempContentLength; + $curlOptions[CURLOPT_INFILESIZE] = $tempContentLength; + } + // Add a callback for curl to read data to send with the request only if a body was specified + $curlOptions[CURLOPT_READFUNCTION] = array($mediator, 'readRequestBody'); + // Attempt to seek to the start of the stream + $request->getBody()->seek(0); + } + } else { + // Special handling for POST specific fields and files + $postFields = false; + if (count($request->getPostFiles())) { + $postFields = $request->getPostFields()->useUrlEncoding(false)->urlEncode(); + foreach ($request->getPostFiles() as $key => $data) { + $prefixKeys = count($data) > 1; + foreach ($data as $index => $file) { + // Allow multiple files in the same key + $fieldKey = $prefixKeys ? "{$key}[{$index}]" : $key; + $postFields[$fieldKey] = $file->getCurlValue(); + } + } + } elseif (count($request->getPostFields())) { + $postFields = (string) $request->getPostFields()->useUrlEncoding(true); + } + if ($postFields !== false) { + if ($method == 'POST') { + unset($curlOptions[CURLOPT_CUSTOMREQUEST]); + $curlOptions[CURLOPT_POST] = true; + } + $curlOptions[CURLOPT_POSTFIELDS] = $postFields; + $request->removeHeader('Content-Length'); + } + } + // If the Expect header is not present, prevent curl from adding it + if (!$request->hasHeader('Expect')) { + $curlOptions[CURLOPT_HTTPHEADER][] = 'Expect:'; + } + } + // If a Content-Length header was specified but we want to allow curl to set one for us + if (null !== $tempContentLength) { + $request->removeHeader('Content-Length'); + } + // Set custom cURL options + foreach ($requestCurlOptions->toArray() as $key => $value) { + if (is_numeric($key)) { + $curlOptions[$key] = $value; + } + } + // Do not set an Accept header by default + if (!isset($curlOptions[CURLOPT_ENCODING])) { + $curlOptions[CURLOPT_HTTPHEADER][] = 'Accept:'; + } + // Add any custom headers to the request. Empty headers will cause curl to not send the header at all. + foreach ($request->getHeaderLines() as $line) { + $curlOptions[CURLOPT_HTTPHEADER][] = $line; + } + // Add the content-length header back if it was temporarily removed + if (null !== $tempContentLength) { + $request->setHeader('Content-Length', $tempContentLength); + } + // Apply the options to a new cURL handle. + $handle = curl_init(); + // Enable the progress function if the 'progress' param was set + if ($requestCurlOptions->get('progress')) { + // Wrap the function in a function that provides the curl handle to the mediator's progress function + // Using this rather than injecting the handle into the mediator prevents a circular reference + $curlOptions[CURLOPT_PROGRESSFUNCTION] = function () use($mediator, $handle) { + $args = func_get_args(); + $args[] = $handle; + // PHP 5.5 pushed the handle onto the start of the args + if (is_resource($args[0])) { + array_shift($args); + } + call_user_func_array(array($mediator, 'progress'), $args); + }; + $curlOptions[CURLOPT_NOPROGRESS] = false; + } + curl_setopt_array($handle, $curlOptions); + return new static($handle, $curlOptions); + } + /** + * Construct a new CurlHandle object that wraps a cURL handle + * + * @param resource $handle Configured cURL handle resource + * @param Collection|array $options Curl options to use with the handle + * + * @throws InvalidArgumentException + */ + public function __construct($handle, $options) + { + if (!is_resource($handle)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Invalid handle provided'); + } + if (is_array($options)) { + $this->options = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection($options); + } elseif ($options instanceof Collection) { + $this->options = $options; + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Expected array or Collection'); + } + $this->handle = $handle; + } + /** + * Destructor + */ + public function __destruct() + { + $this->close(); + } + /** + * Close the curl handle + */ + public function close() + { + if (is_resource($this->handle)) { + curl_close($this->handle); + } + $this->handle = null; + } + /** + * Check if the handle is available and still OK + * + * @return bool + */ + public function isAvailable() + { + return is_resource($this->handle); + } + /** + * Get the last error that occurred on the cURL handle + * + * @return string + */ + public function getError() + { + return $this->isAvailable() ? curl_error($this->handle) : ''; + } + /** + * Get the last error number that occurred on the cURL handle + * + * @return int + */ + public function getErrorNo() + { + if ($this->errorNo) { + return $this->errorNo; + } + return $this->isAvailable() ? curl_errno($this->handle) : CURLE_OK; + } + /** + * Set the curl error number + * + * @param int $error Error number to set + * + * @return CurlHandle + */ + public function setErrorNo($error) + { + $this->errorNo = $error; + return $this; + } + /** + * Get cURL curl_getinfo data + * + * @param int $option Option to retrieve. Pass null to retrieve all data as an array. + * + * @return array|mixed + */ + public function getInfo($option = null) + { + if (!is_resource($this->handle)) { + return null; + } + if (null !== $option) { + return curl_getinfo($this->handle, $option) ?: null; + } + return curl_getinfo($this->handle) ?: array(); + } + /** + * Get the stderr output + * + * @param bool $asResource Set to TRUE to get an fopen resource + * + * @return string|resource|null + */ + public function getStderr($asResource = false) + { + $stderr = $this->getOptions()->get(CURLOPT_STDERR); + if (!$stderr) { + return null; + } + if ($asResource) { + return $stderr; + } + fseek($stderr, 0); + $e = stream_get_contents($stderr); + fseek($stderr, 0, SEEK_END); + return $e; + } + /** + * Get the URL that this handle is connecting to + * + * @return Url + */ + public function getUrl() + { + return \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Url::factory($this->options->get(CURLOPT_URL)); + } + /** + * Get the wrapped curl handle + * + * @return resource|null Returns the cURL handle or null if it was closed + */ + public function getHandle() + { + return $this->isAvailable() ? $this->handle : null; + } + /** + * Get the cURL setopt options of the handle. Changing values in the return object will have no effect on the curl + * handle after it is created. + * + * @return Collection + */ + public function getOptions() + { + return $this->options; + } + /** + * Update a request based on the log messages of the CurlHandle + * + * @param RequestInterface $request Request to update + */ + public function updateRequestFromTransfer(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + if (!$request->getResponse()) { + return; + } + // Update the transfer stats of the response + $request->getResponse()->setInfo($this->getInfo()); + if (!($log = $this->getStderr(true))) { + return; + } + // Parse the cURL stderr output for outgoing requests + $headers = ''; + fseek($log, 0); + while (($line = fgets($log)) !== false) { + if ($line && $line[0] == '>') { + $headers = substr(trim($line), 2) . "\r\n"; + while (($line = fgets($log)) !== false) { + if ($line[0] == '*' || $line[0] == '<') { + break; + } else { + $headers .= trim($line) . "\r\n"; + } + } + } + } + // Add request headers to the request exactly as they were sent + if ($headers) { + $parsed = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Parser\ParserRegistry::getInstance()->getParser('message')->parseRequest($headers); + if (!empty($parsed['headers'])) { + $request->setHeaders(array()); + foreach ($parsed['headers'] as $name => $value) { + $request->setHeader($name, $value); + } + } + if (!empty($parsed['version'])) { + $request->setProtocolVersion($parsed['version']); + } + } + } + /** + * Parse the config and replace curl.* configurators into the constant based values so it can be used elsewhere + * + * @param array|Collection $config The configuration we want to parse + * + * @return array + */ + public static function parseCurlConfig($config) + { + $curlOptions = array(); + foreach ($config as $key => $value) { + if (is_string($key) && defined($key)) { + // Convert constants represented as string to constant int values + $key = constant($key); + } + if (is_string($value) && defined($value)) { + $value = constant($value); + } + $curlOptions[$key] = $value; + } + return $curlOptions; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php new file mode 100644 index 00000000..bd8572f8 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php @@ -0,0 +1,351 @@ + array('CURLM_BAD_HANDLE', 'The passed-in handle is not a valid CURLM handle.'), CURLM_BAD_EASY_HANDLE => array('CURLM_BAD_EASY_HANDLE', "An easy handle was not good/valid. It could mean that it isn't an easy handle at all, or possibly that the handle already is in used by this or another multi handle."), CURLM_OUT_OF_MEMORY => array('CURLM_OUT_OF_MEMORY', 'You are doomed.'), CURLM_INTERNAL_ERROR => array('CURLM_INTERNAL_ERROR', 'This can only be returned if libcurl bugs. Please report it to us!')); + /** @var float */ + protected $selectTimeout; + public function __construct($selectTimeout = 1.0) + { + $this->selectTimeout = $selectTimeout; + $this->multiHandle = curl_multi_init(); + // @codeCoverageIgnoreStart + if ($this->multiHandle === false) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\CurlException('Unable to create multi handle'); + } + // @codeCoverageIgnoreEnd + $this->reset(); + } + public function __destruct() + { + if (is_resource($this->multiHandle)) { + curl_multi_close($this->multiHandle); + } + } + public function add(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $this->requests[] = $request; + // If requests are currently transferring and this is async, then the + // request must be prepared now as the send() method is not called. + $this->beforeSend($request); + $this->dispatch(self::ADD_REQUEST, array('request' => $request)); + return $this; + } + public function all() + { + return $this->requests; + } + public function remove(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $this->removeHandle($request); + if (($index = array_search($request, $this->requests, true)) !== false) { + $request = $this->requests[$index]; + unset($this->requests[$index]); + $this->requests = array_values($this->requests); + $this->dispatch(self::REMOVE_REQUEST, array('request' => $request)); + return true; + } + return false; + } + public function reset($hard = false) + { + // Remove each request + if ($this->requests) { + foreach ($this->requests as $request) { + $this->remove($request); + } + } + $this->handles = new \SplObjectStorage(); + $this->requests = $this->resourceHash = $this->exceptions = $this->successful = array(); + } + public function send() + { + $this->perform(); + $exceptions = $this->exceptions; + $successful = $this->successful; + $this->reset(); + if ($exceptions) { + $this->throwMultiException($exceptions, $successful); + } + } + public function count() + { + return count($this->requests); + } + /** + * Build and throw a MultiTransferException + * + * @param array $exceptions Exceptions encountered + * @param array $successful Successful requests + * @throws MultiTransferException + */ + protected function throwMultiException(array $exceptions, array $successful) + { + $multiException = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\MultiTransferException('Errors during multi transfer'); + while ($e = array_shift($exceptions)) { + $multiException->addFailedRequestWithException($e['request'], $e['exception']); + } + // Add successful requests + foreach ($successful as $request) { + if (!$multiException->containsRequest($request)) { + $multiException->addSuccessfulRequest($request); + } + } + throw $multiException; + } + /** + * Prepare for sending + * + * @param RequestInterface $request Request to prepare + * @throws \Exception on error preparing the request + */ + protected function beforeSend(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + try { + $state = $request->setState(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_TRANSFER); + if ($state == \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_TRANSFER) { + $this->addHandle($request); + } else { + // Requests might decide they don't need to be sent just before + // transfer (e.g. CachePlugin) + $this->remove($request); + if ($state == \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_COMPLETE) { + $this->successful[] = $request; + } + } + } catch (\Exception $e) { + // Queue the exception to be thrown when sent + $this->removeErroredRequest($request, $e); + } + } + private function addHandle(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $handle = $this->createCurlHandle($request)->getHandle(); + $this->checkCurlResult(curl_multi_add_handle($this->multiHandle, $handle)); + } + /** + * Create a curl handle for a request + * + * @param RequestInterface $request Request + * + * @return CurlHandle + */ + protected function createCurlHandle(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $wrapper = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlHandle::factory($request); + $this->handles[$request] = $wrapper; + $this->resourceHash[(int) $wrapper->getHandle()] = $request; + return $wrapper; + } + /** + * Get the data from the multi handle + */ + protected function perform() + { + $event = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event(array('curl_multi' => $this)); + while ($this->requests) { + // Notify each request as polling + $blocking = $total = 0; + foreach ($this->requests as $request) { + ++$total; + $event['request'] = $request; + $request->getEventDispatcher()->dispatch(self::POLLING_REQUEST, $event); + // The blocking variable just has to be non-falsey to block the loop + if ($request->getParams()->hasKey(self::BLOCKING)) { + ++$blocking; + } + } + if ($blocking == $total) { + // Sleep to prevent eating CPU because no requests are actually pending a select call + usleep(500); + } else { + $this->executeHandles(); + } + } + } + /** + * Execute and select curl handles + */ + private function executeHandles() + { + // The first curl_multi_select often times out no matter what, but is usually required for fast transfers + $selectTimeout = 0.001; + $active = false; + do { + while (($mrc = curl_multi_exec($this->multiHandle, $active)) == CURLM_CALL_MULTI_PERFORM) { + } + $this->checkCurlResult($mrc); + $this->processMessages(); + if ($active && curl_multi_select($this->multiHandle, $selectTimeout) === -1) { + // Perform a usleep if a select returns -1: https://bugs.php.net/bug.php?id=61141 + usleep(150); + } + $selectTimeout = $this->selectTimeout; + } while ($active); + } + /** + * Process any received curl multi messages + */ + private function processMessages() + { + while ($done = curl_multi_info_read($this->multiHandle)) { + $request = $this->resourceHash[(int) $done['handle']]; + try { + $this->processResponse($request, $this->handles[$request], $done); + $this->successful[] = $request; + } catch (\Exception $e) { + $this->removeErroredRequest($request, $e); + } + } + } + /** + * Remove a request that encountered an exception + * + * @param RequestInterface $request Request to remove + * @param \Exception $e Exception encountered + */ + protected function removeErroredRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \Exception $e = null) + { + $this->exceptions[] = array('request' => $request, 'exception' => $e); + $this->remove($request); + $this->dispatch(self::MULTI_EXCEPTION, array('exception' => $e, 'all_exceptions' => $this->exceptions)); + } + /** + * Check for errors and fix headers of a request based on a curl response + * + * @param RequestInterface $request Request to process + * @param CurlHandle $handle Curl handle object + * @param array $curl Array returned from curl_multi_info_read + * + * @throws CurlException on Curl error + */ + protected function processResponse(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlHandle $handle, array $curl) + { + // Set the transfer stats on the response + $handle->updateRequestFromTransfer($request); + // Check if a cURL exception occurred, and if so, notify things + $curlException = $this->isCurlException($request, $handle, $curl); + // Always remove completed curl handles. They can be added back again + // via events if needed (e.g. ExponentialBackoffPlugin) + $this->removeHandle($request); + if (!$curlException) { + if ($this->validateResponseWasSet($request)) { + $state = $request->setState(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_COMPLETE, array('handle' => $handle)); + // Only remove the request if it wasn't resent as a result of + // the state change + if ($state != \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_TRANSFER) { + $this->remove($request); + } + } + return; + } + // Set the state of the request to an error + $state = $request->setState(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_ERROR, array('exception' => $curlException)); + // Allow things to ignore the error if possible + if ($state != \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_TRANSFER) { + $this->remove($request); + } + // The error was not handled, so fail + if ($state == \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_ERROR) { + /** @var CurlException $curlException */ + throw $curlException; + } + } + /** + * Remove a curl handle from the curl multi object + * + * @param RequestInterface $request Request that owns the handle + */ + protected function removeHandle(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + if (isset($this->handles[$request])) { + $handle = $this->handles[$request]; + curl_multi_remove_handle($this->multiHandle, $handle->getHandle()); + unset($this->handles[$request]); + unset($this->resourceHash[(int) $handle->getHandle()]); + $handle->close(); + } + } + /** + * Check if a cURL transfer resulted in what should be an exception + * + * @param RequestInterface $request Request to check + * @param CurlHandle $handle Curl handle object + * @param array $curl Array returned from curl_multi_info_read + * + * @return CurlException|bool + */ + private function isCurlException(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlHandle $handle, array $curl) + { + if (CURLM_OK == $curl['result'] || CURLM_CALL_MULTI_PERFORM == $curl['result']) { + return false; + } + $handle->setErrorNo($curl['result']); + $e = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\CurlException(sprintf('[curl] %s: %s [url] %s', $handle->getErrorNo(), $handle->getError(), $handle->getUrl())); + $e->setCurlHandle($handle)->setRequest($request)->setCurlInfo($handle->getInfo())->setError($handle->getError(), $handle->getErrorNo()); + return $e; + } + /** + * Throw an exception for a cURL multi response if needed + * + * @param int $code Curl response code + * @throws CurlException + */ + private function checkCurlResult($code) + { + if ($code != CURLM_OK && $code != CURLM_CALL_MULTI_PERFORM) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\CurlException(isset($this->multiErrors[$code]) ? "cURL error: {$code} ({$this->multiErrors[$code][0]}): cURL message: {$this->multiErrors[$code][1]}" : 'Unexpected cURL error: ' . $code); + } + } + /** + * @link https://github.com/guzzle/guzzle/issues/710 + */ + private function validateResponseWasSet(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + if ($request->getResponse()) { + return true; + } + $body = $request instanceof EntityEnclosingRequestInterface ? $request->getBody() : null; + if (!$body) { + $rex = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\RequestException('No response was received for a request with no body. This' . ' could mean that you are saturating your network.'); + $rex->setRequest($request); + $this->removeErroredRequest($request, $rex); + } elseif (!$body->isSeekable() || !$body->seek(0)) { + // Nothing we can do with this. Sorry! + $rex = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\RequestException('The connection was unexpectedly closed. The request would' . ' have been retried, but attempting to rewind the' . ' request body failed.'); + $rex->setRequest($request); + $this->removeErroredRequest($request, $rex); + } else { + $this->remove($request); + // Add the request back to the batch to retry automatically. + $this->requests[] = $request; + $this->addHandle($request); + } + return false; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiInterface.php new file mode 100644 index 00000000..bfd48b94 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiInterface.php @@ -0,0 +1,52 @@ +maxHandles = $maxHandles; + $this->selectTimeout = $selectTimeout; + // You can get some weird "Too many open files" errors when sending a large amount of requests in parallel. + // These two statements autoload classes before a system runs out of file descriptors so that you can get back + // valuable error messages if you run out. + class_exists('DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Response'); + class_exists('DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\CurlException'); + } + public function add(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $this->queued[] = $request; + return $this; + } + public function all() + { + $requests = $this->queued; + foreach ($this->handles as $handle) { + $requests = array_merge($requests, $handle->all()); + } + return $requests; + } + public function remove(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + foreach ($this->queued as $i => $r) { + if ($request === $r) { + unset($this->queued[$i]); + return true; + } + } + foreach ($this->handles as $handle) { + if ($handle->remove($request)) { + return true; + } + } + return false; + } + public function reset($hard = false) + { + $this->queued = array(); + $this->groups = array(); + foreach ($this->handles as $handle) { + $handle->reset(); + } + if ($hard) { + $this->handles = array(); + } + return $this; + } + public function send() + { + if ($this->queued) { + $group = $this->getAvailableHandle(); + // Add this handle to a list of handles than is claimed + $this->groups[] = $group; + while ($request = array_shift($this->queued)) { + $group->add($request); + } + try { + $group->send(); + array_pop($this->groups); + $this->cleanupHandles(); + } catch (\Exception $e) { + // Remove the group and cleanup if an exception was encountered and no more requests in group + if (!$group->count()) { + array_pop($this->groups); + $this->cleanupHandles(); + } + throw $e; + } + } + } + public function count() + { + return count($this->all()); + } + /** + * Get an existing available CurlMulti handle or create a new one + * + * @return CurlMulti + */ + protected function getAvailableHandle() + { + // Grab a handle that is not claimed + foreach ($this->handles as $h) { + if (!in_array($h, $this->groups, true)) { + return $h; + } + } + // All are claimed, so create one + $handle = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlMulti($this->selectTimeout); + $handle->setEventDispatcher($this->getEventDispatcher()); + $this->handles[] = $handle; + return $handle; + } + /** + * Trims down unused CurlMulti handles to limit the number of open connections + */ + protected function cleanupHandles() + { + if ($diff = max(0, count($this->handles) - $this->maxHandles)) { + for ($i = count($this->handles) - 1; $i > 0 && $diff > 0; $i--) { + if (!count($this->handles[$i])) { + unset($this->handles[$i]); + $diff--; + } + } + $this->handles = array_values($this->handles); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Curl/CurlVersion.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Curl/CurlVersion.php new file mode 100644 index 00000000..3877e0ed --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Curl/CurlVersion.php @@ -0,0 +1,58 @@ +version) { + $this->version = curl_version(); + } + return $this->version; + } + /** + * Get a specific type of curl information + * + * @param string $type Version information to retrieve. This value is one of: + * - version_number: cURL 24 bit version number + * - version: cURL version number, as a string + * - ssl_version_number: OpenSSL 24 bit version number + * - ssl_version: OpenSSL version number, as a string + * - libz_version: zlib version number, as a string + * - host: Information about the host where cURL was built + * - features: A bitmask of the CURL_VERSION_XXX constants + * - protocols: An array of protocols names supported by cURL + * + * @return string|float|bool if the $type is found, and false if not found + */ + public function get($type) + { + $version = $this->getAll(); + return isset($version[$type]) ? $version[$type] : false; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Curl/RequestMediator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Curl/RequestMediator.php new file mode 100644 index 00000000..538a2115 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Curl/RequestMediator.php @@ -0,0 +1,112 @@ +request = $request; + $this->emitIo = $emitIo; + } + /** + * Receive a response header from curl + * + * @param resource $curl Curl handle + * @param string $header Received header + * + * @return int + */ + public function receiveResponseHeader($curl, $header) + { + static $normalize = array("\r", "\n"); + $length = strlen($header); + $header = str_replace($normalize, '', $header); + if (strpos($header, 'HTTP/') === 0) { + $startLine = explode(' ', $header, 3); + $code = $startLine[1]; + $status = isset($startLine[2]) ? $startLine[2] : ''; + // Only download the body of the response to the specified response + // body when a successful response is received. + if ($code >= 200 && $code < 300) { + $body = $this->request->getResponseBody(); + } else { + $body = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory(); + } + $response = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response($code, null, $body); + $response->setStatus($code, $status); + $this->request->startResponse($response); + $this->request->dispatch('request.receive.status_line', array('request' => $this, 'line' => $header, 'status_code' => $code, 'reason_phrase' => $status)); + } elseif ($pos = strpos($header, ':')) { + $this->request->getResponse()->addHeader(trim(substr($header, 0, $pos)), trim(substr($header, $pos + 1))); + } + return $length; + } + /** + * Received a progress notification + * + * @param int $downloadSize Total download size + * @param int $downloaded Amount of bytes downloaded + * @param int $uploadSize Total upload size + * @param int $uploaded Amount of bytes uploaded + * @param resource $handle CurlHandle object + */ + public function progress($downloadSize, $downloaded, $uploadSize, $uploaded, $handle = null) + { + $this->request->dispatch('curl.callback.progress', array('request' => $this->request, 'handle' => $handle, 'download_size' => $downloadSize, 'downloaded' => $downloaded, 'upload_size' => $uploadSize, 'uploaded' => $uploaded)); + } + /** + * Write data to the response body of a request + * + * @param resource $curl Curl handle + * @param string $write Data that was received + * + * @return int + */ + public function writeResponseBody($curl, $write) + { + if ($this->emitIo) { + $this->request->dispatch('curl.callback.write', array('request' => $this->request, 'write' => $write)); + } + if ($response = $this->request->getResponse()) { + return $response->getBody()->write($write); + } else { + // Unexpected data received before response headers - abort transfer + return 0; + } + } + /** + * Read data from the request body and send it to curl + * + * @param resource $ch Curl handle + * @param resource $fd File descriptor + * @param int $length Amount of data to read + * + * @return string + */ + public function readRequestBody($ch, $fd, $length) + { + if (!($body = $this->request->getBody())) { + return ''; + } + $read = (string) $body->read($length); + if ($this->emitIo) { + $this->request->dispatch('curl.callback.read', array('request' => $this->request, 'read' => $read)); + } + return $read; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/EntityBody.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/EntityBody.php new file mode 100644 index 00000000..9469d8ff --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/EntityBody.php @@ -0,0 +1,168 @@ +rewindFunction = $callable; + return $this; + } + public function rewind() + { + return $this->rewindFunction ? call_user_func($this->rewindFunction, $this) : parent::rewind(); + } + /** + * Create a new EntityBody from a string + * + * @param string $string String of data + * + * @return EntityBody + */ + public static function fromString($string) + { + $stream = fopen('php://temp', 'r+'); + if ($string !== '') { + fwrite($stream, $string); + rewind($stream); + } + return new static($stream); + } + public function compress($filter = 'zlib.deflate') + { + $result = $this->handleCompression($filter); + $this->contentEncoding = $result ? $filter : false; + return $result; + } + public function uncompress($filter = 'zlib.inflate') + { + $offsetStart = 0; + // When inflating gzipped data, the first 10 bytes must be stripped + // if a gzip header is present + if ($filter == 'zlib.inflate') { + // @codeCoverageIgnoreStart + if (!$this->isReadable() || $this->isConsumed() && !$this->isSeekable()) { + return false; + } + // @codeCoverageIgnoreEnd + if (stream_get_contents($this->stream, 3, 0) === "\37‹\10") { + $offsetStart = 10; + } + } + $this->contentEncoding = false; + return $this->handleCompression($filter, $offsetStart); + } + public function getContentLength() + { + return $this->getSize(); + } + public function getContentType() + { + return $this->getUri() ? \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Mimetypes::getInstance()->fromFilename($this->getUri()) : null; + } + public function getContentMd5($rawOutput = false, $base64Encode = false) + { + if ($hash = self::getHash($this, 'md5', $rawOutput)) { + return $hash && $base64Encode ? base64_encode($hash) : $hash; + } else { + return false; + } + } + /** + * Calculate the MD5 hash of an entity body + * + * @param EntityBodyInterface $body Entity body to calculate the hash for + * @param bool $rawOutput Whether or not to use raw output + * @param bool $base64Encode Whether or not to base64 encode raw output (only if raw output is true) + * + * @return bool|string Returns an MD5 string on success or FALSE on failure + * @deprecated This will be deprecated soon + * @codeCoverageIgnore + */ + public static function calculateMd5(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBodyInterface $body, $rawOutput = false, $base64Encode = false) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__CLASS__ . ' is deprecated. Use getContentMd5()'); + return $body->getContentMd5($rawOutput, $base64Encode); + } + public function setStreamFilterContentEncoding($streamFilterContentEncoding) + { + $this->contentEncoding = $streamFilterContentEncoding; + return $this; + } + public function getContentEncoding() + { + return strtr($this->contentEncoding, array('zlib.deflate' => 'gzip', 'bzip2.compress' => 'compress')) ?: false; + } + protected function handleCompression($filter, $offsetStart = 0) + { + // @codeCoverageIgnoreStart + if (!$this->isReadable() || $this->isConsumed() && !$this->isSeekable()) { + return false; + } + // @codeCoverageIgnoreEnd + $handle = fopen('php://temp', 'r+'); + $filter = @stream_filter_append($handle, $filter, STREAM_FILTER_WRITE); + if (!$filter) { + return false; + } + // Seek to the offset start if possible + $this->seek($offsetStart); + while ($data = fread($this->stream, 8096)) { + fwrite($handle, $data); + } + fclose($this->stream); + $this->stream = $handle; + stream_filter_remove($filter); + $stat = fstat($this->stream); + $this->size = $stat['size']; + $this->rebuildCache(); + $this->seek(0); + // Remove any existing rewind function as the underlying stream has been replaced + $this->rewindFunction = null; + return true; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/EntityBodyInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/EntityBodyInterface.php new file mode 100644 index 00000000..7d5503c1 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/EntityBodyInterface.php @@ -0,0 +1,66 @@ +isClientError()) { + $label = 'Client error response'; + $class = __NAMESPACE__ . '\\ClientErrorResponseException'; + } elseif ($response->isServerError()) { + $label = 'Server error response'; + $class = __NAMESPACE__ . '\\ServerErrorResponseException'; + } else { + $label = 'Unsuccessful response'; + $class = __CLASS__; + } + $message = $label . PHP_EOL . implode(PHP_EOL, array('[status code] ' . $response->getStatusCode(), '[reason phrase] ' . $response->getReasonPhrase(), '[url] ' . $request->getUrl())); + $e = new $class($message); + $e->setResponse($response); + $e->setRequest($request); + return $e; + } + /** + * Set the response that caused the exception + * + * @param Response $response Response to set + */ + public function setResponse(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + $this->response = $response; + } + /** + * Get the response that caused the exception + * + * @return Response + */ + public function getResponse() + { + return $this->response; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Exception/ClientErrorResponseException.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Exception/ClientErrorResponseException.php new file mode 100644 index 00000000..bffe3b4c --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Exception/ClientErrorResponseException.php @@ -0,0 +1,10 @@ +curlError = $error; + $this->curlErrorNo = $number; + return $this; + } + /** + * Set the associated curl handle + * + * @param CurlHandle $handle Curl handle + * + * @return self + */ + public function setCurlHandle(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlHandle $handle) + { + $this->handle = $handle; + return $this; + } + /** + * Get the associated cURL handle + * + * @return CurlHandle|null + */ + public function getCurlHandle() + { + return $this->handle; + } + /** + * Get the associated cURL error message + * + * @return string|null + */ + public function getError() + { + return $this->curlError; + } + /** + * Get the associated cURL error number + * + * @return int|null + */ + public function getErrorNo() + { + return $this->curlErrorNo; + } + /** + * Returns curl information about the transfer + * + * @return array + */ + public function getCurlInfo() + { + return $this->curlInfo; + } + /** + * Set curl transfer information + * + * @param array $info Array of curl transfer information + * + * @return self + * @link http://php.net/manual/en/function.curl-getinfo.php + */ + public function setCurlInfo(array $info) + { + $this->curlInfo = $info; + return $this; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Exception/HttpException.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Exception/HttpException.php new file mode 100644 index 00000000..c542743f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Exception/HttpException.php @@ -0,0 +1,11 @@ +successfulRequests, $this->failedRequests); + } + /** + * Add to the array of successful requests + * + * @param RequestInterface $request Successful request + * + * @return self + */ + public function addSuccessfulRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $this->successfulRequests[] = $request; + return $this; + } + /** + * Add to the array of failed requests + * + * @param RequestInterface $request Failed request + * + * @return self + */ + public function addFailedRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $this->failedRequests[] = $request; + return $this; + } + /** + * Add to the array of failed requests and associate with exceptions + * + * @param RequestInterface $request Failed request + * @param \Exception $exception Exception to add and associate with + * + * @return self + */ + public function addFailedRequestWithException(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \Exception $exception) + { + $this->add($exception)->addFailedRequest($request)->exceptionForRequest[spl_object_hash($request)] = $exception; + return $this; + } + /** + * Get the Exception that caused the given $request to fail + * + * @param RequestInterface $request Failed command + * + * @return \Exception|null + */ + public function getExceptionForFailedRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $oid = spl_object_hash($request); + return isset($this->exceptionForRequest[$oid]) ? $this->exceptionForRequest[$oid] : null; + } + /** + * Set all of the successful requests + * + * @param array Array of requests + * + * @return self + */ + public function setSuccessfulRequests(array $requests) + { + $this->successfulRequests = $requests; + return $this; + } + /** + * Set all of the failed requests + * + * @param array Array of requests + * + * @return self + */ + public function setFailedRequests(array $requests) + { + $this->failedRequests = $requests; + return $this; + } + /** + * Get an array of successful requests sent in the multi transfer + * + * @return array + */ + public function getSuccessfulRequests() + { + return $this->successfulRequests; + } + /** + * Get an array of failed requests sent in the multi transfer + * + * @return array + */ + public function getFailedRequests() + { + return $this->failedRequests; + } + /** + * Check if the exception object contains a request + * + * @param RequestInterface $request Request to check + * + * @return bool + */ + public function containsRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + return in_array($request, $this->failedRequests, true) || in_array($request, $this->successfulRequests, true); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Exception/RequestException.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Exception/RequestException.php new file mode 100644 index 00000000..8d01781a --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Exception/RequestException.php @@ -0,0 +1,35 @@ +request = $request; + return $this; + } + /** + * Get the request that caused the exception + * + * @return RequestInterface + */ + public function getRequest() + { + return $this->request; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Exception/ServerErrorResponseException.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Exception/ServerErrorResponseException.php new file mode 100644 index 00000000..4629ce52 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Exception/ServerErrorResponseException.php @@ -0,0 +1,10 @@ +eventDispatcher = $eventDispatcher; + return $this; + } + public function getEventDispatcher() + { + if (!$this->eventDispatcher) { + $this->eventDispatcher = new \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcher(); + } + return $this->eventDispatcher; + } + public function dispatch($eventName, array $context = array()) + { + return $this->getEventDispatcher()->dispatch($eventName, new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event($context)); + } + /** + * {@inheritdoc} + * @codeCoverageIgnore + */ + public function addSubscriber(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface $subscriber) + { + $this->getEventDispatcher()->addSubscriber($subscriber); + return $this; + } + public function read($length) + { + $event = array('body' => $this, 'length' => $length, 'read' => $this->body->read($length)); + $this->dispatch('body.read', $event); + return $event['read']; + } + public function write($string) + { + $event = array('body' => $this, 'write' => $string, 'result' => $this->body->write($string)); + $this->dispatch('body.write', $event); + return $event['result']; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/AbstractMessage.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/AbstractMessage.php new file mode 100644 index 00000000..78deafec --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/AbstractMessage.php @@ -0,0 +1,186 @@ +params = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection(); + $this->headerFactory = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Header\HeaderFactory(); + $this->headers = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Header\HeaderCollection(); + } + /** + * Set the header factory to use to create headers + * + * @param HeaderFactoryInterface $factory + * + * @return self + */ + public function setHeaderFactory(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Header\HeaderFactoryInterface $factory) + { + $this->headerFactory = $factory; + return $this; + } + public function getParams() + { + return $this->params; + } + public function addHeader($header, $value) + { + if (isset($this->headers[$header])) { + $this->headers[$header]->add($value); + } elseif ($value instanceof HeaderInterface) { + $this->headers[$header] = $value; + } else { + $this->headers[$header] = $this->headerFactory->createHeader($header, $value); + } + return $this; + } + public function addHeaders(array $headers) + { + foreach ($headers as $key => $value) { + $this->addHeader($key, $value); + } + return $this; + } + public function getHeader($header) + { + return $this->headers[$header]; + } + public function getHeaders() + { + return $this->headers; + } + public function getHeaderLines() + { + $headers = array(); + foreach ($this->headers as $value) { + $headers[] = $value->getName() . ': ' . $value; + } + return $headers; + } + public function setHeader($header, $value) + { + unset($this->headers[$header]); + $this->addHeader($header, $value); + return $this; + } + public function setHeaders(array $headers) + { + $this->headers->clear(); + foreach ($headers as $key => $value) { + $this->addHeader($key, $value); + } + return $this; + } + public function hasHeader($header) + { + return isset($this->headers[$header]); + } + public function removeHeader($header) + { + unset($this->headers[$header]); + return $this; + } + /** + * @deprecated Use $message->getHeader()->parseParams() + * @codeCoverageIgnore + */ + public function getTokenizedHeader($header, $token = ';') + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader()->parseParams()'); + if ($this->hasHeader($header)) { + $data = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection(); + foreach ($this->getHeader($header)->parseParams() as $values) { + foreach ($values as $key => $value) { + if ($value === '') { + $data->set($data->count(), $key); + } else { + $data->add($key, $value); + } + } + } + return $data; + } + } + /** + * @deprecated + * @codeCoverageIgnore + */ + public function setTokenizedHeader($header, $data, $token = ';') + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated.'); + return $this; + } + /** + * @deprecated + * @codeCoverageIgnore + */ + public function getCacheControlDirective($directive) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->getDirective()'); + if (!($header = $this->getHeader('Cache-Control'))) { + return null; + } + return $header->getDirective($directive); + } + /** + * @deprecated + * @codeCoverageIgnore + */ + public function hasCacheControlDirective($directive) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->hasDirective()'); + if ($header = $this->getHeader('Cache-Control')) { + return $header->hasDirective($directive); + } else { + return false; + } + } + /** + * @deprecated + * @codeCoverageIgnore + */ + public function addCacheControlDirective($directive, $value = true) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->addDirective()'); + if (!($header = $this->getHeader('Cache-Control'))) { + $this->addHeader('Cache-Control', ''); + $header = $this->getHeader('Cache-Control'); + } + $header->addDirective($directive, $value); + return $this; + } + /** + * @deprecated + * @codeCoverageIgnore + */ + public function removeCacheControlDirective($directive) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->removeDirective()'); + if ($header = $this->getHeader('Cache-Control')) { + $header->removeDirective($directive); + } + return $this; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequest.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequest.php new file mode 100644 index 00000000..6985cfd8 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequest.php @@ -0,0 +1,206 @@ +postFields = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryString(); + parent::__construct($method, $url, $headers); + } + /** + * @return string + */ + public function __toString() + { + // Only attempt to include the POST data if it's only fields + if (count($this->postFields) && empty($this->postFiles)) { + return parent::__toString() . (string) $this->postFields; + } + return parent::__toString() . $this->body; + } + public function setState($state, array $context = array()) + { + parent::setState($state, $context); + if ($state == self::STATE_TRANSFER && !$this->body && !count($this->postFields) && !count($this->postFiles)) { + $this->setHeader('Content-Length', 0)->removeHeader('Transfer-Encoding'); + } + return $this->state; + } + public function setBody($body, $contentType = null) + { + $this->body = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory($body); + // Auto detect the Content-Type from the path of the request if possible + if ($contentType === null && !$this->hasHeader('Content-Type')) { + $contentType = $this->body->getContentType(); + } + if ($contentType) { + $this->setHeader('Content-Type', $contentType); + } + // Always add the Expect 100-Continue header if the body cannot be rewound. This helps with redirects. + if (!$this->body->isSeekable() && $this->expectCutoff !== false) { + $this->setHeader('Expect', '100-Continue'); + } + // Set the Content-Length header if it can be determined + $size = $this->body->getContentLength(); + if ($size !== null && $size !== false) { + $this->setHeader('Content-Length', $size); + if ($size > $this->expectCutoff) { + $this->setHeader('Expect', '100-Continue'); + } + } elseif (!$this->hasHeader('Content-Length')) { + if ('1.1' == $this->protocolVersion) { + $this->setHeader('Transfer-Encoding', 'chunked'); + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\RequestException('Cannot determine Content-Length and cannot use chunked Transfer-Encoding when using HTTP/1.0'); + } + } + return $this; + } + public function getBody() + { + return $this->body; + } + /** + * Set the size that the entity body of the request must exceed before adding the Expect: 100-Continue header. + * + * @param int|bool $size Cutoff in bytes. Set to false to never send the expect header (even with non-seekable data) + * + * @return self + */ + public function setExpectHeaderCutoff($size) + { + $this->expectCutoff = $size; + if ($size === false || !$this->body) { + $this->removeHeader('Expect'); + } elseif ($this->body && $this->body->getSize() && $this->body->getSize() > $size) { + $this->setHeader('Expect', '100-Continue'); + } + return $this; + } + public function configureRedirects($strict = false, $maxRedirects = 5) + { + $this->getParams()->set(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\RedirectPlugin::STRICT_REDIRECTS, $strict); + if ($maxRedirects == 0) { + $this->getParams()->set(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\RedirectPlugin::DISABLE, true); + } else { + $this->getParams()->set(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\RedirectPlugin::MAX_REDIRECTS, $maxRedirects); + } + return $this; + } + public function getPostField($field) + { + return $this->postFields->get($field); + } + public function getPostFields() + { + return $this->postFields; + } + public function setPostField($key, $value) + { + $this->postFields->set($key, $value); + $this->processPostFields(); + return $this; + } + public function addPostFields($fields) + { + $this->postFields->merge($fields); + $this->processPostFields(); + return $this; + } + public function removePostField($field) + { + $this->postFields->remove($field); + $this->processPostFields(); + return $this; + } + public function getPostFiles() + { + return $this->postFiles; + } + public function getPostFile($fieldName) + { + return isset($this->postFiles[$fieldName]) ? $this->postFiles[$fieldName] : null; + } + public function removePostFile($fieldName) + { + unset($this->postFiles[$fieldName]); + $this->processPostFields(); + return $this; + } + public function addPostFile($field, $filename = null, $contentType = null, $postname = null) + { + $data = null; + if ($field instanceof PostFileInterface) { + $data = $field; + } elseif (is_array($filename)) { + // Allow multiple values to be set in a single key + foreach ($filename as $file) { + $this->addPostFile($field, $file, $contentType); + } + return $this; + } elseif (!is_string($filename)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\RequestException('The path to a file must be a string'); + } elseif (!empty($filename)) { + // Adding an empty file will cause cURL to error out + $data = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\PostFile($field, $filename, $contentType, $postname); + } + if ($data) { + if (!isset($this->postFiles[$data->getFieldName()])) { + $this->postFiles[$data->getFieldName()] = array($data); + } else { + $this->postFiles[$data->getFieldName()][] = $data; + } + $this->processPostFields(); + } + return $this; + } + public function addPostFiles(array $files) + { + foreach ($files as $key => $file) { + if ($file instanceof PostFileInterface) { + $this->addPostFile($file, null, null, false); + } elseif (is_string($file)) { + // Convert non-associative array keys into 'file' + if (is_numeric($key)) { + $key = 'file'; + } + $this->addPostFile($key, $file, null, false); + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\RequestException('File must be a string or instance of PostFileInterface'); + } + } + return $this; + } + /** + * Determine what type of request should be sent based on post fields + */ + protected function processPostFields() + { + if (!$this->postFiles) { + $this->removeHeader('Expect')->setHeader('Content-Type', self::URL_ENCODED); + } else { + $this->setHeader('Content-Type', self::MULTIPART); + if ($this->expectCutoff !== false) { + $this->setHeader('Expect', '100-Continue'); + } + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequestInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequestInterface.php new file mode 100644 index 00000000..2256041b --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequestInterface.php @@ -0,0 +1,123 @@ + filenames where filename can be a string or PostFileInterface + * + * @return self + */ + public function addPostFiles(array $files); + /** + * Configure how redirects are handled for the request + * + * @param bool $strict Set to true to follow strict RFC compliance when redirecting POST requests. Most + * browsers with follow a 301-302 redirect for a POST request with a GET request. This is + * the default behavior of Guzzle. Enable strict redirects to redirect these responses + * with a POST rather than a GET request. + * @param int $maxRedirects Specify the maximum number of allowed redirects. Set to 0 to disable redirects. + * + * @return self + */ + public function configureRedirects($strict = false, $maxRedirects = 5); +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header.php new file mode 100644 index 00000000..99350b9f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header.php @@ -0,0 +1,153 @@ +header = trim($header); + $this->glue = $glue; + foreach ((array) $values as $value) { + foreach ((array) $value as $v) { + $this->values[] = $v; + } + } + } + public function __toString() + { + return implode($this->glue . ' ', $this->toArray()); + } + public function add($value) + { + $this->values[] = $value; + return $this; + } + public function getName() + { + return $this->header; + } + public function setName($name) + { + $this->header = $name; + return $this; + } + public function setGlue($glue) + { + $this->glue = $glue; + return $this; + } + public function getGlue() + { + return $this->glue; + } + /** + * Normalize the header to be a single header with an array of values. + * + * If any values of the header contains the glue string value (e.g. ","), then the value will be exploded into + * multiple entries in the header. + * + * @return self + */ + public function normalize() + { + $values = $this->toArray(); + for ($i = 0, $total = count($values); $i < $total; $i++) { + if (strpos($values[$i], $this->glue) !== false) { + // Explode on glue when the glue is not inside of a comma + foreach (preg_split('/' . preg_quote($this->glue) . '(?=([^"]*"[^"]*")*[^"]*$)/', $values[$i]) as $v) { + $values[] = trim($v); + } + unset($values[$i]); + } + } + $this->values = array_values($values); + return $this; + } + public function hasValue($searchValue) + { + return in_array($searchValue, $this->toArray()); + } + public function removeValue($searchValue) + { + $this->values = array_values(array_filter($this->values, function ($value) use($searchValue) { + return $value != $searchValue; + })); + return $this; + } + public function toArray() + { + return $this->values; + } + public function count() + { + return count($this->toArray()); + } + public function getIterator() + { + return new \ArrayIterator($this->toArray()); + } + public function parseParams() + { + $params = $matches = array(); + $callback = array($this, 'trimHeader'); + // Normalize the header into a single array and iterate over all values + foreach ($this->normalize()->toArray() as $val) { + $part = array(); + foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { + if (!preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { + continue; + } + $pieces = array_map($callback, $matches[0]); + $part[$pieces[0]] = isset($pieces[1]) ? $pieces[1] : ''; + } + if ($part) { + $params[] = $part; + } + } + return $params; + } + /** + * @deprecated + * @codeCoverageIgnore + */ + public function hasExactHeader($header) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated'); + return $this->header == $header; + } + /** + * @deprecated + * @codeCoverageIgnore + */ + public function raw() + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use toArray()'); + return $this->toArray(); + } + /** + * Trim a header by removing excess spaces and wrapping quotes + * + * @param $str + * + * @return string + */ + protected function trimHeader($str) + { + static $trimmed = "\"' \n\t"; + return trim($str, $trimmed); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header/CacheControl.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header/CacheControl.php new file mode 100644 index 00000000..460d0f0b --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header/CacheControl.php @@ -0,0 +1,106 @@ +directives = null; + } + public function removeValue($searchValue) + { + parent::removeValue($searchValue); + $this->directives = null; + } + /** + * Check if a specific cache control directive exists + * + * @param string $param Directive to retrieve + * + * @return bool + */ + public function hasDirective($param) + { + $directives = $this->getDirectives(); + return isset($directives[$param]); + } + /** + * Get a specific cache control directive + * + * @param string $param Directive to retrieve + * + * @return string|bool|null + */ + public function getDirective($param) + { + $directives = $this->getDirectives(); + return isset($directives[$param]) ? $directives[$param] : null; + } + /** + * Add a cache control directive + * + * @param string $param Directive to add + * @param string $value Value to set + * + * @return self + */ + public function addDirective($param, $value) + { + $directives = $this->getDirectives(); + $directives[$param] = $value; + $this->updateFromDirectives($directives); + return $this; + } + /** + * Remove a cache control directive by name + * + * @param string $param Directive to remove + * + * @return self + */ + public function removeDirective($param) + { + $directives = $this->getDirectives(); + unset($directives[$param]); + $this->updateFromDirectives($directives); + return $this; + } + /** + * Get an associative array of cache control directives + * + * @return array + */ + public function getDirectives() + { + if ($this->directives === null) { + $this->directives = array(); + foreach ($this->parseParams() as $collection) { + foreach ($collection as $key => $value) { + $this->directives[$key] = $value === '' ? true : $value; + } + } + } + return $this->directives; + } + /** + * Updates the header value based on the parsed directives + * + * @param array $directives Array of cache control directives + */ + protected function updateFromDirectives(array $directives) + { + $this->directives = $directives; + $this->values = array(); + foreach ($directives as $key => $value) { + $this->values[] = $value === true ? $key : "{$key}={$value}"; + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderCollection.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderCollection.php new file mode 100644 index 00000000..8cd150a1 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderCollection.php @@ -0,0 +1,91 @@ +headers = $headers; + } + public function __clone() + { + foreach ($this->headers as &$header) { + $header = clone $header; + } + } + /** + * Clears the header collection + */ + public function clear() + { + $this->headers = array(); + } + /** + * Set a header on the collection + * + * @param HeaderInterface $header Header to add + * + * @return self + */ + public function add(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Header\HeaderInterface $header) + { + $this->headers[strtolower($header->getName())] = $header; + return $this; + } + /** + * Get an array of header objects + * + * @return array + */ + public function getAll() + { + return $this->headers; + } + /** + * Alias of offsetGet + */ + public function get($key) + { + return $this->offsetGet($key); + } + public function count() + { + return count($this->headers); + } + public function offsetExists($offset) + { + return isset($this->headers[strtolower($offset)]); + } + public function offsetGet($offset) + { + $l = strtolower($offset); + return isset($this->headers[$l]) ? $this->headers[$l] : null; + } + public function offsetSet($offset, $value) + { + $this->add($value); + } + public function offsetUnset($offset) + { + unset($this->headers[strtolower($offset)]); + } + public function getIterator() + { + return new \ArrayIterator($this->headers); + } + public function toArray() + { + $result = array(); + foreach ($this->headers as $header) { + $result[$header->getName()] = $header->toArray(); + } + return $result; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactory.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactory.php new file mode 100644 index 00000000..e31e16be --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactory.php @@ -0,0 +1,18 @@ + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\CacheControl', 'link' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\Link'); + public function createHeader($header, $value = null) + { + $lowercase = strtolower($header); + return isset($this->mapping[$lowercase]) ? new $this->mapping[$lowercase]($header, $value) : new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Header($header, $value); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactoryInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactoryInterface.php new file mode 100644 index 00000000..c1e5a59a --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactoryInterface.php @@ -0,0 +1,19 @@ +", "rel=\"{$rel}\""); + foreach ($params as $k => $v) { + $values[] = "{$k}=\"{$v}\""; + } + return $this->add(implode('; ', $values)); + } + /** + * Check if a specific link exists for a given rel attribute + * + * @param string $rel rel value + * + * @return bool + */ + public function hasLink($rel) + { + return $this->getLink($rel) !== null; + } + /** + * Get a specific link for a given rel attribute + * + * @param string $rel Rel value + * + * @return array|null + */ + public function getLink($rel) + { + foreach ($this->getLinks() as $link) { + if (isset($link['rel']) && $link['rel'] == $rel) { + return $link; + } + } + return null; + } + /** + * Get an associative array of links + * + * For example: + * Link: ; rel=front; type="image/jpeg", ; rel=back; type="image/jpeg" + * + * + * var_export($response->getLinks()); + * array( + * array( + * 'url' => 'http:/.../front.jpeg', + * 'rel' => 'back', + * 'type' => 'image/jpeg', + * ) + * ) + * + * + * @return array + */ + public function getLinks() + { + $links = $this->parseParams(); + foreach ($links as &$link) { + $key = key($link); + unset($link[$key]); + $link['url'] = trim($key, '<> '); + } + return $links; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/MessageInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/MessageInterface.php new file mode 100644 index 00000000..f253e6a4 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/MessageInterface.php @@ -0,0 +1,92 @@ +fieldName = $fieldName; + $this->setFilename($filename); + $this->postname = $postname ? $postname : basename($filename); + $this->contentType = $contentType ?: $this->guessContentType(); + } + public function setFieldName($name) + { + $this->fieldName = $name; + return $this; + } + public function getFieldName() + { + return $this->fieldName; + } + public function setFilename($filename) + { + // Remove leading @ symbol + if (strpos($filename, '@') === 0) { + $filename = substr($filename, 1); + } + if (!is_readable($filename)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException("Unable to open {$filename} for reading"); + } + $this->filename = $filename; + return $this; + } + public function setPostname($postname) + { + $this->postname = $postname; + return $this; + } + public function getFilename() + { + return $this->filename; + } + public function getPostname() + { + return $this->postname; + } + public function setContentType($type) + { + $this->contentType = $type; + return $this; + } + public function getContentType() + { + return $this->contentType; + } + public function getCurlValue() + { + // PHP 5.5 introduced a CurlFile object that deprecates the old @filename syntax + // See: https://wiki.php.net/rfc/curl-file-upload + if (function_exists('curl_file_create')) { + return curl_file_create($this->filename, $this->contentType, $this->postname); + } + // Use the old style if using an older version of PHP + $value = "@{$this->filename};filename=" . $this->postname; + if ($this->contentType) { + $value .= ';type=' . $this->contentType; + } + return $value; + } + /** + * @deprecated + * @codeCoverageIgnore + */ + public function getCurlString() + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use getCurlValue()'); + return $this->getCurlValue(); + } + /** + * Determine the Content-Type of the file + */ + protected function guessContentType() + { + return \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Mimetypes::getInstance()->fromFilename($this->filename) ?: 'application/octet-stream'; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/PostFileInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/PostFileInterface.php new file mode 100644 index 00000000..f054929e --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/PostFileInterface.php @@ -0,0 +1,74 @@ +method = strtoupper($method); + $this->curlOptions = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection(); + $this->setUrl($url); + if ($headers) { + // Special handling for multi-value headers + foreach ($headers as $key => $value) { + // Deal with collisions with Host and Authorization + if ($key == 'host' || $key == 'Host') { + $this->setHeader($key, $value); + } elseif ($value instanceof HeaderInterface) { + $this->addHeader($key, $value); + } else { + foreach ((array) $value as $v) { + $this->addHeader($key, $v); + } + } + } + } + $this->setState(self::STATE_NEW); + } + public function __clone() + { + if ($this->eventDispatcher) { + $this->eventDispatcher = clone $this->eventDispatcher; + } + $this->curlOptions = clone $this->curlOptions; + $this->params = clone $this->params; + $this->url = clone $this->url; + $this->response = $this->responseBody = null; + $this->headers = clone $this->headers; + $this->setState(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_NEW); + $this->dispatch('request.clone', array('request' => $this)); + } + /** + * Get the HTTP request as a string + * + * @return string + */ + public function __toString() + { + return $this->getRawHeaders() . "\r\n\r\n"; + } + /** + * Default method that will throw exceptions if an unsuccessful response is received. + * + * @param Event $event Received + * @throws BadResponseException if the response is not successful + */ + public static function onRequestError(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $e = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\BadResponseException::factory($event['request'], $event['response']); + $event['request']->setState(self::STATE_ERROR, array('exception' => $e) + $event->toArray()); + throw $e; + } + public function setClient(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\ClientInterface $client) + { + $this->client = $client; + return $this; + } + public function getClient() + { + return $this->client; + } + public function getRawHeaders() + { + $protocolVersion = $this->protocolVersion ?: '1.1'; + return trim($this->method . ' ' . $this->getResource()) . ' ' . strtoupper(str_replace('https', 'http', $this->url->getScheme())) . '/' . $protocolVersion . "\r\n" . implode("\r\n", $this->getHeaderLines()); + } + public function setUrl($url) + { + if ($url instanceof Url) { + $this->url = $url; + } else { + $this->url = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Url::factory($url); + } + // Update the port and host header + $this->setPort($this->url->getPort()); + if ($this->url->getUsername() || $this->url->getPassword()) { + $this->setAuth($this->url->getUsername(), $this->url->getPassword()); + // Remove the auth info from the URL + $this->url->setUsername(null); + $this->url->setPassword(null); + } + return $this; + } + public function send() + { + if (!$this->client) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException('A client must be set on the request'); + } + return $this->client->send($this); + } + public function getResponse() + { + return $this->response; + } + public function getQuery($asString = false) + { + return $asString ? (string) $this->url->getQuery() : $this->url->getQuery(); + } + public function getMethod() + { + return $this->method; + } + public function getScheme() + { + return $this->url->getScheme(); + } + public function setScheme($scheme) + { + $this->url->setScheme($scheme); + return $this; + } + public function getHost() + { + return $this->url->getHost(); + } + public function setHost($host) + { + $this->url->setHost($host); + $this->setPort($this->url->getPort()); + return $this; + } + public function getProtocolVersion() + { + return $this->protocolVersion; + } + public function setProtocolVersion($protocol) + { + $this->protocolVersion = $protocol; + return $this; + } + public function getPath() + { + return '/' . ltrim($this->url->getPath(), '/'); + } + public function setPath($path) + { + $this->url->setPath($path); + return $this; + } + public function getPort() + { + return $this->url->getPort(); + } + public function setPort($port) + { + $this->url->setPort($port); + // Include the port in the Host header if it is not the default port for the scheme of the URL + $scheme = $this->url->getScheme(); + if ($port && ($scheme == 'http' && $port != 80 || $scheme == 'https' && $port != 443)) { + $this->headers['host'] = $this->headerFactory->createHeader('Host', $this->url->getHost() . ':' . $port); + } else { + $this->headers['host'] = $this->headerFactory->createHeader('Host', $this->url->getHost()); + } + return $this; + } + public function getUsername() + { + return $this->username; + } + public function getPassword() + { + return $this->password; + } + public function setAuth($user, $password = '', $scheme = CURLAUTH_BASIC) + { + static $authMap = array('basic' => CURLAUTH_BASIC, 'digest' => CURLAUTH_DIGEST, 'ntlm' => CURLAUTH_NTLM, 'any' => CURLAUTH_ANY); + // If we got false or null, disable authentication + if (!$user) { + $this->password = $this->username = null; + $this->removeHeader('Authorization'); + $this->getCurlOptions()->remove(CURLOPT_HTTPAUTH); + return $this; + } + if (!is_numeric($scheme)) { + $scheme = strtolower($scheme); + if (!isset($authMap[$scheme])) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException($scheme . ' is not a valid authentication type'); + } + $scheme = $authMap[$scheme]; + } + $this->username = $user; + $this->password = $password; + // Bypass CURL when using basic auth to promote connection reuse + if ($scheme == CURLAUTH_BASIC) { + $this->getCurlOptions()->remove(CURLOPT_HTTPAUTH); + $this->setHeader('Authorization', 'Basic ' . base64_encode($this->username . ':' . $this->password)); + } else { + $this->getCurlOptions()->set(CURLOPT_HTTPAUTH, $scheme)->set(CURLOPT_USERPWD, $this->username . ':' . $this->password); + } + return $this; + } + public function getResource() + { + $resource = $this->getPath(); + if ($query = (string) $this->url->getQuery()) { + $resource .= '?' . $query; + } + return $resource; + } + public function getUrl($asObject = false) + { + return $asObject ? clone $this->url : (string) $this->url; + } + public function getState() + { + return $this->state; + } + public function setState($state, array $context = array()) + { + $oldState = $this->state; + $this->state = $state; + switch ($state) { + case self::STATE_NEW: + $this->response = null; + break; + case self::STATE_TRANSFER: + if ($oldState !== $state) { + // Fix Content-Length and Transfer-Encoding collisions + if ($this->hasHeader('Transfer-Encoding') && $this->hasHeader('Content-Length')) { + $this->removeHeader('Transfer-Encoding'); + } + $this->dispatch('request.before_send', array('request' => $this)); + } + break; + case self::STATE_COMPLETE: + if ($oldState !== $state) { + $this->processResponse($context); + $this->responseBody = null; + } + break; + case self::STATE_ERROR: + if (isset($context['exception'])) { + $this->dispatch('request.exception', array('request' => $this, 'response' => isset($context['response']) ? $context['response'] : $this->response, 'exception' => isset($context['exception']) ? $context['exception'] : null)); + } + } + return $this->state; + } + public function getCurlOptions() + { + return $this->curlOptions; + } + public function startResponse(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + $this->state = self::STATE_TRANSFER; + $response->setEffectiveUrl((string) $this->getUrl()); + $this->response = $response; + return $this; + } + public function setResponse(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response, $queued = false) + { + $response->setEffectiveUrl((string) $this->url); + if ($queued) { + $ed = $this->getEventDispatcher(); + $ed->addListener('request.before_send', $f = function ($e) use($response, &$f, $ed) { + $e['request']->setResponse($response); + $ed->removeListener('request.before_send', $f); + }, -9999); + } else { + $this->response = $response; + // If a specific response body is specified, then use it instead of the response's body + if ($this->responseBody && !$this->responseBody->getCustomData('default') && !$response->isRedirect()) { + $this->getResponseBody()->write((string) $this->response->getBody()); + } else { + $this->responseBody = $this->response->getBody(); + } + $this->setState(self::STATE_COMPLETE); + } + return $this; + } + public function setResponseBody($body) + { + // Attempt to open a file for writing if a string was passed + if (is_string($body)) { + // @codeCoverageIgnoreStart + if (!($body = fopen($body, 'w+'))) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Could not open ' . $body . ' for writing'); + } + // @codeCoverageIgnoreEnd + } + $this->responseBody = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory($body); + return $this; + } + public function getResponseBody() + { + if ($this->responseBody === null) { + $this->responseBody = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory()->setCustomData('default', true); + } + return $this->responseBody; + } + /** + * Determine if the response body is repeatable (readable + seekable) + * + * @return bool + * @deprecated Use getResponseBody()->isSeekable() + * @codeCoverageIgnore + */ + public function isResponseBodyRepeatable() + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use $request->getResponseBody()->isRepeatable()'); + return !$this->responseBody ? true : $this->responseBody->isRepeatable(); + } + public function getCookies() + { + if ($cookie = $this->getHeader('Cookie')) { + $data = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Parser\ParserRegistry::getInstance()->getParser('cookie')->parseCookie($cookie); + return $data['cookies']; + } + return array(); + } + public function getCookie($name) + { + $cookies = $this->getCookies(); + return isset($cookies[$name]) ? $cookies[$name] : null; + } + public function addCookie($name, $value) + { + if (!$this->hasHeader('Cookie')) { + $this->setHeader('Cookie', "{$name}={$value}"); + } else { + $this->getHeader('Cookie')->add("{$name}={$value}"); + } + // Always use semicolons to separate multiple cookie headers + $this->getHeader('Cookie')->setGlue(';'); + return $this; + } + public function removeCookie($name) + { + if ($cookie = $this->getHeader('Cookie')) { + foreach ($cookie as $cookieValue) { + if (strpos($cookieValue, $name . '=') === 0) { + $cookie->removeValue($cookieValue); + } + } + } + return $this; + } + public function setEventDispatcher(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcherInterface $eventDispatcher) + { + $this->eventDispatcher = $eventDispatcher; + $this->eventDispatcher->addListener('request.error', array(__CLASS__, 'onRequestError'), -255); + return $this; + } + public function getEventDispatcher() + { + if (!$this->eventDispatcher) { + $this->setEventDispatcher(new \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcher()); + } + return $this->eventDispatcher; + } + public function dispatch($eventName, array $context = array()) + { + $context['request'] = $this; + return $this->getEventDispatcher()->dispatch($eventName, new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event($context)); + } + public function addSubscriber(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface $subscriber) + { + $this->getEventDispatcher()->addSubscriber($subscriber); + return $this; + } + /** + * Get an array containing the request and response for event notifications + * + * @return array + */ + protected function getEventArray() + { + return array('request' => $this, 'response' => $this->response); + } + /** + * Process a received response + * + * @param array $context Contextual information + * @throws RequestException|BadResponseException on unsuccessful responses + */ + protected function processResponse(array $context = array()) + { + if (!$this->response) { + // If no response, then processResponse shouldn't have been called + $e = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\RequestException('Error completing request'); + $e->setRequest($this); + throw $e; + } + $this->state = self::STATE_COMPLETE; + // A request was sent, but we don't know if we'll send more or if the final response will be successful + $this->dispatch('request.sent', $this->getEventArray() + $context); + // Some response processors will remove the response or reset the state (example: ExponentialBackoffPlugin) + if ($this->state == \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_COMPLETE) { + // The request completed, so the HTTP transaction is complete + $this->dispatch('request.complete', $this->getEventArray()); + // If the response is bad, allow listeners to modify it or throw exceptions. You can change the response by + // modifying the Event object in your listeners or calling setResponse() on the request + if ($this->response->isError()) { + $event = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event($this->getEventArray()); + $this->getEventDispatcher()->dispatch('request.error', $event); + // Allow events of request.error to quietly change the response + if ($event['response'] !== $this->response) { + $this->response = $event['response']; + } + } + // If a successful response was received, dispatch an event + if ($this->response->isSuccessful()) { + $this->dispatch('request.success', $this->getEventArray()); + } + } + } + /** + * @deprecated Use Guzzle\Plugin\Cache\DefaultCanCacheStrategy + * @codeCoverageIgnore + */ + public function canCache() + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy.'); + if (class_exists('DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy')) { + $canCache = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cache\DefaultCanCacheStrategy(); + return $canCache->canCacheRequest($this); + } else { + return false; + } + } + /** + * @deprecated Use the history plugin (not emitting a warning as this is built-into the RedirectPlugin for now) + * @codeCoverageIgnore + */ + public function setIsRedirect($isRedirect) + { + $this->isRedirect = $isRedirect; + return $this; + } + /** + * @deprecated Use the history plugin + * @codeCoverageIgnore + */ + public function isRedirect() + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use the HistoryPlugin to track this.'); + return $this->isRedirect; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactory.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactory.php new file mode 100644 index 00000000..e2ba5d44 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactory.php @@ -0,0 +1,304 @@ +methods = array_flip(get_class_methods(__CLASS__)); + } + public function fromMessage($message) + { + $parsed = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Parser\ParserRegistry::getInstance()->getParser('message')->parseRequest($message); + if (!$parsed) { + return false; + } + $request = $this->fromParts($parsed['method'], $parsed['request_url'], $parsed['headers'], $parsed['body'], $parsed['protocol'], $parsed['version']); + // EntityEnclosingRequest adds an "Expect: 100-Continue" header when using a raw request body for PUT or POST + // requests. This factory method should accurately reflect the message, so here we are removing the Expect + // header if one was not supplied in the message. + if (!isset($parsed['headers']['Expect']) && !isset($parsed['headers']['expect'])) { + $request->removeHeader('Expect'); + } + return $request; + } + public function fromParts($method, array $urlParts, $headers = null, $body = null, $protocol = 'HTTP', $protocolVersion = '1.1') + { + return $this->create($method, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Url::buildUrl($urlParts), $headers, $body)->setProtocolVersion($protocolVersion); + } + public function create($method, $url, $headers = null, $body = null, array $options = array()) + { + $method = strtoupper($method); + if ($method == 'GET' || $method == 'HEAD' || $method == 'TRACE') { + // Handle non-entity-enclosing request methods + $request = new $this->requestClass($method, $url, $headers); + if ($body) { + // The body is where the response body will be stored + $type = gettype($body); + if ($type == 'string' || $type == 'resource' || $type == 'object') { + $request->setResponseBody($body); + } + } + } else { + // Create an entity enclosing request by default + $request = new $this->entityEnclosingRequestClass($method, $url, $headers); + if ($body || $body === '0') { + // Add POST fields and files to an entity enclosing request if an array is used + if (is_array($body) || $body instanceof Collection) { + // Normalize PHP style cURL uploads with a leading '@' symbol + foreach ($body as $key => $value) { + if (is_string($value) && substr($value, 0, 1) == '@') { + $request->addPostFile($key, $value); + unset($body[$key]); + } + } + // Add the fields if they are still present and not all files + $request->addPostFields($body); + } else { + // Add a raw entity body body to the request + $request->setBody($body, (string) $request->getHeader('Content-Type')); + if ((string) $request->getHeader('Transfer-Encoding') == 'chunked') { + $request->removeHeader('Content-Length'); + } + } + } + } + if ($options) { + $this->applyOptions($request, $options); + } + return $request; + } + /** + * Clone a request while changing the method. Emulates the behavior of + * {@see Guzzle\Http\Message\Request::clone}, but can change the HTTP method. + * + * @param RequestInterface $request Request to clone + * @param string $method Method to set + * + * @return RequestInterface + */ + public function cloneRequestWithMethod(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $method) + { + // Create the request with the same client if possible + if ($request->getClient()) { + $cloned = $request->getClient()->createRequest($method, $request->getUrl(), $request->getHeaders()); + } else { + $cloned = $this->create($method, $request->getUrl(), $request->getHeaders()); + } + $cloned->getCurlOptions()->replace($request->getCurlOptions()->toArray()); + $cloned->setEventDispatcher(clone $request->getEventDispatcher()); + // Ensure that that the Content-Length header is not copied if changing to GET or HEAD + if (!$cloned instanceof EntityEnclosingRequestInterface) { + $cloned->removeHeader('Content-Length'); + } elseif ($request instanceof EntityEnclosingRequestInterface) { + $cloned->setBody($request->getBody()); + } + $cloned->getParams()->replace($request->getParams()->toArray()); + $cloned->dispatch('request.clone', array('request' => $cloned)); + return $cloned; + } + public function applyOptions(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, array $options = array(), $flags = self::OPTIONS_NONE) + { + // Iterate over each key value pair and attempt to apply a config using function visitors + foreach ($options as $key => $value) { + $method = "visit_{$key}"; + if (isset($this->methods[$method])) { + $this->{$method}($request, $value, $flags); + } + } + } + protected function visit_headers(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('headers value must be an array'); + } + if ($flags & self::OPTIONS_AS_DEFAULTS) { + // Merge headers in but do not overwrite existing values + foreach ($value as $key => $header) { + if (!$request->hasHeader($key)) { + $request->setHeader($key, $header); + } + } + } else { + $request->addHeaders($value); + } + } + protected function visit_body(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if ($request instanceof EntityEnclosingRequestInterface) { + $request->setBody($value); + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Attempting to set a body on a non-entity-enclosing request'); + } + } + protected function visit_allow_redirects(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if ($value === false) { + $request->getParams()->set(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\RedirectPlugin::DISABLE, true); + } + } + protected function visit_auth(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('auth value must be an array'); + } + $request->setAuth($value[0], isset($value[1]) ? $value[1] : null, isset($value[2]) ? $value[2] : 'basic'); + } + protected function visit_query(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('query value must be an array'); + } + if ($flags & self::OPTIONS_AS_DEFAULTS) { + // Merge query string values in but do not overwrite existing values + $query = $request->getQuery(); + $query->overwriteWith(array_diff_key($value, $query->toArray())); + } else { + $request->getQuery()->overwriteWith($value); + } + } + protected function visit_cookies(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('cookies value must be an array'); + } + foreach ($value as $name => $v) { + $request->addCookie($name, $v); + } + } + protected function visit_events(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('events value must be an array'); + } + foreach ($value as $name => $method) { + if (is_array($method)) { + $request->getEventDispatcher()->addListener($name, $method[0], $method[1]); + } else { + $request->getEventDispatcher()->addListener($name, $method); + } + } + } + protected function visit_plugins(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('plugins value must be an array'); + } + foreach ($value as $plugin) { + $request->addSubscriber($plugin); + } + } + protected function visit_exceptions(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if ($value === false || $value === 0) { + $dispatcher = $request->getEventDispatcher(); + foreach ($dispatcher->getListeners('request.error') as $listener) { + if (is_array($listener) && $listener[0] == 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Request' && ($listener[1] = 'onRequestError')) { + $dispatcher->removeListener('request.error', $listener); + break; + } + } + } + } + protected function visit_save_to(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + $request->setResponseBody($value); + } + protected function visit_params(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('params value must be an array'); + } + $request->getParams()->overwriteWith($value); + } + protected function visit_timeout(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if (defined('CURLOPT_TIMEOUT_MS')) { + $request->getCurlOptions()->set(CURLOPT_TIMEOUT_MS, $value * 1000); + } else { + $request->getCurlOptions()->set(CURLOPT_TIMEOUT, $value); + } + } + protected function visit_connect_timeout(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if (defined('CURLOPT_CONNECTTIMEOUT_MS')) { + $request->getCurlOptions()->set(CURLOPT_CONNECTTIMEOUT_MS, $value * 1000); + } else { + $request->getCurlOptions()->set(CURLOPT_CONNECTTIMEOUT, $value); + } + } + protected function visit_debug(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if ($value) { + $request->getCurlOptions()->set(CURLOPT_VERBOSE, true); + } + } + protected function visit_verify(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + $curl = $request->getCurlOptions(); + if ($value === true || is_string($value)) { + $curl[CURLOPT_SSL_VERIFYHOST] = 2; + $curl[CURLOPT_SSL_VERIFYPEER] = true; + if ($value !== true) { + $curl[CURLOPT_CAINFO] = $value; + } + } elseif ($value === false) { + unset($curl[CURLOPT_CAINFO]); + $curl[CURLOPT_SSL_VERIFYHOST] = 0; + $curl[CURLOPT_SSL_VERIFYPEER] = false; + } + } + protected function visit_proxy(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + $request->getCurlOptions()->set(CURLOPT_PROXY, $value, $flags); + } + protected function visit_cert(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if (is_array($value)) { + $request->getCurlOptions()->set(CURLOPT_SSLCERT, $value[0]); + $request->getCurlOptions()->set(CURLOPT_SSLCERTPASSWD, $value[1]); + } else { + $request->getCurlOptions()->set(CURLOPT_SSLCERT, $value); + } + } + protected function visit_ssl_key(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $value, $flags) + { + if (is_array($value)) { + $request->getCurlOptions()->set(CURLOPT_SSLKEY, $value[0]); + $request->getCurlOptions()->set(CURLOPT_SSLKEYPASSWD, $value[1]); + } else { + $request->getCurlOptions()->set(CURLOPT_SSLKEY, $value); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactoryInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactoryInterface.php new file mode 100644 index 00000000..ece01cbc --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactoryInterface.php @@ -0,0 +1,93 @@ + 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-Status', 208 => 'Already Reported', 226 => 'IM Used', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 308 => 'Permanent Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Reserved for WebDAV advanced collections expired proposal', 426 => 'Upgrade required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 506 => 'Variant Also Negotiates (Experimental)', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 510 => 'Not Extended', 511 => 'Network Authentication Required'); + /** @var EntityBodyInterface The response body */ + protected $body; + /** @var string The reason phrase of the response (human readable code) */ + protected $reasonPhrase; + /** @var string The status code of the response */ + protected $statusCode; + /** @var array Information about the request */ + protected $info = array(); + /** @var string The effective URL that returned this response */ + protected $effectiveUrl; + /** @var array Cacheable response codes (see RFC 2616:13.4) */ + protected static $cacheResponseCodes = array(200, 203, 206, 300, 301, 410); + /** + * Create a new Response based on a raw response message + * + * @param string $message Response message + * + * @return self|bool Returns false on error + */ + public static function fromMessage($message) + { + $data = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Parser\ParserRegistry::getInstance()->getParser('message')->parseResponse($message); + if (!$data) { + return false; + } + $response = new static($data['code'], $data['headers'], $data['body']); + $response->setProtocol($data['protocol'], $data['version'])->setStatus($data['code'], $data['reason_phrase']); + // Set the appropriate Content-Length if the one set is inaccurate (e.g. setting to X) + $contentLength = (string) $response->getHeader('Content-Length'); + $actualLength = strlen($data['body']); + if (strlen($data['body']) > 0 && $contentLength != $actualLength) { + $response->setHeader('Content-Length', $actualLength); + } + return $response; + } + /** + * Construct the response + * + * @param string $statusCode The response status code (e.g. 200, 404, etc) + * @param ToArrayInterface|array $headers The response headers + * @param string|resource|EntityBodyInterface $body The body of the response + * + * @throws BadResponseException if an invalid response code is given + */ + public function __construct($statusCode, $headers = null, $body = null) + { + parent::__construct(); + $this->setStatus($statusCode); + $this->body = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory($body !== null ? $body : ''); + if ($headers) { + if (is_array($headers)) { + $this->setHeaders($headers); + } elseif ($headers instanceof ToArrayInterface) { + $this->setHeaders($headers->toArray()); + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\BadResponseException('Invalid headers argument received'); + } + } + } + /** + * @return string + */ + public function __toString() + { + return $this->getMessage(); + } + public function serialize() + { + return json_encode(array('status' => $this->statusCode, 'body' => (string) $this->body, 'headers' => $this->headers->toArray())); + } + public function unserialize($serialize) + { + $data = json_decode($serialize, true); + $this->__construct($data['status'], $data['headers'], $data['body']); + } + /** + * Get the response entity body + * + * @param bool $asString Set to TRUE to return a string of the body rather than a full body object + * + * @return EntityBodyInterface|string + */ + public function getBody($asString = false) + { + return $asString ? (string) $this->body : $this->body; + } + /** + * Set the response entity body + * + * @param EntityBodyInterface|string $body Body to set + * + * @return self + */ + public function setBody($body) + { + $this->body = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory($body); + return $this; + } + /** + * Set the protocol and protocol version of the response + * + * @param string $protocol Response protocol + * @param string $version Protocol version + * + * @return self + */ + public function setProtocol($protocol, $version) + { + $this->protocol = $protocol; + $this->protocolVersion = $version; + return $this; + } + /** + * Get the protocol used for the response (e.g. HTTP) + * + * @return string + */ + public function getProtocol() + { + return $this->protocol; + } + /** + * Get the HTTP protocol version + * + * @return string + */ + public function getProtocolVersion() + { + return $this->protocolVersion; + } + /** + * Get a cURL transfer information + * + * @param string $key A single statistic to check + * + * @return array|string|null Returns all stats if no key is set, a single stat if a key is set, or null if a key + * is set and not found + * @link http://www.php.net/manual/en/function.curl-getinfo.php + */ + public function getInfo($key = null) + { + if ($key === null) { + return $this->info; + } elseif (array_key_exists($key, $this->info)) { + return $this->info[$key]; + } else { + return null; + } + } + /** + * Set the transfer information + * + * @param array $info Array of cURL transfer stats + * + * @return self + */ + public function setInfo(array $info) + { + $this->info = $info; + return $this; + } + /** + * Set the response status + * + * @param int $statusCode Response status code to set + * @param string $reasonPhrase Response reason phrase + * + * @return self + * @throws BadResponseException when an invalid response code is received + */ + public function setStatus($statusCode, $reasonPhrase = '') + { + $this->statusCode = (int) $statusCode; + if (!$reasonPhrase && isset(self::$statusTexts[$this->statusCode])) { + $this->reasonPhrase = self::$statusTexts[$this->statusCode]; + } else { + $this->reasonPhrase = $reasonPhrase; + } + return $this; + } + /** + * Get the response status code + * + * @return integer + */ + public function getStatusCode() + { + return $this->statusCode; + } + /** + * Get the entire response as a string + * + * @return string + */ + public function getMessage() + { + $message = $this->getRawHeaders(); + // Only include the body in the message if the size is < 2MB + $size = $this->body->getSize(); + if ($size < 2097152) { + $message .= (string) $this->body; + } + return $message; + } + /** + * Get the the raw message headers as a string + * + * @return string + */ + public function getRawHeaders() + { + $headers = 'HTTP/1.1 ' . $this->statusCode . ' ' . $this->reasonPhrase . "\r\n"; + $lines = $this->getHeaderLines(); + if (!empty($lines)) { + $headers .= implode("\r\n", $lines) . "\r\n"; + } + return $headers . "\r\n"; + } + /** + * Get the response reason phrase- a human readable version of the numeric + * status code + * + * @return string + */ + public function getReasonPhrase() + { + return $this->reasonPhrase; + } + /** + * Get the Accept-Ranges HTTP header + * + * @return string Returns what partial content range types this server supports. + */ + public function getAcceptRanges() + { + return (string) $this->getHeader('Accept-Ranges'); + } + /** + * Calculate the age of the response + * + * @return integer + */ + public function calculateAge() + { + $age = $this->getHeader('Age'); + if ($age === null && $this->getDate()) { + $age = time() - strtotime($this->getDate()); + } + return $age === null ? null : (int) (string) $age; + } + /** + * Get the Age HTTP header + * + * @return integer|null Returns the age the object has been in a proxy cache in seconds. + */ + public function getAge() + { + return (string) $this->getHeader('Age'); + } + /** + * Get the Allow HTTP header + * + * @return string|null Returns valid actions for a specified resource. To be used for a 405 Method not allowed. + */ + public function getAllow() + { + return (string) $this->getHeader('Allow'); + } + /** + * Check if an HTTP method is allowed by checking the Allow response header + * + * @param string $method Method to check + * + * @return bool + */ + public function isMethodAllowed($method) + { + $allow = $this->getHeader('Allow'); + if ($allow) { + foreach (explode(',', $allow) as $allowable) { + if (!strcasecmp(trim($allowable), $method)) { + return true; + } + } + } + return false; + } + /** + * Get the Cache-Control HTTP header + * + * @return string + */ + public function getCacheControl() + { + return (string) $this->getHeader('Cache-Control'); + } + /** + * Get the Connection HTTP header + * + * @return string + */ + public function getConnection() + { + return (string) $this->getHeader('Connection'); + } + /** + * Get the Content-Encoding HTTP header + * + * @return string|null + */ + public function getContentEncoding() + { + return (string) $this->getHeader('Content-Encoding'); + } + /** + * Get the Content-Language HTTP header + * + * @return string|null Returns the language the content is in. + */ + public function getContentLanguage() + { + return (string) $this->getHeader('Content-Language'); + } + /** + * Get the Content-Length HTTP header + * + * @return integer Returns the length of the response body in bytes + */ + public function getContentLength() + { + return (int) (string) $this->getHeader('Content-Length'); + } + /** + * Get the Content-Location HTTP header + * + * @return string|null Returns an alternate location for the returned data (e.g /index.htm) + */ + public function getContentLocation() + { + return (string) $this->getHeader('Content-Location'); + } + /** + * Get the Content-Disposition HTTP header + * + * @return string|null Returns the Content-Disposition header + */ + public function getContentDisposition() + { + return (string) $this->getHeader('Content-Disposition'); + } + /** + * Get the Content-MD5 HTTP header + * + * @return string|null Returns a Base64-encoded binary MD5 sum of the content of the response. + */ + public function getContentMd5() + { + return (string) $this->getHeader('Content-MD5'); + } + /** + * Get the Content-Range HTTP header + * + * @return string Returns where in a full body message this partial message belongs (e.g. bytes 21010-47021/47022). + */ + public function getContentRange() + { + return (string) $this->getHeader('Content-Range'); + } + /** + * Get the Content-Type HTTP header + * + * @return string Returns the mime type of this content. + */ + public function getContentType() + { + return (string) $this->getHeader('Content-Type'); + } + /** + * Checks if the Content-Type is of a certain type. This is useful if the + * Content-Type header contains charset information and you need to know if + * the Content-Type matches a particular type. + * + * @param string $type Content type to check against + * + * @return bool + */ + public function isContentType($type) + { + return stripos($this->getHeader('Content-Type'), $type) !== false; + } + /** + * Get the Date HTTP header + * + * @return string|null Returns the date and time that the message was sent. + */ + public function getDate() + { + return (string) $this->getHeader('Date'); + } + /** + * Get the ETag HTTP header + * + * @return string|null Returns an identifier for a specific version of a resource, often a Message digest. + */ + public function getEtag() + { + return (string) $this->getHeader('ETag'); + } + /** + * Get the Expires HTTP header + * + * @return string|null Returns the date/time after which the response is considered stale. + */ + public function getExpires() + { + return (string) $this->getHeader('Expires'); + } + /** + * Get the Last-Modified HTTP header + * + * @return string|null Returns the last modified date for the requested object, in RFC 2822 format + * (e.g. Tue, 15 Nov 1994 12:45:26 GMT) + */ + public function getLastModified() + { + return (string) $this->getHeader('Last-Modified'); + } + /** + * Get the Location HTTP header + * + * @return string|null Used in redirection, or when a new resource has been created. + */ + public function getLocation() + { + return (string) $this->getHeader('Location'); + } + /** + * Get the Pragma HTTP header + * + * @return Header|null Returns the implementation-specific headers that may have various effects anywhere along + * the request-response chain. + */ + public function getPragma() + { + return (string) $this->getHeader('Pragma'); + } + /** + * Get the Proxy-Authenticate HTTP header + * + * @return string|null Authentication to access the proxy (e.g. Basic) + */ + public function getProxyAuthenticate() + { + return (string) $this->getHeader('Proxy-Authenticate'); + } + /** + * Get the Retry-After HTTP header + * + * @return int|null If an entity is temporarily unavailable, this instructs the client to try again after a + * specified period of time. + */ + public function getRetryAfter() + { + return (string) $this->getHeader('Retry-After'); + } + /** + * Get the Server HTTP header + * + * @return string|null A name for the server + */ + public function getServer() + { + return (string) $this->getHeader('Server'); + } + /** + * Get the Set-Cookie HTTP header + * + * @return string|null An HTTP cookie. + */ + public function getSetCookie() + { + return (string) $this->getHeader('Set-Cookie'); + } + /** + * Get the Trailer HTTP header + * + * @return string|null The Trailer general field value indicates that the given set of header fields is present in + * the trailer of a message encoded with chunked transfer-coding. + */ + public function getTrailer() + { + return (string) $this->getHeader('Trailer'); + } + /** + * Get the Transfer-Encoding HTTP header + * + * @return string|null The form of encoding used to safely transfer the entity to the user + */ + public function getTransferEncoding() + { + return (string) $this->getHeader('Transfer-Encoding'); + } + /** + * Get the Vary HTTP header + * + * @return string|null Tells downstream proxies how to match future request headers to decide whether the cached + * response can be used rather than requesting a fresh one from the origin server. + */ + public function getVary() + { + return (string) $this->getHeader('Vary'); + } + /** + * Get the Via HTTP header + * + * @return string|null Informs the client of proxies through which the response was sent. + */ + public function getVia() + { + return (string) $this->getHeader('Via'); + } + /** + * Get the Warning HTTP header + * + * @return string|null A general warning about possible problems with the entity body + */ + public function getWarning() + { + return (string) $this->getHeader('Warning'); + } + /** + * Get the WWW-Authenticate HTTP header + * + * @return string|null Indicates the authentication scheme that should be used to access the requested entity + */ + public function getWwwAuthenticate() + { + return (string) $this->getHeader('WWW-Authenticate'); + } + /** + * Checks if HTTP Status code is a Client Error (4xx) + * + * @return bool + */ + public function isClientError() + { + return $this->statusCode >= 400 && $this->statusCode < 500; + } + /** + * Checks if HTTP Status code is Server OR Client Error (4xx or 5xx) + * + * @return boolean + */ + public function isError() + { + return $this->isClientError() || $this->isServerError(); + } + /** + * Checks if HTTP Status code is Information (1xx) + * + * @return bool + */ + public function isInformational() + { + return $this->statusCode < 200; + } + /** + * Checks if HTTP Status code is a Redirect (3xx) + * + * @return bool + */ + public function isRedirect() + { + return $this->statusCode >= 300 && $this->statusCode < 400; + } + /** + * Checks if HTTP Status code is Server Error (5xx) + * + * @return bool + */ + public function isServerError() + { + return $this->statusCode >= 500 && $this->statusCode < 600; + } + /** + * Checks if HTTP Status code is Successful (2xx | 304) + * + * @return bool + */ + public function isSuccessful() + { + return $this->statusCode >= 200 && $this->statusCode < 300 || $this->statusCode == 304; + } + /** + * Check if the response can be cached based on the response headers + * + * @return bool Returns TRUE if the response can be cached or false if not + */ + public function canCache() + { + // Check if the response is cacheable based on the code + if (!in_array((int) $this->getStatusCode(), self::$cacheResponseCodes)) { + return false; + } + // Make sure a valid body was returned and can be cached + if ((!$this->getBody()->isReadable() || !$this->getBody()->isSeekable()) && ($this->getContentLength() > 0 || $this->getTransferEncoding() == 'chunked')) { + return false; + } + // Never cache no-store resources (this is a private cache, so private + // can be cached) + if ($this->getHeader('Cache-Control') && $this->getHeader('Cache-Control')->hasDirective('no-store')) { + return false; + } + return $this->isFresh() || $this->getFreshness() === null || $this->canValidate(); + } + /** + * Gets the number of seconds from the current time in which this response is still considered fresh + * + * @return int|null Returns the number of seconds + */ + public function getMaxAge() + { + if ($header = $this->getHeader('Cache-Control')) { + // s-max-age, then max-age, then Expires + if ($age = $header->getDirective('s-maxage')) { + return $age; + } + if ($age = $header->getDirective('max-age')) { + return $age; + } + } + if ($this->getHeader('Expires')) { + return strtotime($this->getExpires()) - time(); + } + return null; + } + /** + * Check if the response is considered fresh. + * + * A response is considered fresh when its age is less than or equal to the freshness lifetime (maximum age) of the + * response. + * + * @return bool|null + */ + public function isFresh() + { + $fresh = $this->getFreshness(); + return $fresh === null ? null : $fresh >= 0; + } + /** + * Check if the response can be validated against the origin server using a conditional GET request. + * + * @return bool + */ + public function canValidate() + { + return $this->getEtag() || $this->getLastModified(); + } + /** + * Get the freshness of the response by returning the difference of the maximum lifetime of the response and the + * age of the response (max-age - age). + * + * Freshness values less than 0 mean that the response is no longer fresh and is ABS(freshness) seconds expired. + * Freshness values of greater than zero is the number of seconds until the response is no longer fresh. A NULL + * result means that no freshness information is available. + * + * @return int + */ + public function getFreshness() + { + $maxAge = $this->getMaxAge(); + $age = $this->calculateAge(); + return $maxAge && $age ? $maxAge - $age : null; + } + /** + * Parse the JSON response body and return an array + * + * @return array|string|int|bool|float + * @throws RuntimeException if the response body is not in JSON format + */ + public function json() + { + $data = json_decode((string) $this->body, true); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException('Unable to parse response body into JSON: ' . json_last_error()); + } + return $data === null ? array() : $data; + } + /** + * Parse the XML response body and return a \SimpleXMLElement. + * + * In order to prevent XXE attacks, this method disables loading external + * entities. If you rely on external entities, then you must parse the + * XML response manually by accessing the response body directly. + * + * @return \SimpleXMLElement + * @throws RuntimeException if the response body is not in XML format + * @link http://websec.io/2012/08/27/Preventing-XXE-in-PHP.html + */ + public function xml() + { + $errorMessage = null; + $internalErrors = libxml_use_internal_errors(true); + $disableEntities = libxml_disable_entity_loader(true); + libxml_clear_errors(); + try { + $xml = new \SimpleXMLElement((string) $this->body ?: '', LIBXML_NONET); + if ($error = libxml_get_last_error()) { + $errorMessage = $error->message; + } + } catch (\Exception $e) { + $errorMessage = $e->getMessage(); + } + libxml_clear_errors(); + libxml_use_internal_errors($internalErrors); + libxml_disable_entity_loader($disableEntities); + if ($errorMessage) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException('Unable to parse response body into XML: ' . $errorMessage); + } + return $xml; + } + /** + * Get the redirect count of this response + * + * @return int + */ + public function getRedirectCount() + { + return (int) $this->params->get(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\RedirectPlugin::REDIRECT_COUNT); + } + /** + * Set the effective URL that resulted in this response (e.g. the last redirect URL) + * + * @param string $url The effective URL + * + * @return self + */ + public function setEffectiveUrl($url) + { + $this->effectiveUrl = $url; + return $this; + } + /** + * Get the effective URL that resulted in this response (e.g. the last redirect URL) + * + * @return string + */ + public function getEffectiveUrl() + { + return $this->effectiveUrl; + } + /** + * @deprecated + * @codeCoverageIgnore + */ + public function getPreviousResponse() + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated. Use the HistoryPlugin.'); + return null; + } + /** + * @deprecated + * @codeCoverageIgnore + */ + public function setRequest($request) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated'); + return $this; + } + /** + * @deprecated + * @codeCoverageIgnore + */ + public function getRequest() + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated'); + return null; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Mimetypes.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Mimetypes.php new file mode 100644 index 00000000..c90f6112 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Mimetypes.php @@ -0,0 +1,52 @@ + 'text/vnd.in3d.3dml', '3g2' => 'video/3gpp2', '3gp' => 'video/3gpp', '7z' => 'application/x-7z-compressed', 'aab' => 'application/x-authorware-bin', 'aac' => 'audio/x-aac', 'aam' => 'application/x-authorware-map', 'aas' => 'application/x-authorware-seg', 'abw' => 'application/x-abiword', 'ac' => 'application/pkix-attr-cert', 'acc' => 'application/vnd.americandynamics.acc', 'ace' => 'application/x-ace-compressed', 'acu' => 'application/vnd.acucobol', 'acutc' => 'application/vnd.acucorp', 'adp' => 'audio/adpcm', 'aep' => 'application/vnd.audiograph', 'afm' => 'application/x-font-type1', 'afp' => 'application/vnd.ibm.modcap', 'ahead' => 'application/vnd.ahead.space', 'ai' => 'application/postscript', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'air' => 'application/vnd.adobe.air-application-installer-package+zip', 'ait' => 'application/vnd.dvb.ait', 'ami' => 'application/vnd.amiga.ami', 'apk' => 'application/vnd.android.package-archive', 'application' => 'application/x-ms-application', 'apr' => 'application/vnd.lotus-approach', 'asa' => 'text/plain', 'asax' => 'application/octet-stream', 'asc' => 'application/pgp-signature', 'ascx' => 'text/plain', 'asf' => 'video/x-ms-asf', 'ashx' => 'text/plain', 'asm' => 'text/x-asm', 'asmx' => 'text/plain', 'aso' => 'application/vnd.accpac.simply.aso', 'asp' => 'text/plain', 'aspx' => 'text/plain', 'asx' => 'video/x-ms-asf', 'atc' => 'application/vnd.acucorp', 'atom' => 'application/atom+xml', 'atomcat' => 'application/atomcat+xml', 'atomsvc' => 'application/atomsvc+xml', 'atx' => 'application/vnd.antix.game-component', 'au' => 'audio/basic', 'avi' => 'video/x-msvideo', 'aw' => 'application/applixware', 'axd' => 'text/plain', 'azf' => 'application/vnd.airzip.filesecure.azf', 'azs' => 'application/vnd.airzip.filesecure.azs', 'azw' => 'application/vnd.amazon.ebook', 'bat' => 'application/x-msdownload', 'bcpio' => 'application/x-bcpio', 'bdf' => 'application/x-font-bdf', 'bdm' => 'application/vnd.syncml.dm+wbxml', 'bed' => 'application/vnd.realvnc.bed', 'bh2' => 'application/vnd.fujitsu.oasysprs', 'bin' => 'application/octet-stream', 'bmi' => 'application/vnd.bmi', 'bmp' => 'image/bmp', 'book' => 'application/vnd.framemaker', 'box' => 'application/vnd.previewsystems.box', 'boz' => 'application/x-bzip2', 'bpk' => 'application/octet-stream', 'btif' => 'image/prs.btif', 'bz' => 'application/x-bzip', 'bz2' => 'application/x-bzip2', 'c' => 'text/x-c', 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', 'c4d' => 'application/vnd.clonk.c4group', 'c4f' => 'application/vnd.clonk.c4group', 'c4g' => 'application/vnd.clonk.c4group', 'c4p' => 'application/vnd.clonk.c4group', 'c4u' => 'application/vnd.clonk.c4group', 'cab' => 'application/vnd.ms-cab-compressed', 'car' => 'application/vnd.curl.car', 'cat' => 'application/vnd.ms-pki.seccat', 'cc' => 'text/x-c', 'cct' => 'application/x-director', 'ccxml' => 'application/ccxml+xml', 'cdbcmsg' => 'application/vnd.contact.cmsg', 'cdf' => 'application/x-netcdf', 'cdkey' => 'application/vnd.mediastation.cdkey', 'cdmia' => 'application/cdmi-capability', 'cdmic' => 'application/cdmi-container', 'cdmid' => 'application/cdmi-domain', 'cdmio' => 'application/cdmi-object', 'cdmiq' => 'application/cdmi-queue', 'cdx' => 'chemical/x-cdx', 'cdxml' => 'application/vnd.chemdraw+xml', 'cdy' => 'application/vnd.cinderella', 'cer' => 'application/pkix-cert', 'cfc' => 'application/x-coldfusion', 'cfm' => 'application/x-coldfusion', 'cgm' => 'image/cgm', 'chat' => 'application/x-chat', 'chm' => 'application/vnd.ms-htmlhelp', 'chrt' => 'application/vnd.kde.kchart', 'cif' => 'chemical/x-cif', 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', 'cil' => 'application/vnd.ms-artgalry', 'cla' => 'application/vnd.claymore', 'class' => 'application/java-vm', 'clkk' => 'application/vnd.crick.clicker.keyboard', 'clkp' => 'application/vnd.crick.clicker.palette', 'clkt' => 'application/vnd.crick.clicker.template', 'clkw' => 'application/vnd.crick.clicker.wordbank', 'clkx' => 'application/vnd.crick.clicker', 'clp' => 'application/x-msclip', 'cmc' => 'application/vnd.cosmocaller', 'cmdf' => 'chemical/x-cmdf', 'cml' => 'chemical/x-cml', 'cmp' => 'application/vnd.yellowriver-custom-menu', 'cmx' => 'image/x-cmx', 'cod' => 'application/vnd.rim.cod', 'com' => 'application/x-msdownload', 'conf' => 'text/plain', 'cpio' => 'application/x-cpio', 'cpp' => 'text/x-c', 'cpt' => 'application/mac-compactpro', 'crd' => 'application/x-mscardfile', 'crl' => 'application/pkix-crl', 'crt' => 'application/x-x509-ca-cert', 'cryptonote' => 'application/vnd.rig.cryptonote', 'cs' => 'text/plain', 'csh' => 'application/x-csh', 'csml' => 'chemical/x-csml', 'csp' => 'application/vnd.commonspace', 'css' => 'text/css', 'cst' => 'application/x-director', 'csv' => 'text/csv', 'cu' => 'application/cu-seeme', 'curl' => 'text/vnd.curl', 'cww' => 'application/prs.cww', 'cxt' => 'application/x-director', 'cxx' => 'text/x-c', 'dae' => 'model/vnd.collada+xml', 'daf' => 'application/vnd.mobius.daf', 'dataless' => 'application/vnd.fdsn.seed', 'davmount' => 'application/davmount+xml', 'dcr' => 'application/x-director', 'dcurl' => 'text/vnd.curl.dcurl', 'dd2' => 'application/vnd.oma.dd2+xml', 'ddd' => 'application/vnd.fujixerox.ddd', 'deb' => 'application/x-debian-package', 'def' => 'text/plain', 'deploy' => 'application/octet-stream', 'der' => 'application/x-x509-ca-cert', 'dfac' => 'application/vnd.dreamfactory', 'dic' => 'text/x-c', 'dir' => 'application/x-director', 'dis' => 'application/vnd.mobius.dis', 'dist' => 'application/octet-stream', 'distz' => 'application/octet-stream', 'djv' => 'image/vnd.djvu', 'djvu' => 'image/vnd.djvu', 'dll' => 'application/x-msdownload', 'dmg' => 'application/octet-stream', 'dms' => 'application/octet-stream', 'dna' => 'application/vnd.dna', 'doc' => 'application/msword', 'docm' => 'application/vnd.ms-word.document.macroenabled.12', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dot' => 'application/msword', 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dp' => 'application/vnd.osgi.dp', 'dpg' => 'application/vnd.dpgraph', 'dra' => 'audio/vnd.dra', 'dsc' => 'text/prs.lines.tag', 'dssc' => 'application/dssc+der', 'dtb' => 'application/x-dtbook+xml', 'dtd' => 'application/xml-dtd', 'dts' => 'audio/vnd.dts', 'dtshd' => 'audio/vnd.dts.hd', 'dump' => 'application/octet-stream', 'dvi' => 'application/x-dvi', 'dwf' => 'model/vnd.dwf', 'dwg' => 'image/vnd.dwg', 'dxf' => 'image/vnd.dxf', 'dxp' => 'application/vnd.spotfire.dxp', 'dxr' => 'application/x-director', 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', 'ecma' => 'application/ecmascript', 'edm' => 'application/vnd.novadigm.edm', 'edx' => 'application/vnd.novadigm.edx', 'efif' => 'application/vnd.picsel', 'ei6' => 'application/vnd.pg.osasli', 'elc' => 'application/octet-stream', 'eml' => 'message/rfc822', 'emma' => 'application/emma+xml', 'eol' => 'audio/vnd.digital-winds', 'eot' => 'application/vnd.ms-fontobject', 'eps' => 'application/postscript', 'epub' => 'application/epub+zip', 'es3' => 'application/vnd.eszigno3+xml', 'esf' => 'application/vnd.epson.esf', 'et3' => 'application/vnd.eszigno3+xml', 'etx' => 'text/x-setext', 'exe' => 'application/x-msdownload', 'exi' => 'application/exi', 'ext' => 'application/vnd.novadigm.ext', 'ez' => 'application/andrew-inset', 'ez2' => 'application/vnd.ezpix-album', 'ez3' => 'application/vnd.ezpix-package', 'f' => 'text/x-fortran', 'f4v' => 'video/x-f4v', 'f77' => 'text/x-fortran', 'f90' => 'text/x-fortran', 'fbs' => 'image/vnd.fastbidsheet', 'fcs' => 'application/vnd.isac.fcs', 'fdf' => 'application/vnd.fdf', 'fe_launch' => 'application/vnd.denovo.fcselayout-link', 'fg5' => 'application/vnd.fujitsu.oasysgp', 'fgd' => 'application/x-director', 'fh' => 'image/x-freehand', 'fh4' => 'image/x-freehand', 'fh5' => 'image/x-freehand', 'fh7' => 'image/x-freehand', 'fhc' => 'image/x-freehand', 'fig' => 'application/x-xfig', 'fli' => 'video/x-fli', 'flo' => 'application/vnd.micrografx.flo', 'flv' => 'video/x-flv', 'flw' => 'application/vnd.kde.kivio', 'flx' => 'text/vnd.fmi.flexstor', 'fly' => 'text/vnd.fly', 'fm' => 'application/vnd.framemaker', 'fnc' => 'application/vnd.frogans.fnc', 'for' => 'text/x-fortran', 'fpx' => 'image/vnd.fpx', 'frame' => 'application/vnd.framemaker', 'fsc' => 'application/vnd.fsc.weblaunch', 'fst' => 'image/vnd.fst', 'ftc' => 'application/vnd.fluxtime.clip', 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', 'fvt' => 'video/vnd.fvt', 'fxp' => 'application/vnd.adobe.fxp', 'fxpl' => 'application/vnd.adobe.fxp', 'fzs' => 'application/vnd.fuzzysheet', 'g2w' => 'application/vnd.geoplan', 'g3' => 'image/g3fax', 'g3w' => 'application/vnd.geospace', 'gac' => 'application/vnd.groove-account', 'gdl' => 'model/vnd.gdl', 'geo' => 'application/vnd.dynageo', 'gex' => 'application/vnd.geometry-explorer', 'ggb' => 'application/vnd.geogebra.file', 'ggt' => 'application/vnd.geogebra.tool', 'ghf' => 'application/vnd.groove-help', 'gif' => 'image/gif', 'gim' => 'application/vnd.groove-identity-message', 'gmx' => 'application/vnd.gmx', 'gnumeric' => 'application/x-gnumeric', 'gph' => 'application/vnd.flographit', 'gqf' => 'application/vnd.grafeq', 'gqs' => 'application/vnd.grafeq', 'gram' => 'application/srgs', 'gre' => 'application/vnd.geometry-explorer', 'grv' => 'application/vnd.groove-injector', 'grxml' => 'application/srgs+xml', 'gsf' => 'application/x-font-ghostscript', 'gtar' => 'application/x-gtar', 'gtm' => 'application/vnd.groove-tool-message', 'gtw' => 'model/vnd.gtw', 'gv' => 'text/vnd.graphviz', 'gxt' => 'application/vnd.geonext', 'h' => 'text/x-c', 'h261' => 'video/h261', 'h263' => 'video/h263', 'h264' => 'video/h264', 'hal' => 'application/vnd.hal+xml', 'hbci' => 'application/vnd.hbci', 'hdf' => 'application/x-hdf', 'hh' => 'text/x-c', 'hlp' => 'application/winhlp', 'hpgl' => 'application/vnd.hp-hpgl', 'hpid' => 'application/vnd.hp-hpid', 'hps' => 'application/vnd.hp-hps', 'hqx' => 'application/mac-binhex40', 'hta' => 'application/octet-stream', 'htc' => 'text/html', 'htke' => 'application/vnd.kenameaapp', 'htm' => 'text/html', 'html' => 'text/html', 'hvd' => 'application/vnd.yamaha.hv-dic', 'hvp' => 'application/vnd.yamaha.hv-voice', 'hvs' => 'application/vnd.yamaha.hv-script', 'i2g' => 'application/vnd.intergeo', 'icc' => 'application/vnd.iccprofile', 'ice' => 'x-conference/x-cooltalk', 'icm' => 'application/vnd.iccprofile', 'ico' => 'image/x-icon', 'ics' => 'text/calendar', 'ief' => 'image/ief', 'ifb' => 'text/calendar', 'ifm' => 'application/vnd.shana.informed.formdata', 'iges' => 'model/iges', 'igl' => 'application/vnd.igloader', 'igm' => 'application/vnd.insors.igm', 'igs' => 'model/iges', 'igx' => 'application/vnd.micrografx.igx', 'iif' => 'application/vnd.shana.informed.interchange', 'imp' => 'application/vnd.accpac.simply.imp', 'ims' => 'application/vnd.ms-ims', 'in' => 'text/plain', 'ini' => 'text/plain', 'ipfix' => 'application/ipfix', 'ipk' => 'application/vnd.shana.informed.package', 'irm' => 'application/vnd.ibm.rights-management', 'irp' => 'application/vnd.irepository.package+xml', 'iso' => 'application/octet-stream', 'itp' => 'application/vnd.shana.informed.formtemplate', 'ivp' => 'application/vnd.immervision-ivp', 'ivu' => 'application/vnd.immervision-ivu', 'jad' => 'text/vnd.sun.j2me.app-descriptor', 'jam' => 'application/vnd.jam', 'jar' => 'application/java-archive', 'java' => 'text/x-java-source', 'jisp' => 'application/vnd.jisp', 'jlt' => 'application/vnd.hp-jlyt', 'jnlp' => 'application/x-java-jnlp-file', 'joda' => 'application/vnd.joost.joda-archive', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'jpgm' => 'video/jpm', 'jpgv' => 'video/jpeg', 'jpm' => 'video/jpm', 'js' => 'text/javascript', 'json' => 'application/json', 'kar' => 'audio/midi', 'karbon' => 'application/vnd.kde.karbon', 'kfo' => 'application/vnd.kde.kformula', 'kia' => 'application/vnd.kidspiration', 'kml' => 'application/vnd.google-earth.kml+xml', 'kmz' => 'application/vnd.google-earth.kmz', 'kne' => 'application/vnd.kinar', 'knp' => 'application/vnd.kinar', 'kon' => 'application/vnd.kde.kontour', 'kpr' => 'application/vnd.kde.kpresenter', 'kpt' => 'application/vnd.kde.kpresenter', 'ksp' => 'application/vnd.kde.kspread', 'ktr' => 'application/vnd.kahootz', 'ktx' => 'image/ktx', 'ktz' => 'application/vnd.kahootz', 'kwd' => 'application/vnd.kde.kword', 'kwt' => 'application/vnd.kde.kword', 'lasxml' => 'application/vnd.las.las+xml', 'latex' => 'application/x-latex', 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', 'les' => 'application/vnd.hhe.lesson-player', 'lha' => 'application/octet-stream', 'link66' => 'application/vnd.route66.link66+xml', 'list' => 'text/plain', 'list3820' => 'application/vnd.ibm.modcap', 'listafp' => 'application/vnd.ibm.modcap', 'log' => 'text/plain', 'lostxml' => 'application/lost+xml', 'lrf' => 'application/octet-stream', 'lrm' => 'application/vnd.ms-lrm', 'ltf' => 'application/vnd.frogans.ltf', 'lvp' => 'audio/vnd.lucent.voice', 'lwp' => 'application/vnd.lotus-wordpro', 'lzh' => 'application/octet-stream', 'm13' => 'application/x-msmediaview', 'm14' => 'application/x-msmediaview', 'm1v' => 'video/mpeg', 'm21' => 'application/mp21', 'm2a' => 'audio/mpeg', 'm2v' => 'video/mpeg', 'm3a' => 'audio/mpeg', 'm3u' => 'audio/x-mpegurl', 'm3u8' => 'application/vnd.apple.mpegurl', 'm4a' => 'audio/mp4', 'm4u' => 'video/vnd.mpegurl', 'm4v' => 'video/mp4', 'ma' => 'application/mathematica', 'mads' => 'application/mads+xml', 'mag' => 'application/vnd.ecowin.chart', 'maker' => 'application/vnd.framemaker', 'man' => 'text/troff', 'mathml' => 'application/mathml+xml', 'mb' => 'application/mathematica', 'mbk' => 'application/vnd.mobius.mbk', 'mbox' => 'application/mbox', 'mc1' => 'application/vnd.medcalcdata', 'mcd' => 'application/vnd.mcd', 'mcurl' => 'text/vnd.curl.mcurl', 'mdb' => 'application/x-msaccess', 'mdi' => 'image/vnd.ms-modi', 'me' => 'text/troff', 'mesh' => 'model/mesh', 'meta4' => 'application/metalink4+xml', 'mets' => 'application/mets+xml', 'mfm' => 'application/vnd.mfmp', 'mgp' => 'application/vnd.osgeo.mapguide.package', 'mgz' => 'application/vnd.proteus.magazine', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mif' => 'application/vnd.mif', 'mime' => 'message/rfc822', 'mj2' => 'video/mj2', 'mjp2' => 'video/mj2', 'mlp' => 'application/vnd.dolby.mlp', 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', 'mmf' => 'application/vnd.smaf', 'mmr' => 'image/vnd.fujixerox.edmics-mmr', 'mny' => 'application/x-msmoney', 'mobi' => 'application/x-mobipocket-ebook', 'mods' => 'application/mods+xml', 'mov' => 'video/quicktime', 'movie' => 'video/x-sgi-movie', 'mp2' => 'audio/mpeg', 'mp21' => 'application/mp21', 'mp2a' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', 'mp4s' => 'application/mp4', 'mp4v' => 'video/mp4', 'mpc' => 'application/vnd.mophun.certificate', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpg4' => 'video/mp4', 'mpga' => 'audio/mpeg', 'mpkg' => 'application/vnd.apple.installer+xml', 'mpm' => 'application/vnd.blueice.multipass', 'mpn' => 'application/vnd.mophun.application', 'mpp' => 'application/vnd.ms-project', 'mpt' => 'application/vnd.ms-project', 'mpy' => 'application/vnd.ibm.minipay', 'mqy' => 'application/vnd.mobius.mqy', 'mrc' => 'application/marc', 'mrcx' => 'application/marcxml+xml', 'ms' => 'text/troff', 'mscml' => 'application/mediaservercontrol+xml', 'mseed' => 'application/vnd.fdsn.mseed', 'mseq' => 'application/vnd.mseq', 'msf' => 'application/vnd.epson.msf', 'msh' => 'model/mesh', 'msi' => 'application/x-msdownload', 'msl' => 'application/vnd.mobius.msl', 'msty' => 'application/vnd.muvee.style', 'mts' => 'model/vnd.mts', 'mus' => 'application/vnd.musician', 'musicxml' => 'application/vnd.recordare.musicxml+xml', 'mvb' => 'application/x-msmediaview', 'mwf' => 'application/vnd.mfer', 'mxf' => 'application/mxf', 'mxl' => 'application/vnd.recordare.musicxml', 'mxml' => 'application/xv+xml', 'mxs' => 'application/vnd.triscape.mxs', 'mxu' => 'video/vnd.mpegurl', 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', 'n3' => 'text/n3', 'nb' => 'application/mathematica', 'nbp' => 'application/vnd.wolfram.player', 'nc' => 'application/x-netcdf', 'ncx' => 'application/x-dtbncx+xml', 'ngdat' => 'application/vnd.nokia.n-gage.data', 'nlu' => 'application/vnd.neurolanguage.nlu', 'nml' => 'application/vnd.enliven', 'nnd' => 'application/vnd.noblenet-directory', 'nns' => 'application/vnd.noblenet-sealer', 'nnw' => 'application/vnd.noblenet-web', 'npx' => 'image/vnd.net-fpx', 'nsf' => 'application/vnd.lotus-notes', 'oa2' => 'application/vnd.fujitsu.oasys2', 'oa3' => 'application/vnd.fujitsu.oasys3', 'oas' => 'application/vnd.fujitsu.oasys', 'obd' => 'application/x-msbinder', 'oda' => 'application/oda', 'odb' => 'application/vnd.oasis.opendocument.database', 'odc' => 'application/vnd.oasis.opendocument.chart', 'odf' => 'application/vnd.oasis.opendocument.formula', 'odft' => 'application/vnd.oasis.opendocument.formula-template', 'odg' => 'application/vnd.oasis.opendocument.graphics', 'odi' => 'application/vnd.oasis.opendocument.image', 'odm' => 'application/vnd.oasis.opendocument.text-master', 'odp' => 'application/vnd.oasis.opendocument.presentation', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'odt' => 'application/vnd.oasis.opendocument.text', 'oga' => 'audio/ogg', 'ogg' => 'audio/ogg', 'ogv' => 'video/ogg', 'ogx' => 'application/ogg', 'onepkg' => 'application/onenote', 'onetmp' => 'application/onenote', 'onetoc' => 'application/onenote', 'onetoc2' => 'application/onenote', 'opf' => 'application/oebps-package+xml', 'oprc' => 'application/vnd.palm', 'org' => 'application/vnd.lotus-organizer', 'osf' => 'application/vnd.yamaha.openscoreformat', 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', 'otc' => 'application/vnd.oasis.opendocument.chart-template', 'otf' => 'application/x-font-otf', 'otg' => 'application/vnd.oasis.opendocument.graphics-template', 'oth' => 'application/vnd.oasis.opendocument.text-web', 'oti' => 'application/vnd.oasis.opendocument.image-template', 'otp' => 'application/vnd.oasis.opendocument.presentation-template', 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', 'ott' => 'application/vnd.oasis.opendocument.text-template', 'oxt' => 'application/vnd.openofficeorg.extension', 'p' => 'text/x-pascal', 'p10' => 'application/pkcs10', 'p12' => 'application/x-pkcs12', 'p7b' => 'application/x-pkcs7-certificates', 'p7c' => 'application/pkcs7-mime', 'p7m' => 'application/pkcs7-mime', 'p7r' => 'application/x-pkcs7-certreqresp', 'p7s' => 'application/pkcs7-signature', 'p8' => 'application/pkcs8', 'pas' => 'text/x-pascal', 'paw' => 'application/vnd.pawaafile', 'pbd' => 'application/vnd.powerbuilder6', 'pbm' => 'image/x-portable-bitmap', 'pcf' => 'application/x-font-pcf', 'pcl' => 'application/vnd.hp-pcl', 'pclxl' => 'application/vnd.hp-pclxl', 'pct' => 'image/x-pict', 'pcurl' => 'application/vnd.curl.pcurl', 'pcx' => 'image/x-pcx', 'pdb' => 'application/vnd.palm', 'pdf' => 'application/pdf', 'pfa' => 'application/x-font-type1', 'pfb' => 'application/x-font-type1', 'pfm' => 'application/x-font-type1', 'pfr' => 'application/font-tdpfr', 'pfx' => 'application/x-pkcs12', 'pgm' => 'image/x-portable-graymap', 'pgn' => 'application/x-chess-pgn', 'pgp' => 'application/pgp-encrypted', 'php' => 'text/x-php', 'phps' => 'application/x-httpd-phps', 'pic' => 'image/x-pict', 'pkg' => 'application/octet-stream', 'pki' => 'application/pkixcmp', 'pkipath' => 'application/pkix-pkipath', 'plb' => 'application/vnd.3gpp.pic-bw-large', 'plc' => 'application/vnd.mobius.plc', 'plf' => 'application/vnd.pocketlearn', 'pls' => 'application/pls+xml', 'pml' => 'application/vnd.ctc-posml', 'png' => 'image/png', 'pnm' => 'image/x-portable-anymap', 'portpkg' => 'application/vnd.macports.portpkg', 'pot' => 'application/vnd.ms-powerpoint', 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', 'ppd' => 'application/vnd.cups-ppd', 'ppm' => 'image/x-portable-pixmap', 'pps' => 'application/vnd.ms-powerpoint', 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppt' => 'application/vnd.ms-powerpoint', 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pqa' => 'application/vnd.palm', 'prc' => 'application/x-mobipocket-ebook', 'pre' => 'application/vnd.lotus-freelance', 'prf' => 'application/pics-rules', 'ps' => 'application/postscript', 'psb' => 'application/vnd.3gpp.pic-bw-small', 'psd' => 'image/vnd.adobe.photoshop', 'psf' => 'application/x-font-linux-psf', 'pskcxml' => 'application/pskc+xml', 'ptid' => 'application/vnd.pvi.ptid1', 'pub' => 'application/x-mspublisher', 'pvb' => 'application/vnd.3gpp.pic-bw-var', 'pwn' => 'application/vnd.3m.post-it-notes', 'pya' => 'audio/vnd.ms-playready.media.pya', 'pyv' => 'video/vnd.ms-playready.media.pyv', 'qam' => 'application/vnd.epson.quickanime', 'qbo' => 'application/vnd.intu.qbo', 'qfx' => 'application/vnd.intu.qfx', 'qps' => 'application/vnd.publishare-delta-tree', 'qt' => 'video/quicktime', 'qwd' => 'application/vnd.quark.quarkxpress', 'qwt' => 'application/vnd.quark.quarkxpress', 'qxb' => 'application/vnd.quark.quarkxpress', 'qxd' => 'application/vnd.quark.quarkxpress', 'qxl' => 'application/vnd.quark.quarkxpress', 'qxt' => 'application/vnd.quark.quarkxpress', 'ra' => 'audio/x-pn-realaudio', 'ram' => 'audio/x-pn-realaudio', 'rar' => 'application/x-rar-compressed', 'ras' => 'image/x-cmu-raster', 'rb' => 'text/plain', 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', 'rdf' => 'application/rdf+xml', 'rdz' => 'application/vnd.data-vision.rdz', 'rep' => 'application/vnd.businessobjects', 'res' => 'application/x-dtbresource+xml', 'resx' => 'text/xml', 'rgb' => 'image/x-rgb', 'rif' => 'application/reginfo+xml', 'rip' => 'audio/vnd.rip', 'rl' => 'application/resource-lists+xml', 'rlc' => 'image/vnd.fujixerox.edmics-rlc', 'rld' => 'application/resource-lists-diff+xml', 'rm' => 'application/vnd.rn-realmedia', 'rmi' => 'audio/midi', 'rmp' => 'audio/x-pn-realaudio-plugin', 'rms' => 'application/vnd.jcp.javame.midlet-rms', 'rnc' => 'application/relax-ng-compact-syntax', 'roff' => 'text/troff', 'rp9' => 'application/vnd.cloanto.rp9', 'rpss' => 'application/vnd.nokia.radio-presets', 'rpst' => 'application/vnd.nokia.radio-preset', 'rq' => 'application/sparql-query', 'rs' => 'application/rls-services+xml', 'rsd' => 'application/rsd+xml', 'rss' => 'application/rss+xml', 'rtf' => 'application/rtf', 'rtx' => 'text/richtext', 's' => 'text/x-asm', 'saf' => 'application/vnd.yamaha.smaf-audio', 'sbml' => 'application/sbml+xml', 'sc' => 'application/vnd.ibm.secure-container', 'scd' => 'application/x-msschedule', 'scm' => 'application/vnd.lotus-screencam', 'scq' => 'application/scvp-cv-request', 'scs' => 'application/scvp-cv-response', 'scurl' => 'text/vnd.curl.scurl', 'sda' => 'application/vnd.stardivision.draw', 'sdc' => 'application/vnd.stardivision.calc', 'sdd' => 'application/vnd.stardivision.impress', 'sdkd' => 'application/vnd.solent.sdkm+xml', 'sdkm' => 'application/vnd.solent.sdkm+xml', 'sdp' => 'application/sdp', 'sdw' => 'application/vnd.stardivision.writer', 'see' => 'application/vnd.seemail', 'seed' => 'application/vnd.fdsn.seed', 'sema' => 'application/vnd.sema', 'semd' => 'application/vnd.semd', 'semf' => 'application/vnd.semf', 'ser' => 'application/java-serialized-object', 'setpay' => 'application/set-payment-initiation', 'setreg' => 'application/set-registration-initiation', 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', 'sfs' => 'application/vnd.spotfire.sfs', 'sgl' => 'application/vnd.stardivision.writer-global', 'sgm' => 'text/sgml', 'sgml' => 'text/sgml', 'sh' => 'application/x-sh', 'shar' => 'application/x-shar', 'shf' => 'application/shf+xml', 'sig' => 'application/pgp-signature', 'silo' => 'model/mesh', 'sis' => 'application/vnd.symbian.install', 'sisx' => 'application/vnd.symbian.install', 'sit' => 'application/x-stuffit', 'sitx' => 'application/x-stuffitx', 'skd' => 'application/vnd.koan', 'skm' => 'application/vnd.koan', 'skp' => 'application/vnd.koan', 'skt' => 'application/vnd.koan', 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', 'slt' => 'application/vnd.epson.salt', 'sm' => 'application/vnd.stepmania.stepchart', 'smf' => 'application/vnd.stardivision.math', 'smi' => 'application/smil+xml', 'smil' => 'application/smil+xml', 'snd' => 'audio/basic', 'snf' => 'application/x-font-snf', 'so' => 'application/octet-stream', 'spc' => 'application/x-pkcs7-certificates', 'spf' => 'application/vnd.yamaha.smaf-phrase', 'spl' => 'application/x-futuresplash', 'spot' => 'text/vnd.in3d.spot', 'spp' => 'application/scvp-vp-response', 'spq' => 'application/scvp-vp-request', 'spx' => 'audio/ogg', 'src' => 'application/x-wais-source', 'sru' => 'application/sru+xml', 'srx' => 'application/sparql-results+xml', 'sse' => 'application/vnd.kodak-descriptor', 'ssf' => 'application/vnd.epson.ssf', 'ssml' => 'application/ssml+xml', 'st' => 'application/vnd.sailingtracker.track', 'stc' => 'application/vnd.sun.xml.calc.template', 'std' => 'application/vnd.sun.xml.draw.template', 'stf' => 'application/vnd.wt.stf', 'sti' => 'application/vnd.sun.xml.impress.template', 'stk' => 'application/hyperstudio', 'stl' => 'application/vnd.ms-pki.stl', 'str' => 'application/vnd.pg.format', 'stw' => 'application/vnd.sun.xml.writer.template', 'sub' => 'image/vnd.dvb.subtitle', 'sus' => 'application/vnd.sus-calendar', 'susp' => 'application/vnd.sus-calendar', 'sv4cpio' => 'application/x-sv4cpio', 'sv4crc' => 'application/x-sv4crc', 'svc' => 'application/vnd.dvb.service', 'svd' => 'application/vnd.svd', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', 'swa' => 'application/x-director', 'swf' => 'application/x-shockwave-flash', 'swi' => 'application/vnd.aristanetworks.swi', 'sxc' => 'application/vnd.sun.xml.calc', 'sxd' => 'application/vnd.sun.xml.draw', 'sxg' => 'application/vnd.sun.xml.writer.global', 'sxi' => 'application/vnd.sun.xml.impress', 'sxm' => 'application/vnd.sun.xml.math', 'sxw' => 'application/vnd.sun.xml.writer', 't' => 'text/troff', 'tao' => 'application/vnd.tao.intent-module-archive', 'tar' => 'application/x-tar', 'tcap' => 'application/vnd.3gpp2.tcap', 'tcl' => 'application/x-tcl', 'teacher' => 'application/vnd.smart.teacher', 'tei' => 'application/tei+xml', 'teicorpus' => 'application/tei+xml', 'tex' => 'application/x-tex', 'texi' => 'application/x-texinfo', 'texinfo' => 'application/x-texinfo', 'text' => 'text/plain', 'tfi' => 'application/thraud+xml', 'tfm' => 'application/x-tex-tfm', 'thmx' => 'application/vnd.ms-officetheme', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'tmo' => 'application/vnd.tmobile-livetv', 'torrent' => 'application/x-bittorrent', 'tpl' => 'application/vnd.groove-tool-template', 'tpt' => 'application/vnd.trid.tpt', 'tr' => 'text/troff', 'tra' => 'application/vnd.trueapp', 'trm' => 'application/x-msterminal', 'tsd' => 'application/timestamped-data', 'tsv' => 'text/tab-separated-values', 'ttc' => 'application/x-font-ttf', 'ttf' => 'application/x-font-ttf', 'ttl' => 'text/turtle', 'twd' => 'application/vnd.simtech-mindmapper', 'twds' => 'application/vnd.simtech-mindmapper', 'txd' => 'application/vnd.genomatix.tuxedo', 'txf' => 'application/vnd.mobius.txf', 'txt' => 'text/plain', 'u32' => 'application/x-authorware-bin', 'udeb' => 'application/x-debian-package', 'ufd' => 'application/vnd.ufdl', 'ufdl' => 'application/vnd.ufdl', 'umj' => 'application/vnd.umajin', 'unityweb' => 'application/vnd.unity', 'uoml' => 'application/vnd.uoml+xml', 'uri' => 'text/uri-list', 'uris' => 'text/uri-list', 'urls' => 'text/uri-list', 'ustar' => 'application/x-ustar', 'utz' => 'application/vnd.uiq.theme', 'uu' => 'text/x-uuencode', 'uva' => 'audio/vnd.dece.audio', 'uvd' => 'application/vnd.dece.data', 'uvf' => 'application/vnd.dece.data', 'uvg' => 'image/vnd.dece.graphic', 'uvh' => 'video/vnd.dece.hd', 'uvi' => 'image/vnd.dece.graphic', 'uvm' => 'video/vnd.dece.mobile', 'uvp' => 'video/vnd.dece.pd', 'uvs' => 'video/vnd.dece.sd', 'uvt' => 'application/vnd.dece.ttml+xml', 'uvu' => 'video/vnd.uvvu.mp4', 'uvv' => 'video/vnd.dece.video', 'uvva' => 'audio/vnd.dece.audio', 'uvvd' => 'application/vnd.dece.data', 'uvvf' => 'application/vnd.dece.data', 'uvvg' => 'image/vnd.dece.graphic', 'uvvh' => 'video/vnd.dece.hd', 'uvvi' => 'image/vnd.dece.graphic', 'uvvm' => 'video/vnd.dece.mobile', 'uvvp' => 'video/vnd.dece.pd', 'uvvs' => 'video/vnd.dece.sd', 'uvvt' => 'application/vnd.dece.ttml+xml', 'uvvu' => 'video/vnd.uvvu.mp4', 'uvvv' => 'video/vnd.dece.video', 'uvvx' => 'application/vnd.dece.unspecified', 'uvx' => 'application/vnd.dece.unspecified', 'vcd' => 'application/x-cdlink', 'vcf' => 'text/x-vcard', 'vcg' => 'application/vnd.groove-vcard', 'vcs' => 'text/x-vcalendar', 'vcx' => 'application/vnd.vcx', 'vis' => 'application/vnd.visionary', 'viv' => 'video/vnd.vivo', 'vor' => 'application/vnd.stardivision.writer', 'vox' => 'application/x-authorware-bin', 'vrml' => 'model/vrml', 'vsd' => 'application/vnd.visio', 'vsf' => 'application/vnd.vsf', 'vss' => 'application/vnd.visio', 'vst' => 'application/vnd.visio', 'vsw' => 'application/vnd.visio', 'vtu' => 'model/vnd.vtu', 'vxml' => 'application/voicexml+xml', 'w3d' => 'application/x-director', 'wad' => 'application/x-doom', 'wav' => 'audio/x-wav', 'wax' => 'audio/x-ms-wax', 'wbmp' => 'image/vnd.wap.wbmp', 'wbs' => 'application/vnd.criticaltools.wbs+xml', 'wbxml' => 'application/vnd.wap.wbxml', 'wcm' => 'application/vnd.ms-works', 'wdb' => 'application/vnd.ms-works', 'weba' => 'audio/webm', 'webm' => 'video/webm', 'webp' => 'image/webp', 'wg' => 'application/vnd.pmi.widget', 'wgt' => 'application/widget', 'wks' => 'application/vnd.ms-works', 'wm' => 'video/x-ms-wm', 'wma' => 'audio/x-ms-wma', 'wmd' => 'application/x-ms-wmd', 'wmf' => 'application/x-msmetafile', 'wml' => 'text/vnd.wap.wml', 'wmlc' => 'application/vnd.wap.wmlc', 'wmls' => 'text/vnd.wap.wmlscript', 'wmlsc' => 'application/vnd.wap.wmlscriptc', 'wmv' => 'video/x-ms-wmv', 'wmx' => 'video/x-ms-wmx', 'wmz' => 'application/x-ms-wmz', 'woff' => 'application/x-font-woff', 'wpd' => 'application/vnd.wordperfect', 'wpl' => 'application/vnd.ms-wpl', 'wps' => 'application/vnd.ms-works', 'wqd' => 'application/vnd.wqd', 'wri' => 'application/x-mswrite', 'wrl' => 'model/vrml', 'wsdl' => 'application/wsdl+xml', 'wspolicy' => 'application/wspolicy+xml', 'wtb' => 'application/vnd.webturbo', 'wvx' => 'video/x-ms-wvx', 'x32' => 'application/x-authorware-bin', 'x3d' => 'application/vnd.hzn-3d-crossword', 'xap' => 'application/x-silverlight-app', 'xar' => 'application/vnd.xara', 'xbap' => 'application/x-ms-xbap', 'xbd' => 'application/vnd.fujixerox.docuworks.binder', 'xbm' => 'image/x-xbitmap', 'xdf' => 'application/xcap-diff+xml', 'xdm' => 'application/vnd.syncml.dm+xml', 'xdp' => 'application/vnd.adobe.xdp+xml', 'xdssc' => 'application/dssc+xml', 'xdw' => 'application/vnd.fujixerox.docuworks', 'xenc' => 'application/xenc+xml', 'xer' => 'application/patch-ops-error+xml', 'xfdf' => 'application/vnd.adobe.xfdf', 'xfdl' => 'application/vnd.xfdl', 'xht' => 'application/xhtml+xml', 'xhtml' => 'application/xhtml+xml', 'xhvml' => 'application/xv+xml', 'xif' => 'image/vnd.xiff', 'xla' => 'application/vnd.ms-excel', 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', 'xlc' => 'application/vnd.ms-excel', 'xlm' => 'application/vnd.ms-excel', 'xls' => 'application/vnd.ms-excel', 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlt' => 'application/vnd.ms-excel', 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xlw' => 'application/vnd.ms-excel', 'xml' => 'application/xml', 'xo' => 'application/vnd.olpc-sugar', 'xop' => 'application/xop+xml', 'xpi' => 'application/x-xpinstall', 'xpm' => 'image/x-xpixmap', 'xpr' => 'application/vnd.is-xpr', 'xps' => 'application/vnd.ms-xpsdocument', 'xpw' => 'application/vnd.intercon.formnet', 'xpx' => 'application/vnd.intercon.formnet', 'xsl' => 'application/xml', 'xslt' => 'application/xslt+xml', 'xsm' => 'application/vnd.syncml+xml', 'xspf' => 'application/xspf+xml', 'xul' => 'application/vnd.mozilla.xul+xml', 'xvm' => 'application/xv+xml', 'xvml' => 'application/xv+xml', 'xwd' => 'image/x-xwindowdump', 'xyz' => 'chemical/x-xyz', 'yaml' => 'text/yaml', 'yang' => 'application/yang', 'yin' => 'application/yin+xml', 'yml' => 'text/yaml', 'zaz' => 'application/vnd.zzazz.deck+xml', 'zip' => 'application/zip', 'zir' => 'application/vnd.zul', 'zirz' => 'application/vnd.zul', 'zmm' => 'application/vnd.handheld-entertainment+xml'); + /** + * Get a singleton instance of the class + * + * @return self + * @codeCoverageIgnore + */ + public static function getInstance() + { + if (!self::$instance) { + self::$instance = new self(); + } + return self::$instance; + } + /** + * Get a mimetype value from a file extension + * + * @param string $extension File extension + * + * @return string|null + * + */ + public function fromExtension($extension) + { + $extension = strtolower($extension); + return isset($this->mimetypes[$extension]) ? $this->mimetypes[$extension] : null; + } + /** + * Get a mimetype from a filename + * + * @param string $filename Filename to generate a mimetype from + * + * @return string|null + */ + public function fromFilename($filename) + { + return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/CommaAggregator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/CommaAggregator.php new file mode 100644 index 00000000..0d5d3ea0 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/CommaAggregator.php @@ -0,0 +1,19 @@ +isUrlEncoding()) { + return array($query->encodeValue($key) => implode(',', array_map(array($query, 'encodeValue'), $value))); + } else { + return array($key => implode(',', $value)); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/DuplicateAggregator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/DuplicateAggregator.php new file mode 100644 index 00000000..badfb34e --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/DuplicateAggregator.php @@ -0,0 +1,21 @@ +isUrlEncoding()) { + return array($query->encodeValue($key) => array_map(array($query, 'encodeValue'), $value)); + } else { + return array($key => $value); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/PhpAggregator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/PhpAggregator.php new file mode 100644 index 00000000..cceccdad --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/PhpAggregator.php @@ -0,0 +1,24 @@ + $v) { + $k = "{$key}[{$k}]"; + if (is_array($v)) { + $ret = array_merge($ret, self::aggregate($k, $v, $query)); + } else { + $ret[$query->encodeValue($k)] = $query->encodeValue($v); + } + } + return $ret; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php new file mode 100644 index 00000000..102e68e6 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php @@ -0,0 +1,21 @@ +add($key, $value); + $foundDuplicates = true; + } elseif ($paramIsPhpStyleArray) { + $q[$key] = array($value); + } else { + $q[$key] = $value; + } + } else { + // Uses false by default to represent keys with no trailing "=" sign. + $q->add($key, false); + } + } + // Use the duplicate aggregator if duplicates were found and not using PHP style arrays + if ($foundDuplicates && !$foundPhpStyle) { + $q->setAggregator(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryAggregator\DuplicateAggregator()); + } + return $q; + } + /** + * Convert the query string parameters to a query string string + * + * @return string + * @throws RuntimeException + */ + public function __toString() + { + if (!$this->data) { + return ''; + } + $queryList = array(); + foreach ($this->prepareData($this->data) as $name => $value) { + $queryList[] = $this->convertKvp($name, $value); + } + return implode($this->fieldSeparator, $queryList); + } + /** + * Get the query string field separator + * + * @return string + */ + public function getFieldSeparator() + { + return $this->fieldSeparator; + } + /** + * Get the query string value separator + * + * @return string + */ + public function getValueSeparator() + { + return $this->valueSeparator; + } + /** + * Returns the type of URL encoding used by the query string + * + * One of: false, "RFC 3986", or "application/x-www-form-urlencoded" + * + * @return bool|string + */ + public function getUrlEncoding() + { + return $this->urlEncode; + } + /** + * Returns true or false if using URL encoding + * + * @return bool + */ + public function isUrlEncoding() + { + return $this->urlEncode !== false; + } + /** + * Provide a function for combining multi-valued query string parameters into a single or multiple fields + * + * @param null|QueryAggregatorInterface $aggregator Pass in a QueryAggregatorInterface object to handle converting + * deeply nested query string variables into a flattened array. + * Pass null to use the default PHP style aggregator. For legacy + * reasons, this function accepts a callable that must accepts a + * $key, $value, and query object. + * @return self + * @see \Guzzle\Http\QueryString::aggregateUsingComma() + */ + public function setAggregator(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryAggregator\QueryAggregatorInterface $aggregator = null) + { + // Use the default aggregator if none was set + if (!$aggregator) { + if (!self::$defaultAggregator) { + self::$defaultAggregator = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryAggregator\PhpAggregator(); + } + $aggregator = self::$defaultAggregator; + } + $this->aggregator = $aggregator; + return $this; + } + /** + * Set whether or not field names and values should be rawurlencoded + * + * @param bool|string $encode Set to TRUE to use RFC 3986 encoding (rawurlencode), false to disable encoding, or + * form_urlencoding to use application/x-www-form-urlencoded encoding (urlencode) + * @return self + */ + public function useUrlEncoding($encode) + { + $this->urlEncode = $encode === true ? self::RFC_3986 : $encode; + return $this; + } + /** + * Set the query string separator + * + * @param string $separator The query string separator that will separate fields + * + * @return self + */ + public function setFieldSeparator($separator) + { + $this->fieldSeparator = $separator; + return $this; + } + /** + * Set the query string value separator + * + * @param string $separator The query string separator that will separate values from fields + * + * @return self + */ + public function setValueSeparator($separator) + { + $this->valueSeparator = $separator; + return $this; + } + /** + * Returns an array of url encoded field names and values + * + * @return array + */ + public function urlEncode() + { + return $this->prepareData($this->data); + } + /** + * URL encodes a value based on the url encoding type of the query string object + * + * @param string $value Value to encode + * + * @return string + */ + public function encodeValue($value) + { + if ($this->urlEncode == self::RFC_3986) { + return rawurlencode($value); + } elseif ($this->urlEncode == self::FORM_URLENCODED) { + return urlencode($value); + } else { + return (string) $value; + } + } + /** + * Url encode parameter data and convert nested query strings into a flattened hash. + * + * @param array $data The data to encode + * + * @return array Returns an array of encoded values and keys + */ + protected function prepareData(array $data) + { + // If no aggregator is present then set the default + if (!$this->aggregator) { + $this->setAggregator(null); + } + $temp = array(); + foreach ($data as $key => $value) { + if ($value === false || $value === null) { + // False and null will not include the "=". Use an empty string to include the "=". + $temp[$this->encodeValue($key)] = $value; + } elseif (is_array($value)) { + $temp = array_merge($temp, $this->aggregator->aggregate($key, $value, $this)); + } else { + $temp[$this->encodeValue($key)] = $this->encodeValue($value); + } + } + return $temp; + } + /** + * Converts a key value pair that can contain strings, nulls, false, or arrays + * into a single string. + * + * @param string $name Name of the field + * @param mixed $value Value of the field + * @return string + */ + private function convertKvp($name, $value) + { + if ($value === self::BLANK || $value === null || $value === false) { + return $name; + } elseif (!is_array($value)) { + return $name . $this->valueSeparator . $value; + } + $result = ''; + foreach ($value as $v) { + $result .= $this->convertKvp($name, $v) . $this->fieldSeparator; + } + return rtrim($result, $this->fieldSeparator); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/ReadLimitEntityBody.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/ReadLimitEntityBody.php new file mode 100644 index 00000000..8efdbda9 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/ReadLimitEntityBody.php @@ -0,0 +1,100 @@ +setLimit($limit)->setOffset($offset); + } + /** + * Returns only a subset of the decorated entity body when cast as a string + * {@inheritdoc} + */ + public function __toString() + { + if (!$this->body->isReadable() || !$this->body->isSeekable() && $this->body->isConsumed()) { + return ''; + } + $originalPos = $this->body->ftell(); + $this->body->seek($this->offset); + $data = ''; + while (!$this->feof()) { + $data .= $this->read(1048576); + } + $this->body->seek($originalPos); + return (string) $data ?: ''; + } + public function isConsumed() + { + return $this->body->isConsumed() || $this->body->ftell() >= $this->offset + $this->limit; + } + /** + * Returns the Content-Length of the limited subset of data + * {@inheritdoc} + */ + public function getContentLength() + { + $length = $this->body->getContentLength(); + return $length === false ? $this->limit : min($this->limit, min($length, $this->offset + $this->limit) - $this->offset); + } + /** + * Allow for a bounded seek on the read limited entity body + * {@inheritdoc} + */ + public function seek($offset, $whence = SEEK_SET) + { + return $whence === SEEK_SET ? $this->body->seek(max($this->offset, min($this->offset + $this->limit, $offset))) : false; + } + /** + * Set the offset to start limiting from + * + * @param int $offset Offset to seek to and begin byte limiting from + * + * @return self + */ + public function setOffset($offset) + { + $this->body->seek($offset); + $this->offset = $offset; + return $this; + } + /** + * Set the limit of bytes that the decorator allows to be read from the stream + * + * @param int $limit Total number of bytes to allow to be read from the stream + * + * @return self + */ + public function setLimit($limit) + { + $this->limit = $limit; + return $this; + } + public function read($length) + { + // Check if the current position is less than the total allowed bytes + original offset + $remaining = $this->offset + $this->limit - $this->body->ftell(); + if ($remaining > 0) { + // Only return the amount of requested data, ensuring that the byte limit is not exceeded + return $this->body->read(min($remaining, $length)); + } else { + return false; + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/RedirectPlugin.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/RedirectPlugin.php new file mode 100644 index 00000000..b61da2a0 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/RedirectPlugin.php @@ -0,0 +1,204 @@ + array('onRequestSent', 100), 'request.clone' => 'cleanupRequest', 'request.before_send' => 'cleanupRequest'); + } + /** + * Clean up the parameters of a request when it is cloned + * + * @param Event $event Event emitted + */ + public function cleanupRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $params = $event['request']->getParams(); + unset($params[self::REDIRECT_COUNT]); + unset($params[self::PARENT_REQUEST]); + } + /** + * Called when a request receives a redirect response + * + * @param Event $event Event emitted + */ + public function onRequestSent(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $response = $event['response']; + $request = $event['request']; + // Only act on redirect requests with Location headers + if (!$response || $request->getParams()->get(self::DISABLE)) { + return; + } + // Trace the original request based on parameter history + $original = $this->getOriginalRequest($request); + // Terminating condition to set the effective response on the original request + if (!$response->isRedirect() || !$response->hasHeader('Location')) { + if ($request !== $original) { + // This is a terminating redirect response, so set it on the original request + $response->getParams()->set(self::REDIRECT_COUNT, $original->getParams()->get(self::REDIRECT_COUNT)); + $original->setResponse($response); + $response->setEffectiveUrl($request->getUrl()); + } + return; + } + $this->sendRedirectRequest($original, $request, $response); + } + /** + * Get the original request that initiated a series of redirects + * + * @param RequestInterface $request Request to get the original request from + * + * @return RequestInterface + */ + protected function getOriginalRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $original = $request; + // The number of redirects is held on the original request, so determine which request that is + while ($parent = $original->getParams()->get(self::PARENT_REQUEST)) { + $original = $parent; + } + return $original; + } + /** + * Create a redirect request for a specific request object + * + * Takes into account strict RFC compliant redirection (e.g. redirect POST with POST) vs doing what most clients do + * (e.g. redirect POST with GET). + * + * @param RequestInterface $request Request being redirected + * @param RequestInterface $original Original request + * @param int $statusCode Status code of the redirect + * @param string $location Location header of the redirect + * + * @return RequestInterface Returns a new redirect request + * @throws CouldNotRewindStreamException If the body needs to be rewound but cannot + */ + protected function createRedirectRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $statusCode, $location, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $original) + { + $redirectRequest = null; + $strict = $original->getParams()->get(self::STRICT_REDIRECTS); + // Switch method to GET for 303 redirects. 301 and 302 redirects also switch to GET unless we are forcing RFC + // compliance to emulate what most browsers do. NOTE: IE only switches methods on 301/302 when coming from a POST. + if ($request instanceof EntityEnclosingRequestInterface && ($statusCode == 303 || !$strict && $statusCode <= 302)) { + $redirectRequest = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestFactory::getInstance()->cloneRequestWithMethod($request, 'GET'); + } else { + $redirectRequest = clone $request; + } + $redirectRequest->setIsRedirect(true); + // Always use the same response body when redirecting + $redirectRequest->setResponseBody($request->getResponseBody()); + $location = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Url::factory($location); + // If the location is not absolute, then combine it with the original URL + if (!$location->isAbsolute()) { + $originalUrl = $redirectRequest->getUrl(true); + // Remove query string parameters and just take what is present on the redirect Location header + $originalUrl->getQuery()->clear(); + $location = $originalUrl->combine((string) $location, true); + } + $redirectRequest->setUrl($location); + // Add the parent request to the request before it sends (make sure it's before the onRequestClone event too) + $redirectRequest->getEventDispatcher()->addListener('request.before_send', $func = function ($e) use(&$func, $request, $redirectRequest) { + $redirectRequest->getEventDispatcher()->removeListener('request.before_send', $func); + $e['request']->getParams()->set(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\RedirectPlugin::PARENT_REQUEST, $request); + }); + // Rewind the entity body of the request if needed + if ($redirectRequest instanceof EntityEnclosingRequestInterface && $redirectRequest->getBody()) { + $body = $redirectRequest->getBody(); + // Only rewind the body if some of it has been read already, and throw an exception if the rewind fails + if ($body->ftell() && !$body->rewind()) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\CouldNotRewindStreamException('Unable to rewind the non-seekable entity body of the request after redirecting. cURL probably ' . 'sent part of body before the redirect occurred. Try adding acustom rewind function using on the ' . 'entity body of the request using setRewindFunction().'); + } + } + return $redirectRequest; + } + /** + * Prepare the request for redirection and enforce the maximum number of allowed redirects per client + * + * @param RequestInterface $original Original request + * @param RequestInterface $request Request to prepare and validate + * @param Response $response The current response + * + * @return RequestInterface + */ + protected function prepareRedirection(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $original, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + $params = $original->getParams(); + // This is a new redirect, so increment the redirect counter + $current = $params[self::REDIRECT_COUNT] + 1; + $params[self::REDIRECT_COUNT] = $current; + // Use a provided maximum value or default to a max redirect count of 5 + $max = isset($params[self::MAX_REDIRECTS]) ? $params[self::MAX_REDIRECTS] : $this->defaultMaxRedirects; + // Throw an exception if the redirect count is exceeded + if ($current > $max) { + $this->throwTooManyRedirectsException($original, $max); + return false; + } else { + // Create a redirect request based on the redirect rules set on the request + return $this->createRedirectRequest($request, $response->getStatusCode(), trim($response->getLocation()), $original); + } + } + /** + * Send a redirect request and handle any errors + * + * @param RequestInterface $original The originating request + * @param RequestInterface $request The current request being redirected + * @param Response $response The response of the current request + * + * @throws BadResponseException|\Exception + */ + protected function sendRedirectRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $original, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + // Validate and create a redirect request based on the original request and current response + if ($redirectRequest = $this->prepareRedirection($original, $request, $response)) { + try { + $redirectRequest->send(); + } catch (BadResponseException $e) { + $e->getResponse(); + if (!$e->getResponse()) { + throw $e; + } + } + } + } + /** + * Throw a too many redirects exception for a request + * + * @param RequestInterface $original Request + * @param int $max Max allowed redirects + * + * @throws TooManyRedirectsException when too many redirects have been issued + */ + protected function throwTooManyRedirectsException(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $original, $max) + { + $original->getEventDispatcher()->addListener('request.complete', $func = function ($e) use(&$func, $original, $max) { + $original->getEventDispatcher()->removeListener('request.complete', $func); + $str = "{$max} redirects were issued for this request:\n" . $e['request']->getRawHeaders(); + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\TooManyRedirectsException($str); + }); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem new file mode 100644 index 00000000..18ce7038 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem @@ -0,0 +1,3870 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla downloaded on: Wed Aug 13 21:49:32 2014 +## +## 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 verison 1.22. +## SHA1: bf2c15b3019e696660321d2227d942936dc50aa7 +## + + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +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----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----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----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----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----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----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----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----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----- + +TDC Internet Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE +ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx +NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu +ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j +xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL +znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc +5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 +otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI +AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM +VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM +MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe +UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G +CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb +O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU +Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----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----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----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----- + +TURKTRUST Certificate Services Provider Root 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP +MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 +acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx +MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB +TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC +aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX +yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i +Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ +8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 +W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 +sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE +q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY +nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN +MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr +dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe +LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI +x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g +QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr +5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB +AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt +Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ +hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P +9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 +UrbnBEI= +-----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----- + +AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. +====================================== +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT +AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg +LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w +HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ +U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh +IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN +yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU +2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 +4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP +2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm +8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf +HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa +Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK +5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b +czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g +ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF +BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug +cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf +AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX +EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v +/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 +MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 +3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk +eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f +/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h +RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU +Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 2 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw +MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw +IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 +xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ +Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u +SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G +dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ +KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj +TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP +JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk +vQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 3 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw +MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W +yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo +6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ +uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk +2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE +O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 +yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 +IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal +092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc +5A== +-----END CERTIFICATE----- + +TC TrustCenter Universal CA I +============================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN +MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg +VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw +JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC +qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv +xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw +ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O +gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j +BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG +1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy +vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 +ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a +7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----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----- + +ComSign Secured CA +================== +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE +AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w +NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD +QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs +49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH +7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB +kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 +9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw +AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t +U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA +j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC +AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a +BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp +FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP +51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----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----- + +Buypass Class 3 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 +MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx +ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 +n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia +AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c +1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 +pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA +EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 +htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj +el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----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----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----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----- + +E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi +=================================================== +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz +ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 +MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 +cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u +aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY +8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y +jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI +JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk +9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG +SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d +F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq +D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 +Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----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----- + +A-Trust-nQual-03 +================ +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE +Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy +a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R +dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw +RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 +ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 +c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA +zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n +yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE +SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 +iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V +cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV +eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 +ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr +sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd +JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 +ahq97BvIxYSazQ== +-----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----- + diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/StaticClient.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/StaticClient.php new file mode 100644 index 00000000..bb13aadc --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/StaticClient.php @@ -0,0 +1,144 @@ +createRequest($method, $url, null, null, $options); + if (isset($options['stream'])) { + if ($options['stream'] instanceof StreamRequestFactoryInterface) { + return $options['stream']->fromRequest($request); + } elseif ($options['stream'] == true) { + $streamFactory = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Stream\PhpStreamRequestFactory(); + return $streamFactory->fromRequest($request); + } + } + return $request->send(); + } + /** + * Send a GET request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function get($url, $options = array()) + { + return self::request('GET', $url, $options); + } + /** + * Send a HEAD request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function head($url, $options = array()) + { + return self::request('HEAD', $url, $options); + } + /** + * Send a DELETE request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function delete($url, $options = array()) + { + return self::request('DELETE', $url, $options); + } + /** + * Send a POST request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function post($url, $options = array()) + { + return self::request('POST', $url, $options); + } + /** + * Send a PUT request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function put($url, $options = array()) + { + return self::request('PUT', $url, $options); + } + /** + * Send a PATCH request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function patch($url, $options = array()) + { + return self::request('PATCH', $url, $options); + } + /** + * Send an OPTIONS request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function options($url, $options = array()) + { + return self::request('OPTIONS', $url, $options); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Url.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Url.php new file mode 100644 index 00000000..9358bb23 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/Url.php @@ -0,0 +1,473 @@ + null, 'host' => null, 'path' => null, 'port' => null, 'query' => null, 'user' => null, 'pass' => null, 'fragment' => null); + if (false === ($parts = parse_url($url))) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Was unable to parse malformed url: ' . $url); + } + $parts += $defaults; + // Convert the query string into a QueryString object + if ($parts['query'] || 0 !== strlen($parts['query'])) { + $parts['query'] = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryString::fromString($parts['query']); + } + return new static($parts['scheme'], $parts['host'], $parts['user'], $parts['pass'], $parts['port'], $parts['path'], $parts['query'], $parts['fragment']); + } + /** + * Build a URL from parse_url parts. The generated URL will be a relative URL if a scheme or host are not provided. + * + * @param array $parts Array of parse_url parts + * + * @return string + */ + public static function buildUrl(array $parts) + { + $url = $scheme = ''; + if (isset($parts['scheme'])) { + $scheme = $parts['scheme']; + $url .= $scheme . ':'; + } + if (isset($parts['host'])) { + $url .= '//'; + if (isset($parts['user'])) { + $url .= $parts['user']; + if (isset($parts['pass'])) { + $url .= ':' . $parts['pass']; + } + $url .= '@'; + } + $url .= $parts['host']; + // Only include the port if it is not the default port of the scheme + if (isset($parts['port']) && !($scheme == 'http' && $parts['port'] == 80 || $scheme == 'https' && $parts['port'] == 443)) { + $url .= ':' . $parts['port']; + } + } + // Add the path component if present + if (isset($parts['path']) && 0 !== strlen($parts['path'])) { + // Always ensure that the path begins with '/' if set and something is before the path + if ($url && $parts['path'][0] != '/' && substr($url, -1) != '/') { + $url .= '/'; + } + $url .= $parts['path']; + } + // Add the query string if present + if (isset($parts['query'])) { + $url .= '?' . $parts['query']; + } + // Ensure that # is only added to the url if fragment contains anything. + if (isset($parts['fragment'])) { + $url .= '#' . $parts['fragment']; + } + return $url; + } + /** + * Create a new URL from URL parts + * + * @param string $scheme Scheme of the URL + * @param string $host Host of the URL + * @param string $username Username of the URL + * @param string $password Password of the URL + * @param int $port Port of the URL + * @param string $path Path of the URL + * @param QueryString|array|string $query Query string of the URL + * @param string $fragment Fragment of the URL + */ + public function __construct($scheme, $host, $username = null, $password = null, $port = null, $path = null, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryString $query = null, $fragment = null) + { + $this->scheme = $scheme; + $this->host = $host; + $this->port = $port; + $this->username = $username; + $this->password = $password; + $this->fragment = $fragment; + if (!$query) { + $this->query = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryString(); + } else { + $this->setQuery($query); + } + $this->setPath($path); + } + /** + * Clone the URL + */ + public function __clone() + { + $this->query = clone $this->query; + } + /** + * Returns the URL as a URL string + * + * @return string + */ + public function __toString() + { + return self::buildUrl($this->getParts()); + } + /** + * Get the parts of the URL as an array + * + * @return array + */ + public function getParts() + { + $query = (string) $this->query; + return array('scheme' => $this->scheme, 'user' => $this->username, 'pass' => $this->password, 'host' => $this->host, 'port' => $this->port, 'path' => $this->getPath(), 'query' => $query !== '' ? $query : null, 'fragment' => $this->fragment); + } + /** + * Set the host of the request. + * + * @param string $host Host to set (e.g. www.yahoo.com, yahoo.com) + * + * @return Url + */ + public function setHost($host) + { + if (strpos($host, ':') === false) { + $this->host = $host; + } else { + list($host, $port) = explode(':', $host); + $this->host = $host; + $this->setPort($port); + } + return $this; + } + /** + * Get the host part of the URL + * + * @return string + */ + public function getHost() + { + return $this->host; + } + /** + * Set the scheme part of the URL (http, https, ftp, etc) + * + * @param string $scheme Scheme to set + * + * @return Url + */ + public function setScheme($scheme) + { + if ($this->scheme == 'http' && $this->port == 80) { + $this->port = null; + } elseif ($this->scheme == 'https' && $this->port == 443) { + $this->port = null; + } + $this->scheme = $scheme; + return $this; + } + /** + * Get the scheme part of the URL + * + * @return string + */ + public function getScheme() + { + return $this->scheme; + } + /** + * Set the port part of the URL + * + * @param int $port Port to set + * + * @return Url + */ + public function setPort($port) + { + $this->port = $port; + return $this; + } + /** + * Get the port part of the URl. Will return the default port for a given scheme if no port has been set. + * + * @return int|null + */ + public function getPort() + { + if ($this->port) { + return $this->port; + } elseif ($this->scheme == 'http') { + return 80; + } elseif ($this->scheme == 'https') { + return 443; + } + return null; + } + /** + * Set the path part of the URL + * + * @param array|string $path Path string or array of path segments + * + * @return Url + */ + public function setPath($path) + { + static $pathReplace = array(' ' => '%20', '?' => '%3F'); + if (is_array($path)) { + $path = '/' . implode('/', $path); + } + $this->path = strtr($path, $pathReplace); + return $this; + } + /** + * Normalize the URL so that double slashes and relative paths are removed + * + * @return Url + */ + public function normalizePath() + { + if (!$this->path || $this->path == '/' || $this->path == '*') { + return $this; + } + $results = array(); + $segments = $this->getPathSegments(); + foreach ($segments as $segment) { + if ($segment == '..') { + array_pop($results); + } elseif ($segment != '.' && $segment != '') { + $results[] = $segment; + } + } + // Combine the normalized parts and add the leading slash if needed + $this->path = ($this->path[0] == '/' ? '/' : '') . implode('/', $results); + // Add the trailing slash if necessary + if ($this->path != '/' && end($segments) == '') { + $this->path .= '/'; + } + return $this; + } + /** + * Add a relative path to the currently set path. + * + * @param string $relativePath Relative path to add + * + * @return Url + */ + public function addPath($relativePath) + { + if ($relativePath != '/' && is_string($relativePath) && strlen($relativePath) > 0) { + // Add a leading slash if needed + if ($relativePath[0] != '/') { + $relativePath = '/' . $relativePath; + } + $this->setPath(str_replace('//', '/', $this->path . $relativePath)); + } + return $this; + } + /** + * Get the path part of the URL + * + * @return string + */ + public function getPath() + { + return $this->path; + } + /** + * Get the path segments of the URL as an array + * + * @return array + */ + public function getPathSegments() + { + return array_slice(explode('/', $this->getPath()), 1); + } + /** + * Set the password part of the URL + * + * @param string $password Password to set + * + * @return Url + */ + public function setPassword($password) + { + $this->password = $password; + return $this; + } + /** + * Get the password part of the URL + * + * @return null|string + */ + public function getPassword() + { + return $this->password; + } + /** + * Set the username part of the URL + * + * @param string $username Username to set + * + * @return Url + */ + public function setUsername($username) + { + $this->username = $username; + return $this; + } + /** + * Get the username part of the URl + * + * @return null|string + */ + public function getUsername() + { + return $this->username; + } + /** + * Get the query part of the URL as a QueryString object + * + * @return QueryString + */ + public function getQuery() + { + return $this->query; + } + /** + * Set the query part of the URL + * + * @param QueryString|string|array $query Query to set + * + * @return Url + */ + public function setQuery($query) + { + if (is_string($query)) { + $output = null; + parse_str($query, $output); + $this->query = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryString($output); + } elseif (is_array($query)) { + $this->query = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryString($query); + } elseif ($query instanceof QueryString) { + $this->query = $query; + } + return $this; + } + /** + * Get the fragment part of the URL + * + * @return null|string + */ + public function getFragment() + { + return $this->fragment; + } + /** + * Set the fragment part of the URL + * + * @param string $fragment Fragment to set + * + * @return Url + */ + public function setFragment($fragment) + { + $this->fragment = $fragment; + return $this; + } + /** + * Check if this is an absolute URL + * + * @return bool + */ + public function isAbsolute() + { + return $this->scheme && $this->host; + } + /** + * Combine the URL with another URL. Follows the rules specific in RFC 3986 section 5.4. + * + * @param string $url Relative URL to combine with + * @param bool $strictRfc3986 Set to true to use strict RFC 3986 compliance when merging paths. When first + * released, Guzzle used an incorrect algorithm for combining relative URL paths. In + * order to not break users, we introduced this flag to allow the merging of URLs based + * on strict RFC 3986 section 5.4.1. This means that "http://a.com/foo/baz" merged with + * "bar" would become "http://a.com/foo/bar". When this value is set to false, it would + * become "http://a.com/foo/baz/bar". + * @return Url + * @throws InvalidArgumentException + * @link http://tools.ietf.org/html/rfc3986#section-5.4 + */ + public function combine($url, $strictRfc3986 = false) + { + $url = self::factory($url); + // Use the more absolute URL as the base URL + if (!$this->isAbsolute() && $url->isAbsolute()) { + $url = $url->combine($this); + } + // Passing a URL with a scheme overrides everything + if ($buffer = $url->getScheme()) { + $this->scheme = $buffer; + $this->host = $url->getHost(); + $this->port = $url->getPort(); + $this->username = $url->getUsername(); + $this->password = $url->getPassword(); + $this->path = $url->getPath(); + $this->query = $url->getQuery(); + $this->fragment = $url->getFragment(); + return $this; + } + // Setting a host overrides the entire rest of the URL + if ($buffer = $url->getHost()) { + $this->host = $buffer; + $this->port = $url->getPort(); + $this->username = $url->getUsername(); + $this->password = $url->getPassword(); + $this->path = $url->getPath(); + $this->query = $url->getQuery(); + $this->fragment = $url->getFragment(); + return $this; + } + $path = $url->getPath(); + $query = $url->getQuery(); + if (!$path) { + if (count($query)) { + $this->addQuery($query, $strictRfc3986); + } + } else { + if ($path[0] == '/') { + $this->path = $path; + } elseif ($strictRfc3986) { + $this->path .= '/../' . $path; + } else { + $this->path .= '/' . $path; + } + $this->normalizePath(); + $this->addQuery($query, $strictRfc3986); + } + $this->fragment = $url->getFragment(); + return $this; + } + private function addQuery(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\QueryString $new, $strictRfc386) + { + if (!$strictRfc386) { + $new->merge($this->query); + } + $this->query = $new; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/composer.json new file mode 100644 index 00000000..54d2cf75 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Http/composer.json @@ -0,0 +1,40 @@ +{ + "name": "guzzle\/http", + "description": "HTTP libraries used by Guzzle", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "http client", + "http", + "client", + "Guzzle", + "curl" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/common": "self.version", + "guzzle\/parser": "self.version", + "guzzle\/stream": "self.version" + }, + "suggest": { + "ext-curl": "*" + }, + "autoload": { + "psr-0": { + "Guzzle\\Http": "" + } + }, + "target-dir": "Guzzle\/Http", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Inflection/Inflector.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Inflection/Inflector.php new file mode 100644 index 00000000..62fbaa0d --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Inflection/Inflector.php @@ -0,0 +1,34 @@ + array(), 'camel' => array()); + /** @var int Max entries per cache */ + protected $maxCacheSize; + /** @var InflectorInterface Decorated inflector */ + protected $decoratedInflector; + /** + * @param InflectorInterface $inflector Inflector being decorated + * @param int $maxCacheSize Maximum number of cached items to hold per cache + */ + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Inflection\InflectorInterface $inflector, $maxCacheSize = 500) + { + $this->decoratedInflector = $inflector; + $this->maxCacheSize = $maxCacheSize; + } + public function snake($word) + { + if (!isset($this->cache['snake'][$word])) { + $this->pruneCache('snake'); + $this->cache['snake'][$word] = $this->decoratedInflector->snake($word); + } + return $this->cache['snake'][$word]; + } + /** + * Converts strings from snake_case to upper CamelCase + * + * @param string $word Value to convert into upper CamelCase + * + * @return string + */ + public function camel($word) + { + if (!isset($this->cache['camel'][$word])) { + $this->pruneCache('camel'); + $this->cache['camel'][$word] = $this->decoratedInflector->camel($word); + } + return $this->cache['camel'][$word]; + } + /** + * Prune one of the named caches by removing 20% of the cache if it is full + * + * @param string $cache Type of cache to prune + */ + protected function pruneCache($cache) + { + if (count($this->cache[$cache]) == $this->maxCacheSize) { + $this->cache[$cache] = array_slice($this->cache[$cache], $this->maxCacheSize * 0.2); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Inflection/PreComputedInflector.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Inflection/PreComputedInflector.php new file mode 100644 index 00000000..9b237f2c --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Inflection/PreComputedInflector.php @@ -0,0 +1,44 @@ + array(), 'camel' => array()); + /** @var InflectorInterface Decorated inflector */ + protected $decoratedInflector; + /** + * @param InflectorInterface $inflector Inflector being decorated + * @param array $snake Hash of pre-computed camel to snake + * @param array $camel Hash of pre-computed snake to camel + * @param bool $mirror Mirror snake and camel reflections + */ + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Inflection\InflectorInterface $inflector, array $snake = array(), array $camel = array(), $mirror = false) + { + if ($mirror) { + $camel = array_merge(array_flip($snake), $camel); + $snake = array_merge(array_flip($camel), $snake); + } + $this->decoratedInflector = $inflector; + $this->mapping = array('snake' => $snake, 'camel' => $camel); + } + public function snake($word) + { + return isset($this->mapping['snake'][$word]) ? $this->mapping['snake'][$word] : $this->decoratedInflector->snake($word); + } + /** + * Converts strings from snake_case to upper CamelCase + * + * @param string $word Value to convert into upper CamelCase + * + * @return string + */ + public function camel($word) + { + return isset($this->mapping['camel'][$word]) ? $this->mapping['camel'][$word] : $this->decoratedInflector->camel($word); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Inflection/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Inflection/composer.json new file mode 100644 index 00000000..3504e46c --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Inflection/composer.json @@ -0,0 +1,31 @@ +{ + "name": "guzzle\/inflection", + "description": "Guzzle inflection component", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "inflection", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2" + }, + "autoload": { + "psr-0": { + "Guzzle\\Inflection": "" + } + }, + "target-dir": "Guzzle\/Inflection", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/AppendIterator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/AppendIterator.php new file mode 100644 index 00000000..4066559b --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/AppendIterator.php @@ -0,0 +1,19 @@ +getArrayIterator()->append($iterator); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/ChunkedIterator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/ChunkedIterator.php new file mode 100644 index 00000000..e21c88d7 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/ChunkedIterator.php @@ -0,0 +1,49 @@ +chunkSize = $chunkSize; + } + public function rewind() + { + parent::rewind(); + $this->next(); + } + public function next() + { + $this->chunk = array(); + for ($i = 0; $i < $this->chunkSize && parent::valid(); $i++) { + $this->chunk[] = parent::current(); + parent::next(); + } + } + public function current() + { + return $this->chunk; + } + public function valid() + { + return (bool) $this->chunk; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/FilterIterator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/FilterIterator.php new file mode 100644 index 00000000..e3774e54 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/FilterIterator.php @@ -0,0 +1,33 @@ +callback = $callback; + } + public function accept() + { + return call_user_func($this->callback, $this->current()); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/MapIterator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/MapIterator.php new file mode 100644 index 00000000..05072831 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/MapIterator.php @@ -0,0 +1,31 @@ +callback = $callback; + } + public function current() + { + return call_user_func($this->callback, parent::current()); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/MethodProxyIterator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/MethodProxyIterator.php new file mode 100644 index 00000000..4915d27c --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/MethodProxyIterator.php @@ -0,0 +1,26 @@ +getInnerIterator(); + while ($i instanceof \OuterIterator) { + $i = $i->getInnerIterator(); + } + return call_user_func_array(array($i, $name), $args); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/README.md b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/README.md new file mode 100644 index 00000000..8bb7e08e --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/README.md @@ -0,0 +1,25 @@ +Guzzle Iterator +=============== + +Provides useful Iterators and Iterator decorators + +- ChunkedIterator: Pulls out chunks from an inner iterator and yields the chunks as arrays +- FilterIterator: Used when PHP 5.4's CallbackFilterIterator is not available +- MapIterator: Maps values before yielding +- MethodProxyIterator: Proxies missing method calls to the innermost iterator + +### Installing via Composer + +```bash +# Install Composer +curl -sS https://getcomposer.org/installer | php + +# Add Guzzle as a dependency +php composer.phar require guzzle/iterator:~3.0 +``` + +After installing, you need to require Composer's autoloader: + +```php +require 'vendor/autoload.php'; +``` diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/composer.json new file mode 100644 index 00000000..54100cc0 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Iterator/composer.json @@ -0,0 +1,32 @@ +{ + "name": "guzzle\/iterator", + "description": "Provides helpful iterators and iterator decorators", + "keywords": [ + "iterator", + "guzzle" + ], + "homepage": "http:\/\/guzzlephp.org\/", + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/common": ">=2.8.0" + }, + "autoload": { + "psr-0": { + "Guzzle\\Iterator": "\/" + } + }, + "target-dir": "Guzzle\/Iterator", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/AbstractLogAdapter.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/AbstractLogAdapter.php new file mode 100644 index 00000000..16cd0b2e --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/AbstractLogAdapter.php @@ -0,0 +1,15 @@ +log; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/ArrayLogAdapter.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/ArrayLogAdapter.php new file mode 100644 index 00000000..2968fa96 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/ArrayLogAdapter.php @@ -0,0 +1,31 @@ +logs[] = array('message' => $message, 'priority' => $priority, 'extras' => $extras); + } + /** + * Get logged entries + * + * @return array + */ + public function getLogs() + { + return $this->logs; + } + /** + * Clears logged entries + */ + public function clearLogs() + { + $this->logs = array(); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/ClosureLogAdapter.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/ClosureLogAdapter.php new file mode 100644 index 00000000..4f4a4a7f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/ClosureLogAdapter.php @@ -0,0 +1,21 @@ +log = $logObject; + } + public function log($message, $priority = LOG_INFO, $extras = array()) + { + call_user_func($this->log, $message, $priority, $extras); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/LogAdapterInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/LogAdapterInterface.php new file mode 100644 index 00000000..890abb30 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/LogAdapterInterface.php @@ -0,0 +1,18 @@ +>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{curl_stderr}"; + const SHORT_FORMAT = '[{ts}] "{method} {resource} {protocol}/{version}" {code}'; + /** + * @var string Template used to format log messages + */ + protected $template; + /** + * @param string $template Log message template + */ + public function __construct($template = self::DEFAULT_FORMAT) + { + $this->template = $template ?: self::DEFAULT_FORMAT; + } + /** + * Set the template to use for logging + * + * @param string $template Log message template + * + * @return self + */ + public function setTemplate($template) + { + $this->template = $template; + return $this; + } + /** + * Returns a formatted message + * + * @param RequestInterface $request Request that was sent + * @param Response $response Response that was received + * @param CurlHandle $handle Curl handle associated with the message + * @param array $customData Associative array of custom template data + * + * @return string + */ + public function format(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response = null, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlHandle $handle = null, array $customData = array()) + { + $cache = $customData; + return preg_replace_callback('/{\\s*([A-Za-z_\\-\\.0-9]+)\\s*}/', function (array $matches) use($request, $response, $handle, &$cache) { + if (array_key_exists($matches[1], $cache)) { + return $cache[$matches[1]]; + } + $result = ''; + switch ($matches[1]) { + case 'request': + $result = (string) $request; + break; + case 'response': + $result = (string) $response; + break; + case 'req_body': + $result = $request instanceof EntityEnclosingRequestInterface ? (string) $request->getBody() : ''; + break; + case 'res_body': + $result = $response ? $response->getBody(true) : ''; + break; + case 'ts': + $result = gmdate('c'); + break; + case 'method': + $result = $request->getMethod(); + break; + case 'url': + $result = (string) $request->getUrl(); + break; + case 'resource': + $result = $request->getResource(); + break; + case 'protocol': + $result = 'HTTP'; + break; + case 'version': + $result = $request->getProtocolVersion(); + break; + case 'host': + $result = $request->getHost(); + break; + case 'hostname': + $result = gethostname(); + break; + case 'port': + $result = $request->getPort(); + break; + case 'code': + $result = $response ? $response->getStatusCode() : ''; + break; + case 'phrase': + $result = $response ? $response->getReasonPhrase() : ''; + break; + case 'connect_time': + $result = $handle && $handle->getInfo(CURLINFO_CONNECT_TIME) ? $handle->getInfo(CURLINFO_CONNECT_TIME) : ($response ? $response->getInfo('connect_time') : ''); + break; + case 'total_time': + $result = $handle && $handle->getInfo(CURLINFO_TOTAL_TIME) ? $handle->getInfo(CURLINFO_TOTAL_TIME) : ($response ? $response->getInfo('total_time') : ''); + break; + case 'curl_error': + $result = $handle ? $handle->getError() : ''; + break; + case 'curl_code': + $result = $handle ? $handle->getErrorNo() : ''; + break; + case 'curl_stderr': + $result = $handle ? $handle->getStderr() : ''; + break; + default: + if (strpos($matches[1], 'req_header_') === 0) { + $result = $request->getHeader(substr($matches[1], 11)); + } elseif ($response && strpos($matches[1], 'res_header_') === 0) { + $result = $response->getHeader(substr($matches[1], 11)); + } + } + $cache[$matches[1]] = $result; + return $result; + }, $this->template); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/MonologLogAdapter.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/MonologLogAdapter.php new file mode 100644 index 00000000..a7f3aac8 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/MonologLogAdapter.php @@ -0,0 +1,24 @@ + \DeliciousBrains\WP_Offload_S3\Aws2\Monolog\Logger::DEBUG, LOG_INFO => \DeliciousBrains\WP_Offload_S3\Aws2\Monolog\Logger::INFO, LOG_WARNING => \DeliciousBrains\WP_Offload_S3\Aws2\Monolog\Logger::WARNING, LOG_ERR => \DeliciousBrains\WP_Offload_S3\Aws2\Monolog\Logger::ERROR, LOG_CRIT => \DeliciousBrains\WP_Offload_S3\Aws2\Monolog\Logger::CRITICAL, LOG_ALERT => \DeliciousBrains\WP_Offload_S3\Aws2\Monolog\Logger::ALERT); + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Monolog\Logger $logObject) + { + $this->log = $logObject; + } + public function log($message, $priority = LOG_INFO, $extras = array()) + { + $this->log->addRecord(self::$mapping[$priority], $message, $extras); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/PsrLogAdapter.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/PsrLogAdapter.php new file mode 100644 index 00000000..b9c35744 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/PsrLogAdapter.php @@ -0,0 +1,26 @@ + \DeliciousBrains\WP_Offload_S3\Aws2\Psr\Log\LogLevel::DEBUG, LOG_INFO => \DeliciousBrains\WP_Offload_S3\Aws2\Psr\Log\LogLevel::INFO, LOG_WARNING => \DeliciousBrains\WP_Offload_S3\Aws2\Psr\Log\LogLevel::WARNING, LOG_ERR => \DeliciousBrains\WP_Offload_S3\Aws2\Psr\Log\LogLevel::ERROR, LOG_CRIT => \DeliciousBrains\WP_Offload_S3\Aws2\Psr\Log\LogLevel::CRITICAL, LOG_ALERT => \DeliciousBrains\WP_Offload_S3\Aws2\Psr\Log\LogLevel::ALERT); + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Psr\Log\LoggerInterface $logObject) + { + $this->log = $logObject; + } + public function log($message, $priority = LOG_INFO, $extras = array()) + { + $this->log->log(self::$mapping[$priority], $message, $extras); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/Zf1LogAdapter.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/Zf1LogAdapter.php new file mode 100644 index 00000000..487c3105 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/Zf1LogAdapter.php @@ -0,0 +1,22 @@ +log = $logObject; + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__CLASS__ . ' is deprecated'); + } + public function log($message, $priority = LOG_INFO, $extras = array()) + { + $this->log->log($message, $priority, $extras); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/Zf2LogAdapter.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/Zf2LogAdapter.php new file mode 100644 index 00000000..bc884585 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/Zf2LogAdapter.php @@ -0,0 +1,19 @@ +log = $logObject; + } + public function log($message, $priority = LOG_INFO, $extras = array()) + { + $this->log->log($priority, $message, $extras); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/composer.json new file mode 100644 index 00000000..75e955f6 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Log/composer.json @@ -0,0 +1,35 @@ +{ + "name": "guzzle\/log", + "description": "Guzzle log adapter component", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "log", + "adapter", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2" + }, + "autoload": { + "psr-0": { + "Guzzle\\Log": "" + } + }, + "suggest": { + "guzzle\/http": "self.version" + }, + "target-dir": "Guzzle\/Log", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParser.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParser.php new file mode 100644 index 00000000..8d307afe --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParser.php @@ -0,0 +1,96 @@ + 'Domain', 'path' => 'Path', 'max_age' => 'Max-Age', 'expires' => 'Expires', 'version' => 'Version', 'secure' => 'Secure', 'port' => 'Port', 'discard' => 'Discard', 'comment' => 'Comment', 'comment_url' => 'Comment-Url', 'http_only' => 'HttpOnly'); + public function parseCookie($cookie, $host = null, $path = null, $decode = false) + { + // Explode the cookie string using a series of semicolons + $pieces = array_filter(array_map('trim', explode(';', $cookie))); + // The name of the cookie (first kvp) must include an equal sign. + if (empty($pieces) || !strpos($pieces[0], '=')) { + return false; + } + // Create the default return array + $data = array_merge(array_fill_keys(array_keys(self::$cookieParts), null), array('cookies' => array(), 'data' => array(), 'path' => null, 'http_only' => false, 'discard' => false, 'domain' => $host)); + $foundNonCookies = 0; + // Add the cookie pieces into the parsed data array + foreach ($pieces as $part) { + $cookieParts = explode('=', $part, 2); + $key = trim($cookieParts[0]); + if (count($cookieParts) == 1) { + // Can be a single value (e.g. secure, httpOnly) + $value = true; + } else { + // Be sure to strip wrapping quotes + $value = trim($cookieParts[1], " \n\r\t\0\v\""); + if ($decode) { + $value = urldecode($value); + } + } + // Only check for non-cookies when cookies have been found + if (!empty($data['cookies'])) { + foreach (self::$cookieParts as $mapValue => $search) { + if (!strcasecmp($search, $key)) { + $data[$mapValue] = $mapValue == 'port' ? array_map('trim', explode(',', $value)) : $value; + $foundNonCookies++; + continue 2; + } + } + } + // If cookies have not yet been retrieved, or this value was not found in the pieces array, treat it as a + // cookie. IF non-cookies have been parsed, then this isn't a cookie, it's cookie data. Cookies then data. + $data[$foundNonCookies ? 'data' : 'cookies'][$key] = $value; + } + // Calculate the expires date + if (!$data['expires'] && $data['max_age']) { + $data['expires'] = time() + (int) $data['max_age']; + } + // Check path attribute according RFC6265 http://tools.ietf.org/search/rfc6265#section-5.2.4 + // "If the attribute-value is empty or if the first character of the + // attribute-value is not %x2F ("/"): + // Let cookie-path be the default-path. + // Otherwise: + // Let cookie-path be the attribute-value." + if (!$data['path'] || substr($data['path'], 0, 1) !== '/') { + $data['path'] = $this->getDefaultPath($path); + } + return $data; + } + /** + * Get default cookie path according to RFC 6265 + * http://tools.ietf.org/search/rfc6265#section-5.1.4 Paths and Path-Match + * + * @param string $path Request uri-path + * + * @return string + */ + protected function getDefaultPath($path) + { + // "The user agent MUST use an algorithm equivalent to the following algorithm + // to compute the default-path of a cookie:" + // "2. If the uri-path is empty or if the first character of the uri-path is not + // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps. + if (empty($path) || substr($path, 0, 1) !== '/') { + return '/'; + } + // "3. If the uri-path contains no more than one %x2F ("/") character, output + // %x2F ("/") and skip the remaining step." + if ($path === "/") { + return $path; + } + $rightSlashPos = strrpos($path, '/'); + if ($rightSlashPos === 0) { + return "/"; + } + // "4. Output the characters of the uri-path from the first character up to, + // but not including, the right-most %x2F ("/")." + return substr($path, 0, $rightSlashPos); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParserInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParserInterface.php new file mode 100644 index 00000000..5b3ca707 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParserInterface.php @@ -0,0 +1,33 @@ + $requestUrl, 'scheme' => 'http'); + // Check for the Host header + if (isset($parts['headers']['Host'])) { + $urlParts['host'] = $parts['headers']['Host']; + } elseif (isset($parts['headers']['host'])) { + $urlParts['host'] = $parts['headers']['host']; + } else { + $urlParts['host'] = null; + } + if (false === strpos($urlParts['host'], ':')) { + $urlParts['port'] = ''; + } else { + $hostParts = explode(':', $urlParts['host']); + $urlParts['host'] = trim($hostParts[0]); + $urlParts['port'] = (int) trim($hostParts[1]); + if ($urlParts['port'] == 443) { + $urlParts['scheme'] = 'https'; + } + } + // Check if a query is present + $path = $urlParts['path']; + $qpos = strpos($path, '?'); + if ($qpos) { + $urlParts['query'] = substr($path, $qpos + 1); + $urlParts['path'] = substr($path, 0, $qpos); + } else { + $urlParts['query'] = ''; + } + return $urlParts; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Message/MessageParser.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Message/MessageParser.php new file mode 100644 index 00000000..23231552 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Message/MessageParser.php @@ -0,0 +1,79 @@ +parseMessage($message); + // Parse the protocol and protocol version + if (isset($parts['start_line'][2])) { + $startParts = explode('/', $parts['start_line'][2]); + $protocol = strtoupper($startParts[0]); + $version = isset($startParts[1]) ? $startParts[1] : '1.1'; + } else { + $protocol = 'HTTP'; + $version = '1.1'; + } + $parsed = array('method' => strtoupper($parts['start_line'][0]), 'protocol' => $protocol, 'version' => $version, 'headers' => $parts['headers'], 'body' => $parts['body']); + $parsed['request_url'] = $this->getUrlPartsFromMessage(isset($parts['start_line'][1]) ? $parts['start_line'][1] : '', $parsed); + return $parsed; + } + public function parseResponse($message) + { + if (!$message) { + return false; + } + $parts = $this->parseMessage($message); + list($protocol, $version) = explode('/', trim($parts['start_line'][0])); + return array('protocol' => $protocol, 'version' => $version, 'code' => $parts['start_line'][1], 'reason_phrase' => isset($parts['start_line'][2]) ? $parts['start_line'][2] : '', 'headers' => $parts['headers'], 'body' => $parts['body']); + } + /** + * Parse a message into parts + * + * @param string $message Message to parse + * + * @return array + */ + protected function parseMessage($message) + { + $startLine = null; + $headers = array(); + $body = ''; + // Iterate over each line in the message, accounting for line endings + $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE); + for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) { + $line = $lines[$i]; + // If two line breaks were encountered, then this is the end of body + if (empty($line)) { + if ($i < $totalLines - 1) { + $body = implode('', array_slice($lines, $i + 2)); + } + break; + } + // Parse message headers + if (!$startLine) { + $startLine = explode(' ', $line, 3); + } elseif (strpos($line, ':')) { + $parts = explode(':', $line, 2); + $key = trim($parts[0]); + $value = isset($parts[1]) ? trim($parts[1]) : ''; + if (!isset($headers[$key])) { + $headers[$key] = $value; + } elseif (!is_array($headers[$key])) { + $headers[$key] = array($headers[$key], $value); + } else { + $headers[$key][] = $value; + } + } + } + return array('start_line' => $startLine, 'headers' => $headers, 'body' => $body); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Message/MessageParserInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Message/MessageParserInterface.php new file mode 100644 index 00000000..a4519c0b --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Message/MessageParserInterface.php @@ -0,0 +1,26 @@ + $parts->requestMethod, 'protocol' => 'HTTP', 'version' => number_format($parts->httpVersion, 1), 'headers' => $parts->headers, 'body' => $parts->body); + $parsed['request_url'] = $this->getUrlPartsFromMessage($parts->requestUrl, $parsed); + return $parsed; + } + public function parseResponse($message) + { + if (!$message) { + return false; + } + $parts = http_parse_message($message); + return array('protocol' => 'HTTP', 'version' => number_format($parts->httpVersion, 1), 'code' => $parts->responseCode, 'reason_phrase' => $parts->responseStatus, 'headers' => $parts->headers, 'body' => $parts->body); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/ParserRegistry.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/ParserRegistry.php new file mode 100644 index 00000000..d1e76b60 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/ParserRegistry.php @@ -0,0 +1,62 @@ + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Message\\MessageParser', 'cookie' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Cookie\\CookieParser', 'url' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Url\\UrlParser', 'uri_template' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\UriTemplate\\UriTemplate'); + /** + * @return self + * @codeCoverageIgnore + */ + public static function getInstance() + { + if (!self::$instance) { + self::$instance = new static(); + } + return self::$instance; + } + public function __construct() + { + // Use the PECL URI template parser if available + if (extension_loaded('uri_template')) { + $this->mapping['uri_template'] = 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\UriTemplate\\PeclUriTemplate'; + } + } + /** + * Get a parser by name from an instance + * + * @param string $name Name of the parser to retrieve + * + * @return mixed|null + */ + public function getParser($name) + { + if (!isset($this->instances[$name])) { + if (!isset($this->mapping[$name])) { + return null; + } + $class = $this->mapping[$name]; + $this->instances[$name] = new $class(); + } + return $this->instances[$name]; + } + /** + * Register a custom parser by name with the register + * + * @param string $name Name or handle of the parser to register + * @param mixed $parser Instantiated parser to register + */ + public function registerParser($name, $parser) + { + $this->instances[$name] = $parser; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/PeclUriTemplate.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/PeclUriTemplate.php new file mode 100644 index 00000000..0b1c0169 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/PeclUriTemplate.php @@ -0,0 +1,24 @@ + true, '#' => true, '.' => true, '/' => true, ';' => true, '?' => true, '&' => true); + /** @var array Delimiters */ + private static $delims = array(':', '/', '?', '#', '[', ']', '@', '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '='); + /** @var array Percent encoded delimiters */ + private static $delimsPct = array('%3A', '%2F', '%3F', '%23', '%5B', '%5D', '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', '%3B', '%3D'); + public function expand($template, array $variables) + { + if ($this->regex == self::DEFAULT_PATTERN && false === strpos($template, '{')) { + return $template; + } + $this->template = $template; + $this->variables = $variables; + return preg_replace_callback($this->regex, array($this, 'expandMatch'), $this->template); + } + /** + * Set the regex patten used to expand URI templates + * + * @param string $regexPattern + */ + public function setRegex($regexPattern) + { + $this->regex = $regexPattern; + } + /** + * Parse an expression into parts + * + * @param string $expression Expression to parse + * + * @return array Returns an associative array of parts + */ + private function parseExpression($expression) + { + // Check for URI operators + $operator = ''; + if (isset(self::$operatorHash[$expression[0]])) { + $operator = $expression[0]; + $expression = substr($expression, 1); + } + $values = explode(',', $expression); + foreach ($values as &$value) { + $value = trim($value); + $varspec = array(); + $substrPos = strpos($value, ':'); + if ($substrPos) { + $varspec['value'] = substr($value, 0, $substrPos); + $varspec['modifier'] = ':'; + $varspec['position'] = (int) substr($value, $substrPos + 1); + } elseif (substr($value, -1) == '*') { + $varspec['modifier'] = '*'; + $varspec['value'] = substr($value, 0, -1); + } else { + $varspec['value'] = (string) $value; + $varspec['modifier'] = ''; + } + $value = $varspec; + } + return array('operator' => $operator, 'values' => $values); + } + /** + * Process an expansion + * + * @param array $matches Matches met in the preg_replace_callback + * + * @return string Returns the replacement string + */ + private function expandMatch(array $matches) + { + static $rfc1738to3986 = array('+' => '%20', '%7e' => '~'); + $parsed = self::parseExpression($matches[1]); + $replacements = array(); + $prefix = $parsed['operator']; + $joiner = $parsed['operator']; + $useQueryString = false; + if ($parsed['operator'] == '?') { + $joiner = '&'; + $useQueryString = true; + } elseif ($parsed['operator'] == '&') { + $useQueryString = true; + } elseif ($parsed['operator'] == '#') { + $joiner = ','; + } elseif ($parsed['operator'] == ';') { + $useQueryString = true; + } elseif ($parsed['operator'] == '' || $parsed['operator'] == '+') { + $joiner = ','; + $prefix = ''; + } + foreach ($parsed['values'] as $value) { + if (!array_key_exists($value['value'], $this->variables) || $this->variables[$value['value']] === null) { + continue; + } + $variable = $this->variables[$value['value']]; + $actuallyUseQueryString = $useQueryString; + $expanded = ''; + if (is_array($variable)) { + $isAssoc = $this->isAssoc($variable); + $kvp = array(); + foreach ($variable as $key => $var) { + if ($isAssoc) { + $key = rawurlencode($key); + $isNestedArray = is_array($var); + } else { + $isNestedArray = false; + } + if (!$isNestedArray) { + $var = rawurlencode($var); + if ($parsed['operator'] == '+' || $parsed['operator'] == '#') { + $var = $this->decodeReserved($var); + } + } + if ($value['modifier'] == '*') { + if ($isAssoc) { + if ($isNestedArray) { + // Nested arrays must allow for deeply nested structures + $var = strtr(http_build_query(array($key => $var)), $rfc1738to3986); + } else { + $var = $key . '=' . $var; + } + } elseif ($key > 0 && $actuallyUseQueryString) { + $var = $value['value'] . '=' . $var; + } + } + $kvp[$key] = $var; + } + if (empty($variable)) { + $actuallyUseQueryString = false; + } elseif ($value['modifier'] == '*') { + $expanded = implode($joiner, $kvp); + if ($isAssoc) { + // Don't prepend the value name when using the explode modifier with an associative array + $actuallyUseQueryString = false; + } + } else { + if ($isAssoc) { + // When an associative array is encountered and the explode modifier is not set, then the + // result must be a comma separated list of keys followed by their respective values. + foreach ($kvp as $k => &$v) { + $v = $k . ',' . $v; + } + } + $expanded = implode(',', $kvp); + } + } else { + if ($value['modifier'] == ':') { + $variable = substr($variable, 0, $value['position']); + } + $expanded = rawurlencode($variable); + if ($parsed['operator'] == '+' || $parsed['operator'] == '#') { + $expanded = $this->decodeReserved($expanded); + } + } + if ($actuallyUseQueryString) { + if (!$expanded && $joiner != '&') { + $expanded = $value['value']; + } else { + $expanded = $value['value'] . '=' . $expanded; + } + } + $replacements[] = $expanded; + } + $ret = implode($joiner, $replacements); + if ($ret && $prefix) { + return $prefix . $ret; + } + return $ret; + } + /** + * Determines if an array is associative + * + * @param array $array Array to check + * + * @return bool + */ + private function isAssoc(array $array) + { + return (bool) count(array_filter(array_keys($array), 'is_string')); + } + /** + * Removes percent encoding on reserved characters (used with + and # modifiers) + * + * @param string $string String to fix + * + * @return string + */ + private function decodeReserved($string) + { + return str_replace(self::$delimsPct, self::$delims, $string); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/UriTemplateInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/UriTemplateInterface.php new file mode 100644 index 00000000..8e5d40a0 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/UriTemplateInterface.php @@ -0,0 +1,21 @@ +utf8 = $utf8; + } + public function parseUrl($url) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__CLASS__ . ' is deprecated. Just use parse_url()'); + static $defaults = array('scheme' => null, 'host' => null, 'path' => null, 'port' => null, 'query' => null, 'user' => null, 'pass' => null, 'fragment' => null); + $parts = parse_url($url); + // Need to handle query parsing specially for UTF-8 requirements + if ($this->utf8 && isset($parts['query'])) { + $queryPos = strpos($url, '?'); + if (isset($parts['fragment'])) { + $parts['query'] = substr($url, $queryPos + 1, strpos($url, '#') - $queryPos - 1); + } else { + $parts['query'] = substr($url, $queryPos + 1); + } + } + return $parts + $defaults; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Url/UrlParserInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Url/UrlParserInterface.php new file mode 100644 index 00000000..cb49e73b --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Parser/Url/UrlParserInterface.php @@ -0,0 +1,19 @@ +=5.3.2" + }, + "autoload": { + "psr-0": { + "Guzzle\\Parser": "" + } + }, + "target-dir": "Guzzle\/Parser", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Async/AsyncPlugin.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Async/AsyncPlugin.php new file mode 100644 index 00000000..c919f5fa --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Async/AsyncPlugin.php @@ -0,0 +1,70 @@ + 'onBeforeSend', 'request.exception' => 'onRequestTimeout', 'request.sent' => 'onRequestSent', 'curl.callback.progress' => 'onCurlProgress'); + } + /** + * Event used to ensure that progress callback are emitted from the curl handle's request mediator. + * + * @param Event $event + */ + public function onBeforeSend(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + // Ensure that progress callbacks are dispatched + $event['request']->getCurlOptions()->set('progress', true); + } + /** + * Event emitted when a curl progress function is called. When the amount of data uploaded == the amount of data to + * upload OR any bytes have been downloaded, then time the request out after 1ms because we're done with + * transmitting the request, and tell curl not download a body. + * + * @param Event $event + */ + public function onCurlProgress(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + if ($event['handle'] && ($event['downloaded'] || isset($event['uploaded']) && $event['upload_size'] === $event['uploaded'])) { + // Timeout after 1ms + curl_setopt($event['handle'], CURLOPT_TIMEOUT_MS, 1); + // Even if the response is quick, tell curl not to download the body. + // - Note that we can only perform this shortcut if the request transmitted a body so as to ensure that the + // request method is not converted to a HEAD request before the request was sent via curl. + if ($event['uploaded']) { + curl_setopt($event['handle'], CURLOPT_NOBODY, true); + } + } + } + /** + * Event emitted when a curl exception occurs. Ignore the exception and set a mock response. + * + * @param Event $event + */ + public function onRequestTimeout(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + if ($event['exception'] instanceof CurlException) { + $event['request']->setResponse(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response(200, array('X-Guzzle-Async' => 'Did not wait for the response'))); + } + } + /** + * Event emitted when a request completes because it took less than 1ms. Add an X-Guzzle-Async header to notify the + * caller that there is no body in the message. + * + * @param Event $event + */ + public function onRequestSent(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + // Let the caller know this was meant to be async + $event['request']->getResponse()->setHeader('X-Guzzle-Async', 'Did not wait for the response'); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Async/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Async/composer.json new file mode 100644 index 00000000..3ffee347 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Async/composer.json @@ -0,0 +1,32 @@ +{ + "name": "guzzle\/plugin-async", + "description": "Guzzle async request plugin", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "plugin", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/http": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\Async": "" + } + }, + "target-dir": "Guzzle\/Plugin\/Async", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/AbstractBackoffStrategy.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/AbstractBackoffStrategy.php new file mode 100644 index 00000000..fd8156f3 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/AbstractBackoffStrategy.php @@ -0,0 +1,74 @@ +next = $next; + } + /** + * Get the next backoff strategy in the chain + * + * @return AbstractBackoffStrategy|null + */ + public function getNext() + { + return $this->next; + } + public function getBackoffPeriod($retries, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response = null, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\HttpException $e = null) + { + $delay = $this->getDelay($retries, $request, $response, $e); + if ($delay === false) { + // The strategy knows that this must not be retried + return false; + } elseif ($delay === null) { + // If the strategy is deferring a decision and the next strategy will not make a decision then return false + return !$this->next || !$this->next->makesDecision() ? false : $this->next->getBackoffPeriod($retries, $request, $response, $e); + } elseif ($delay === true) { + // if the strategy knows that it must retry but is deferring to the next to determine the delay + if (!$this->next) { + return 0; + } else { + $next = $this->next; + while ($next->makesDecision() && $next->getNext()) { + $next = $next->getNext(); + } + return !$next->makesDecision() ? $next->getBackoffPeriod($retries, $request, $response, $e) : 0; + } + } else { + return $delay; + } + } + /** + * Check if the strategy does filtering and makes decisions on whether or not to retry. + * + * Strategies that return false will never retry if all of the previous strategies in a chain defer on a backoff + * decision. + * + * @return bool + */ + public abstract function makesDecision(); + /** + * Implement the concrete strategy + * + * @param int $retries Number of retries of the request + * @param RequestInterface $request Request that was sent + * @param Response $response Response that was received. Note that there may not be a response + * @param HttpException $e Exception that was encountered if any + * + * @return bool|int|null Returns false to not retry or the number of seconds to delay between retries. Return true + * or null to defer to the next strategy if available, and if not, return 0. + */ + protected abstract function getDelay($retries, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response = null, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\HttpException $e = null); +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/AbstractErrorCodeBackoffStrategy.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/AbstractErrorCodeBackoffStrategy.php new file mode 100644 index 00000000..da3a8572 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/AbstractErrorCodeBackoffStrategy.php @@ -0,0 +1,36 @@ +errorCodes = array_fill_keys($codes ?: static::$defaultErrorCodes, 1); + $this->next = $next; + } + /** + * Get the default failure codes to retry + * + * @return array + */ + public static function getDefaultFailureCodes() + { + return static::$defaultErrorCodes; + } + public function makesDecision() + { + return true; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffLogger.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffLogger.php new file mode 100644 index 00000000..d65de423 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffLogger.php @@ -0,0 +1,60 @@ +logger = $logger; + $this->formatter = $formatter ?: new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Log\MessageFormatter(self::DEFAULT_FORMAT); + } + public static function getSubscribedEvents() + { + return array(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\BackoffPlugin::RETRY_EVENT => 'onRequestRetry'); + } + /** + * Set the template to use for logging + * + * @param string $template Log message template + * + * @return self + */ + public function setTemplate($template) + { + $this->formatter->setTemplate($template); + return $this; + } + /** + * Called when a request is being retried + * + * @param Event $event Event emitted + */ + public function onRequestRetry(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $this->logger->log($this->formatter->format($event['request'], $event['response'], $event['handle'], array('retries' => $event['retries'], 'delay' => $event['delay']))); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffPlugin.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffPlugin.php new file mode 100644 index 00000000..3336f288 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffPlugin.php @@ -0,0 +1,95 @@ +strategy = $strategy; + } + /** + * Retrieve a basic truncated exponential backoff plugin that will retry HTTP errors and cURL errors + * + * @param int $maxRetries Maximum number of retries + * @param array $httpCodes HTTP response codes to retry + * @param array $curlCodes cURL error codes to retry + * + * @return self + */ + public static function getExponentialBackoff($maxRetries = 3, array $httpCodes = null, array $curlCodes = null) + { + return new self(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\TruncatedBackoffStrategy($maxRetries, new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\HttpBackoffStrategy($httpCodes, new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\CurlBackoffStrategy($curlCodes, new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Backoff\ExponentialBackoffStrategy())))); + } + public static function getAllEvents() + { + return array(self::RETRY_EVENT); + } + public static function getSubscribedEvents() + { + return array('request.sent' => 'onRequestSent', 'request.exception' => 'onRequestSent', \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlMultiInterface::POLLING_REQUEST => 'onRequestPoll'); + } + /** + * Called when a request has been sent and isn't finished processing + * + * @param Event $event + */ + public function onRequestSent(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $request = $event['request']; + $response = $event['response']; + $exception = $event['exception']; + $params = $request->getParams(); + $retries = (int) $params->get(self::RETRY_PARAM); + $delay = $this->strategy->getBackoffPeriod($retries, $request, $response, $exception); + if ($delay !== false) { + // Calculate how long to wait until the request should be retried + $params->set(self::RETRY_PARAM, ++$retries)->set(self::DELAY_PARAM, microtime(true) + $delay); + // Send the request again + $request->setState(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_TRANSFER); + $this->dispatch(self::RETRY_EVENT, array('request' => $request, 'response' => $response, 'handle' => $exception && $exception instanceof CurlException ? $exception->getCurlHandle() : null, 'retries' => $retries, 'delay' => $delay)); + } + } + /** + * Called when a request is polling in the curl multi object + * + * @param Event $event + */ + public function onRequestPoll(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $request = $event['request']; + $delay = $request->getParams()->get(self::DELAY_PARAM); + // If the duration of the delay has passed, retry the request using the pool + if (null !== $delay && microtime(true) >= $delay) { + // Remove the request from the pool and then add it back again. This is required for cURL to know that we + // want to retry sending the easy handle. + $request->getParams()->remove(self::DELAY_PARAM); + // Rewind the request body if possible + if ($request instanceof EntityEnclosingRequestInterface && $request->getBody()) { + $request->getBody()->seek(0); + } + $multi = $event['curl_multi']; + $multi->remove($request); + $multi->add($request); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffStrategyInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffStrategyInterface.php new file mode 100644 index 00000000..0807bf9f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffStrategyInterface.php @@ -0,0 +1,24 @@ +callback = $callback; + $this->decision = (bool) $decision; + $this->next = $next; + } + public function makesDecision() + { + return $this->decision; + } + protected function getDelay($retries, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response = null, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\HttpException $e = null) + { + return call_user_func($this->callback, $retries, $request, $response, $e); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ConstantBackoffStrategy.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ConstantBackoffStrategy.php new file mode 100644 index 00000000..63119e24 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ConstantBackoffStrategy.php @@ -0,0 +1,30 @@ +delay = $delay; + } + public function makesDecision() + { + return false; + } + protected function getDelay($retries, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response = null, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\HttpException $e = null) + { + return $this->delay; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/CurlBackoffStrategy.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/CurlBackoffStrategy.php new file mode 100644 index 00000000..df1ed5b7 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/CurlBackoffStrategy.php @@ -0,0 +1,22 @@ +errorCodes[$e->getErrorNo()]) ? true : null; + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ExponentialBackoffStrategy.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ExponentialBackoffStrategy.php new file mode 100644 index 00000000..6b59adbe --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ExponentialBackoffStrategy.php @@ -0,0 +1,23 @@ +isSuccessful()) { + return false; + } else { + return isset($this->errorCodes[$response->getStatusCode()]) ? true : null; + } + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/LinearBackoffStrategy.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/LinearBackoffStrategy.php new file mode 100644 index 00000000..b1c7d658 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/LinearBackoffStrategy.php @@ -0,0 +1,32 @@ +step = $step; + } + public function makesDecision() + { + return false; + } + protected function getDelay($retries, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response = null, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\HttpException $e = null) + { + return $retries * $this->step; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ReasonPhraseBackoffStrategy.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ReasonPhraseBackoffStrategy.php new file mode 100644 index 00000000..af94f9af --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ReasonPhraseBackoffStrategy.php @@ -0,0 +1,23 @@ +errorCodes[$response->getReasonPhrase()]) ? true : null; + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/TruncatedBackoffStrategy.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/TruncatedBackoffStrategy.php new file mode 100644 index 00000000..b2cee856 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/TruncatedBackoffStrategy.php @@ -0,0 +1,32 @@ +max = $maxRetries; + $this->next = $next; + } + public function makesDecision() + { + return true; + } + protected function getDelay($retries, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response = null, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\HttpException $e = null) + { + return $retries < $this->max ? null : false; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/composer.json new file mode 100644 index 00000000..b7a5af3f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Backoff/composer.json @@ -0,0 +1,33 @@ +{ + "name": "guzzle\/plugin-backoff", + "description": "Guzzle backoff retry plugins", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "plugin", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/http": "self.version", + "guzzle\/log": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\Backoff": "" + } + }, + "target-dir": "Guzzle\/Plugin\/Backoff", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/CacheKeyProviderInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/CacheKeyProviderInterface.php new file mode 100644 index 00000000..63f68a1f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/CacheKeyProviderInterface.php @@ -0,0 +1,12 @@ + new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cache\DefaultCacheStorage($options)); + } elseif ($options instanceof CacheStorageInterface) { + $options = array('storage' => $options); + } elseif ($options) { + $options = array('storage' => new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cache\DefaultCacheStorage(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Cache\CacheAdapterFactory::fromCache($options))); + } elseif (!class_exists('DeliciousBrains\\WP_Offload_S3\\Aws2\\Doctrine\\Common\\Cache\\ArrayCache')) { + // @codeCoverageIgnoreStart + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('No cache was provided and Doctrine is not installed'); + // @codeCoverageIgnoreEnd + } + } + $this->autoPurge = isset($options['auto_purge']) ? $options['auto_purge'] : false; + // Add a cache storage if a cache adapter was provided + $this->storage = isset($options['storage']) ? $options['storage'] : new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cache\DefaultCacheStorage(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Cache\DoctrineCacheAdapter(new \DeliciousBrains\WP_Offload_S3\Aws2\Doctrine\Common\Cache\ArrayCache())); + if (!isset($options['can_cache'])) { + $this->canCache = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cache\DefaultCanCacheStrategy(); + } else { + $this->canCache = is_callable($options['can_cache']) ? new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cache\CallbackCanCacheStrategy($options['can_cache']) : $options['can_cache']; + } + // Use the provided revalidation strategy or the default + $this->revalidation = isset($options['revalidation']) ? $options['revalidation'] : new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cache\DefaultRevalidation($this->storage, $this->canCache); + } + public static function getSubscribedEvents() + { + return array('request.before_send' => array('onRequestBeforeSend', -255), 'request.sent' => array('onRequestSent', 255), 'request.error' => array('onRequestError', 0), 'request.exception' => array('onRequestException', 0)); + } + /** + * Check if a response in cache will satisfy the request before sending + * + * @param Event $event + */ + public function onRequestBeforeSend(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $request = $event['request']; + $request->addHeader('Via', sprintf('%s GuzzleCache/%s', $request->getProtocolVersion(), \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::VERSION)); + if (!$this->canCache->canCacheRequest($request)) { + switch ($request->getMethod()) { + case 'PURGE': + $this->purge($request); + $request->setResponse(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response(200, array(), 'purged')); + break; + case 'PUT': + case 'POST': + case 'DELETE': + case 'PATCH': + if ($this->autoPurge) { + $this->purge($request); + } + } + return; + } + if ($response = $this->storage->fetch($request)) { + $params = $request->getParams(); + $params['cache.lookup'] = true; + $response->setHeader('Age', time() - strtotime($response->getDate() ?: $response->getLastModified() ?: 'now')); + // Validate that the response satisfies the request + if ($this->canResponseSatisfyRequest($request, $response)) { + if (!isset($params['cache.hit'])) { + $params['cache.hit'] = true; + } + $request->setResponse($response); + } + } + } + /** + * If possible, store a response in cache after sending + * + * @param Event $event + */ + public function onRequestSent(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $request = $event['request']; + $response = $event['response']; + if ($request->getParams()->get('cache.hit') === null && $this->canCache->canCacheRequest($request) && $this->canCache->canCacheResponse($response)) { + $this->storage->cache($request, $response); + } + $this->addResponseHeaders($request, $response); + } + /** + * If possible, return a cache response on an error + * + * @param Event $event + */ + public function onRequestError(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $request = $event['request']; + if (!$this->canCache->canCacheRequest($request)) { + return; + } + if ($response = $this->storage->fetch($request)) { + $response->setHeader('Age', time() - strtotime($response->getLastModified() ?: $response->getDate() ?: 'now')); + if ($this->canResponseSatisfyFailedRequest($request, $response)) { + $request->getParams()->set('cache.hit', 'error'); + $this->addResponseHeaders($request, $response); + $event['response'] = $response; + $event->stopPropagation(); + } + } + } + /** + * If possible, set a cache response on a cURL exception + * + * @param Event $event + * + * @return null + */ + public function onRequestException(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + if (!$event['exception'] instanceof CurlException) { + return; + } + $request = $event['request']; + if (!$this->canCache->canCacheRequest($request)) { + return; + } + if ($response = $this->storage->fetch($request)) { + $response->setHeader('Age', time() - strtotime($response->getDate() ?: 'now')); + if (!$this->canResponseSatisfyFailedRequest($request, $response)) { + return; + } + $request->getParams()->set('cache.hit', 'error'); + $request->setResponse($response); + $this->addResponseHeaders($request, $response); + $event->stopPropagation(); + } + } + /** + * Check if a cache response satisfies a request's caching constraints + * + * @param RequestInterface $request Request to validate + * @param Response $response Response to validate + * + * @return bool + */ + public function canResponseSatisfyRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + $responseAge = $response->calculateAge(); + $reqc = $request->getHeader('Cache-Control'); + $resc = $response->getHeader('Cache-Control'); + // Check the request's max-age header against the age of the response + if ($reqc && $reqc->hasDirective('max-age') && $responseAge > $reqc->getDirective('max-age')) { + return false; + } + // Check the response's max-age header + if ($response->isFresh() === false) { + $maxStale = $reqc ? $reqc->getDirective('max-stale') : null; + if (null !== $maxStale) { + if ($maxStale !== true && $response->getFreshness() < -1 * $maxStale) { + return false; + } + } elseif ($resc && $resc->hasDirective('max-age') && $responseAge > $resc->getDirective('max-age')) { + return false; + } + } + if ($this->revalidation->shouldRevalidate($request, $response)) { + try { + return $this->revalidation->revalidate($request, $response); + } catch (CurlException $e) { + $request->getParams()->set('cache.hit', 'error'); + return $this->canResponseSatisfyFailedRequest($request, $response); + } + } + return true; + } + /** + * Check if a cache response satisfies a failed request's caching constraints + * + * @param RequestInterface $request Request to validate + * @param Response $response Response to validate + * + * @return bool + */ + public function canResponseSatisfyFailedRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + $reqc = $request->getHeader('Cache-Control'); + $resc = $response->getHeader('Cache-Control'); + $requestStaleIfError = $reqc ? $reqc->getDirective('stale-if-error') : null; + $responseStaleIfError = $resc ? $resc->getDirective('stale-if-error') : null; + if (!$requestStaleIfError && !$responseStaleIfError) { + return false; + } + if (is_numeric($requestStaleIfError) && $response->getAge() - $response->getMaxAge() > $requestStaleIfError) { + return false; + } + if (is_numeric($responseStaleIfError) && $response->getAge() - $response->getMaxAge() > $responseStaleIfError) { + return false; + } + return true; + } + /** + * Purge all cache entries for a given URL + * + * @param string $url URL to purge + */ + public function purge($url) + { + // BC compatibility with previous version that accepted a Request object + $url = $url instanceof RequestInterface ? $url->getUrl() : $url; + $this->storage->purge($url); + } + /** + * Add the plugin's headers to a response + * + * @param RequestInterface $request Request + * @param Response $response Response to add headers to + */ + protected function addResponseHeaders(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + $params = $request->getParams(); + $response->setHeader('Via', sprintf('%s GuzzleCache/%s', $request->getProtocolVersion(), \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::VERSION)); + $lookup = ($params['cache.lookup'] === true ? 'HIT' : 'MISS') . ' from GuzzleCache'; + if ($header = $response->getHeader('X-Cache-Lookup')) { + // Don't add duplicates + $values = $header->toArray(); + $values[] = $lookup; + $response->setHeader('X-Cache-Lookup', array_unique($values)); + } else { + $response->setHeader('X-Cache-Lookup', $lookup); + } + if ($params['cache.hit'] === true) { + $xcache = 'HIT from GuzzleCache'; + } elseif ($params['cache.hit'] == 'error') { + $xcache = 'HIT_ERROR from GuzzleCache'; + } else { + $xcache = 'MISS from GuzzleCache'; + } + if ($header = $response->getHeader('X-Cache')) { + // Don't add duplicates + $values = $header->toArray(); + $values[] = $xcache; + $response->setHeader('X-Cache', array_unique($values)); + } else { + $response->setHeader('X-Cache', $xcache); + } + if ($response->isFresh() === false) { + $response->addHeader('Warning', sprintf('110 GuzzleCache/%s "Response is stale"', \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::VERSION)); + if ($params['cache.hit'] === 'error') { + $response->addHeader('Warning', sprintf('111 GuzzleCache/%s "Revalidation failed"', \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::VERSION)); + } + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/CacheStorageInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/CacheStorageInterface.php new file mode 100644 index 00000000..2bcf6c78 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/CacheStorageInterface.php @@ -0,0 +1,39 @@ +requestCallback = $requestCallback; + $this->responseCallback = $responseCallback; + } + public function canCacheRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + return $this->requestCallback ? call_user_func($this->requestCallback, $request) : parent::canCacheRequest($request); + } + public function canCacheResponse(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + return $this->responseCallback ? call_user_func($this->responseCallback, $response) : parent::canCacheResponse($response); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/CanCacheStrategyInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/CanCacheStrategyInterface.php new file mode 100644 index 00000000..e317066d --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/CanCacheStrategyInterface.php @@ -0,0 +1,28 @@ +getParams()->get(self::CACHE_KEY); + if (!$key) { + $cloned = clone $request; + $cloned->removeHeader('Cache-Control'); + // Check to see how and if the key should be filtered + foreach (explode(';', $request->getParams()->get(self::CACHE_KEY_FILTER)) as $part) { + $pieces = array_map('trim', explode('=', $part)); + if (isset($pieces[1])) { + foreach (array_map('trim', explode(',', $pieces[1])) as $remove) { + if ($pieces[0] == 'header') { + $cloned->removeHeader($remove); + } elseif ($pieces[0] == 'query') { + $cloned->getQuery()->remove($remove); + } + } + } + } + $raw = (string) $cloned; + $key = 'GZ' . md5($raw); + $request->getParams()->set(self::CACHE_KEY, $key)->set(self::CACHE_KEY_RAW, $raw); + } + return $key; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCacheStorage.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCacheStorage.php new file mode 100644 index 00000000..88a554c1 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCacheStorage.php @@ -0,0 +1,224 @@ +cache = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Cache\CacheAdapterFactory::fromCache($cache); + $this->defaultTtl = $defaultTtl; + $this->keyPrefix = $keyPrefix; + } + public function cache(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + $currentTime = time(); + $overrideTtl = $request->getParams()->get('cache.override_ttl'); + if ($overrideTtl) { + $ttl = $overrideTtl; + } else { + $maxAge = $response->getMaxAge(); + if ($maxAge !== null) { + $ttl = $maxAge; + } else { + $ttl = $this->defaultTtl; + } + } + if ($cacheControl = $response->getHeader('Cache-Control')) { + $stale = $cacheControl->getDirective('stale-if-error'); + if ($stale === true) { + $ttl += $ttl; + } else { + if (is_numeric($stale)) { + $ttl += $stale; + } + } + } + // Determine which manifest key should be used + $key = $this->getCacheKey($request); + $persistedRequest = $this->persistHeaders($request); + $entries = array(); + if ($manifest = $this->cache->fetch($key)) { + // Determine which cache entries should still be in the cache + $vary = $response->getVary(); + foreach (unserialize($manifest) as $entry) { + // Check if the entry is expired + if ($entry[4] < $currentTime) { + continue; + } + $entry[1]['vary'] = isset($entry[1]['vary']) ? $entry[1]['vary'] : ''; + if ($vary != $entry[1]['vary'] || !$this->requestsMatch($vary, $entry[0], $persistedRequest)) { + $entries[] = $entry; + } + } + } + // Persist the response body if needed + $bodyDigest = null; + if ($response->getBody() && $response->getBody()->getContentLength() > 0) { + $bodyDigest = $this->getBodyKey($request->getUrl(), $response->getBody()); + $this->cache->save($bodyDigest, (string) $response->getBody(), $ttl); + } + array_unshift($entries, array($persistedRequest, $this->persistHeaders($response), $response->getStatusCode(), $bodyDigest, $currentTime + $ttl)); + $this->cache->save($key, serialize($entries)); + } + public function delete(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $key = $this->getCacheKey($request); + if ($entries = $this->cache->fetch($key)) { + // Delete each cached body + foreach (unserialize($entries) as $entry) { + if ($entry[3]) { + $this->cache->delete($entry[3]); + } + } + $this->cache->delete($key); + } + } + public function purge($url) + { + foreach (array('GET', 'HEAD', 'POST', 'PUT', 'DELETE') as $method) { + $this->delete(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Request($method, $url)); + } + } + public function fetch(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $key = $this->getCacheKey($request); + if (!($entries = $this->cache->fetch($key))) { + return null; + } + $match = null; + $headers = $this->persistHeaders($request); + $entries = unserialize($entries); + foreach ($entries as $index => $entry) { + if ($this->requestsMatch(isset($entry[1]['vary']) ? $entry[1]['vary'] : '', $headers, $entry[0])) { + $match = $entry; + break; + } + } + if (!$match) { + return null; + } + // Ensure that the response is not expired + $response = null; + if ($match[4] < time()) { + $response = -1; + } else { + $response = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response($match[2], $match[1]); + if ($match[3]) { + if ($body = $this->cache->fetch($match[3])) { + $response->setBody($body); + } else { + // The response is not valid because the body was somehow deleted + $response = -1; + } + } + } + if ($response === -1) { + // Remove the entry from the metadata and update the cache + unset($entries[$index]); + if ($entries) { + $this->cache->save($key, serialize($entries)); + } else { + $this->cache->delete($key); + } + return null; + } + return $response; + } + /** + * Hash a request URL into a string that returns cache metadata + * + * @param RequestInterface $request + * + * @return string + */ + protected function getCacheKey(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + // Allow cache.key_filter to trim down the URL cache key by removing generate query string values (e.g. auth) + if ($filter = $request->getParams()->get('cache.key_filter')) { + $url = $request->getUrl(true); + foreach (explode(',', $filter) as $remove) { + $url->getQuery()->remove(trim($remove)); + } + } else { + $url = $request->getUrl(); + } + return $this->keyPrefix . md5($request->getMethod() . ' ' . $url); + } + /** + * Create a cache key for a response's body + * + * @param string $url URL of the entry + * @param EntityBodyInterface $body Response body + * + * @return string + */ + protected function getBodyKey($url, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBodyInterface $body) + { + return $this->keyPrefix . md5($url) . $body->getContentMd5(); + } + /** + * Determines whether two Request HTTP header sets are non-varying + * + * @param string $vary Response vary header + * @param array $r1 HTTP header array + * @param array $r2 HTTP header array + * + * @return bool + */ + private function requestsMatch($vary, $r1, $r2) + { + if ($vary) { + foreach (explode(',', $vary) as $header) { + $key = trim(strtolower($header)); + $v1 = isset($r1[$key]) ? $r1[$key] : null; + $v2 = isset($r2[$key]) ? $r2[$key] : null; + if ($v1 !== $v2) { + return false; + } + } + } + return true; + } + /** + * Creates an array of cacheable and normalized message headers + * + * @param MessageInterface $message + * + * @return array + */ + private function persistHeaders(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\MessageInterface $message) + { + // Headers are excluded from the caching (see RFC 2616:13.5.1) + static $noCache = array('age' => true, 'connection' => true, 'keep-alive' => true, 'proxy-authenticate' => true, 'proxy-authorization' => true, 'te' => true, 'trailers' => true, 'transfer-encoding' => true, 'upgrade' => true, 'set-cookie' => true, 'set-cookie2' => true); + // Clone the response to not destroy any necessary headers when caching + $headers = $message->getHeaders()->getAll(); + $headers = array_diff_key($headers, $noCache); + // Cast the headers to a string + $headers = array_map(function ($h) { + return (string) $h; + }, $headers); + return $headers; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCanCacheStrategy.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCanCacheStrategy.php new file mode 100644 index 00000000..3b07fe55 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCanCacheStrategy.php @@ -0,0 +1,28 @@ +getMethod() != \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::GET && $request->getMethod() != \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::HEAD) { + return false; + } + // Never cache requests when using no-store + if ($request->hasHeader('Cache-Control') && $request->getHeader('Cache-Control')->hasDirective('no-store')) { + return false; + } + return true; + } + public function canCacheResponse(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + return $response->isSuccessful() && $response->canCache(); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultRevalidation.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultRevalidation.php new file mode 100644 index 00000000..a918eefb --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultRevalidation.php @@ -0,0 +1,149 @@ +storage = $cache; + $this->canCache = $canCache ?: new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cache\DefaultCanCacheStrategy(); + } + public function revalidate(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + try { + $revalidate = $this->createRevalidationRequest($request, $response); + $validateResponse = $revalidate->send(); + if ($validateResponse->getStatusCode() == 200) { + return $this->handle200Response($request, $validateResponse); + } elseif ($validateResponse->getStatusCode() == 304) { + return $this->handle304Response($request, $validateResponse, $response); + } + } catch (BadResponseException $e) { + $this->handleBadResponse($e); + } + // Other exceptions encountered in the revalidation request are ignored + // in hopes that sending a request to the origin server will fix it + return false; + } + public function shouldRevalidate(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + if ($request->getMethod() != \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::GET) { + return false; + } + $reqCache = $request->getHeader('Cache-Control'); + $resCache = $response->getHeader('Cache-Control'); + $revalidate = $request->getHeader('Pragma') == 'no-cache' || $reqCache && ($reqCache->hasDirective('no-cache') || $reqCache->hasDirective('must-revalidate')) || $resCache && ($resCache->hasDirective('no-cache') || $resCache->hasDirective('must-revalidate')); + // Use the strong ETag validator if available and the response contains no Cache-Control directive + if (!$revalidate && !$resCache && $response->hasHeader('ETag')) { + $revalidate = true; + } + return $revalidate; + } + /** + * Handles a bad response when attempting to revalidate + * + * @param BadResponseException $e Exception encountered + * + * @throws BadResponseException + */ + protected function handleBadResponse(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\BadResponseException $e) + { + // 404 errors mean the resource no longer exists, so remove from + // cache, and prevent an additional request by throwing the exception + if ($e->getResponse()->getStatusCode() == 404) { + $this->storage->delete($e->getRequest()); + throw $e; + } + } + /** + * Creates a request to use for revalidation + * + * @param RequestInterface $request Request + * @param Response $response Response to revalidate + * + * @return RequestInterface returns a revalidation request + */ + protected function createRevalidationRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + $revalidate = clone $request; + $revalidate->removeHeader('Pragma')->removeHeader('Cache-Control'); + if ($response->getLastModified()) { + $revalidate->setHeader('If-Modified-Since', $response->getLastModified()); + } + if ($response->getEtag()) { + $revalidate->setHeader('If-None-Match', $response->getEtag()); + } + // Remove any cache plugins that might be on the request to prevent infinite recursive revalidations + $dispatcher = $revalidate->getEventDispatcher(); + foreach ($dispatcher->getListeners() as $eventName => $listeners) { + foreach ($listeners as $listener) { + if (is_array($listener) && $listener[0] instanceof CachePlugin) { + $dispatcher->removeListener($eventName, $listener); + } + } + } + return $revalidate; + } + /** + * Handles a 200 response response from revalidating. The server does not support validation, so use this response. + * + * @param RequestInterface $request Request that was sent + * @param Response $validateResponse Response received + * + * @return bool Returns true if valid, false if invalid + */ + protected function handle200Response(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $validateResponse) + { + $request->setResponse($validateResponse); + if ($this->canCache->canCacheResponse($validateResponse)) { + $this->storage->cache($request, $validateResponse); + } + return false; + } + /** + * Handle a 304 response and ensure that it is still valid + * + * @param RequestInterface $request Request that was sent + * @param Response $validateResponse Response received + * @param Response $response Original cached response + * + * @return bool Returns true if valid, false if invalid + */ + protected function handle304Response(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $validateResponse, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + static $replaceHeaders = array('Date', 'Expires', 'Cache-Control', 'ETag', 'Last-Modified'); + // Make sure that this response has the same ETag + if ($validateResponse->getEtag() != $response->getEtag()) { + return false; + } + // Replace cached headers with any of these headers from the + // origin server that might be more up to date + $modified = false; + foreach ($replaceHeaders as $name) { + if ($validateResponse->hasHeader($name)) { + $modified = true; + $response->setHeader($name, $validateResponse->getHeader($name)); + } + } + // Store the updated response in cache + if ($modified && $this->canCache->canCacheResponse($response)) { + $this->storage->cache($request, $response); + } + return true; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/DenyRevalidation.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/DenyRevalidation.php new file mode 100644 index 00000000..947fc7e1 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cache/DenyRevalidation.php @@ -0,0 +1,19 @@ +=5.3.2", + "guzzle\/http": "self.version", + "guzzle\/cache": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\Cache": "" + } + }, + "target-dir": "Guzzle\/Plugin\/Cache", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php new file mode 100644 index 00000000..c0f9dbc0 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php @@ -0,0 +1,465 @@ + '', 'value' => '', 'domain' => '', 'path' => '/', 'expires' => null, 'max_age' => 0, 'comment' => null, 'comment_url' => null, 'port' => array(), 'version' => null, 'secure' => false, 'discard' => false, 'http_only' => false); + $this->data = array_merge($defaults, $data); + // Extract the expires value and turn it into a UNIX timestamp if needed + if (!$this->getExpires() && $this->getMaxAge()) { + // Calculate the expires date + $this->setExpires(time() + (int) $this->getMaxAge()); + } elseif ($this->getExpires() && !is_numeric($this->getExpires())) { + $this->setExpires(strtotime($this->getExpires())); + } + } + /** + * Get the cookie as an array + * + * @return array + */ + public function toArray() + { + return $this->data; + } + /** + * Get the cookie name + * + * @return string + */ + public function getName() + { + return $this->data['name']; + } + /** + * Set the cookie name + * + * @param string $name Cookie name + * + * @return Cookie + */ + public function setName($name) + { + return $this->setData('name', $name); + } + /** + * Get the cookie value + * + * @return string + */ + public function getValue() + { + return $this->data['value']; + } + /** + * Set the cookie value + * + * @param string $value Cookie value + * + * @return Cookie + */ + public function setValue($value) + { + return $this->setData('value', $value); + } + /** + * Get the domain + * + * @return string|null + */ + public function getDomain() + { + return $this->data['domain']; + } + /** + * Set the domain of the cookie + * + * @param string $domain + * + * @return Cookie + */ + public function setDomain($domain) + { + return $this->setData('domain', $domain); + } + /** + * Get the path + * + * @return string + */ + public function getPath() + { + return $this->data['path']; + } + /** + * Set the path of the cookie + * + * @param string $path Path of the cookie + * + * @return Cookie + */ + public function setPath($path) + { + return $this->setData('path', $path); + } + /** + * Maximum lifetime of the cookie in seconds + * + * @return int|null + */ + public function getMaxAge() + { + return $this->data['max_age']; + } + /** + * Set the max-age of the cookie + * + * @param int $maxAge Max age of the cookie in seconds + * + * @return Cookie + */ + public function setMaxAge($maxAge) + { + return $this->setData('max_age', $maxAge); + } + /** + * The UNIX timestamp when the cookie expires + * + * @return mixed + */ + public function getExpires() + { + return $this->data['expires']; + } + /** + * Set the unix timestamp for which the cookie will expire + * + * @param int $timestamp Unix timestamp + * + * @return Cookie + */ + public function setExpires($timestamp) + { + return $this->setData('expires', $timestamp); + } + /** + * Version of the cookie specification. RFC 2965 is 1 + * + * @return mixed + */ + public function getVersion() + { + return $this->data['version']; + } + /** + * Set the cookie version + * + * @param string|int $version Version to set + * + * @return Cookie + */ + public function setVersion($version) + { + return $this->setData('version', $version); + } + /** + * Get whether or not this is a secure cookie + * + * @return null|bool + */ + public function getSecure() + { + return $this->data['secure']; + } + /** + * Set whether or not the cookie is secure + * + * @param bool $secure Set to true or false if secure + * + * @return Cookie + */ + public function setSecure($secure) + { + return $this->setData('secure', (bool) $secure); + } + /** + * Get whether or not this is a session cookie + * + * @return null|bool + */ + public function getDiscard() + { + return $this->data['discard']; + } + /** + * Set whether or not this is a session cookie + * + * @param bool $discard Set to true or false if this is a session cookie + * + * @return Cookie + */ + public function setDiscard($discard) + { + return $this->setData('discard', $discard); + } + /** + * Get the comment + * + * @return string|null + */ + public function getComment() + { + return $this->data['comment']; + } + /** + * Set the comment of the cookie + * + * @param string $comment Cookie comment + * + * @return Cookie + */ + public function setComment($comment) + { + return $this->setData('comment', $comment); + } + /** + * Get the comment URL of the cookie + * + * @return string|null + */ + public function getCommentUrl() + { + return $this->data['comment_url']; + } + /** + * Set the comment URL of the cookie + * + * @param string $commentUrl Cookie comment URL for more information + * + * @return Cookie + */ + public function setCommentUrl($commentUrl) + { + return $this->setData('comment_url', $commentUrl); + } + /** + * Get an array of acceptable ports this cookie can be used with + * + * @return array + */ + public function getPorts() + { + return $this->data['port']; + } + /** + * Set a list of acceptable ports this cookie can be used with + * + * @param array $ports Array of acceptable ports + * + * @return Cookie + */ + public function setPorts(array $ports) + { + return $this->setData('port', $ports); + } + /** + * Get whether or not this is an HTTP only cookie + * + * @return bool + */ + public function getHttpOnly() + { + return $this->data['http_only']; + } + /** + * Set whether or not this is an HTTP only cookie + * + * @param bool $httpOnly Set to true or false if this is HTTP only + * + * @return Cookie + */ + public function setHttpOnly($httpOnly) + { + return $this->setData('http_only', $httpOnly); + } + /** + * Get an array of extra cookie data + * + * @return array + */ + public function getAttributes() + { + return $this->data['data']; + } + /** + * Get a specific data point from the extra cookie data + * + * @param string $name Name of the data point to retrieve + * + * @return null|string + */ + public function getAttribute($name) + { + return array_key_exists($name, $this->data['data']) ? $this->data['data'][$name] : null; + } + /** + * Set a cookie data attribute + * + * @param string $name Name of the attribute to set + * @param string $value Value to set + * + * @return Cookie + */ + public function setAttribute($name, $value) + { + $this->data['data'][$name] = $value; + return $this; + } + /** + * Check if the cookie matches a path value + * + * @param string $path Path to check against + * + * @return bool + */ + public function matchesPath($path) + { + // RFC6265 http://tools.ietf.org/search/rfc6265#section-5.1.4 + // A request-path path-matches a given cookie-path if at least one of + // the following conditions holds: + // o The cookie-path and the request-path are identical. + if ($path == $this->getPath()) { + return true; + } + $pos = stripos($path, $this->getPath()); + if ($pos === 0) { + // o The cookie-path is a prefix of the request-path, and the last + // character of the cookie-path is %x2F ("/"). + if (substr($this->getPath(), -1, 1) === "/") { + return true; + } + // o The cookie-path is a prefix of the request-path, and the first + // character of the request-path that is not included in the cookie- + // path is a %x2F ("/") character. + if (substr($path, strlen($this->getPath()), 1) === "/") { + return true; + } + } + return false; + } + /** + * Check if the cookie matches a domain value + * + * @param string $domain Domain to check against + * + * @return bool + */ + public function matchesDomain($domain) + { + // Remove the leading '.' as per spec in RFC 6265: http://tools.ietf.org/html/rfc6265#section-5.2.3 + $cookieDomain = ltrim($this->getDomain(), '.'); + // Domain not set or exact match. + if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) { + return true; + } + // Matching the subdomain according to RFC 6265: http://tools.ietf.org/html/rfc6265#section-5.1.3 + if (filter_var($domain, FILTER_VALIDATE_IP)) { + return false; + } + return (bool) preg_match('/\\.' . preg_quote($cookieDomain, '/') . '$/i', $domain); + } + /** + * Check if the cookie is compatible with a specific port + * + * @param int $port Port to check + * + * @return bool + */ + public function matchesPort($port) + { + return count($this->getPorts()) == 0 || in_array($port, $this->getPorts()); + } + /** + * Check if the cookie is expired + * + * @return bool + */ + public function isExpired() + { + return $this->getExpires() && time() > $this->getExpires(); + } + /** + * Check if the cookie is valid according to RFC 6265 + * + * @return bool|string Returns true if valid or an error message if invalid + */ + public function validate() + { + // Names must not be empty, but can be 0 + $name = $this->getName(); + if (empty($name) && !is_numeric($name)) { + return 'The cookie name must not be empty'; + } + // Check if any of the invalid characters are present in the cookie name + if (strpbrk($name, self::getInvalidCharacters()) !== false) { + return 'The cookie name must not contain invalid characters: ' . $name; + } + // Value must not be empty, but can be 0 + $value = $this->getValue(); + if (empty($value) && !is_numeric($value)) { + return 'The cookie value must not be empty'; + } + // Domains must not be empty, but can be 0 + // A "0" is not a valid internet domain, but may be used as server name in a private network + $domain = $this->getDomain(); + if (empty($domain) && !is_numeric($domain)) { + return 'The cookie domain must not be empty'; + } + return true; + } + /** + * Set a value and return the cookie object + * + * @param string $key Key to set + * @param string $value Value to set + * + * @return Cookie + */ + private function setData($key, $value) + { + $this->data[$key] = $value; + return $this; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/ArrayCookieJar.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/ArrayCookieJar.php new file mode 100644 index 00000000..5b7d7e9b --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/ArrayCookieJar.php @@ -0,0 +1,192 @@ +strictMode = $strictMode; + } + /** + * Enable or disable strict mode on the cookie jar + * + * @param bool $strictMode Set to true to throw exceptions when invalid cookies are added. False to ignore them. + * + * @return self + */ + public function setStrictMode($strictMode) + { + $this->strictMode = $strictMode; + } + public function remove($domain = null, $path = null, $name = null) + { + $cookies = $this->all($domain, $path, $name, false, false); + $this->cookies = array_filter($this->cookies, function (\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cookie\Cookie $cookie) use($cookies) { + return !in_array($cookie, $cookies, true); + }); + return $this; + } + public function removeTemporary() + { + $this->cookies = array_filter($this->cookies, function (\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cookie\Cookie $cookie) { + return !$cookie->getDiscard() && $cookie->getExpires(); + }); + return $this; + } + public function removeExpired() + { + $currentTime = time(); + $this->cookies = array_filter($this->cookies, function (\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cookie\Cookie $cookie) use($currentTime) { + return !$cookie->getExpires() || $currentTime < $cookie->getExpires(); + }); + return $this; + } + public function all($domain = null, $path = null, $name = null, $skipDiscardable = false, $skipExpired = true) + { + return array_values(array_filter($this->cookies, function (\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cookie\Cookie $cookie) use($domain, $path, $name, $skipDiscardable, $skipExpired) { + return false === ($name && $cookie->getName() != $name || $skipExpired && $cookie->isExpired() || $skipDiscardable && ($cookie->getDiscard() || !$cookie->getExpires()) || $path && !$cookie->matchesPath($path) || $domain && !$cookie->matchesDomain($domain)); + })); + } + public function add(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cookie\Cookie $cookie) + { + // Only allow cookies with set and valid domain, name, value + $result = $cookie->validate(); + if ($result !== true) { + if ($this->strictMode) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cookie\Exception\InvalidCookieException($result); + } else { + $this->removeCookieIfEmpty($cookie); + return false; + } + } + // Resolve conflicts with previously set cookies + foreach ($this->cookies as $i => $c) { + // Two cookies are identical, when their path, domain, port and name are identical + if ($c->getPath() != $cookie->getPath() || $c->getDomain() != $cookie->getDomain() || $c->getPorts() != $cookie->getPorts() || $c->getName() != $cookie->getName()) { + continue; + } + // The previously set cookie is a discard cookie and this one is not so allow the new cookie to be set + if (!$cookie->getDiscard() && $c->getDiscard()) { + unset($this->cookies[$i]); + continue; + } + // If the new cookie's expiration is further into the future, then replace the old cookie + if ($cookie->getExpires() > $c->getExpires()) { + unset($this->cookies[$i]); + continue; + } + // If the value has changed, we better change it + if ($cookie->getValue() !== $c->getValue()) { + unset($this->cookies[$i]); + continue; + } + // The cookie exists, so no need to continue + return false; + } + $this->cookies[] = $cookie; + return true; + } + /** + * Serializes the cookie cookieJar + * + * @return string + */ + public function serialize() + { + // Only serialize long term cookies and unexpired cookies + return json_encode(array_map(function (\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cookie\Cookie $cookie) { + return $cookie->toArray(); + }, $this->all(null, null, null, true, true))); + } + /** + * Unserializes the cookie cookieJar + */ + public function unserialize($data) + { + $data = json_decode($data, true); + if (empty($data)) { + $this->cookies = array(); + } else { + $this->cookies = array_map(function (array $cookie) { + return new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cookie\Cookie($cookie); + }, $data); + } + } + /** + * Returns the total number of stored cookies + * + * @return int + */ + public function count() + { + return count($this->cookies); + } + /** + * Returns an iterator + * + * @return \ArrayIterator + */ + public function getIterator() + { + return new \ArrayIterator($this->cookies); + } + public function addCookiesFromResponse(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request = null) + { + if ($cookieHeader = $response->getHeader('Set-Cookie')) { + $parser = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Parser\ParserRegistry::getInstance()->getParser('cookie'); + foreach ($cookieHeader as $cookie) { + if ($parsed = $request ? $parser->parseCookie($cookie, $request->getHost(), $request->getPath()) : $parser->parseCookie($cookie)) { + // Break up cookie v2 into multiple cookies + foreach ($parsed['cookies'] as $key => $value) { + $row = $parsed; + $row['name'] = $key; + $row['value'] = $value; + unset($row['cookies']); + $this->add(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cookie\Cookie($row)); + } + } + } + } + } + public function getMatchingCookies(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + // Find cookies that match this request + $cookies = $this->all($request->getHost(), $request->getPath()); + // Remove ineligible cookies + foreach ($cookies as $index => $cookie) { + if (!$cookie->matchesPort($request->getPort()) || $cookie->getSecure() && $request->getScheme() != 'https') { + unset($cookies[$index]); + } + } + return $cookies; + } + /** + * If a cookie already exists and the server asks to set it again with a null value, the + * cookie must be deleted. + * + * @param \Guzzle\Plugin\Cookie\Cookie $cookie + */ + private function removeCookieIfEmpty(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cookie\Cookie $cookie) + { + $cookieValue = $cookie->getValue(); + if ($cookieValue === null || $cookieValue === '') { + $this->remove($cookie->getDomain(), $cookie->getPath(), $cookie->getName()); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/CookieJarInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/CookieJarInterface.php new file mode 100644 index 00000000..58f99193 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/CookieJarInterface.php @@ -0,0 +1,78 @@ +filename = $cookieFile; + $this->load(); + } + /** + * Saves the file when shutting down + */ + public function __destruct() + { + $this->persist(); + } + /** + * Save the contents of the data array to the file + * + * @throws RuntimeException if the file cannot be found or created + */ + protected function persist() + { + if (false === file_put_contents($this->filename, $this->serialize())) { + // @codeCoverageIgnoreStart + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException('Unable to open file ' . $this->filename); + // @codeCoverageIgnoreEnd + } + } + /** + * Load the contents of the json formatted file into the data array and discard any unsaved state + */ + protected function load() + { + $json = file_get_contents($this->filename); + if (false === $json) { + // @codeCoverageIgnoreStart + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException('Unable to open file ' . $this->filename); + // @codeCoverageIgnoreEnd + } + $this->unserialize($json); + $this->cookies = $this->cookies ?: array(); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookiePlugin.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookiePlugin.php new file mode 100644 index 00000000..b7ba1fbe --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookiePlugin.php @@ -0,0 +1,61 @@ +cookieJar = $cookieJar ?: new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar(); + } + public static function getSubscribedEvents() + { + return array('request.before_send' => array('onRequestBeforeSend', 125), 'request.sent' => array('onRequestSent', 125)); + } + /** + * Get the cookie cookieJar + * + * @return CookieJarInterface + */ + public function getCookieJar() + { + return $this->cookieJar; + } + /** + * Add cookies before a request is sent + * + * @param Event $event + */ + public function onRequestBeforeSend(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $request = $event['request']; + if (!$request->getParams()->get('cookies.disable')) { + $request->removeHeader('Cookie'); + // Find cookies that match this request + foreach ($this->cookieJar->getMatchingCookies($request) as $cookie) { + $request->addCookie($cookie->getName(), $cookie->getValue()); + } + } + } + /** + * Extract cookies from a sent request + * + * @param Event $event + */ + public function onRequestSent(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $this->cookieJar->addCookiesFromResponse($event['response'], $event['request']); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Exception/InvalidCookieException.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Exception/InvalidCookieException.php new file mode 100644 index 00000000..30cd31b3 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Exception/InvalidCookieException.php @@ -0,0 +1,8 @@ +=5.3.2", + "guzzle\/http": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\Cookie": "" + } + }, + "target-dir": "Guzzle\/Plugin\/Cookie", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/CurlAuth/CurlAuthPlugin.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/CurlAuth/CurlAuthPlugin.php new file mode 100644 index 00000000..dd23ac11 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/CurlAuth/CurlAuthPlugin.php @@ -0,0 +1,42 @@ +getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest'); + */ +class CurlAuthPlugin implements \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface +{ + private $username; + private $password; + private $scheme; + /** + * @param string $username HTTP basic auth username + * @param string $password Password + * @param int $scheme Curl auth scheme + */ + public function __construct($username, $password, $scheme = CURLAUTH_BASIC) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__CLASS__ . " is deprecated. Use \$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');"); + $this->username = $username; + $this->password = $password; + $this->scheme = $scheme; + } + public static function getSubscribedEvents() + { + return array('client.create_request' => array('onRequestCreate', 255)); + } + /** + * Add basic auth + * + * @param Event $event + */ + public function onRequestCreate(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $event['request']->setAuth($this->username, $this->password, $this->scheme); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/CurlAuth/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/CurlAuth/composer.json new file mode 100644 index 00000000..48eb4359 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/CurlAuth/composer.json @@ -0,0 +1,33 @@ +{ + "name": "guzzle\/plugin-curlauth", + "description": "Guzzle cURL authorization plugin", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "plugin", + "curl", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/http": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\CurlAuth": "" + } + }, + "target-dir": "Guzzle\/Plugin\/CurlAuth", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponseExceptionInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponseExceptionInterface.php new file mode 100644 index 00000000..27dd68c9 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponseExceptionInterface.php @@ -0,0 +1,21 @@ + array('onCommandBeforeSend', -1)); + } + /** + * Adds a listener to requests before they sent from a command + * + * @param Event $event Event emitted + */ + public function onCommandBeforeSend(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $command = $event['command']; + if ($operation = $command->getOperation()) { + if ($operation->getErrorResponses()) { + $request = $command->getRequest(); + $request->getEventDispatcher()->addListener('request.complete', $this->getErrorClosure($request, $command, $operation)); + } + } + } + /** + * @param RequestInterface $request Request that received an error + * @param CommandInterface $command Command that created the request + * @param Operation $operation Operation that defines the request and errors + * + * @return \Closure Returns a closure + * @throws ErrorResponseException + */ + protected function getErrorClosure(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Operation $operation) + { + return function (\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) use($request, $command, $operation) { + $response = $event['response']; + foreach ($operation->getErrorResponses() as $error) { + if (!isset($error['class'])) { + continue; + } + if (isset($error['code']) && $response->getStatusCode() != $error['code']) { + continue; + } + if (isset($error['reason']) && $response->getReasonPhrase() != $error['reason']) { + continue; + } + $className = $error['class']; + $errorClassInterface = __NAMESPACE__ . '\\ErrorResponseExceptionInterface'; + if (!class_exists($className)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\ErrorResponse\Exception\ErrorResponseException("{$className} does not exist"); + } elseif (!in_array($errorClassInterface, class_implements($className))) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\ErrorResponse\Exception\ErrorResponseException("{$className} must implement {$errorClassInterface}"); + } + throw $className::fromCommand($command, $response); + } + }; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/Exception/ErrorResponseException.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/Exception/ErrorResponseException.php new file mode 100644 index 00000000..089b2a32 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/Exception/ErrorResponseException.php @@ -0,0 +1,8 @@ +=5.3.2", + "guzzle\/service": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\ErrorResponse": "" + } + }, + "target-dir": "Guzzle\/Plugin\/ErrorResponse", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/History/HistoryPlugin.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/History/HistoryPlugin.php new file mode 100644 index 00000000..3aeb4e09 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/History/HistoryPlugin.php @@ -0,0 +1,142 @@ + array('onRequestSent', 9999)); + } + /** + * Convert to a string that contains all request and response headers + * + * @return string + */ + public function __toString() + { + $lines = array(); + foreach ($this->transactions as $entry) { + $response = isset($entry['response']) ? $entry['response'] : ''; + $lines[] = '> ' . trim($entry['request']) . "\n\n< " . trim($response) . "\n"; + } + return implode("\n", $lines); + } + /** + * Add a request to the history + * + * @param RequestInterface $request Request to add + * @param Response $response Response of the request + * + * @return HistoryPlugin + */ + public function add(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response = null) + { + if (!$response && $request->getResponse()) { + $response = $request->getResponse(); + } + $this->transactions[] = array('request' => $request, 'response' => $response); + if (count($this->transactions) > $this->getlimit()) { + array_shift($this->transactions); + } + return $this; + } + /** + * Set the max number of requests to store + * + * @param int $limit Limit + * + * @return HistoryPlugin + */ + public function setLimit($limit) + { + $this->limit = (int) $limit; + return $this; + } + /** + * Get the request limit + * + * @return int + */ + public function getLimit() + { + return $this->limit; + } + /** + * Get all of the raw transactions in the form of an array of associative arrays containing + * 'request' and 'response' keys. + * + * @return array + */ + public function getAll() + { + return $this->transactions; + } + /** + * Get the requests in the history + * + * @return \ArrayIterator + */ + public function getIterator() + { + // Return an iterator just like the old iteration of the HistoryPlugin for BC compatibility (use getAll()) + return new \ArrayIterator(array_map(function ($entry) { + $entry['request']->getParams()->set('actual_response', $entry['response']); + return $entry['request']; + }, $this->transactions)); + } + /** + * Get the number of requests in the history + * + * @return int + */ + public function count() + { + return count($this->transactions); + } + /** + * Get the last request sent + * + * @return RequestInterface + */ + public function getLastRequest() + { + $last = end($this->transactions); + return $last['request']; + } + /** + * Get the last response in the history + * + * @return Response|null + */ + public function getLastResponse() + { + $last = end($this->transactions); + return isset($last['response']) ? $last['response'] : null; + } + /** + * Clears the history + * + * @return HistoryPlugin + */ + public function clear() + { + $this->transactions = array(); + return $this; + } + public function onRequestSent(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $this->add($event['request'], $event['response']); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/History/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/History/composer.json new file mode 100644 index 00000000..993ba82f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/History/composer.json @@ -0,0 +1,32 @@ +{ + "name": "guzzle\/plugin-history", + "description": "Guzzle history plugin", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "plugin", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/http": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\History": "" + } + }, + "target-dir": "Guzzle\/Plugin\/History", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Log/LogPlugin.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Log/LogPlugin.php new file mode 100644 index 00000000..b6e5740e --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Log/LogPlugin.php @@ -0,0 +1,133 @@ +logAdapter = $logAdapter; + $this->formatter = $formatter instanceof MessageFormatter ? $formatter : new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Log\MessageFormatter($formatter); + $this->wireBodies = $wireBodies; + } + /** + * Get a log plugin that outputs full request, response, and curl error information to stderr + * + * @param bool $wireBodies Set to false to disable request/response body output when they use are not repeatable + * @param resource $stream Stream to write to when logging. Defaults to STDERR when it is available + * + * @return self + */ + public static function getDebugPlugin($wireBodies = true, $stream = null) + { + if ($stream === null) { + if (defined('STDERR')) { + $stream = STDERR; + } else { + $stream = fopen('php://output', 'w'); + } + } + return new self(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Log\ClosureLogAdapter(function ($m) use($stream) { + fwrite($stream, $m . PHP_EOL); + }), "# Request:\n{request}\n\n# Response:\n{response}\n\n# Errors: {curl_code} {curl_error}", $wireBodies); + } + public static function getSubscribedEvents() + { + return array('curl.callback.write' => array('onCurlWrite', 255), 'curl.callback.read' => array('onCurlRead', 255), 'request.before_send' => array('onRequestBeforeSend', 255), 'request.sent' => array('onRequestSent', 255)); + } + /** + * Event triggered when curl data is read from a request + * + * @param Event $event + */ + public function onCurlRead(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + // Stream the request body to the log if the body is not repeatable + if ($wire = $event['request']->getParams()->get('request_wire')) { + $wire->write($event['read']); + } + } + /** + * Event triggered when curl data is written to a response + * + * @param Event $event + */ + public function onCurlWrite(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + // Stream the response body to the log if the body is not repeatable + if ($wire = $event['request']->getParams()->get('response_wire')) { + $wire->write($event['write']); + } + } + /** + * Called before a request is sent + * + * @param Event $event + */ + public function onRequestBeforeSend(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + if ($this->wireBodies) { + $request = $event['request']; + // Ensure that curl IO events are emitted + $request->getCurlOptions()->set('emit_io', true); + // We need to make special handling for content wiring and non-repeatable streams. + if ($request instanceof EntityEnclosingRequestInterface && $request->getBody() && (!$request->getBody()->isSeekable() || !$request->getBody()->isReadable())) { + // The body of the request cannot be recalled so logging the body will require us to buffer it + $request->getParams()->set('request_wire', \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory()); + } + if (!$request->getResponseBody()->isRepeatable()) { + // The body of the response cannot be recalled so logging the body will require us to buffer it + $request->getParams()->set('response_wire', \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory()); + } + } + } + /** + * Triggers the actual log write when a request completes + * + * @param Event $event + */ + public function onRequestSent(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $request = $event['request']; + $response = $event['response']; + $handle = $event['handle']; + if ($wire = $request->getParams()->get('request_wire')) { + $request = clone $request; + $request->setBody($wire); + } + if ($wire = $request->getParams()->get('response_wire')) { + $response = clone $response; + $response->setBody($wire); + } + // Send the log message to the adapter, adding a category and host + $priority = $response && $response->isError() ? LOG_ERR : LOG_DEBUG; + $message = $this->formatter->format($request, $response, $handle); + $this->logAdapter->log($message, $priority, array('request' => $request, 'response' => $response, 'handle' => $handle)); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Log/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Log/composer.json new file mode 100644 index 00000000..d616db48 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Log/composer.json @@ -0,0 +1,34 @@ +{ + "name": "guzzle\/plugin-log", + "description": "Guzzle log plugin for over the wire logging", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "plugin", + "log", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/http": "self.version", + "guzzle\/log": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\Log": "" + } + }, + "target-dir": "Guzzle\/Plugin\/Log", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Md5/CommandContentMd5Plugin.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Md5/CommandContentMd5Plugin.php new file mode 100644 index 00000000..3b1137c5 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Md5/CommandContentMd5Plugin.php @@ -0,0 +1,49 @@ +contentMd5Param = $contentMd5Param; + $this->validateMd5Param = $validateMd5Param; + } + public static function getSubscribedEvents() + { + return array('command.before_send' => array('onCommandBeforeSend', -255)); + } + public function onCommandBeforeSend(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $command = $event['command']; + $request = $command->getRequest(); + // Only add an MD5 is there is a MD5 option on the operation and it has a payload + if ($request instanceof EntityEnclosingRequestInterface && $request->getBody() && $command->getOperation()->hasParam($this->contentMd5Param)) { + // Check if an MD5 checksum value should be passed along to the request + if ($command[$this->contentMd5Param] === true) { + if (false !== ($md5 = $request->getBody()->getContentMd5(true, true))) { + $request->setHeader('Content-MD5', $md5); + } + } + } + // Check if MD5 validation should be used with the response + if ($command[$this->validateMd5Param] === true) { + $request->addSubscriber(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Plugin\Md5\Md5ValidatorPlugin(true, false)); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Md5/Md5ValidatorPlugin.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Md5/Md5ValidatorPlugin.php new file mode 100644 index 00000000..40d05c1f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Md5/Md5ValidatorPlugin.php @@ -0,0 +1,75 @@ +contentLengthCutoff = $contentLengthCutoff; + $this->contentEncoded = $contentEncoded; + } + public static function getSubscribedEvents() + { + return array('request.complete' => array('onRequestComplete', 255)); + } + /** + * {@inheritdoc} + * @throws UnexpectedValueException + */ + public function onRequestComplete(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $response = $event['response']; + if (!($contentMd5 = $response->getContentMd5())) { + return; + } + $contentEncoding = $response->getContentEncoding(); + if ($contentEncoding && !$this->contentEncoded) { + return false; + } + // Make sure that the size of the request is under the cutoff size + if ($this->contentLengthCutoff) { + $size = $response->getContentLength() ?: $response->getBody()->getSize(); + if (!$size || $size > $this->contentLengthCutoff) { + return; + } + } + if (!$contentEncoding) { + $hash = $response->getBody()->getContentMd5(); + } elseif ($contentEncoding == 'gzip') { + $response->getBody()->compress('zlib.deflate'); + $hash = $response->getBody()->getContentMd5(); + $response->getBody()->uncompress(); + } elseif ($contentEncoding == 'compress') { + $response->getBody()->compress('bzip2.compress'); + $hash = $response->getBody()->getContentMd5(); + $response->getBody()->uncompress(); + } else { + return; + } + if ($contentMd5 !== $hash) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\UnexpectedValueException("The response entity body may have been modified over the wire. The Content-MD5 " . "received ({$contentMd5}) did not match the calculated MD5 hash ({$hash})."); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Md5/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Md5/composer.json new file mode 100644 index 00000000..a657cd9b --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Md5/composer.json @@ -0,0 +1,32 @@ +{ + "name": "guzzle\/plugin-md5", + "description": "Guzzle MD5 plugins", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "plugin", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/http": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\Md5": "" + } + }, + "target-dir": "Guzzle\/Plugin\/Md5", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Mock/MockPlugin.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Mock/MockPlugin.php new file mode 100644 index 00000000..bf11d56d --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Mock/MockPlugin.php @@ -0,0 +1,218 @@ +readBodies = $readBodies; + $this->temporary = $temporary; + if ($items) { + foreach ($items as $item) { + if ($item instanceof \Exception) { + $this->addException($item); + } else { + $this->addResponse($item); + } + } + } + } + public static function getSubscribedEvents() + { + // Use a number lower than the CachePlugin + return array('request.before_send' => array('onRequestBeforeSend', -999)); + } + public static function getAllEvents() + { + return array('mock.request'); + } + /** + * Get a mock response from a file + * + * @param string $path File to retrieve a mock response from + * + * @return Response + * @throws InvalidArgumentException if the file is not found + */ + public static function getMockFile($path) + { + if (!file_exists($path)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Unable to open mock file: ' . $path); + } + return \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response::fromMessage(file_get_contents($path)); + } + /** + * Set whether or not to consume the entity body of a request when a mock + * response is used + * + * @param bool $readBodies Set to true to read and consume entity bodies + * + * @return self + */ + public function readBodies($readBodies) + { + $this->readBodies = $readBodies; + return $this; + } + /** + * Returns the number of remaining mock responses + * + * @return int + */ + public function count() + { + return count($this->queue); + } + /** + * Add a response to the end of the queue + * + * @param string|Response $response Response object or path to response file + * + * @return MockPlugin + * @throws InvalidArgumentException if a string or Response is not passed + */ + public function addResponse($response) + { + if (!$response instanceof Response) { + if (!is_string($response)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Invalid response'); + } + $response = self::getMockFile($response); + } + $this->queue[] = $response; + return $this; + } + /** + * Add an exception to the end of the queue + * + * @param CurlException $e Exception to throw when the request is executed + * + * @return MockPlugin + */ + public function addException(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Exception\CurlException $e) + { + $this->queue[] = $e; + return $this; + } + /** + * Clear the queue + * + * @return MockPlugin + */ + public function clearQueue() + { + $this->queue = array(); + return $this; + } + /** + * Returns an array of mock responses remaining in the queue + * + * @return array + */ + public function getQueue() + { + return $this->queue; + } + /** + * Check if this is a temporary plugin + * + * @return bool + */ + public function isTemporary() + { + return $this->temporary; + } + /** + * Get a response from the front of the list and add it to a request + * + * @param RequestInterface $request Request to mock + * + * @return self + * @throws CurlException When request.send is called and an exception is queued + */ + public function dequeue(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $this->dispatch('mock.request', array('plugin' => $this, 'request' => $request)); + $item = array_shift($this->queue); + if ($item instanceof Response) { + if ($this->readBodies && $request instanceof EntityEnclosingRequestInterface) { + $request->getEventDispatcher()->addListener('request.sent', $f = function (\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) use(&$f) { + while ($data = $event['request']->getBody()->read(8096)) { + } + // Remove the listener after one-time use + $event['request']->getEventDispatcher()->removeListener('request.sent', $f); + }); + } + $request->setResponse($item); + } elseif ($item instanceof CurlException) { + // Emulates exceptions encountered while transferring requests + $item->setRequest($request); + $state = $request->setState(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_ERROR, array('exception' => $item)); + // Only throw if the exception wasn't handled + if ($state == \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_ERROR) { + throw $item; + } + } + return $this; + } + /** + * Clear the array of received requests + */ + public function flush() + { + $this->received = array(); + } + /** + * Get an array of requests that were mocked by this plugin + * + * @return array + */ + public function getReceivedRequests() + { + return $this->received; + } + /** + * Called when a request is about to be sent + * + * @param Event $event + * @throws \OutOfBoundsException When queue is empty + */ + public function onRequestBeforeSend(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + if (!$this->queue) { + throw new \OutOfBoundsException('Mock queue is empty'); + } + $request = $event['request']; + $this->received[] = $request; + // Detach the filter from the client so it's a one-time use + if ($this->temporary && count($this->queue) == 1 && $request->getClient()) { + $request->getClient()->getEventDispatcher()->removeSubscriber($this); + } + $this->dequeue($request); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Mock/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Mock/composer.json new file mode 100644 index 00000000..1af00ad1 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Mock/composer.json @@ -0,0 +1,33 @@ +{ + "name": "guzzle\/plugin-mock", + "description": "Guzzle Mock plugin", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "mock", + "plugin", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/http": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\Mock": "" + } + }, + "target-dir": "Guzzle\/Plugin\/Mock", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Oauth/OauthPlugin.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Oauth/OauthPlugin.php new file mode 100644 index 00000000..3b76c599 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Oauth/OauthPlugin.php @@ -0,0 +1,241 @@ +config = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection::fromConfig($config, array('version' => '1.0', 'request_method' => self::REQUEST_METHOD_HEADER, 'consumer_key' => 'anonymous', 'consumer_secret' => 'anonymous', 'signature_method' => 'HMAC-SHA1', 'signature_callback' => function ($stringToSign, $key) { + return hash_hmac('sha1', $stringToSign, $key, true); + }), array('signature_method', 'signature_callback', 'version', 'consumer_key', 'consumer_secret')); + } + public static function getSubscribedEvents() + { + return array('request.before_send' => array('onRequestBeforeSend', -1000)); + } + /** + * Request before-send event handler + * + * @param Event $event Event received + * @return array + * @throws \InvalidArgumentException + */ + public function onRequestBeforeSend(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + $timestamp = $this->getTimestamp($event); + $request = $event['request']; + $nonce = $this->generateNonce($request); + $authorizationParams = $this->getOauthParams($timestamp, $nonce); + $authorizationParams['oauth_signature'] = $this->getSignature($request, $timestamp, $nonce); + switch ($this->config['request_method']) { + case self::REQUEST_METHOD_HEADER: + $request->setHeader('Authorization', $this->buildAuthorizationHeader($authorizationParams)); + break; + case self::REQUEST_METHOD_QUERY: + foreach ($authorizationParams as $key => $value) { + $request->getQuery()->set($key, $value); + } + break; + default: + throw new \InvalidArgumentException(sprintf('Invalid consumer method "%s"', $this->config['request_method'])); + } + return $authorizationParams; + } + /** + * Builds the Authorization header for a request + * + * @param array $authorizationParams Associative array of authorization parameters + * + * @return string + */ + private function buildAuthorizationHeader($authorizationParams) + { + $authorizationString = 'OAuth '; + foreach ($authorizationParams as $key => $val) { + if ($val) { + $authorizationString .= $key . '="' . urlencode($val) . '", '; + } + } + return substr($authorizationString, 0, -2); + } + /** + * Calculate signature for request + * + * @param RequestInterface $request Request to generate a signature for + * @param integer $timestamp Timestamp to use for nonce + * @param string $nonce + * + * @return string + */ + public function getSignature(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $timestamp, $nonce) + { + $string = $this->getStringToSign($request, $timestamp, $nonce); + $key = urlencode($this->config['consumer_secret']) . '&' . urlencode($this->config['token_secret']); + return base64_encode(call_user_func($this->config['signature_callback'], $string, $key)); + } + /** + * Calculate string to sign + * + * @param RequestInterface $request Request to generate a signature for + * @param int $timestamp Timestamp to use for nonce + * @param string $nonce + * + * @return string + */ + public function getStringToSign(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $timestamp, $nonce) + { + $params = $this->getParamsToSign($request, $timestamp, $nonce); + // Convert booleans to strings. + $params = $this->prepareParameters($params); + // Build signing string from combined params + $parameterString = clone $request->getQuery(); + $parameterString->replace($params); + $url = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Url::factory($request->getUrl())->setQuery('')->setFragment(null); + return strtoupper($request->getMethod()) . '&' . rawurlencode($url) . '&' . rawurlencode((string) $parameterString); + } + /** + * Get the oauth parameters as named by the oauth spec + * + * @param $timestamp + * @param $nonce + * @return Collection + */ + protected function getOauthParams($timestamp, $nonce) + { + $params = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection(array('oauth_consumer_key' => $this->config['consumer_key'], 'oauth_nonce' => $nonce, 'oauth_signature_method' => $this->config['signature_method'], 'oauth_timestamp' => $timestamp)); + // Optional parameters should not be set if they have not been set in the config as + // the parameter may be considered invalid by the Oauth service. + $optionalParams = array('callback' => 'oauth_callback', 'token' => 'oauth_token', 'verifier' => 'oauth_verifier', 'version' => 'oauth_version'); + foreach ($optionalParams as $optionName => $oauthName) { + if (isset($this->config[$optionName]) == true) { + $params[$oauthName] = $this->config[$optionName]; + } + } + return $params; + } + /** + * Get all of the parameters required to sign a request including: + * * The oauth params + * * The request GET params + * * The params passed in the POST body (with a content-type of application/x-www-form-urlencoded) + * + * @param RequestInterface $request Request to generate a signature for + * @param integer $timestamp Timestamp to use for nonce + * @param string $nonce + * + * @return array + */ + public function getParamsToSign(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, $timestamp, $nonce) + { + $params = $this->getOauthParams($timestamp, $nonce); + // Add query string parameters + $params->merge($request->getQuery()); + // Add POST fields to signing string if required + if ($this->shouldPostFieldsBeSigned($request)) { + $params->merge($request->getPostFields()); + } + // Sort params + $params = $params->toArray(); + uksort($params, 'strcmp'); + return $params; + } + /** + * Decide whether the post fields should be added to the base string that Oauth signs. + * This implementation is correct. Non-conformant APIs may require that this method be + * overwritten e.g. the Flickr API incorrectly adds the post fields when the Content-Type + * is 'application/x-www-form-urlencoded' + * + * @param $request + * @return bool Whether the post fields should be signed or not + */ + public function shouldPostFieldsBeSigned($request) + { + if (!$this->config->get('disable_post_params') && $request instanceof EntityEnclosingRequestInterface && false !== strpos($request->getHeader('Content-Type'), 'application/x-www-form-urlencoded')) { + return true; + } + return false; + } + /** + * Returns a Nonce Based on the unique id and URL. This will allow for multiple requests in parallel with the same + * exact timestamp to use separate nonce's. + * + * @param RequestInterface $request Request to generate a nonce for + * + * @return string + */ + public function generateNonce(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + return sha1(uniqid('', true) . $request->getUrl()); + } + /** + * Gets timestamp from event or create new timestamp + * + * @param Event $event Event containing contextual information + * + * @return int + */ + public function getTimestamp(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Event $event) + { + return $event['timestamp'] ?: time(); + } + /** + * Convert booleans to strings, removed unset parameters, and sorts the array + * + * @param array $data Data array + * + * @return array + */ + protected function prepareParameters($data) + { + ksort($data); + foreach ($data as $key => &$value) { + switch (gettype($value)) { + case 'NULL': + unset($data[$key]); + break; + case 'array': + $data[$key] = self::prepareParameters($value); + break; + case 'boolean': + $data[$key] = $value ? 'true' : 'false'; + break; + } + } + return $data; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Oauth/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Oauth/composer.json new file mode 100644 index 00000000..9c12a296 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/Oauth/composer.json @@ -0,0 +1,33 @@ +{ + "name": "guzzle\/plugin-oauth", + "description": "Guzzle OAuth plugin", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "oauth", + "plugin", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/http": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\Oauth": "" + } + }, + "target-dir": "Guzzle\/Plugin\/Oauth", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/composer.json b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/composer.json new file mode 100644 index 00000000..ef607c3e --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Plugin/composer.json @@ -0,0 +1,52 @@ +{ + "name": "guzzle\/plugin", + "description": "Guzzle plugin component containing all Guzzle HTTP plugins", + "homepage": "http:\/\/guzzlephp.org\/", + "keywords": [ + "http", + "client", + "plugin", + "extension", + "guzzle" + ], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https:\/\/github.com\/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle\/http": "self.version" + }, + "suggest": { + "guzzle\/cache": "self.version", + "guzzle\/log": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin": "" + } + }, + "target-dir": "Guzzle\/Plugin", + "replace": { + "guzzle\/plugin-async": "self.version", + "guzzle\/plugin-backoff": "self.version", + "guzzle\/plugin-cache": "self.version", + "guzzle\/plugin-cookie": "self.version", + "guzzle\/plugin-curlauth": "self.version", + "guzzle\/plugin-error-response": "self.version", + "guzzle\/plugin-history": "self.version", + "guzzle\/plugin-log": "self.version", + "guzzle\/plugin-md5": "self.version", + "guzzle\/plugin-mock": "self.version", + "guzzle\/plugin-oauth": "self.version" + }, + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/AbstractConfigLoader.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/AbstractConfigLoader.php new file mode 100644 index 00000000..6f9f2c17 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/AbstractConfigLoader.php @@ -0,0 +1,150 @@ + 'JSON_ERROR_NONE - No errors', JSON_ERROR_DEPTH => 'JSON_ERROR_DEPTH - Maximum stack depth exceeded', JSON_ERROR_STATE_MISMATCH => 'JSON_ERROR_STATE_MISMATCH - Underflow or the modes mismatch', JSON_ERROR_CTRL_CHAR => 'JSON_ERROR_CTRL_CHAR - Unexpected control character found', JSON_ERROR_SYNTAX => 'JSON_ERROR_SYNTAX - Syntax error, malformed JSON', JSON_ERROR_UTF8 => 'JSON_ERROR_UTF8 - Malformed UTF-8 characters, possibly incorrectly encoded'); + public function load($config, array $options = array()) + { + // Reset the array of loaded files because this is a new config + $this->loadedFiles = array(); + if (is_string($config)) { + $config = $this->loadFile($config); + } elseif (!is_array($config)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Unknown type passed to configuration loader: ' . gettype($config)); + } else { + $this->mergeIncludes($config); + } + return $this->build($config, $options); + } + /** + * Add an include alias to the loader + * + * @param string $filename Filename to alias (e.g. _foo) + * @param string $alias Actual file to use (e.g. /path/to/foo.json) + * + * @return self + */ + public function addAlias($filename, $alias) + { + $this->aliases[$filename] = $alias; + return $this; + } + /** + * Remove an alias from the loader + * + * @param string $alias Alias to remove + * + * @return self + */ + public function removeAlias($alias) + { + unset($this->aliases[$alias]); + return $this; + } + /** + * Perform the parsing of a config file and create the end result + * + * @param array $config Configuration data + * @param array $options Options to use when building + * + * @return mixed + */ + protected abstract function build($config, array $options); + /** + * Load a configuration file (can load JSON or PHP files that return an array when included) + * + * @param string $filename File to load + * + * @return array + * @throws InvalidArgumentException + * @throws RuntimeException when the JSON cannot be parsed + */ + protected function loadFile($filename) + { + if (isset($this->aliases[$filename])) { + $filename = $this->aliases[$filename]; + } + switch (pathinfo($filename, PATHINFO_EXTENSION)) { + case 'js': + case 'json': + $level = error_reporting(0); + $json = file_get_contents($filename); + error_reporting($level); + if ($json === false) { + $err = error_get_last(); + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException("Unable to open {$filename}: " . $err['message']); + } + $config = json_decode($json, true); + // Throw an exception if there was an error loading the file + if ($error = json_last_error()) { + $message = isset(self::$jsonErrors[$error]) ? self::$jsonErrors[$error] : 'Unknown error'; + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException("Error loading JSON data from {$filename}: ({$error}) - {$message}"); + } + break; + case 'php': + if (!is_readable($filename)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException("Unable to open {$filename} for reading"); + } + $config = (require $filename); + if (!is_array($config)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('PHP files must return an array of configuration data'); + } + break; + default: + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Unknown file extension: ' . $filename); + } + // Keep track of this file being loaded to prevent infinite recursion + $this->loadedFiles[$filename] = true; + // Merge include files into the configuration array + $this->mergeIncludes($config, dirname($filename)); + return $config; + } + /** + * Merges in all include files + * + * @param array $config Config data that contains includes + * @param string $basePath Base path to use when a relative path is encountered + * + * @return array Returns the merged and included data + */ + protected function mergeIncludes(&$config, $basePath = null) + { + if (!empty($config['includes'])) { + foreach ($config['includes'] as &$path) { + // Account for relative paths + if ($path[0] != DIRECTORY_SEPARATOR && !isset($this->aliases[$path]) && $basePath) { + $path = "{$basePath}/{$path}"; + } + // Don't load the same files more than once + if (!isset($this->loadedFiles[$path])) { + $this->loadedFiles[$path] = true; + $config = $this->mergeData($this->loadFile($path), $config); + } + } + } + } + /** + * Default implementation for merging two arrays of data (uses array_merge_recursive) + * + * @param array $a Original data + * @param array $b Data to merge into the original and overwrite existing values + * + * @return array + */ + protected function mergeData(array $a, array $b) + { + return array_merge_recursive($a, $b); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilder.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilder.php new file mode 100644 index 00000000..0ee203b9 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilder.php @@ -0,0 +1,159 @@ +load($config, $globalParameters); + } + /** + * @param array $serviceBuilderConfig Service configuration settings: + * - name: Name of the service + * - class: Client class to instantiate using a factory method + * - params: array of key value pair configuration settings for the builder + */ + public function __construct(array $serviceBuilderConfig = array()) + { + $this->builderConfig = $serviceBuilderConfig; + } + public static function getAllEvents() + { + return array('service_builder.create_client'); + } + public function unserialize($serialized) + { + $this->builderConfig = json_decode($serialized, true); + } + public function serialize() + { + return json_encode($this->builderConfig); + } + /** + * Attach a plugin to every client created by the builder + * + * @param EventSubscriberInterface $plugin Plugin to attach to each client + * + * @return self + */ + public function addGlobalPlugin(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface $plugin) + { + $this->plugins[] = $plugin; + return $this; + } + /** + * Get data from the service builder without triggering the building of a service + * + * @param string $name Name of the service to retrieve + * + * @return array|null + */ + public function getData($name) + { + return isset($this->builderConfig[$name]) ? $this->builderConfig[$name] : null; + } + public function get($name, $throwAway = false) + { + if (!isset($this->builderConfig[$name])) { + // Check to see if arbitrary data is being referenced + if (isset($this->clients[$name])) { + return $this->clients[$name]; + } + // Check aliases and return a match if found + foreach ($this->builderConfig as $actualName => $config) { + if (isset($config['alias']) && $config['alias'] == $name) { + return $this->get($actualName, $throwAway); + } + } + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Exception\ServiceNotFoundException('No service is registered as ' . $name); + } + if (!$throwAway && isset($this->clients[$name])) { + return $this->clients[$name]; + } + $builder =& $this->builderConfig[$name]; + // Convert references to the actual client + foreach ($builder['params'] as &$v) { + if (is_string($v) && substr($v, 0, 1) == '{' && substr($v, -1) == '}') { + $v = $this->get(trim($v, '{} ')); + } + } + // Get the configured parameters and merge in any parameters provided for throw-away clients + $config = $builder['params']; + if (is_array($throwAway)) { + $config = $throwAway + $config; + } + $client = $builder['class']::factory($config); + if (!$throwAway) { + $this->clients[$name] = $client; + } + if ($client instanceof ClientInterface) { + foreach ($this->plugins as $plugin) { + $client->addSubscriber($plugin); + } + // Dispatch an event letting listeners know a client was created + $this->dispatch('service_builder.create_client', array('client' => $client)); + } + return $client; + } + public function set($key, $service) + { + if (is_array($service) && isset($service['class']) && isset($service['params'])) { + $this->builderConfig[$key] = $service; + } else { + $this->clients[$key] = $service; + } + return $this; + } + public function offsetSet($offset, $value) + { + $this->set($offset, $value); + } + public function offsetUnset($offset) + { + unset($this->builderConfig[$offset]); + unset($this->clients[$offset]); + } + public function offsetExists($offset) + { + return isset($this->builderConfig[$offset]) || isset($this->clients[$offset]); + } + public function offsetGet($offset) + { + return $this->get($offset); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderInterface.php new file mode 100644 index 00000000..b16e81d8 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderInterface.php @@ -0,0 +1,38 @@ + &$service) { + $service['params'] = isset($service['params']) ? $service['params'] : array(); + // Check if this client builder extends another client + if (!empty($service['extends'])) { + // Make sure that the service it's extending has been defined + if (!isset($services[$service['extends']])) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Exception\ServiceNotFoundException("{$name} is trying to extend a non-existent service: {$service['extends']}"); + } + $extended =& $services[$service['extends']]; + // Use the correct class attribute + if (empty($service['class'])) { + $service['class'] = isset($extended['class']) ? $extended['class'] : ''; + } + if ($extendsParams = isset($extended['params']) ? $extended['params'] : false) { + $service['params'] = $service['params'] + $extendsParams; + } + } + // Overwrite default values with global parameter values + if (!empty($options)) { + $service['params'] = $options + $service['params']; + } + $service['class'] = isset($service['class']) ? $service['class'] : ''; + } + return new $class($services); + } + protected function mergeData(array $a, array $b) + { + $result = $b + $a; + // Merge services using a recursive union of arrays + if (isset($a['services']) && $b['services']) { + // Get a union of the services of the two arrays + $result['services'] = $b['services'] + $a['services']; + // Merge each service in using a union of the two arrays + foreach ($result['services'] as $name => &$service) { + // By default, services completely override a previously defined service unless it extends itself + if (isset($a['services'][$name]['extends']) && isset($b['services'][$name]['extends']) && $b['services'][$name]['extends'] == $name) { + $service += $a['services'][$name]; + // Use the `extends` attribute of the parent + $service['extends'] = $a['services'][$name]['extends']; + // Merge parameters using a union if both have parameters + if (isset($a['services'][$name]['params'])) { + $service['params'] += $a['services'][$name]['params']; + } + } + } + } + return $result; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/CachingConfigLoader.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/CachingConfigLoader.php new file mode 100644 index 00000000..f2b7f163 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/CachingConfigLoader.php @@ -0,0 +1,40 @@ +loader = $loader; + $this->cache = $cache; + } + public function load($config, array $options = array()) + { + if (!is_string($config)) { + $key = false; + } else { + $key = 'loader_' . crc32($config); + if ($result = $this->cache->fetch($key)) { + return $result; + } + } + $result = $this->loader->load($config, $options); + if ($key) { + $this->cache->save($key, $result); + } + return $result; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Client.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Client.php new file mode 100644 index 00000000..e79aaee3 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Client.php @@ -0,0 +1,246 @@ +getCommand($method, isset($args[0]) ? $args[0] : array())->getResult(); + } + public function getCommand($name, array $args = array()) + { + // Add global client options to the command + if ($options = $this->getConfig(self::COMMAND_PARAMS)) { + $args += $options; + } + if (!($command = $this->getCommandFactory()->factory($name, $args))) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException("Command was not found matching {$name}"); + } + $command->setClient($this); + $this->dispatch('client.command.create', array('client' => $this, 'command' => $command)); + return $command; + } + /** + * Set the command factory used to create commands by name + * + * @param CommandFactoryInterface $factory Command factory + * + * @return self + */ + public function setCommandFactory(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\Factory\FactoryInterface $factory) + { + $this->commandFactory = $factory; + return $this; + } + /** + * Set the resource iterator factory associated with the client + * + * @param ResourceIteratorFactoryInterface $factory Resource iterator factory + * + * @return self + */ + public function setResourceIteratorFactory(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\ResourceIteratorFactoryInterface $factory) + { + $this->resourceIteratorFactory = $factory; + return $this; + } + public function getIterator($command, array $commandOptions = null, array $iteratorOptions = array()) + { + if (!$command instanceof CommandInterface) { + $command = $this->getCommand($command, $commandOptions ?: array()); + } + return $this->getResourceIteratorFactory()->build($command, $iteratorOptions); + } + public function execute($command) + { + if ($command instanceof CommandInterface) { + $this->send($this->prepareCommand($command)); + $this->dispatch('command.after_send', array('command' => $command)); + return $command->getResult(); + } elseif (is_array($command) || $command instanceof \Traversable) { + return $this->executeMultiple($command); + } else { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Command must be a command or array of commands'); + } + } + public function setDescription(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\ServiceDescriptionInterface $service) + { + $this->serviceDescription = $service; + if ($this->getCommandFactory() && $this->getCommandFactory() instanceof CompositeFactory) { + $this->commandFactory->add(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\Factory\ServiceDescriptionFactory($service)); + } + // If a baseUrl was set on the description, then update the client + if ($baseUrl = $service->getBaseUrl()) { + $this->setBaseUrl($baseUrl); + } + return $this; + } + public function getDescription() + { + return $this->serviceDescription; + } + /** + * Set the inflector used with the client + * + * @param InflectorInterface $inflector Inflection object + * + * @return self + */ + public function setInflector(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Inflection\InflectorInterface $inflector) + { + $this->inflector = $inflector; + return $this; + } + /** + * Get the inflector used with the client + * + * @return self + */ + public function getInflector() + { + if (!$this->inflector) { + $this->inflector = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Inflection\Inflector::getDefault(); + } + return $this->inflector; + } + /** + * Prepare a command for sending and get the RequestInterface object created by the command + * + * @param CommandInterface $command Command to prepare + * + * @return RequestInterface + */ + protected function prepareCommand(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + // Set the client and prepare the command + $request = $command->setClient($this)->prepare(); + // Set the state to new if the command was previously executed + $request->setState(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface::STATE_NEW); + $this->dispatch('command.before_send', array('command' => $command)); + return $request; + } + /** + * Execute multiple commands in parallel + * + * @param array|Traversable $commands Array of CommandInterface objects to execute + * + * @return array Returns an array of the executed commands + * @throws Exception\CommandTransferException + */ + protected function executeMultiple($commands) + { + $requests = array(); + $commandRequests = new \SplObjectStorage(); + foreach ($commands as $command) { + $request = $this->prepareCommand($command); + $commandRequests[$request] = $command; + $requests[] = $request; + } + try { + $this->send($requests); + foreach ($commands as $command) { + $this->dispatch('command.after_send', array('command' => $command)); + } + return $commands; + } catch (MultiTransferException $failureException) { + // Throw a CommandTransferException using the successful and failed commands + $e = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Exception\CommandTransferException::fromMultiTransferException($failureException); + // Remove failed requests from the successful requests array and add to the failures array + foreach ($failureException->getFailedRequests() as $request) { + if (isset($commandRequests[$request])) { + $e->addFailedCommand($commandRequests[$request]); + unset($commandRequests[$request]); + } + } + // Always emit the command after_send events for successful commands + foreach ($commandRequests as $success) { + $e->addSuccessfulCommand($commandRequests[$success]); + $this->dispatch('command.after_send', array('command' => $commandRequests[$success])); + } + throw $e; + } + } + protected function getResourceIteratorFactory() + { + if (!$this->resourceIteratorFactory) { + // Build the default resource iterator factory if one is not set + $clientClass = get_class($this); + $prefix = substr($clientClass, 0, strrpos($clientClass, '\\')); + $this->resourceIteratorFactory = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\ResourceIteratorClassFactory(array("{$prefix}\\Iterator", "{$prefix}\\Model")); + } + return $this->resourceIteratorFactory; + } + /** + * Get the command factory associated with the client + * + * @return CommandFactoryInterface + */ + protected function getCommandFactory() + { + if (!$this->commandFactory) { + $this->commandFactory = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\Factory\CompositeFactory::getDefaultChain($this); + } + return $this->commandFactory; + } + /** + * @deprecated + * @codeCoverageIgnore + */ + public function enableMagicMethods($isEnabled) + { + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__METHOD__ . ' is deprecated'); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/ClientInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/ClientInterface.php new file mode 100644 index 00000000..ea092779 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/ClientInterface.php @@ -0,0 +1,63 @@ +operation = $operation ?: $this->createOperation(); + foreach ($this->operation->getParams() as $name => $arg) { + $currentValue = $this[$name]; + $configValue = $arg->getValue($currentValue); + // If default or static values are set, then this should always be updated on the config object + if ($currentValue !== $configValue) { + $this[$name] = $configValue; + } + } + $headers = $this[self::HEADERS_OPTION]; + if (!$headers instanceof Collection) { + $this[self::HEADERS_OPTION] = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Collection((array) $headers); + } + // You can set a command.on_complete option in your parameters to set an onComplete callback + if ($onComplete = $this['command.on_complete']) { + unset($this['command.on_complete']); + $this->setOnComplete($onComplete); + } + // Set the hidden additional parameters + if (!$this[self::HIDDEN_PARAMS]) { + $this[self::HIDDEN_PARAMS] = array(self::HEADERS_OPTION, self::RESPONSE_PROCESSING, self::HIDDEN_PARAMS, self::REQUEST_OPTIONS); + } + $this->init(); + } + /** + * Custom clone behavior + */ + public function __clone() + { + $this->request = null; + $this->result = null; + } + /** + * Execute the command in the same manner as calling a function + * + * @return mixed Returns the result of {@see AbstractCommand::execute} + */ + public function __invoke() + { + return $this->execute(); + } + public function getName() + { + return $this->operation->getName(); + } + /** + * Get the API command information about the command + * + * @return OperationInterface + */ + public function getOperation() + { + return $this->operation; + } + public function setOnComplete($callable) + { + if (!is_callable($callable)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('The onComplete function must be callable'); + } + $this->onComplete = $callable; + return $this; + } + public function execute() + { + if (!$this->client) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Exception\CommandException('A client must be associated with the command before it can be executed.'); + } + return $this->client->execute($this); + } + public function getClient() + { + return $this->client; + } + public function setClient(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\ClientInterface $client) + { + $this->client = $client; + return $this; + } + public function getRequest() + { + if (!$this->request) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Exception\CommandException('The command must be prepared before retrieving the request'); + } + return $this->request; + } + public function getResponse() + { + if (!$this->isExecuted()) { + $this->execute(); + } + return $this->request->getResponse(); + } + public function getResult() + { + if (!$this->isExecuted()) { + $this->execute(); + } + if (null === $this->result) { + $this->process(); + // Call the onComplete method if one is set + if ($this->onComplete) { + call_user_func($this->onComplete, $this); + } + } + return $this->result; + } + public function setResult($result) + { + $this->result = $result; + return $this; + } + public function isPrepared() + { + return $this->request !== null; + } + public function isExecuted() + { + return $this->request !== null && $this->request->getState() == 'complete'; + } + public function prepare() + { + if (!$this->isPrepared()) { + if (!$this->client) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Exception\CommandException('A client must be associated with the command before it can be prepared.'); + } + // If no response processing value was specified, then attempt to use the highest level of processing + if (!isset($this[self::RESPONSE_PROCESSING])) { + $this[self::RESPONSE_PROCESSING] = self::TYPE_MODEL; + } + // Notify subscribers of the client that the command is being prepared + $this->client->dispatch('command.before_prepare', array('command' => $this)); + // Fail on missing required arguments, and change parameters via filters + $this->validate(); + // Delegate to the subclass that implements the build method + $this->build(); + // Add custom request headers set on the command + if ($headers = $this[self::HEADERS_OPTION]) { + foreach ($headers as $key => $value) { + $this->request->setHeader($key, $value); + } + } + // Add any curl options to the request + if ($options = $this[\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Client::CURL_OPTIONS]) { + $this->request->getCurlOptions()->overwriteWith(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Curl\CurlHandle::parseCurlConfig($options)); + } + // Set a custom response body + if ($responseBody = $this[self::RESPONSE_BODY]) { + $this->request->setResponseBody($responseBody); + } + $this->client->dispatch('command.after_prepare', array('command' => $this)); + } + return $this->request; + } + /** + * Set the validator used to validate and prepare command parameters and nested JSON schemas. If no validator is + * set, then the command will validate using the default {@see SchemaValidator}. + * + * @param ValidatorInterface $validator Validator used to prepare and validate properties against a JSON schema + * + * @return self + */ + public function setValidator(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\ValidatorInterface $validator) + { + $this->validator = $validator; + return $this; + } + public function getRequestHeaders() + { + return $this[self::HEADERS_OPTION]; + } + /** + * Initialize the command (hook that can be implemented in subclasses) + */ + protected function init() + { + } + /** + * Create the request object that will carry out the command + */ + protected abstract function build(); + /** + * Hook used to create an operation for concrete commands that are not associated with a service description + * + * @return OperationInterface + */ + protected function createOperation() + { + return new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Operation(array('name' => get_class($this))); + } + /** + * Create the result of the command after the request has been completed. + * Override this method in subclasses to customize this behavior + */ + protected function process() + { + $this->result = $this[self::RESPONSE_PROCESSING] != self::TYPE_RAW ? \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\DefaultResponseParser::getInstance()->parse($this) : $this->request->getResponse(); + } + /** + * Validate and prepare the command based on the schema and rules defined by the command's Operation object + * + * @throws ValidationException when validation errors occur + */ + protected function validate() + { + // Do not perform request validation/transformation if it is disable + if ($this[self::DISABLE_VALIDATION]) { + return; + } + $errors = array(); + $validator = $this->getValidator(); + foreach ($this->operation->getParams() as $name => $schema) { + $value = $this[$name]; + if (!$validator->validate($schema, $value)) { + $errors = array_merge($errors, $validator->getErrors()); + } elseif ($value !== $this[$name]) { + // Update the config value if it changed and no validation errors were encountered + $this->data[$name] = $value; + } + } + // Validate additional parameters + $hidden = $this[self::HIDDEN_PARAMS]; + if ($properties = $this->operation->getAdditionalParameters()) { + foreach ($this->toArray() as $name => $value) { + // It's only additional if it isn't defined in the schema + if (!$this->operation->hasParam($name) && !in_array($name, $hidden)) { + // Always set the name so that error messages are useful + $properties->setName($name); + if (!$validator->validate($properties, $value)) { + $errors = array_merge($errors, $validator->getErrors()); + } elseif ($value !== $this[$name]) { + $this->data[$name] = $value; + } + } + } + } + if (!empty($errors)) { + $e = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Exception\ValidationException('Validation errors: ' . implode("\n", $errors)); + $e->setErrors($errors); + throw $e; + } + } + /** + * Get the validator used to prepare and validate properties. If no validator has been set on the command, then + * the default {@see SchemaValidator} will be used. + * + * @return ValidatorInterface + */ + protected function getValidator() + { + if (!$this->validator) { + $this->validator = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\SchemaValidator::getInstance(); + } + return $this->validator; + } + /** + * Get array of any validation errors + * If no validator has been set then return false + */ + public function getValidationErrors() + { + if (!$this->validator) { + return false; + } + return $this->validator->getErrors(); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/ClosureCommand.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/ClosureCommand.php new file mode 100644 index 00000000..5a6be867 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/ClosureCommand.php @@ -0,0 +1,38 @@ +request = $closure($this, $this->operation); + if (!$this->request || !$this->request instanceof RequestInterface) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\UnexpectedValueException('Closure command did not return a RequestInterface object'); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/CommandInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/CommandInterface.php new file mode 100644 index 00000000..fb745853 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/CommandInterface.php @@ -0,0 +1,114 @@ +stopPropagation(); + } + /** + * Get the created object + * + * @return mixed + */ + public function getResult() + { + return $this['result']; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/DefaultRequestSerializer.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/DefaultRequestSerializer.php new file mode 100644 index 00000000..636d2719 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/DefaultRequestSerializer.php @@ -0,0 +1,142 @@ +factory = $factory; + } + /** + * Add a location visitor to the serializer + * + * @param string $location Location to associate with the visitor + * @param RequestVisitorInterface $visitor Visitor to attach + * + * @return self + */ + public function addVisitor($location, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\LocationVisitor\Request\RequestVisitorInterface $visitor) + { + $this->factory->addRequestVisitor($location, $visitor); + return $this; + } + public function prepare(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + $request = $this->createRequest($command); + // Keep an array of visitors found in the operation + $foundVisitors = array(); + $operation = $command->getOperation(); + // Add arguments to the request using the location attribute + foreach ($operation->getParams() as $name => $arg) { + /** @var $arg \Guzzle\Service\Description\Parameter */ + $location = $arg->getLocation(); + // Skip 'uri' locations because they've already been processed + if ($location && $location != 'uri') { + // Instantiate visitors as they are detected in the properties + if (!isset($foundVisitors[$location])) { + $foundVisitors[$location] = $this->factory->getRequestVisitor($location); + } + // Ensure that a value has been set for this parameter + $value = $command[$name]; + if ($value !== null) { + // Apply the parameter value with the location visitor + $foundVisitors[$location]->visit($command, $request, $arg, $value); + } + } + } + // Serialize additional parameters + if ($additional = $operation->getAdditionalParameters()) { + if ($visitor = $this->prepareAdditionalParameters($operation, $command, $request, $additional)) { + $foundVisitors[$additional->getLocation()] = $visitor; + } + } + // Call the after method on each visitor found in the operation + foreach ($foundVisitors as $visitor) { + $visitor->after($command, $request); + } + return $request; + } + /** + * Serialize additional parameters + * + * @param OperationInterface $operation Operation that owns the command + * @param CommandInterface $command Command to prepare + * @param RequestInterface $request Request to serialize + * @param Parameter $additional Additional parameters + * + * @return null|RequestVisitorInterface + */ + protected function prepareAdditionalParameters(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\OperationInterface $operation, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $additional) + { + if (!($location = $additional->getLocation())) { + return; + } + $visitor = $this->factory->getRequestVisitor($location); + $hidden = $command[$command::HIDDEN_PARAMS]; + foreach ($command->toArray() as $key => $value) { + // Ignore values that are null or built-in command options + if ($value !== null && !in_array($key, $hidden) && !$operation->hasParam($key)) { + $additional->setName($key); + $visitor->visit($command, $request, $additional, $value); + } + } + return $visitor; + } + /** + * Create a request for the command and operation + * + * @param CommandInterface $command Command to create a request for + * + * @return RequestInterface + */ + protected function createRequest(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + $operation = $command->getOperation(); + $client = $command->getClient(); + $options = $command[\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\AbstractCommand::REQUEST_OPTIONS] ?: array(); + // If the command does not specify a template, then assume the base URL of the client + if (!($uri = $operation->getUri())) { + return $client->createRequest($operation->getHttpMethod(), $client->getBaseUrl(), null, null, $options); + } + // Get the path values and use the client config settings + $variables = array(); + foreach ($operation->getParams() as $name => $arg) { + if ($arg->getLocation() == 'uri') { + if (isset($command[$name])) { + $variables[$name] = $arg->filter($command[$name]); + if (!is_array($variables[$name])) { + $variables[$name] = (string) $variables[$name]; + } + } + } + } + return $client->createRequest($operation->getHttpMethod(), array($uri, $variables), null, null, $options); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/DefaultResponseParser.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/DefaultResponseParser.php new file mode 100644 index 00000000..3ca74c18 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/DefaultResponseParser.php @@ -0,0 +1,47 @@ +getRequest()->getResponse(); + // Account for hard coded content-type values specified in service descriptions + if ($contentType = $command['command.expects']) { + $response->setHeader('Content-Type', $contentType); + } else { + $contentType = (string) $response->getHeader('Content-Type'); + } + return $this->handleParsing($command, $response, $contentType); + } + protected function handleParsing(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response, $contentType) + { + $result = $response; + if ($result->getBody()) { + if (stripos($contentType, 'json') !== false) { + $result = $result->json(); + } elseif (stripos($contentType, 'xml') !== false) { + $result = $result->xml(); + } + } + return $result; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/AliasFactory.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/AliasFactory.php new file mode 100644 index 00000000..6a02a58d --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/AliasFactory.php @@ -0,0 +1,35 @@ +client = $client; + $this->aliases = $aliases; + } + public function factory($name, array $args = array()) + { + if (isset($this->aliases[$name])) { + try { + return $this->client->getCommand($this->aliases[$name], $args); + } catch (InvalidArgumentException $e) { + return null; + } + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/CompositeFactory.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/CompositeFactory.php new file mode 100644 index 00000000..1c0cb914 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/CompositeFactory.php @@ -0,0 +1,138 @@ +getDescription()) { + $factories[] = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\Factory\ServiceDescriptionFactory($description); + } + $factories[] = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\Factory\ConcreteClassFactory($client); + return new self($factories); + } + /** + * @param array $factories Array of command factories + */ + public function __construct(array $factories = array()) + { + $this->factories = $factories; + } + /** + * Add a command factory to the chain + * + * @param FactoryInterface $factory Factory to add + * @param string|FactoryInterface $before Insert the new command factory before a command factory class or object + * matching a class name. + * @return CompositeFactory + */ + public function add(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\Factory\FactoryInterface $factory, $before = null) + { + $pos = null; + if ($before) { + foreach ($this->factories as $i => $f) { + if ($before instanceof FactoryInterface) { + if ($f === $before) { + $pos = $i; + break; + } + } elseif (is_string($before)) { + if ($f instanceof $before) { + $pos = $i; + break; + } + } + } + } + if ($pos === null) { + $this->factories[] = $factory; + } else { + array_splice($this->factories, $i, 0, array($factory)); + } + return $this; + } + /** + * Check if the chain contains a specific command factory + * + * @param FactoryInterface|string $factory Factory to check + * + * @return bool + */ + public function has($factory) + { + return (bool) $this->find($factory); + } + /** + * Remove a specific command factory from the chain + * + * @param string|FactoryInterface $factory Factory to remove by name or instance + * + * @return CompositeFactory + */ + public function remove($factory = null) + { + if (!$factory instanceof FactoryInterface) { + $factory = $this->find($factory); + } + $this->factories = array_values(array_filter($this->factories, function ($f) use($factory) { + return $f !== $factory; + })); + return $this; + } + /** + * Get a command factory by class name + * + * @param string|FactoryInterface $factory Command factory class or instance + * + * @return null|FactoryInterface + */ + public function find($factory) + { + foreach ($this->factories as $f) { + if ($factory === $f || is_string($factory) && $f instanceof $factory) { + return $f; + } + } + } + /** + * Create a command using the associated command factories + * + * @param string $name Name of the command + * @param array $args Command arguments + * + * @return CommandInterface + */ + public function factory($name, array $args = array()) + { + foreach ($this->factories as $factory) { + $command = $factory->factory($name, $args); + if ($command) { + return $command; + } + } + } + public function count() + { + return count($this->factories); + } + public function getIterator() + { + return new \ArrayIterator($this->factories); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/ConcreteClassFactory.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/ConcreteClassFactory.php new file mode 100644 index 00000000..6afe247f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/ConcreteClassFactory.php @@ -0,0 +1,41 @@ +client = $client; + $this->inflector = $inflector ?: \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Inflection\Inflector::getDefault(); + } + public function factory($name, array $args = array()) + { + // Determine the class to instantiate based on the namespace of the current client and the default directory + $prefix = $this->client->getConfig('command.prefix'); + if (!$prefix) { + // The prefix can be specified in a factory method and is cached + $prefix = implode('\\', array_slice(explode('\\', get_class($this->client)), 0, -1)) . '\\Command\\'; + $this->client->getConfig()->set('command.prefix', $prefix); + } + $class = $prefix . str_replace(' ', '\\', ucwords(str_replace('.', ' ', $this->inflector->camel($name)))); + // Create the concrete command if it exists + if (class_exists($class)) { + return new $class($args); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/FactoryInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/FactoryInterface.php new file mode 100644 index 00000000..b3279e1c --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/FactoryInterface.php @@ -0,0 +1,20 @@ +map = $map; + } + public function factory($name, array $args = array()) + { + if (isset($this->map[$name])) { + $class = $this->map[$name]; + return new $class($args); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/ServiceDescriptionFactory.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/ServiceDescriptionFactory.php new file mode 100644 index 00000000..c27a34db --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/Factory/ServiceDescriptionFactory.php @@ -0,0 +1,62 @@ +setServiceDescription($description); + $this->inflector = $inflector; + } + /** + * Change the service description used with the factory + * + * @param ServiceDescriptionInterface $description Service description to use + * + * @return FactoryInterface + */ + public function setServiceDescription(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\ServiceDescriptionInterface $description) + { + $this->description = $description; + return $this; + } + /** + * Returns the service description + * + * @return ServiceDescriptionInterface + */ + public function getServiceDescription() + { + return $this->description; + } + public function factory($name, array $args = array()) + { + $command = $this->description->getOperation($name); + // If a command wasn't found, then try to uppercase the first letter and try again + if (!$command) { + $command = $this->description->getOperation(ucfirst($name)); + // If an inflector was passed, then attempt to get the command using snake_case inflection + if (!$command && $this->inflector) { + $command = $this->description->getOperation($this->inflector->snake($name)); + } + } + if ($command) { + $class = $command->getClass(); + return new $class($args, $command, $this->description); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/AbstractRequestVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/AbstractRequestVisitor.php new file mode 100644 index 00000000..d525f0d3 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/AbstractRequestVisitor.php @@ -0,0 +1,66 @@ +resolveRecursively($value, $param) : $param->filter($value); + } + /** + * Map nested parameters into the location_key based parameters + * + * @param array $value Value to map + * @param Parameter $param Parameter that holds information about the current key + * + * @return array Returns the mapped array + */ + protected function resolveRecursively(array $value, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param) + { + foreach ($value as $name => &$v) { + switch ($param->getType()) { + case 'object': + if ($subParam = $param->getProperty($name)) { + $key = $subParam->getWireName(); + $value[$key] = $this->prepareValue($v, $subParam); + if ($name != $key) { + unset($value[$name]); + } + } elseif ($param->getAdditionalProperties() instanceof Parameter) { + $v = $this->prepareValue($v, $param->getAdditionalProperties()); + } + break; + case 'array': + if ($items = $param->getItems()) { + $v = $this->prepareValue($v, $items); + } + break; + } + } + return $param->filter($value); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/BodyVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/BodyVisitor.php new file mode 100644 index 00000000..e0443f61 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/BodyVisitor.php @@ -0,0 +1,56 @@ +filter($value); + $entityBody = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBody::factory($value); + $request->setBody($entityBody); + $this->addExpectHeader($request, $entityBody, $param->getData('expect_header')); + // Add the Content-Encoding header if one is set on the EntityBody + if ($encoding = $entityBody->getContentEncoding()) { + $request->setHeader('Content-Encoding', $encoding); + } + } + /** + * Add the appropriate expect header to a request + * + * @param EntityEnclosingRequestInterface $request Request to update + * @param EntityBodyInterface $body Entity body of the request + * @param string|int $expect Expect header setting + */ + protected function addExpectHeader(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\EntityEnclosingRequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\EntityBodyInterface $body, $expect) + { + // Allow the `expect` data parameter to be set to remove the Expect header from the request + if ($expect === false) { + $request->removeHeader('Expect'); + } elseif ($expect !== true) { + // Default to using a MB as the point in which to start using the expect header + $expect = $expect ?: 1048576; + // If the expect_header value is numeric then only add if the size is greater than the cutoff + if (is_numeric($expect) && $body->getSize()) { + if ($body->getSize() < $expect) { + $request->removeHeader('Expect'); + } else { + $request->setHeader('Expect', '100-Continue'); + } + } + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/HeaderVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/HeaderVisitor.php new file mode 100644 index 00000000..9e5222a4 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/HeaderVisitor.php @@ -0,0 +1,42 @@ +filter($value); + if ($param->getType() == 'object' && $param->getAdditionalProperties() instanceof Parameter) { + $this->addPrefixedHeaders($request, $param, $value); + } else { + $request->setHeader($param->getWireName(), $value); + } + } + /** + * Add a prefixed array of headers to the request + * + * @param RequestInterface $request Request to update + * @param Parameter $param Parameter object + * @param array $value Header array to add + * + * @throws InvalidArgumentException + */ + protected function addPrefixedHeaders(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, $value) + { + if (!is_array($value)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('An array of mapped headers expected, but received a single value'); + } + $prefix = $param->getSentAs(); + foreach ($value as $headerName => $headerValue) { + $request->setHeader($prefix . $headerName, $headerValue); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/JsonVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/JsonVisitor.php new file mode 100644 index 00000000..8e275b0b --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/JsonVisitor.php @@ -0,0 +1,55 @@ +data = new \SplObjectStorage(); + } + /** + * Set the Content-Type header to add to the request if JSON is added to the body. This visitor does not add a + * Content-Type header unless you specify one here. + * + * @param string $header Header to set when JSON is added (e.g. application/json) + * + * @return self + */ + public function setContentTypeHeader($header = 'application/json') + { + $this->jsonContentType = $header; + return $this; + } + public function visit(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, $value) + { + if (isset($this->data[$command])) { + $json = $this->data[$command]; + } else { + $json = array(); + } + $json[$param->getWireName()] = $this->prepareValue($value, $param); + $this->data[$command] = $json; + } + public function after(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + if (isset($this->data[$command])) { + // Don't overwrite the Content-Type if one is set + if ($this->jsonContentType && !$request->hasHeader('Content-Type')) { + $request->setHeader('Content-Type', $this->jsonContentType); + } + $request->setBody(json_encode($this->data[$command])); + unset($this->data[$command]); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/PostFieldVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/PostFieldVisitor.php new file mode 100644 index 00000000..32547973 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/PostFieldVisitor.php @@ -0,0 +1,17 @@ +setPostField($param->getWireName(), $this->prepareValue($value, $param)); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/PostFileVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/PostFileVisitor.php new file mode 100644 index 00000000..b4e65720 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/PostFileVisitor.php @@ -0,0 +1,23 @@ +filter($value); + if ($value instanceof PostFileInterface) { + $request->addPostFile($value); + } else { + $request->addPostFile($param->getWireName(), $value); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/QueryVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/QueryVisitor.php new file mode 100644 index 00000000..e4e56492 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/QueryVisitor.php @@ -0,0 +1,17 @@ +getQuery()->set($param->getWireName(), $this->prepareValue($value, $param)); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/RequestVisitorInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/RequestVisitorInterface.php new file mode 100644 index 00000000..7f5a900f --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/RequestVisitorInterface.php @@ -0,0 +1,29 @@ +setResponseBody($value); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/XmlVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/XmlVisitor.php new file mode 100644 index 00000000..9dcffcf5 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/XmlVisitor.php @@ -0,0 +1,226 @@ +data = new \SplObjectStorage(); + } + /** + * Change the content-type header that is added when XML is found + * + * @param string $header Header to set when XML is found + * + * @return self + */ + public function setContentTypeHeader($header) + { + $this->contentType = $header; + return $this; + } + public function visit(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, $value) + { + $xml = isset($this->data[$command]) ? $this->data[$command] : $this->createRootElement($param->getParent()); + $this->addXml($xml, $param, $value); + $this->data[$command] = $xml; + } + public function after(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $xml = null; + // If data was found that needs to be serialized, then do so + if (isset($this->data[$command])) { + $xml = $this->finishDocument($this->data[$command]); + unset($this->data[$command]); + } else { + // Check if XML should always be sent for the command + $operation = $command->getOperation(); + if ($operation->getData('xmlAllowEmpty')) { + $xmlWriter = $this->createRootElement($operation); + $xml = $this->finishDocument($xmlWriter); + } + } + if ($xml) { + // Don't overwrite the Content-Type if one is set + if ($this->contentType && !$request->hasHeader('Content-Type')) { + $request->setHeader('Content-Type', $this->contentType); + } + $request->setBody($xml); + } + } + /** + * Create the root XML element to use with a request + * + * @param Operation $operation Operation object + * + * @return \XMLWriter + */ + protected function createRootElement(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Operation $operation) + { + static $defaultRoot = array('name' => 'Request'); + // If no root element was specified, then just wrap the XML in 'Request' + $root = $operation->getData('xmlRoot') ?: $defaultRoot; + // Allow the XML declaration to be customized with xmlEncoding + $encoding = $operation->getData('xmlEncoding'); + $xmlWriter = $this->startDocument($encoding); + $xmlWriter->startElement($root['name']); + // Create the wrapping element with no namespaces if no namespaces were present + if (!empty($root['namespaces'])) { + // Create the wrapping element with an array of one or more namespaces + foreach ((array) $root['namespaces'] as $prefix => $uri) { + $nsLabel = 'xmlns'; + if (!is_numeric($prefix)) { + $nsLabel .= ':' . $prefix; + } + $xmlWriter->writeAttribute($nsLabel, $uri); + } + } + return $xmlWriter; + } + /** + * Recursively build the XML body + * + * @param \XMLWriter $xmlWriter XML to modify + * @param Parameter $param API Parameter + * @param mixed $value Value to add + */ + protected function addXml(\XMLWriter $xmlWriter, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, $value) + { + if ($value === null) { + return; + } + $value = $param->filter($value); + $type = $param->getType(); + $name = $param->getWireName(); + $prefix = null; + $namespace = $param->getData('xmlNamespace'); + if (false !== strpos($name, ':')) { + list($prefix, $name) = explode(':', $name, 2); + } + if ($type == 'object' || $type == 'array') { + if (!$param->getData('xmlFlattened')) { + $xmlWriter->startElementNS(null, $name, $namespace); + } + if ($param->getType() == 'array') { + $this->addXmlArray($xmlWriter, $param, $value); + } elseif ($param->getType() == 'object') { + $this->addXmlObject($xmlWriter, $param, $value); + } + if (!$param->getData('xmlFlattened')) { + $xmlWriter->endElement(); + } + return; + } + if ($param->getData('xmlAttribute')) { + $this->writeAttribute($xmlWriter, $prefix, $name, $namespace, $value); + } else { + $this->writeElement($xmlWriter, $prefix, $name, $namespace, $value); + } + } + /** + * Write an attribute with namespace if used + * + * @param \XMLWriter $xmlWriter XMLWriter instance + * @param string $prefix Namespace prefix if any + * @param string $name Attribute name + * @param string $namespace The uri of the namespace + * @param string $value The attribute content + */ + protected function writeAttribute($xmlWriter, $prefix, $name, $namespace, $value) + { + if (empty($namespace)) { + $xmlWriter->writeAttribute($name, $value); + } else { + $xmlWriter->writeAttributeNS($prefix, $name, $namespace, $value); + } + } + /** + * Write an element with namespace if used + * + * @param \XMLWriter $xmlWriter XML writer resource + * @param string $prefix Namespace prefix if any + * @param string $name Element name + * @param string $namespace The uri of the namespace + * @param string $value The element content + */ + protected function writeElement(\XMLWriter $xmlWriter, $prefix, $name, $namespace, $value) + { + $xmlWriter->startElementNS($prefix, $name, $namespace); + if (strpbrk($value, '<>&')) { + $xmlWriter->writeCData($value); + } else { + $xmlWriter->writeRaw($value); + } + $xmlWriter->endElement(); + } + /** + * Create a new xml writer and start a document + * + * @param string $encoding document encoding + * + * @return \XMLWriter the writer resource + */ + protected function startDocument($encoding) + { + $xmlWriter = new \XMLWriter(); + $xmlWriter->openMemory(); + $xmlWriter->startDocument('1.0', $encoding); + return $xmlWriter; + } + /** + * End the document and return the output + * + * @param \XMLWriter $xmlWriter + * + * @return \string the writer resource + */ + protected function finishDocument($xmlWriter) + { + $xmlWriter->endDocument(); + return $xmlWriter->outputMemory(); + } + /** + * Add an array to the XML + */ + protected function addXmlArray(\XMLWriter $xmlWriter, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, &$value) + { + if ($items = $param->getItems()) { + foreach ($value as $v) { + $this->addXml($xmlWriter, $items, $v); + } + } + } + /** + * Add an object to the XML + */ + protected function addXmlObject(\XMLWriter $xmlWriter, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, &$value) + { + $noAttributes = array(); + // add values which have attributes + foreach ($value as $name => $v) { + if ($property = $param->getProperty($name)) { + if ($property->getData('xmlAttribute')) { + $this->addXml($xmlWriter, $property, $v); + } else { + $noAttributes[] = array('value' => $v, 'property' => $property); + } + } + } + // now add values with no attributes + foreach ($noAttributes as $element) { + $this->addXml($xmlWriter, $element['property'], $element['value']); + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/AbstractResponseVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/AbstractResponseVisitor.php new file mode 100644 index 00000000..f6d8bae3 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/AbstractResponseVisitor.php @@ -0,0 +1,23 @@ +getName()] = $param->filter($response->getBody()); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/HeaderVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/HeaderVisitor.php new file mode 100644 index 00000000..b0f4b8d9 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/HeaderVisitor.php @@ -0,0 +1,43 @@ +getType() == 'object' && $param->getAdditionalProperties() instanceof Parameter) { + $this->processPrefixedHeaders($response, $param, $value); + } else { + $value[$param->getName()] = $param->filter((string) $response->getHeader($param->getWireName())); + } + } + /** + * Process a prefixed header array + * + * @param Response $response Response that contains the headers + * @param Parameter $param Parameter object + * @param array $value Value response array to modify + */ + protected function processPrefixedHeaders(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, &$value) + { + // Grab prefixed headers that should be placed into an array with the prefix stripped + if ($prefix = $param->getSentAs()) { + $container = $param->getName(); + $len = strlen($prefix); + // Find all matching headers and place them into the containing element + foreach ($response->getHeaders()->toArray() as $key => $header) { + if (stripos($key, $prefix) === 0) { + // Account for multi-value headers + $value[$container][substr($key, $len)] = count($header) == 1 ? end($header) : $header; + } + } + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/JsonVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/JsonVisitor.php new file mode 100644 index 00000000..3e525786 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/JsonVisitor.php @@ -0,0 +1,82 @@ +getResponse()->json(); + } + public function visit(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, &$value, $context = null) + { + $name = $param->getName(); + $key = $param->getWireName(); + if (isset($value[$key])) { + $this->recursiveProcess($param, $value[$key]); + if ($key != $name) { + $value[$name] = $value[$key]; + unset($value[$key]); + } + } + } + /** + * Recursively process a parameter while applying filters + * + * @param Parameter $param API parameter being validated + * @param mixed $value Value to validate and process. The value may change during this process. + */ + protected function recursiveProcess(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, &$value) + { + if ($value === null) { + return; + } + if (is_array($value)) { + $type = $param->getType(); + if ($type == 'array') { + foreach ($value as &$item) { + $this->recursiveProcess($param->getItems(), $item); + } + } elseif ($type == 'object' && !isset($value[0])) { + // On the above line, we ensure that the array is associative and not numerically indexed + $knownProperties = array(); + if ($properties = $param->getProperties()) { + foreach ($properties as $property) { + $name = $property->getName(); + $key = $property->getWireName(); + $knownProperties[$name] = 1; + if (isset($value[$key])) { + $this->recursiveProcess($property, $value[$key]); + if ($key != $name) { + $value[$name] = $value[$key]; + unset($value[$key]); + } + } + } + } + // Remove any unknown and potentially unsafe properties + if ($param->getAdditionalProperties() === false) { + $value = array_intersect_key($value, $knownProperties); + } elseif (($additional = $param->getAdditionalProperties()) !== true) { + // Validate and filter additional properties + foreach ($value as &$v) { + $this->recursiveProcess($additional, $v); + } + } + } + } + $value = $param->filter($value); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/ReasonPhraseVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/ReasonPhraseVisitor.php new file mode 100644 index 00000000..8cabf567 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/ReasonPhraseVisitor.php @@ -0,0 +1,17 @@ +getName()] = $response->getReasonPhrase(); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/ResponseVisitorInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/ResponseVisitorInterface.php new file mode 100644 index 00000000..b28d1e80 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/ResponseVisitorInterface.php @@ -0,0 +1,37 @@ +getName()] = $response->getStatusCode(); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/XmlVisitor.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/XmlVisitor.php new file mode 100644 index 00000000..c3cc8566 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/XmlVisitor.php @@ -0,0 +1,136 @@ +getResponse()->xml()), true); + } + public function visit(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, &$value, $context = null) + { + $sentAs = $param->getWireName(); + $name = $param->getName(); + if (isset($value[$sentAs])) { + $this->recursiveProcess($param, $value[$sentAs]); + if ($name != $sentAs) { + $value[$name] = $value[$sentAs]; + unset($value[$sentAs]); + } + } + } + /** + * Recursively process a parameter while applying filters + * + * @param Parameter $param API parameter being processed + * @param mixed $value Value to validate and process. The value may change during this process. + */ + protected function recursiveProcess(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, &$value) + { + $type = $param->getType(); + if (!is_array($value)) { + if ($type == 'array') { + // Cast to an array if the value was a string, but should be an array + $this->recursiveProcess($param->getItems(), $value); + $value = array($value); + } + } elseif ($type == 'object') { + $this->processObject($param, $value); + } elseif ($type == 'array') { + $this->processArray($param, $value); + } elseif ($type == 'string' && gettype($value) == 'array') { + $value = ''; + } + if ($value !== null) { + $value = $param->filter($value); + } + } + /** + * Process an array + * + * @param Parameter $param API parameter being parsed + * @param mixed $value Value to process + */ + protected function processArray(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, &$value) + { + // Convert the node if it was meant to be an array + if (!isset($value[0])) { + // Collections fo nodes are sometimes wrapped in an additional array. For example: + // 12 should become: + // array('Items' => array(array('a' => 1), array('a' => 2)) + // Some nodes are not wrapped. For example: 12 + // should become array('Foo' => array(array('a' => 1), array('a' => 2)) + if ($param->getItems() && isset($value[$param->getItems()->getWireName()])) { + // Account for the case of a collection wrapping wrapped nodes: Items => Item[] + $value = $value[$param->getItems()->getWireName()]; + // If the wrapped node only had one value, then make it an array of nodes + if (!isset($value[0]) || !is_array($value)) { + $value = array($value); + } + } elseif (!empty($value)) { + // Account for repeated nodes that must be an array: Foo => Baz, Foo => Baz, but only if the + // value is set and not empty + $value = array($value); + } + } + foreach ($value as &$item) { + $this->recursiveProcess($param->getItems(), $item); + } + } + /** + * Process an object + * + * @param Parameter $param API parameter being parsed + * @param mixed $value Value to process + */ + protected function processObject(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, &$value) + { + // Ensure that the array is associative and not numerically indexed + if (!isset($value[0]) && ($properties = $param->getProperties())) { + $knownProperties = array(); + foreach ($properties as $property) { + $name = $property->getName(); + $sentAs = $property->getWireName(); + $knownProperties[$name] = 1; + if ($property->getData('xmlAttribute')) { + $this->processXmlAttribute($property, $value); + } elseif (isset($value[$sentAs])) { + $this->recursiveProcess($property, $value[$sentAs]); + if ($name != $sentAs) { + $value[$name] = $value[$sentAs]; + unset($value[$sentAs]); + } + } + } + // Remove any unknown and potentially unsafe properties + if ($param->getAdditionalProperties() === false) { + $value = array_intersect_key($value, $knownProperties); + } + } + } + /** + * Process an XML attribute property + * + * @param Parameter $property Property to process + * @param array $value Value to process and update + */ + protected function processXmlAttribute(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $property, array &$value) + { + $sentAs = $property->getWireName(); + if (isset($value['@attributes'][$sentAs])) { + $value[$property->getName()] = $value['@attributes'][$sentAs]; + unset($value['@attributes'][$sentAs]); + if (empty($value['@attributes'])) { + unset($value['@attributes']); + } + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/VisitorFlyweight.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/VisitorFlyweight.php new file mode 100644 index 00000000..c45bb196 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/VisitorFlyweight.php @@ -0,0 +1,107 @@ + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\BodyVisitor', 'request.header' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\HeaderVisitor', 'request.json' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\JsonVisitor', 'request.postField' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\PostFieldVisitor', 'request.postFile' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\PostFileVisitor', 'request.query' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\QueryVisitor', 'request.response_body' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\ResponseBodyVisitor', 'request.responseBody' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\ResponseBodyVisitor', 'request.xml' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\XmlVisitor', 'response.body' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\BodyVisitor', 'response.header' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\HeaderVisitor', 'response.json' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\JsonVisitor', 'response.reasonPhrase' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\ReasonPhraseVisitor', 'response.statusCode' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\StatusCodeVisitor', 'response.xml' => 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\XmlVisitor'); + /** @var array Array of mappings of location names to classes */ + protected $mappings; + /** @var array Cache of instantiated visitors */ + protected $cache = array(); + /** + * @return self + * @codeCoverageIgnore + */ + public static function getInstance() + { + if (!self::$instance) { + self::$instance = new self(); + } + return self::$instance; + } + /** + * @param array $mappings Array mapping request.name and response.name to location visitor classes. Leave null to + * use the default values. + */ + public function __construct(array $mappings = null) + { + $this->mappings = $mappings === null ? self::$defaultMappings : $mappings; + } + /** + * Get an instance of a request visitor by location name + * + * @param string $visitor Visitor name + * + * @return RequestVisitorInterface + */ + public function getRequestVisitor($visitor) + { + return $this->getKey('request.' . $visitor); + } + /** + * Get an instance of a response visitor by location name + * + * @param string $visitor Visitor name + * + * @return ResponseVisitorInterface + */ + public function getResponseVisitor($visitor) + { + return $this->getKey('response.' . $visitor); + } + /** + * Add a response visitor to the factory by name + * + * @param string $name Name of the visitor + * @param RequestVisitorInterface $visitor Visitor to add + * + * @return self + */ + public function addRequestVisitor($name, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\LocationVisitor\Request\RequestVisitorInterface $visitor) + { + $this->cache['request.' . $name] = $visitor; + return $this; + } + /** + * Add a response visitor to the factory by name + * + * @param string $name Name of the visitor + * @param ResponseVisitorInterface $visitor Visitor to add + * + * @return self + */ + public function addResponseVisitor($name, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\LocationVisitor\Response\ResponseVisitorInterface $visitor) + { + $this->cache['response.' . $name] = $visitor; + return $this; + } + /** + * Get a visitor by key value name + * + * @param string $key Key name to retrieve + * + * @return mixed + * @throws InvalidArgumentException + */ + private function getKey($key) + { + if (!isset($this->cache[$key])) { + if (!isset($this->mappings[$key])) { + list($type, $name) = explode('.', $key); + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException("No {$type} visitor has been mapped for {$name}"); + } + $this->cache[$key] = new $this->mappings[$key](); + } + return $this->cache[$key]; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/OperationCommand.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/OperationCommand.php new file mode 100644 index 00000000..0cc42170 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/OperationCommand.php @@ -0,0 +1,76 @@ +responseParser = $parser; + return $this; + } + /** + * Set the request serializer used with the command + * + * @param RequestSerializerInterface $serializer Request serializer + * + * @return self + */ + public function setRequestSerializer(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\RequestSerializerInterface $serializer) + { + $this->requestSerializer = $serializer; + return $this; + } + /** + * Get the request serializer used with the command + * + * @return RequestSerializerInterface + */ + public function getRequestSerializer() + { + if (!$this->requestSerializer) { + // Use the default request serializer if none was found + $this->requestSerializer = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\DefaultRequestSerializer::getInstance(); + } + return $this->requestSerializer; + } + /** + * Get the response parser used for the operation + * + * @return ResponseParserInterface + */ + public function getResponseParser() + { + if (!$this->responseParser) { + // Use the default response parser if none was found + $this->responseParser = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\OperationResponseParser::getInstance(); + } + return $this->responseParser; + } + protected function build() + { + // Prepare and serialize the request + $this->request = $this->getRequestSerializer()->prepare($this); + } + protected function process() + { + // Do not process the response if 'command.response_processing' is set to 'raw' + $this->result = $this[self::RESPONSE_PROCESSING] == self::TYPE_RAW ? $this->request->getResponse() : $this->getResponseParser()->parse($this); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/OperationResponseParser.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/OperationResponseParser.php new file mode 100644 index 00000000..365b92e7 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/OperationResponseParser.php @@ -0,0 +1,167 @@ +factory = $factory; + $this->schemaInModels = $schemaInModels; + } + /** + * Add a location visitor to the command + * + * @param string $location Location to associate with the visitor + * @param ResponseVisitorInterface $visitor Visitor to attach + * + * @return self + */ + public function addVisitor($location, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\LocationVisitor\Response\ResponseVisitorInterface $visitor) + { + $this->factory->addResponseVisitor($location, $visitor); + return $this; + } + protected function handleParsing(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response, $contentType) + { + $operation = $command->getOperation(); + $type = $operation->getResponseType(); + $model = null; + if ($type == \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\OperationInterface::TYPE_MODEL) { + $model = $operation->getServiceDescription()->getModel($operation->getResponseClass()); + } elseif ($type == \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\OperationInterface::TYPE_CLASS) { + return $this->parseClass($command); + } + if (!$model) { + // Return basic processing if the responseType is not model or the model cannot be found + return parent::handleParsing($command, $response, $contentType); + } elseif ($command[\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\AbstractCommand::RESPONSE_PROCESSING] != \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\AbstractCommand::TYPE_MODEL) { + // Returns a model with no visiting if the command response processing is not model + return new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\Model(parent::handleParsing($command, $response, $contentType)); + } else { + // Only inject the schema into the model if "schemaInModel" is true + return new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\Model($this->visitResult($model, $command, $response), $this->schemaInModels ? $model : null); + } + } + /** + * Parse a class object + * + * @param CommandInterface $command Command to parse into an object + * + * @return mixed + * @throws ResponseClassException + */ + protected function parseClass(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + // Emit the operation.parse_class event. If a listener injects a 'result' property, then that will be the result + $event = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CreateResponseClassEvent(array('command' => $command)); + $command->getClient()->getEventDispatcher()->dispatch('command.parse_response', $event); + if ($result = $event->getResult()) { + return $result; + } + $className = $command->getOperation()->getResponseClass(); + if (!method_exists($className, 'fromCommand')) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Exception\ResponseClassException("{$className} must exist and implement a static fromCommand() method"); + } + return $className::fromCommand($command); + } + /** + * Perform transformations on the result array + * + * @param Parameter $model Model that defines the structure + * @param CommandInterface $command Command that performed the operation + * @param Response $response Response received + * + * @return array Returns the array of result data + */ + protected function visitResult(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $model, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response) + { + $foundVisitors = $result = $knownProps = array(); + $props = $model->getProperties(); + foreach ($props as $schema) { + if ($location = $schema->getLocation()) { + // Trigger the before method on the first found visitor of this type + if (!isset($foundVisitors[$location])) { + $foundVisitors[$location] = $this->factory->getResponseVisitor($location); + $foundVisitors[$location]->before($command, $result); + } + } + } + // Visit additional properties when it is an actual schema + if (($additional = $model->getAdditionalProperties()) instanceof Parameter) { + $this->visitAdditionalProperties($model, $command, $response, $additional, $result, $foundVisitors); + } + // Apply the parameter value with the location visitor + foreach ($props as $schema) { + $knownProps[$schema->getName()] = 1; + if ($location = $schema->getLocation()) { + $foundVisitors[$location]->visit($command, $response, $schema, $result); + } + } + // Remove any unknown and potentially unsafe top-level properties + if ($additional === false) { + $result = array_intersect_key($result, $knownProps); + } + // Call the after() method of each found visitor + foreach ($foundVisitors as $visitor) { + $visitor->after($command); + } + return $result; + } + protected function visitAdditionalProperties(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $model, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\Response $response, \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $additional, &$result, array &$foundVisitors) + { + // Only visit when a location is specified + if ($location = $additional->getLocation()) { + if (!isset($foundVisitors[$location])) { + $foundVisitors[$location] = $this->factory->getResponseVisitor($location); + $foundVisitors[$location]->before($command, $result); + } + // Only traverse if an array was parsed from the before() visitors + if (is_array($result)) { + // Find each additional property + foreach (array_keys($result) as $key) { + // Check if the model actually knows this property. If so, then it is not additional + if (!$model->getProperty($key)) { + // Set the name to the key so that we can parse it with each visitor + $additional->setName($key); + $foundVisitors[$location]->visit($command, $response, $additional, $result); + } + } + // Reset the additionalProperties name to null + $additional->setName(null); + } + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/RequestSerializerInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/RequestSerializerInterface.php new file mode 100644 index 00000000..7063a520 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Command/RequestSerializerInterface.php @@ -0,0 +1,20 @@ + true, 'httpMethod' => true, 'uri' => true, 'class' => true, 'responseClass' => true, 'responseType' => true, 'responseNotes' => true, 'notes' => true, 'summary' => true, 'documentationUrl' => true, 'deprecated' => true, 'data' => true, 'parameters' => true, 'additionalParameters' => true, 'errorResponses' => true); + /** @var array Parameters */ + protected $parameters = array(); + /** @var Parameter Additional parameters schema */ + protected $additionalParameters; + /** @var string Name of the command */ + protected $name; + /** @var string HTTP method */ + protected $httpMethod; + /** @var string This is a short summary of what the operation does */ + protected $summary; + /** @var string A longer text field to explain the behavior of the operation. */ + protected $notes; + /** @var string Reference URL providing more information about the operation */ + protected $documentationUrl; + /** @var string HTTP URI of the command */ + protected $uri; + /** @var string Class of the command object */ + protected $class; + /** @var string This is what is returned from the method */ + protected $responseClass; + /** @var string Type information about the response */ + protected $responseType; + /** @var string Information about the response returned by the operation */ + protected $responseNotes; + /** @var bool Whether or not the command is deprecated */ + protected $deprecated; + /** @var array Array of errors that could occur when running the command */ + protected $errorResponses; + /** @var ServiceDescriptionInterface */ + protected $description; + /** @var array Extra operation information */ + protected $data; + /** + * Builds an Operation object using an array of configuration data: + * - name: (string) Name of the command + * - httpMethod: (string) HTTP method of the operation + * - uri: (string) URI template that can create a relative or absolute URL + * - class: (string) Concrete class that implements this command + * - parameters: (array) Associative array of parameters for the command. {@see Parameter} for information. + * - summary: (string) This is a short summary of what the operation does + * - notes: (string) A longer text field to explain the behavior of the operation. + * - documentationUrl: (string) Reference URL providing more information about the operation + * - responseClass: (string) This is what is returned from the method. Can be a primitive, PSR-0 compliant + * class name, or model. + * - responseNotes: (string) Information about the response returned by the operation + * - responseType: (string) One of 'primitive', 'class', 'model', or 'documentation'. If not specified, this + * value will be automatically inferred based on whether or not there is a model matching the + * name, if a matching PSR-0 compliant class name is found, or set to 'primitive' by default. + * - deprecated: (bool) Set to true if this is a deprecated command + * - errorResponses: (array) Errors that could occur when executing the command. Array of hashes, each with a + * 'code' (the HTTP response code), 'reason' (response reason phrase or description of the + * error), and 'class' (a custom exception class that would be thrown if the error is + * encountered). + * - data: (array) Any extra data that might be used to help build or serialize the operation + * - additionalParameters: (null|array) Parameter schema to use when an option is passed to the operation that is + * not in the schema + * + * @param array $config Array of configuration data + * @param ServiceDescriptionInterface $description Service description used to resolve models if $ref tags are found + */ + public function __construct(array $config = array(), \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\ServiceDescriptionInterface $description = null) + { + $this->description = $description; + // Get the intersection of the available properties and properties set on the operation + foreach (array_intersect_key($config, self::$properties) as $key => $value) { + $this->{$key} = $value; + } + $this->class = $this->class ?: self::DEFAULT_COMMAND_CLASS; + $this->deprecated = (bool) $this->deprecated; + $this->errorResponses = $this->errorResponses ?: array(); + $this->data = $this->data ?: array(); + if (!$this->responseClass) { + $this->responseClass = 'array'; + $this->responseType = 'primitive'; + } elseif ($this->responseType) { + // Set the response type to perform validation + $this->setResponseType($this->responseType); + } else { + // A response class was set and no response type was set, so guess what the type is + $this->inferResponseType(); + } + // Parameters need special handling when adding + if ($this->parameters) { + foreach ($this->parameters as $name => $param) { + if ($param instanceof Parameter) { + $param->setName($name)->setParent($this); + } elseif (is_array($param)) { + $param['name'] = $name; + $this->addParam(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter($param, $this->description)); + } + } + } + if ($this->additionalParameters) { + if ($this->additionalParameters instanceof Parameter) { + $this->additionalParameters->setParent($this); + } elseif (is_array($this->additionalParameters)) { + $this->setadditionalParameters(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter($this->additionalParameters, $this->description)); + } + } + } + public function toArray() + { + $result = array(); + // Grab valid properties and filter out values that weren't set + foreach (array_keys(self::$properties) as $check) { + if ($value = $this->{$check}) { + $result[$check] = $value; + } + } + // Remove the name property + unset($result['name']); + // Parameters need to be converted to arrays + $result['parameters'] = array(); + foreach ($this->parameters as $key => $param) { + $result['parameters'][$key] = $param->toArray(); + } + // Additional parameters need to be cast to an array + if ($this->additionalParameters instanceof Parameter) { + $result['additionalParameters'] = $this->additionalParameters->toArray(); + } + return $result; + } + public function getServiceDescription() + { + return $this->description; + } + public function setServiceDescription(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\ServiceDescriptionInterface $description) + { + $this->description = $description; + return $this; + } + public function getParams() + { + return $this->parameters; + } + public function getParamNames() + { + return array_keys($this->parameters); + } + public function hasParam($name) + { + return isset($this->parameters[$name]); + } + public function getParam($param) + { + return isset($this->parameters[$param]) ? $this->parameters[$param] : null; + } + /** + * Add a parameter to the command + * + * @param Parameter $param Parameter to add + * + * @return self + */ + public function addParam(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param) + { + $this->parameters[$param->getName()] = $param; + $param->setParent($this); + return $this; + } + /** + * Remove a parameter from the command + * + * @param string $name Name of the parameter to remove + * + * @return self + */ + public function removeParam($name) + { + unset($this->parameters[$name]); + return $this; + } + public function getHttpMethod() + { + return $this->httpMethod; + } + /** + * Set the HTTP method of the command + * + * @param string $httpMethod Method to set + * + * @return self + */ + public function setHttpMethod($httpMethod) + { + $this->httpMethod = $httpMethod; + return $this; + } + public function getClass() + { + return $this->class; + } + /** + * Set the concrete class of the command + * + * @param string $className Concrete class name + * + * @return self + */ + public function setClass($className) + { + $this->class = $className; + return $this; + } + public function getName() + { + return $this->name; + } + /** + * Set the name of the command + * + * @param string $name Name of the command + * + * @return self + */ + public function setName($name) + { + $this->name = $name; + return $this; + } + public function getSummary() + { + return $this->summary; + } + /** + * Set a short summary of what the operation does + * + * @param string $summary Short summary of the operation + * + * @return self + */ + public function setSummary($summary) + { + $this->summary = $summary; + return $this; + } + public function getNotes() + { + return $this->notes; + } + /** + * Set a longer text field to explain the behavior of the operation. + * + * @param string $notes Notes on the operation + * + * @return self + */ + public function setNotes($notes) + { + $this->notes = $notes; + return $this; + } + public function getDocumentationUrl() + { + return $this->documentationUrl; + } + /** + * Set the URL pointing to additional documentation on the command + * + * @param string $docUrl Documentation URL + * + * @return self + */ + public function setDocumentationUrl($docUrl) + { + $this->documentationUrl = $docUrl; + return $this; + } + public function getResponseClass() + { + return $this->responseClass; + } + /** + * Set what is returned from the method. Can be a primitive, class name, or model. For example: 'array', + * 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Foo\\Baz', or 'MyModelName' (to reference a model by ID). + * + * @param string $responseClass Type of response + * + * @return self + */ + public function setResponseClass($responseClass) + { + $this->responseClass = $responseClass; + $this->inferResponseType(); + return $this; + } + public function getResponseType() + { + return $this->responseType; + } + /** + * Set qualifying information about the responseClass. One of 'primitive', 'class', 'model', or 'documentation' + * + * @param string $responseType Response type information + * + * @return self + * @throws InvalidArgumentException + */ + public function setResponseType($responseType) + { + static $types = array(self::TYPE_PRIMITIVE => true, self::TYPE_CLASS => true, self::TYPE_MODEL => true, self::TYPE_DOCUMENTATION => true); + if (!isset($types[$responseType])) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('responseType must be one of ' . implode(', ', array_keys($types))); + } + $this->responseType = $responseType; + return $this; + } + public function getResponseNotes() + { + return $this->responseNotes; + } + /** + * Set notes about the response of the operation + * + * @param string $notes Response notes + * + * @return self + */ + public function setResponseNotes($notes) + { + $this->responseNotes = $notes; + return $this; + } + public function getDeprecated() + { + return $this->deprecated; + } + /** + * Set whether or not the command is deprecated + * + * @param bool $isDeprecated Set to true to mark as deprecated + * + * @return self + */ + public function setDeprecated($isDeprecated) + { + $this->deprecated = $isDeprecated; + return $this; + } + public function getUri() + { + return $this->uri; + } + /** + * Set the URI template of the command + * + * @param string $uri URI template to set + * + * @return self + */ + public function setUri($uri) + { + $this->uri = $uri; + return $this; + } + public function getErrorResponses() + { + return $this->errorResponses; + } + /** + * Add an error to the command + * + * @param string $code HTTP response code + * @param string $reason HTTP response reason phrase or information about the error + * @param string $class Exception class associated with the error + * + * @return self + */ + public function addErrorResponse($code, $reason, $class) + { + $this->errorResponses[] = array('code' => $code, 'reason' => $reason, 'class' => $class); + return $this; + } + /** + * Set all of the error responses of the operation + * + * @param array $errorResponses Hash of error name to a hash containing a code, reason, class + * + * @return self + */ + public function setErrorResponses(array $errorResponses) + { + $this->errorResponses = $errorResponses; + return $this; + } + public function getData($name) + { + return isset($this->data[$name]) ? $this->data[$name] : null; + } + /** + * Set a particular data point on the operation + * + * @param string $name Name of the data value + * @param mixed $value Value to set + * + * @return self + */ + public function setData($name, $value) + { + $this->data[$name] = $value; + return $this; + } + /** + * Get the additionalParameters of the operation + * + * @return Parameter|null + */ + public function getAdditionalParameters() + { + return $this->additionalParameters; + } + /** + * Set the additionalParameters of the operation + * + * @param Parameter|null $parameter Parameter to set + * + * @return self + */ + public function setAdditionalParameters($parameter) + { + if ($this->additionalParameters = $parameter) { + $this->additionalParameters->setParent($this); + } + return $this; + } + /** + * Infer the response type from the responseClass value + */ + protected function inferResponseType() + { + static $primitives = array('array' => 1, 'boolean' => 1, 'string' => 1, 'integer' => 1, '' => 1); + if (isset($primitives[$this->responseClass])) { + $this->responseType = self::TYPE_PRIMITIVE; + } elseif ($this->description && $this->description->hasModel($this->responseClass)) { + $this->responseType = self::TYPE_MODEL; + } else { + $this->responseType = self::TYPE_CLASS; + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/OperationInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/OperationInterface.php new file mode 100644 index 00000000..099f1cdf --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/OperationInterface.php @@ -0,0 +1,139 @@ +getModel($data['$ref'])) { + $data = $model->toArray() + $data; + } + } elseif (isset($data['extends'])) { + // If this parameter extends from another parameter then start with the actual data + // union in the parent's data (e.g. actual supersedes parent) + if ($extends = $description->getModel($data['extends'])) { + $data += $extends->toArray(); + } + } + } + // Pull configuration data into the parameter + foreach ($data as $key => $value) { + $this->{$key} = $value; + } + $this->serviceDescription = $description; + $this->required = (bool) $this->required; + $this->data = (array) $this->data; + if ($this->filters) { + $this->setFilters((array) $this->filters); + } + if ($this->type == 'object' && $this->additionalProperties === null) { + $this->additionalProperties = true; + } + } + /** + * Convert the object to an array + * + * @return array + */ + public function toArray() + { + static $checks = array('required', 'description', 'static', 'type', 'format', 'instanceOf', 'location', 'sentAs', 'pattern', 'minimum', 'maximum', 'minItems', 'maxItems', 'minLength', 'maxLength', 'data', 'enum', 'filters'); + $result = array(); + // Anything that is in the `Items` attribute of an array *must* include it's name if available + if ($this->parent instanceof self && $this->parent->getType() == 'array' && isset($this->name)) { + $result['name'] = $this->name; + } + foreach ($checks as $c) { + if ($value = $this->{$c}) { + $result[$c] = $value; + } + } + if ($this->default !== null) { + $result['default'] = $this->default; + } + if ($this->items !== null) { + $result['items'] = $this->getItems()->toArray(); + } + if ($this->additionalProperties !== null) { + $result['additionalProperties'] = $this->getAdditionalProperties(); + if ($result['additionalProperties'] instanceof self) { + $result['additionalProperties'] = $result['additionalProperties']->toArray(); + } + } + if ($this->type == 'object' && $this->properties) { + $result['properties'] = array(); + foreach ($this->getProperties() as $name => $property) { + $result['properties'][$name] = $property->toArray(); + } + } + return $result; + } + /** + * Get the default or static value of the command based on a value + * + * @param string $value Value that is currently set + * + * @return mixed Returns the value, a static value if one is present, or a default value + */ + public function getValue($value) + { + if ($this->static || $this->default !== null && $value === null) { + return $this->default; + } + return $value; + } + /** + * Run a value through the filters OR format attribute associated with the parameter + * + * @param mixed $value Value to filter + * + * @return mixed Returns the filtered value + */ + public function filter($value) + { + // Formats are applied exclusively and supersed filters + if ($this->format) { + return \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\SchemaFormatter::format($this->format, $value); + } + // Convert Boolean values + if ($this->type == 'boolean' && !is_bool($value)) { + $value = filter_var($value, FILTER_VALIDATE_BOOLEAN); + } + // Apply filters to the value + if ($this->filters) { + foreach ($this->filters as $filter) { + if (is_array($filter)) { + // Convert complex filters that hold value place holders + foreach ($filter['args'] as &$data) { + if ($data == '@value') { + $data = $value; + } elseif ($data == '@api') { + $data = $this; + } + } + $value = call_user_func_array($filter['method'], $filter['args']); + } else { + $value = call_user_func($filter, $value); + } + } + } + return $value; + } + /** + * Get the name of the parameter + * + * @return string + */ + public function getName() + { + return $this->name; + } + /** + * Get the key of the parameter, where sentAs will supersede name if it is set + * + * @return string + */ + public function getWireName() + { + return $this->sentAs ?: $this->name; + } + /** + * Set the name of the parameter + * + * @param string $name Name to set + * + * @return self + */ + public function setName($name) + { + $this->name = $name; + return $this; + } + /** + * Get the type(s) of the parameter + * + * @return string|array + */ + public function getType() + { + return $this->type; + } + /** + * Set the type(s) of the parameter + * + * @param string|array $type Type of parameter or array of simple types used in a union + * + * @return self + */ + public function setType($type) + { + $this->type = $type; + return $this; + } + /** + * Get if the parameter is required + * + * @return bool + */ + public function getRequired() + { + return $this->required; + } + /** + * Set if the parameter is required + * + * @param bool $isRequired Whether or not the parameter is required + * + * @return self + */ + public function setRequired($isRequired) + { + $this->required = (bool) $isRequired; + return $this; + } + /** + * Get the default value of the parameter + * + * @return string|null + */ + public function getDefault() + { + return $this->default; + } + /** + * Set the default value of the parameter + * + * @param string|null $default Default value to set + * + * @return self + */ + public function setDefault($default) + { + $this->default = $default; + return $this; + } + /** + * Get the description of the parameter + * + * @return string|null + */ + public function getDescription() + { + return $this->description; + } + /** + * Set the description of the parameter + * + * @param string $description Description + * + * @return self + */ + public function setDescription($description) + { + $this->description = $description; + return $this; + } + /** + * Get the minimum acceptable value for an integer + * + * @return int|null + */ + public function getMinimum() + { + return $this->minimum; + } + /** + * Set the minimum acceptable value for an integer + * + * @param int|null $min Minimum + * + * @return self + */ + public function setMinimum($min) + { + $this->minimum = $min; + return $this; + } + /** + * Get the maximum acceptable value for an integer + * + * @return int|null + */ + public function getMaximum() + { + return $this->maximum; + } + /** + * Set the maximum acceptable value for an integer + * + * @param int $max Maximum + * + * @return self + */ + public function setMaximum($max) + { + $this->maximum = $max; + return $this; + } + /** + * Get the minimum allowed length of a string value + * + * @return int + */ + public function getMinLength() + { + return $this->minLength; + } + /** + * Set the minimum allowed length of a string value + * + * @param int|null $min Minimum + * + * @return self + */ + public function setMinLength($min) + { + $this->minLength = $min; + return $this; + } + /** + * Get the maximum allowed length of a string value + * + * @return int|null + */ + public function getMaxLength() + { + return $this->maxLength; + } + /** + * Set the maximum allowed length of a string value + * + * @param int $max Maximum length + * + * @return self + */ + public function setMaxLength($max) + { + $this->maxLength = $max; + return $this; + } + /** + * Get the maximum allowed number of items in an array value + * + * @return int|null + */ + public function getMaxItems() + { + return $this->maxItems; + } + /** + * Set the maximum allowed number of items in an array value + * + * @param int $max Maximum + * + * @return self + */ + public function setMaxItems($max) + { + $this->maxItems = $max; + return $this; + } + /** + * Get the minimum allowed number of items in an array value + * + * @return int + */ + public function getMinItems() + { + return $this->minItems; + } + /** + * Set the minimum allowed number of items in an array value + * + * @param int|null $min Minimum + * + * @return self + */ + public function setMinItems($min) + { + $this->minItems = $min; + return $this; + } + /** + * Get the location of the parameter + * + * @return string|null + */ + public function getLocation() + { + return $this->location; + } + /** + * Set the location of the parameter + * + * @param string|null $location Location of the parameter + * + * @return self + */ + public function setLocation($location) + { + $this->location = $location; + return $this; + } + /** + * Get the sentAs attribute of the parameter that used with locations to sentAs an attribute when it is being + * applied to a location. + * + * @return string|null + */ + public function getSentAs() + { + return $this->sentAs; + } + /** + * Set the sentAs attribute + * + * @param string|null $name Name of the value as it is sent over the wire + * + * @return self + */ + public function setSentAs($name) + { + $this->sentAs = $name; + return $this; + } + /** + * Retrieve a known property from the parameter by name or a data property by name. When not specific name value + * is specified, all data properties will be returned. + * + * @param string|null $name Specify a particular property name to retrieve + * + * @return array|mixed|null + */ + public function getData($name = null) + { + if (!$name) { + return $this->data; + } + if (isset($this->data[$name])) { + return $this->data[$name]; + } elseif (isset($this->{$name})) { + return $this->{$name}; + } + return null; + } + /** + * Set the extra data properties of the parameter or set a specific extra property + * + * @param string|array|null $nameOrData The name of a specific extra to set or an array of extras to set + * @param mixed|null $data When setting a specific extra property, specify the data to set for it + * + * @return self + */ + public function setData($nameOrData, $data = null) + { + if (is_array($nameOrData)) { + $this->data = $nameOrData; + } else { + $this->data[$nameOrData] = $data; + } + return $this; + } + /** + * Get whether or not the default value can be changed + * + * @return mixed|null + */ + public function getStatic() + { + return $this->static; + } + /** + * Set to true if the default value cannot be changed + * + * @param bool $static True or false + * + * @return self + */ + public function setStatic($static) + { + $this->static = (bool) $static; + return $this; + } + /** + * Get an array of filters used by the parameter + * + * @return array + */ + public function getFilters() + { + return $this->filters ?: array(); + } + /** + * Set the array of filters used by the parameter + * + * @param array $filters Array of functions to use as filters + * + * @return self + */ + public function setFilters(array $filters) + { + $this->filters = array(); + foreach ($filters as $filter) { + $this->addFilter($filter); + } + return $this; + } + /** + * Add a filter to the parameter + * + * @param string|array $filter Method to filter the value through + * + * @return self + * @throws InvalidArgumentException + */ + public function addFilter($filter) + { + if (is_array($filter)) { + if (!isset($filter['method'])) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('A [method] value must be specified for each complex filter'); + } + } + if (!$this->filters) { + $this->filters = array($filter); + } else { + $this->filters[] = $filter; + } + return $this; + } + /** + * Get the parent object (an {@see OperationInterface} or {@see Parameter} + * + * @return OperationInterface|Parameter|null + */ + public function getParent() + { + return $this->parent; + } + /** + * Set the parent object of the parameter + * + * @param OperationInterface|Parameter|null $parent Parent container of the parameter + * + * @return self + */ + public function setParent($parent) + { + $this->parent = $parent; + return $this; + } + /** + * Get the properties of the parameter + * + * @return array + */ + public function getProperties() + { + if (!$this->propertiesCache) { + $this->propertiesCache = array(); + foreach (array_keys($this->properties) as $name) { + $this->propertiesCache[$name] = $this->getProperty($name); + } + } + return $this->propertiesCache; + } + /** + * Get a specific property from the parameter + * + * @param string $name Name of the property to retrieve + * + * @return null|Parameter + */ + public function getProperty($name) + { + if (!isset($this->properties[$name])) { + return null; + } + if (!$this->properties[$name] instanceof self) { + $this->properties[$name]['name'] = $name; + $this->properties[$name] = new static($this->properties[$name], $this->serviceDescription); + $this->properties[$name]->setParent($this); + } + return $this->properties[$name]; + } + /** + * Remove a property from the parameter + * + * @param string $name Name of the property to remove + * + * @return self + */ + public function removeProperty($name) + { + unset($this->properties[$name]); + $this->propertiesCache = null; + return $this; + } + /** + * Add a property to the parameter + * + * @param Parameter $property Properties to set + * + * @return self + */ + public function addProperty(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $property) + { + $this->properties[$property->getName()] = $property; + $property->setParent($this); + $this->propertiesCache = null; + return $this; + } + /** + * Get the additionalProperties value of the parameter + * + * @return bool|Parameter|null + */ + public function getAdditionalProperties() + { + if (is_array($this->additionalProperties)) { + $this->additionalProperties = new static($this->additionalProperties, $this->serviceDescription); + $this->additionalProperties->setParent($this); + } + return $this->additionalProperties; + } + /** + * Set the additionalProperties value of the parameter + * + * @param bool|Parameter|null $additional Boolean to allow any, an Parameter to specify a schema, or false to disallow + * + * @return self + */ + public function setAdditionalProperties($additional) + { + $this->additionalProperties = $additional; + return $this; + } + /** + * Set the items data of the parameter + * + * @param Parameter|null $items Items to set + * + * @return self + */ + public function setItems(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $items = null) + { + if ($this->items = $items) { + $this->items->setParent($this); + } + return $this; + } + /** + * Get the item data of the parameter + * + * @return Parameter|null + */ + public function getItems() + { + if (is_array($this->items)) { + $this->items = new static($this->items, $this->serviceDescription); + $this->items->setParent($this); + } + return $this->items; + } + /** + * Get the class that the parameter must implement + * + * @return null|string + */ + public function getInstanceOf() + { + return $this->instanceOf; + } + /** + * Set the class that the parameter must be an instance of + * + * @param string|null $instanceOf Class or interface name + * + * @return self + */ + public function setInstanceOf($instanceOf) + { + $this->instanceOf = $instanceOf; + return $this; + } + /** + * Get the enum of strings that are valid for the parameter + * + * @return array|null + */ + public function getEnum() + { + return $this->enum; + } + /** + * Set the enum of strings that are valid for the parameter + * + * @param array|null $enum Array of strings or null + * + * @return self + */ + public function setEnum(array $enum = null) + { + $this->enum = $enum; + return $this; + } + /** + * Get the regex pattern that must match a value when the value is a string + * + * @return string + */ + public function getPattern() + { + return $this->pattern; + } + /** + * Set the regex pattern that must match a value when the value is a string + * + * @param string $pattern Regex pattern + * + * @return self + */ + public function setPattern($pattern) + { + $this->pattern = $pattern; + return $this; + } + /** + * Get the format attribute of the schema + * + * @return string + */ + public function getFormat() + { + return $this->format; + } + /** + * Set the format attribute of the schema + * + * @param string $format Format to set (e.g. date, date-time, timestamp, time, date-time-http) + * + * @return self + */ + public function setFormat($format) + { + $this->format = $format; + return $this; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/SchemaFormatter.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/SchemaFormatter.php new file mode 100644 index 00000000..4a53c186 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/SchemaFormatter.php @@ -0,0 +1,142 @@ +setTimezone(self::getUtcTimeZone())->format($format); + } + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Date/Time values must be either a string, integer, or DateTime object'); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php new file mode 100644 index 00000000..c0f14e99 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php @@ -0,0 +1,258 @@ +castIntegerToStringType = $castIntegerToStringType; + } + public function validate(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, &$value) + { + $this->errors = array(); + $this->recursiveProcess($param, $value); + if (empty($this->errors)) { + return true; + } else { + sort($this->errors); + return false; + } + } + /** + * Get the errors encountered while validating + * + * @return array + */ + public function getErrors() + { + return $this->errors ?: array(); + } + /** + * Recursively validate a parameter + * + * @param Parameter $param API parameter being validated + * @param mixed $value Value to validate and validate. The value may change during this validate. + * @param string $path Current validation path (used for error reporting) + * @param int $depth Current depth in the validation validate + * + * @return bool Returns true if valid, or false if invalid + */ + protected function recursiveProcess(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $param, &$value, $path = '', $depth = 0) + { + // Update the value by adding default or static values + $value = $param->getValue($value); + $required = $param->getRequired(); + // if the value is null and the parameter is not required or is static, then skip any further recursion + if (null === $value && !$required || $param->getStatic()) { + return true; + } + $type = $param->getType(); + // Attempt to limit the number of times is_array is called by tracking if the value is an array + $valueIsArray = is_array($value); + // If a name is set then update the path so that validation messages are more helpful + if ($name = $param->getName()) { + $path .= "[{$name}]"; + } + if ($type == 'object') { + // Objects are either associative arrays, ToArrayInterface, or some other object + if ($param->getInstanceOf()) { + $instance = $param->getInstanceOf(); + if (!$value instanceof $instance) { + $this->errors[] = "{$path} must be an instance of {$instance}"; + return false; + } + } + // Determine whether or not this "value" has properties and should be traversed + $traverse = $temporaryValue = false; + // Convert the value to an array + if (!$valueIsArray && $value instanceof ToArrayInterface) { + $value = $value->toArray(); + } + if ($valueIsArray) { + // Ensure that the array is associative and not numerically indexed + if (isset($value[0])) { + $this->errors[] = "{$path} must be an array of properties. Got a numerically indexed array."; + return false; + } + $traverse = true; + } elseif ($value === null) { + // Attempt to let the contents be built up by default values if possible + $value = array(); + $temporaryValue = $valueIsArray = $traverse = true; + } + if ($traverse) { + if ($properties = $param->getProperties()) { + // if properties were found, the validate each property of the value + foreach ($properties as $property) { + $name = $property->getName(); + if (isset($value[$name])) { + $this->recursiveProcess($property, $value[$name], $path, $depth + 1); + } else { + $current = null; + $this->recursiveProcess($property, $current, $path, $depth + 1); + // Only set the value if it was populated with something + if (null !== $current) { + $value[$name] = $current; + } + } + } + } + $additional = $param->getAdditionalProperties(); + if ($additional !== true) { + // If additional properties were found, then validate each against the additionalProperties attr. + $keys = array_keys($value); + // Determine the keys that were specified that were not listed in the properties of the schema + $diff = array_diff($keys, array_keys($properties)); + if (!empty($diff)) { + // Determine which keys are not in the properties + if ($additional instanceof Parameter) { + foreach ($diff as $key) { + $this->recursiveProcess($additional, $value[$key], "{$path}[{$key}]", $depth); + } + } else { + // if additionalProperties is set to false and there are additionalProperties in the values, then fail + foreach ($diff as $prop) { + $this->errors[] = sprintf('%s[%s] is not an allowed property', $path, $prop); + } + } + } + } + // A temporary value will be used to traverse elements that have no corresponding input value. + // This allows nested required parameters with default values to bubble up into the input. + // Here we check if we used a temp value and nothing bubbled up, then we need to remote the value. + if ($temporaryValue && empty($value)) { + $value = null; + $valueIsArray = false; + } + } + } elseif ($type == 'array' && $valueIsArray && $param->getItems()) { + foreach ($value as $i => &$item) { + // Validate each item in an array against the items attribute of the schema + $this->recursiveProcess($param->getItems(), $item, $path . "[{$i}]", $depth + 1); + } + } + // If the value is required and the type is not null, then there is an error if the value is not set + if ($required && $value === null && $type != 'null') { + $message = "{$path} is " . ($param->getType() ? 'a required ' . implode(' or ', (array) $param->getType()) : 'required'); + if ($param->getDescription()) { + $message .= ': ' . $param->getDescription(); + } + $this->errors[] = $message; + return false; + } + // Validate that the type is correct. If the type is string but an integer was passed, the class can be + // instructed to cast the integer to a string to pass validation. This is the default behavior. + if ($type && !($type = $this->determineType($type, $value))) { + if ($this->castIntegerToStringType && $param->getType() == 'string' && is_integer($value)) { + $value = (string) $value; + } else { + $this->errors[] = "{$path} must be of type " . implode(' or ', (array) $param->getType()); + } + } + // Perform type specific validation for strings, arrays, and integers + if ($type == 'string') { + // Strings can have enums which are a list of predefined values + if (($enum = $param->getEnum()) && !in_array($value, $enum)) { + $this->errors[] = "{$path} must be one of " . implode(' or ', array_map(function ($s) { + return '"' . addslashes($s) . '"'; + }, $enum)); + } + // Strings can have a regex pattern that the value must match + if (($pattern = $param->getPattern()) && !preg_match($pattern, $value)) { + $this->errors[] = "{$path} must match the following regular expression: {$pattern}"; + } + $strLen = null; + if ($min = $param->getMinLength()) { + $strLen = strlen($value); + if ($strLen < $min) { + $this->errors[] = "{$path} length must be greater than or equal to {$min}"; + } + } + if ($max = $param->getMaxLength()) { + if (($strLen ?: strlen($value)) > $max) { + $this->errors[] = "{$path} length must be less than or equal to {$max}"; + } + } + } elseif ($type == 'array') { + $size = null; + if ($min = $param->getMinItems()) { + $size = count($value); + if ($size < $min) { + $this->errors[] = "{$path} must contain {$min} or more elements"; + } + } + if ($max = $param->getMaxItems()) { + if (($size ?: count($value)) > $max) { + $this->errors[] = "{$path} must contain {$max} or fewer elements"; + } + } + } elseif ($type == 'integer' || $type == 'number' || $type == 'numeric') { + if (($min = $param->getMinimum()) && $value < $min) { + $this->errors[] = "{$path} must be greater than or equal to {$min}"; + } + if (($max = $param->getMaximum()) && $value > $max) { + $this->errors[] = "{$path} must be less than or equal to {$max}"; + } + } + return empty($this->errors); + } + /** + * From the allowable types, determine the type that the variable matches + * + * @param string $type Parameter type + * @param mixed $value Value to determine the type + * + * @return string|bool Returns the matching type on + */ + protected function determineType($type, $value) + { + foreach ((array) $type as $t) { + if ($t == 'string' && (is_string($value) || is_object($value) && method_exists($value, '__toString'))) { + return 'string'; + } elseif ($t == 'object' && (is_array($value) || is_object($value))) { + return 'object'; + } elseif ($t == 'array' && is_array($value)) { + return 'array'; + } elseif ($t == 'integer' && is_integer($value)) { + return 'integer'; + } elseif ($t == 'boolean' && is_bool($value)) { + return 'boolean'; + } elseif ($t == 'number' && is_numeric($value)) { + return 'number'; + } elseif ($t == 'numeric' && is_numeric($value)) { + return 'numeric'; + } elseif ($t == 'null' && !$value) { + return 'null'; + } elseif ($t == 'any') { + return 'any'; + } + } + return false; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescription.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescription.php new file mode 100644 index 00000000..819c04b8 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescription.php @@ -0,0 +1,219 @@ +load($config, $options); + } + /** + * @param array $config Array of configuration data + */ + public function __construct(array $config = array()) + { + $this->fromArray($config); + } + public function serialize() + { + return json_encode($this->toArray()); + } + public function unserialize($json) + { + $this->operations = array(); + $this->fromArray(json_decode($json, true)); + } + public function toArray() + { + $result = array('name' => $this->name, 'apiVersion' => $this->apiVersion, 'baseUrl' => $this->baseUrl, 'description' => $this->description) + $this->extraData; + $result['operations'] = array(); + foreach ($this->getOperations() as $name => $operation) { + $result['operations'][$operation->getName() ?: $name] = $operation->toArray(); + } + if (!empty($this->models)) { + $result['models'] = array(); + foreach ($this->models as $id => $model) { + $result['models'][$id] = $model instanceof Parameter ? $model->toArray() : $model; + } + } + return array_filter($result); + } + public function getBaseUrl() + { + return $this->baseUrl; + } + /** + * Set the baseUrl of the description + * + * @param string $baseUrl Base URL of each operation + * + * @return self + */ + public function setBaseUrl($baseUrl) + { + $this->baseUrl = $baseUrl; + return $this; + } + public function getOperations() + { + foreach (array_keys($this->operations) as $name) { + $this->getOperation($name); + } + return $this->operations; + } + public function hasOperation($name) + { + return isset($this->operations[$name]); + } + public function getOperation($name) + { + // Lazily retrieve and build operations + if (!isset($this->operations[$name])) { + return null; + } + if (!$this->operations[$name] instanceof Operation) { + $this->operations[$name] = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Operation($this->operations[$name], $this); + } + return $this->operations[$name]; + } + /** + * Add a operation to the service description + * + * @param OperationInterface $operation Operation to add + * + * @return self + */ + public function addOperation(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\OperationInterface $operation) + { + $this->operations[$operation->getName()] = $operation->setServiceDescription($this); + return $this; + } + public function getModel($id) + { + if (!isset($this->models[$id])) { + return null; + } + if (!$this->models[$id] instanceof Parameter) { + $this->models[$id] = new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter($this->models[$id] + array('name' => $id), $this); + } + return $this->models[$id]; + } + public function getModels() + { + // Ensure all models are converted into parameter objects + foreach (array_keys($this->models) as $id) { + $this->getModel($id); + } + return $this->models; + } + public function hasModel($id) + { + return isset($this->models[$id]); + } + /** + * Add a model to the service description + * + * @param Parameter $model Model to add + * + * @return self + */ + public function addModel(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter $model) + { + $this->models[$model->getName()] = $model; + return $this; + } + public function getApiVersion() + { + return $this->apiVersion; + } + public function getName() + { + return $this->name; + } + public function getDescription() + { + return $this->description; + } + public function getData($key) + { + return isset($this->extraData[$key]) ? $this->extraData[$key] : null; + } + public function setData($key, $value) + { + $this->extraData[$key] = $value; + return $this; + } + /** + * Initialize the state from an array + * + * @param array $config Configuration data + * @throws InvalidArgumentException + */ + protected function fromArray(array $config) + { + // Keep a list of default keys used in service descriptions that is later used to determine extra data keys + static $defaultKeys = array('name', 'models', 'apiVersion', 'baseUrl', 'description'); + // Pull in the default configuration values + foreach ($defaultKeys as $key) { + if (isset($config[$key])) { + $this->{$key} = $config[$key]; + } + } + // Account for the Swagger name for Guzzle's baseUrl + if (isset($config['basePath'])) { + $this->baseUrl = $config['basePath']; + } + // Ensure that the models and operations properties are always arrays + $this->models = (array) $this->models; + $this->operations = (array) $this->operations; + // We want to add operations differently than adding the other properties + $defaultKeys[] = 'operations'; + // Create operations for each operation + if (isset($config['operations'])) { + foreach ($config['operations'] as $name => $operation) { + if (!$operation instanceof Operation && !is_array($operation)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Invalid operation in service description: ' . gettype($operation)); + } + $this->operations[$name] = $operation; + } + } + // Get all of the additional properties of the service description and store them in a data array + foreach (array_diff(array_keys($config), $defaultKeys) as $key) { + $this->extraData[$key] = $config[$key]; + } + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescriptionInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescriptionInterface.php new file mode 100644 index 00000000..89e328b6 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescriptionInterface.php @@ -0,0 +1,95 @@ + $op) { + $name = $op['name'] = isset($op['name']) ? $op['name'] : $name; + // Extend other operations + if (!empty($op['extends'])) { + $this->resolveExtension($name, $op, $operations); + } + $op['parameters'] = isset($op['parameters']) ? $op['parameters'] : array(); + $operations[$name] = $op; + } + } + return new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\ServiceDescription(array('apiVersion' => isset($config['apiVersion']) ? $config['apiVersion'] : null, 'baseUrl' => isset($config['baseUrl']) ? $config['baseUrl'] : null, 'description' => isset($config['description']) ? $config['description'] : null, 'operations' => $operations, 'models' => isset($config['models']) ? $config['models'] : null) + $config); + } + /** + * @param string $name Name of the operation + * @param array $op Operation value array + * @param array $operations Currently loaded operations + * @throws DescriptionBuilderException when extending a non-existent operation + */ + protected function resolveExtension($name, array &$op, array &$operations) + { + $resolved = array(); + $original = empty($op['parameters']) ? false : $op['parameters']; + $hasClass = !empty($op['class']); + foreach ((array) $op['extends'] as $extendedCommand) { + if (empty($operations[$extendedCommand])) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Exception\DescriptionBuilderException("{$name} extends missing operation {$extendedCommand}"); + } + $toArray = $operations[$extendedCommand]; + $resolved = empty($resolved) ? $toArray['parameters'] : array_merge($resolved, $toArray['parameters']); + $op = $op + $toArray; + if (!$hasClass && isset($toArray['class'])) { + $op['class'] = $toArray['class']; + } + } + $op['parameters'] = $original ? array_merge($resolved, $original) : $resolved; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/ValidatorInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/ValidatorInterface.php new file mode 100644 index 00000000..b741df7e --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Description/ValidatorInterface.php @@ -0,0 +1,27 @@ +getMessage(), $e->getCode(), $e->getPrevious()); + $ce->setSuccessfulRequests($e->getSuccessfulRequests()); + $alreadyAddedExceptions = array(); + foreach ($e->getFailedRequests() as $request) { + if ($re = $e->getExceptionForFailedRequest($request)) { + $alreadyAddedExceptions[] = $re; + $ce->addFailedRequestWithException($request, $re); + } else { + $ce->addFailedRequest($request); + } + } + // Add any exceptions that did not map to a request + if (count($alreadyAddedExceptions) < count($e)) { + foreach ($e as $ex) { + if (!in_array($ex, $alreadyAddedExceptions)) { + $ce->add($ex); + } + } + } + return $ce; + } + /** + * Get all of the commands in the transfer + * + * @return array + */ + public function getAllCommands() + { + return array_merge($this->successfulCommands, $this->failedCommands); + } + /** + * Add to the array of successful commands + * + * @param CommandInterface $command Successful command + * + * @return self + */ + public function addSuccessfulCommand(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + $this->successfulCommands[] = $command; + return $this; + } + /** + * Add to the array of failed commands + * + * @param CommandInterface $command Failed command + * + * @return self + */ + public function addFailedCommand(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + $this->failedCommands[] = $command; + return $this; + } + /** + * Get an array of successful commands + * + * @return array + */ + public function getSuccessfulCommands() + { + return $this->successfulCommands; + } + /** + * Get an array of failed commands + * + * @return array + */ + public function getFailedCommands() + { + return $this->failedCommands; + } + /** + * Get the Exception that caused the given $command to fail + * + * @param CommandInterface $command Failed command + * + * @return \Exception|null + */ + public function getExceptionForFailedCommand(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + return $this->getExceptionForFailedRequest($command->getRequest()); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Exception/DescriptionBuilderException.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Exception/DescriptionBuilderException.php new file mode 100644 index 00000000..e1210b7c --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Exception/DescriptionBuilderException.php @@ -0,0 +1,8 @@ +invalidCommands = $commands; + parent::__construct('Encountered commands in a batch transfer that use inconsistent clients. The batching ' . 'strategy you use with a command transfer must divide command batches by client.'); + } + /** + * Get the invalid commands + * + * @return array + */ + public function getCommands() + { + return $this->invalidCommands; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Exception/ResponseClassException.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Exception/ResponseClassException.php new file mode 100644 index 00000000..816e1e44 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Exception/ResponseClassException.php @@ -0,0 +1,8 @@ +errors = $errors; + } + /** + * Get any validation errors + * + * @return array + */ + public function getErrors() + { + return $this->errors; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/AbstractResourceIteratorFactory.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/AbstractResourceIteratorFactory.php new file mode 100644 index 00000000..eda7a07c --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/AbstractResourceIteratorFactory.php @@ -0,0 +1,32 @@ +canBuild($command)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Iterator was not found for ' . $command->getName()); + } + $className = $this->getClassName($command); + return new $className($command, $options); + } + public function canBuild(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + return (bool) $this->getClassName($command); + } + /** + * Get the name of the class to instantiate for the command + * + * @param CommandInterface $command Command that is associated with the iterator + * + * @return string + */ + protected abstract function getClassName(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command); +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/CompositeResourceIteratorFactory.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/CompositeResourceIteratorFactory.php new file mode 100644 index 00000000..0dc7ad24 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/CompositeResourceIteratorFactory.php @@ -0,0 +1,58 @@ +factories = $factories; + } + public function build(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command, array $options = array()) + { + if (!($factory = $this->getFactory($command))) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Iterator was not found for ' . $command->getName()); + } + return $factory->build($command, $options); + } + public function canBuild(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + return $this->getFactory($command) !== false; + } + /** + * Add a factory to the composite factory + * + * @param ResourceIteratorFactoryInterface $factory Factory to add + * + * @return self + */ + public function addFactory(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\ResourceIteratorFactoryInterface $factory) + { + $this->factories[] = $factory; + return $this; + } + /** + * Get the factory that matches the command object + * + * @param CommandInterface $command Command retrieving the iterator for + * + * @return ResourceIteratorFactoryInterface|bool + */ + protected function getFactory(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + foreach ($this->factories as $factory) { + if ($factory->canBuild($command)) { + return $factory; + } + } + return false; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/MapResourceIteratorFactory.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/MapResourceIteratorFactory.php new file mode 100644 index 00000000..e0aa9c5d --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/MapResourceIteratorFactory.php @@ -0,0 +1,29 @@ +map = $map; + } + public function getClassName(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + $className = $command->getName(); + if (isset($this->map[$className])) { + return $this->map[$className]; + } elseif (isset($this->map['*'])) { + // If a wildcard was added, then always use that + return $this->map['*']; + } + return null; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/Model.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/Model.php new file mode 100644 index 00000000..6401123d --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/Model.php @@ -0,0 +1,56 @@ +data = $data; + $this->structure = $structure; + } + /** + * Get the structure of the model + * + * @return Parameter + */ + public function getStructure() + { + return $this->structure ?: new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Description\Parameter(); + } + /** + * Provides debug information about the model object + * + * @return string + */ + public function __toString() + { + $output = 'Debug output of '; + if ($this->structure) { + $output .= $this->structure->getName() . ' '; + } + $output .= 'model'; + $output = str_repeat('=', strlen($output)) . "\n" . $output . "\n" . str_repeat('=', strlen($output)) . "\n\n"; + $output .= "Model data\n-----------\n\n"; + $output .= "This data can be retrieved from the model object using the get() method of the model " . "(e.g. \$model->get(\$key)) or accessing the model like an associative array (e.g. \$model['key']).\n\n"; + $lines = array_slice(explode("\n", trim(print_r($this->toArray(), true))), 2, -1); + $output .= implode("\n", $lines); + if ($this->structure) { + $output .= "\n\nModel structure\n---------------\n\n"; + $output .= "The following JSON document defines how the model was parsed from an HTTP response into the " . "associative array structure you see above.\n\n"; + $output .= ' ' . json_encode($this->structure->toArray()) . "\n\n"; + } + return $output . "\n"; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIterator.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIterator.php new file mode 100644 index 00000000..23bf34ef --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIterator.php @@ -0,0 +1,207 @@ +originalCommand = $command; + // Parse options from the array of options + $this->data = $data; + $this->limit = array_key_exists('limit', $data) ? $data['limit'] : 0; + $this->pageSize = array_key_exists('page_size', $data) ? $data['page_size'] : false; + } + /** + * Get all of the resources as an array (Warning: this could issue a large number of requests) + * + * @return array + */ + public function toArray() + { + return iterator_to_array($this, false); + } + public function setLimit($limit) + { + $this->limit = $limit; + $this->resetState(); + return $this; + } + public function setPageSize($pageSize) + { + $this->pageSize = $pageSize; + $this->resetState(); + return $this; + } + /** + * Get an option from the iterator + * + * @param string $key Key of the option to retrieve + * + * @return mixed|null Returns NULL if not set or the value if set + */ + public function get($key) + { + return array_key_exists($key, $this->data) ? $this->data[$key] : null; + } + /** + * Set an option on the iterator + * + * @param string $key Key of the option to set + * @param mixed $value Value to set for the option + * + * @return ResourceIterator + */ + public function set($key, $value) + { + $this->data[$key] = $value; + return $this; + } + public function current() + { + return $this->resources ? current($this->resources) : false; + } + public function key() + { + return max(0, $this->iteratedCount - 1); + } + public function count() + { + return $this->retrievedCount; + } + /** + * Get the total number of requests sent + * + * @return int + */ + public function getRequestCount() + { + return $this->requestCount; + } + /** + * Rewind the Iterator to the first element and send the original command + */ + public function rewind() + { + // Use the original command + $this->command = clone $this->originalCommand; + $this->resetState(); + $this->next(); + } + public function valid() + { + return !$this->invalid && (!$this->resources || $this->current() || $this->nextToken) && (!$this->limit || $this->iteratedCount < $this->limit + 1); + } + public function next() + { + $this->iteratedCount++; + // Check if a new set of resources needs to be retrieved + $sendRequest = false; + if (!$this->resources) { + $sendRequest = true; + } else { + // iterate over the internal array + $current = next($this->resources); + $sendRequest = $current === false && $this->nextToken && (!$this->limit || $this->iteratedCount < $this->limit + 1); + } + if ($sendRequest) { + $this->dispatch('resource_iterator.before_send', array('iterator' => $this, 'resources' => $this->resources)); + // Get a new command object from the original command + $this->command = clone $this->originalCommand; + // Send a request and retrieve the newly loaded resources + $this->resources = $this->sendRequest(); + $this->requestCount++; + // If no resources were found, then the last request was not needed + // and iteration must stop + if (empty($this->resources)) { + $this->invalid = true; + } else { + // Add to the number of retrieved resources + $this->retrievedCount += count($this->resources); + // Ensure that we rewind to the beginning of the array + reset($this->resources); + } + $this->dispatch('resource_iterator.after_send', array('iterator' => $this, 'resources' => $this->resources)); + } + } + /** + * Retrieve the NextToken that can be used in other iterators. + * + * @return string Returns a NextToken + */ + public function getNextToken() + { + return $this->nextToken; + } + /** + * Returns the value that should be specified for the page size for a request that will maintain any hard limits, + * but still honor the specified pageSize if the number of items retrieved + pageSize < hard limit + * + * @return int Returns the page size of the next request. + */ + protected function calculatePageSize() + { + if ($this->limit && $this->iteratedCount + $this->pageSize > $this->limit) { + return 1 + ($this->limit - $this->iteratedCount); + } + return (int) $this->pageSize; + } + /** + * Reset the internal state of the iterator without triggering a rewind() + */ + protected function resetState() + { + $this->iteratedCount = 0; + $this->retrievedCount = 0; + $this->nextToken = false; + $this->resources = null; + $this->invalid = false; + } + /** + * Send a request to retrieve the next page of results. Hook for subclasses to implement. + * + * @return array Returns the newly loaded resources + */ + protected abstract function sendRequest(); +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorApplyBatched.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorApplyBatched.php new file mode 100644 index 00000000..352aac6a --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorApplyBatched.php @@ -0,0 +1,93 @@ +iterator = $iterator; + $this->callback = $callback; + \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Version::warn(__CLASS__ . ' is deprecated'); + } + /** + * Apply the callback to the contents of the resource iterator + * + * @param int $perBatch The number of records to group per batch transfer + * + * @return int Returns the number of iterated resources + */ + public function apply($perBatch = 50) + { + $this->iterated = $this->batches = $batches = 0; + $that = $this; + $it = $this->iterator; + $callback = $this->callback; + $batch = \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\BatchBuilder::factory()->createBatchesWith(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\BatchSizeDivisor($perBatch))->transferWith(new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Batch\BatchClosureTransfer(function (array $batch) use($that, $callback, &$batches, $it) { + $batches++; + $that->dispatch('iterator_batch.before_batch', array('iterator' => $it, 'batch' => $batch)); + call_user_func_array($callback, array($it, $batch)); + $that->dispatch('iterator_batch.after_batch', array('iterator' => $it, 'batch' => $batch)); + }))->autoFlushAt($perBatch)->build(); + $this->dispatch('iterator_batch.created_batch', array('batch' => $batch)); + foreach ($this->iterator as $resource) { + $this->iterated++; + $batch->add($resource); + } + $batch->flush(); + $this->batches = $batches; + return $this->iterated; + } + /** + * Get the total number of batches sent + * + * @return int + */ + public function getBatchCount() + { + return $this->batches; + } + /** + * Get the total number of iterated resources + * + * @return int + */ + public function getIteratedCount() + { + return $this->iterated; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorClassFactory.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorClassFactory.php new file mode 100644 index 00000000..1a3a3d15 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorClassFactory.php @@ -0,0 +1,52 @@ + AbcFoo). + */ +class ResourceIteratorClassFactory extends \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Resource\AbstractResourceIteratorFactory +{ + /** @var array List of namespaces used to look for classes */ + protected $namespaces; + /** @var InflectorInterface Inflector used to determine class names */ + protected $inflector; + /** + * @param string|array $namespaces List of namespaces for iterator objects + * @param InflectorInterface $inflector Inflector used to resolve class names + */ + public function __construct($namespaces = array(), \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Inflection\InflectorInterface $inflector = null) + { + $this->namespaces = (array) $namespaces; + $this->inflector = $inflector ?: \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Inflection\Inflector::getDefault(); + } + /** + * Registers a namespace to check for Iterators + * + * @param string $namespace Namespace which contains Iterator classes + * + * @return self + */ + public function registerNamespace($namespace) + { + array_unshift($this->namespaces, $namespace); + return $this; + } + protected function getClassName(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Service\Command\CommandInterface $command) + { + $iteratorName = $this->inflector->camel($command->getName()) . 'Iterator'; + // Determine the name of the class to load + foreach ($this->namespaces as $namespace) { + $potentialClassName = $namespace . '\\' . $iteratorName; + if (class_exists($potentialClassName)) { + return $potentialClassName; + } + } + return false; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorFactoryInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorFactoryInterface.php new file mode 100644 index 00000000..be20a7bd --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorFactoryInterface.php @@ -0,0 +1,28 @@ +=5.3.2", + "guzzle\/cache": "self.version", + "guzzle\/http": "self.version", + "guzzle\/inflection": "self.version" + }, + "autoload": { + "psr-0": { + "Guzzle\\Service": "" + } + }, + "target-dir": "Guzzle\/Service", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Stream/PhpStreamRequestFactory.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Stream/PhpStreamRequestFactory.php new file mode 100644 index 00000000..f437508c --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Stream/PhpStreamRequestFactory.php @@ -0,0 +1,243 @@ +contextOptions = stream_context_get_options($context); + $this->context = $context; + } elseif (is_array($context) || !$context) { + $this->contextOptions = $context; + $this->createContext($params); + } elseif ($context) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('$context must be an array or resource'); + } + // Dispatch the before send event + $request->dispatch('request.before_send', array('request' => $request, 'context' => $this->context, 'context_options' => $this->contextOptions)); + $this->setUrl($request); + $this->addDefaultContextOptions($request); + $this->addSslOptions($request); + $this->addBodyOptions($request); + $this->addProxyOptions($request); + // Create the file handle but silence errors + return $this->createStream($params)->setCustomData('request', $request)->setCustomData('response_headers', $this->getLastResponseHeaders()); + } + /** + * Set an option on the context and the internal options array + * + * @param string $wrapper Stream wrapper name of http + * @param string $name Context name + * @param mixed $value Context value + * @param bool $overwrite Set to true to overwrite an existing value + */ + protected function setContextValue($wrapper, $name, $value, $overwrite = false) + { + if (!isset($this->contextOptions[$wrapper])) { + $this->contextOptions[$wrapper] = array($name => $value); + } elseif (!$overwrite && isset($this->contextOptions[$wrapper][$name])) { + return; + } + $this->contextOptions[$wrapper][$name] = $value; + stream_context_set_option($this->context, $wrapper, $name, $value); + } + /** + * Create a stream context + * + * @param array $params Parameter array + */ + protected function createContext(array $params) + { + $options = $this->contextOptions; + $this->context = $this->createResource(function () use($params, $options) { + return stream_context_create($options, $params); + }); + } + /** + * Get the last response headers received by the HTTP request + * + * @return array + */ + public function getLastResponseHeaders() + { + return $this->lastResponseHeaders; + } + /** + * Adds the default context options to the stream context options + * + * @param RequestInterface $request Request + */ + protected function addDefaultContextOptions(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $this->setContextValue('http', 'method', $request->getMethod()); + $headers = $request->getHeaderLines(); + // "Connection: close" is required to get streams to work in HTTP 1.1 + if (!$request->hasHeader('Connection')) { + $headers[] = 'Connection: close'; + } + $this->setContextValue('http', 'header', $headers); + $this->setContextValue('http', 'protocol_version', $request->getProtocolVersion()); + $this->setContextValue('http', 'ignore_errors', true); + } + /** + * Set the URL to use with the factory + * + * @param RequestInterface $request Request that owns the URL + */ + protected function setUrl(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + $this->url = $request->getUrl(true); + // Check for basic Auth username + if ($request->getUsername()) { + $this->url->setUsername($request->getUsername()); + } + // Check for basic Auth password + if ($request->getPassword()) { + $this->url->setPassword($request->getPassword()); + } + } + /** + * Add SSL options to the stream context + * + * @param RequestInterface $request Request + */ + protected function addSslOptions(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + if ($request->getCurlOptions()->get(CURLOPT_SSL_VERIFYPEER)) { + $this->setContextValue('ssl', 'verify_peer', true, true); + if ($cafile = $request->getCurlOptions()->get(CURLOPT_CAINFO)) { + $this->setContextValue('ssl', 'cafile', $cafile, true); + } + } else { + $this->setContextValue('ssl', 'verify_peer', false, true); + } + } + /** + * Add body (content) specific options to the context options + * + * @param RequestInterface $request + */ + protected function addBodyOptions(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + // Add the content for the request if needed + if (!$request instanceof EntityEnclosingRequestInterface) { + return; + } + if (count($request->getPostFields())) { + $this->setContextValue('http', 'content', (string) $request->getPostFields(), true); + } elseif ($request->getBody()) { + $this->setContextValue('http', 'content', (string) $request->getBody(), true); + } + // Always ensure a content-length header is sent + if (isset($this->contextOptions['http']['content'])) { + $headers = isset($this->contextOptions['http']['header']) ? $this->contextOptions['http']['header'] : array(); + $headers[] = 'Content-Length: ' . strlen($this->contextOptions['http']['content']); + $this->setContextValue('http', 'header', $headers, true); + } + } + /** + * Add proxy parameters to the context if needed + * + * @param RequestInterface $request Request + */ + protected function addProxyOptions(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Http\Message\RequestInterface $request) + { + if ($proxy = $request->getCurlOptions()->get(CURLOPT_PROXY)) { + $this->setContextValue('http', 'proxy', $proxy); + } + } + /** + * Create the stream for the request with the context options + * + * @param array $params Parameters of the stream + * + * @return StreamInterface + */ + protected function createStream(array $params) + { + $http_response_header = null; + $url = $this->url; + $context = $this->context; + $fp = $this->createResource(function () use($context, $url, &$http_response_header) { + return fopen((string) $url, 'r', false, $context); + }); + // Determine the class to instantiate + $className = isset($params['stream_class']) ? $params['stream_class'] : __NAMESPACE__ . '\\Stream'; + /** @var $stream StreamInterface */ + $stream = new $className($fp); + // Track the response headers of the request + if (isset($http_response_header)) { + $this->lastResponseHeaders = $http_response_header; + $this->processResponseHeaders($stream); + } + return $stream; + } + /** + * Process response headers + * + * @param StreamInterface $stream + */ + protected function processResponseHeaders(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Stream\StreamInterface $stream) + { + // Set the size on the stream if it was returned in the response + foreach ($this->lastResponseHeaders as $header) { + if (stripos($header, 'Content-Length:') === 0) { + $stream->setSize(trim(substr($header, 15))); + } + } + } + /** + * Create a resource and check to ensure it was created successfully + * + * @param callable $callback Closure to invoke that must return a valid resource + * + * @return resource + * @throws RuntimeException on error + */ + protected function createResource($callback) + { + $errors = null; + set_error_handler(function ($_, $msg, $file, $line) use(&$errors) { + $errors[] = array('message' => $msg, 'file' => $file, 'line' => $line); + return true; + }); + $resource = call_user_func($callback); + restore_error_handler(); + if (!$resource) { + $message = 'Error creating resource. '; + foreach ($errors as $err) { + foreach ($err as $key => $value) { + $message .= "[{$key}] {$value}" . PHP_EOL; + } + } + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\RuntimeException(trim($message)); + } + return $resource; + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Stream/Stream.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Stream/Stream.php new file mode 100644 index 00000000..0e4f4f98 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Stream/Stream.php @@ -0,0 +1,227 @@ + array('r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true, 'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true, 'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true, 'x+t' => true, 'c+t' => true, 'a+' => true), 'write' => array('w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true, 'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true, 'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true)); + /** + * @param resource $stream Stream resource to wrap + * @param int $size Size of the stream in bytes. Only pass if the size cannot be obtained from the stream. + * + * @throws InvalidArgumentException if the stream is not a stream resource + */ + public function __construct($stream, $size = null) + { + $this->setStream($stream, $size); + } + /** + * Closes the stream when the helper is destructed + */ + public function __destruct() + { + $this->close(); + } + public function __toString() + { + if (!$this->isReadable() || !$this->isSeekable() && $this->isConsumed()) { + return ''; + } + $originalPos = $this->ftell(); + $body = stream_get_contents($this->stream, -1, 0); + $this->seek($originalPos); + return $body; + } + public function close() + { + if (is_resource($this->stream)) { + fclose($this->stream); + } + $this->cache[self::IS_READABLE] = false; + $this->cache[self::IS_WRITABLE] = false; + } + /** + * Calculate a hash of a Stream + * + * @param StreamInterface $stream Stream to calculate the hash for + * @param string $algo Hash algorithm (e.g. md5, crc32, etc) + * @param bool $rawOutput Whether or not to use raw output + * + * @return bool|string Returns false on failure or a hash string on success + */ + public static function getHash(\DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Stream\StreamInterface $stream, $algo, $rawOutput = false) + { + $pos = $stream->ftell(); + if (!$stream->seek(0)) { + return false; + } + $ctx = hash_init($algo); + while (!$stream->feof()) { + hash_update($ctx, $stream->read(8192)); + } + $out = hash_final($ctx, (bool) $rawOutput); + $stream->seek($pos); + return $out; + } + public function getMetaData($key = null) + { + $meta = stream_get_meta_data($this->stream); + return !$key ? $meta : (array_key_exists($key, $meta) ? $meta[$key] : null); + } + public function getStream() + { + return $this->stream; + } + public function setStream($stream, $size = null) + { + if (!is_resource($stream)) { + throw new \DeliciousBrains\WP_Offload_S3\Aws2\Guzzle\Common\Exception\InvalidArgumentException('Stream must be a resource'); + } + $this->size = $size; + $this->stream = $stream; + $this->rebuildCache(); + return $this; + } + public function detachStream() + { + $this->stream = null; + return $this; + } + public function getWrapper() + { + return $this->cache[self::WRAPPER_TYPE]; + } + public function getWrapperData() + { + return $this->getMetaData('wrapper_data') ?: array(); + } + public function getStreamType() + { + return $this->cache[self::STREAM_TYPE]; + } + public function getUri() + { + return $this->cache['uri']; + } + public function getSize() + { + if ($this->size !== null) { + return $this->size; + } + // If the stream is a file based stream and local, then use fstat + clearstatcache(true, $this->cache['uri']); + $stats = fstat($this->stream); + if (isset($stats['size'])) { + $this->size = $stats['size']; + return $this->size; + } elseif ($this->cache[self::IS_READABLE] && $this->cache[self::SEEKABLE]) { + // Only get the size based on the content if the the stream is readable and seekable + $pos = $this->ftell(); + $this->size = strlen((string) $this); + $this->seek($pos); + return $this->size; + } + return false; + } + public function isReadable() + { + return $this->cache[self::IS_READABLE]; + } + public function isRepeatable() + { + return $this->cache[self::IS_READABLE] && $this->cache[self::SEEKABLE]; + } + public function isWritable() + { + return $this->cache[self::IS_WRITABLE]; + } + public function isConsumed() + { + return feof($this->stream); + } + public function feof() + { + return $this->isConsumed(); + } + public function isLocal() + { + return $this->cache[self::IS_LOCAL]; + } + public function isSeekable() + { + return $this->cache[self::SEEKABLE]; + } + public function setSize($size) + { + $this->size = $size; + return $this; + } + public function seek($offset, $whence = SEEK_SET) + { + return $this->cache[self::SEEKABLE] ? fseek($this->stream, $offset, $whence) === 0 : false; + } + public function read($length) + { + return fread($this->stream, $length); + } + public function write($string) + { + // We can't know the size after writing anything + $this->size = null; + return fwrite($this->stream, $string); + } + public function ftell() + { + return ftell($this->stream); + } + public function rewind() + { + return $this->seek(0); + } + public function readLine($maxLength = null) + { + if (!$this->cache[self::IS_READABLE]) { + return false; + } else { + return $maxLength ? fgets($this->getStream(), $maxLength) : fgets($this->getStream()); + } + } + public function setCustomData($key, $value) + { + $this->customData[$key] = $value; + return $this; + } + public function getCustomData($key) + { + return isset($this->customData[$key]) ? $this->customData[$key] : null; + } + /** + * Reprocess stream metadata + */ + protected function rebuildCache() + { + $this->cache = stream_get_meta_data($this->stream); + $this->cache[self::IS_LOCAL] = stream_is_local($this->stream); + $this->cache[self::IS_READABLE] = isset(self::$readWriteHash['read'][$this->cache['mode']]); + $this->cache[self::IS_WRITABLE] = isset(self::$readWriteHash['write'][$this->cache['mode']]); + } +} diff --git a/vendor/Aws2/guzzle/guzzle/src/Guzzle/Stream/StreamInterface.php b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Stream/StreamInterface.php new file mode 100644 index 00000000..3b206656 --- /dev/null +++ b/vendor/Aws2/guzzle/guzzle/src/Guzzle/Stream/StreamInterface.php @@ -0,0 +1,192 @@ +=5.3.2", + "guzzle\/common": "self.version" + }, + "suggest": { + "guzzle\/http": "To convert Guzzle request objects to PHP streams" + }, + "autoload": { + "psr-0": { + "Guzzle\\Stream": "" + } + }, + "target-dir": "Guzzle\/Stream", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/symfony/event-dispatcher/CHANGELOG.md b/vendor/Aws2/symfony/event-dispatcher/CHANGELOG.md new file mode 100644 index 00000000..bb42ee19 --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/CHANGELOG.md @@ -0,0 +1,23 @@ +CHANGELOG +========= + +2.5.0 +----- + + * added Debug\TraceableEventDispatcher (originally in HttpKernel) + * changed Debug\TraceableEventDispatcherInterface to extend EventDispatcherInterface + * added RegisterListenersPass (originally in HttpKernel) + +2.1.0 +----- + + * added TraceableEventDispatcherInterface + * added ContainerAwareEventDispatcher + * added a reference to the EventDispatcher on the Event + * added a reference to the Event name on the event + * added fluid interface to the dispatch() method which now returns the Event + object + * added GenericEvent event class + * added the possibility for subscribers to subscribe several times for the + same event + * added ImmutableEventDispatcher diff --git a/vendor/Aws2/symfony/event-dispatcher/ContainerAwareEventDispatcher.php b/vendor/Aws2/symfony/event-dispatcher/ContainerAwareEventDispatcher.php new file mode 100644 index 00000000..bd052417 --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/ContainerAwareEventDispatcher.php @@ -0,0 +1,161 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher; + +use DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\DependencyInjection\ContainerInterface; +/** + * Lazily loads listeners and subscribers from the dependency injection + * container. + * + * @author Fabien Potencier + * @author Bernhard Schussek + * @author Jordan Alliot + */ +class ContainerAwareEventDispatcher extends \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcher +{ + private $container; + /** + * The service IDs of the event listeners and subscribers. + */ + private $listenerIds = array(); + /** + * The services registered as listeners. + */ + private $listeners = array(); + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\DependencyInjection\ContainerInterface $container) + { + $this->container = $container; + } + /** + * Adds a service as event listener. + * + * @param string $eventName Event for which the listener is added + * @param array $callback The service ID of the listener service & the method + * name that has to be called + * @param int $priority The higher this value, the earlier an event listener + * will be triggered in the chain. + * Defaults to 0. + * + * @throws \InvalidArgumentException + */ + public function addListenerService($eventName, $callback, $priority = 0) + { + if (!is_array($callback) || 2 !== count($callback)) { + throw new \InvalidArgumentException('Expected an array("service", "method") argument'); + } + $this->listenerIds[$eventName][] = array($callback[0], $callback[1], $priority); + } + public function removeListener($eventName, $listener) + { + $this->lazyLoad($eventName); + if (isset($this->listenerIds[$eventName])) { + foreach ($this->listenerIds[$eventName] as $i => $args) { + list($serviceId, $method, $priority) = $args; + $key = $serviceId . '.' . $method; + if (isset($this->listeners[$eventName][$key]) && $listener === array($this->listeners[$eventName][$key], $method)) { + unset($this->listeners[$eventName][$key]); + if (empty($this->listeners[$eventName])) { + unset($this->listeners[$eventName]); + } + unset($this->listenerIds[$eventName][$i]); + if (empty($this->listenerIds[$eventName])) { + unset($this->listenerIds[$eventName]); + } + } + } + } + parent::removeListener($eventName, $listener); + } + /** + * {@inheritdoc} + */ + public function hasListeners($eventName = null) + { + if (null === $eventName) { + return $this->listenerIds || $this->listeners || parent::hasListeners(); + } + if (isset($this->listenerIds[$eventName])) { + return true; + } + return parent::hasListeners($eventName); + } + /** + * {@inheritdoc} + */ + public function getListeners($eventName = null) + { + if (null === $eventName) { + foreach ($this->listenerIds as $serviceEventName => $args) { + $this->lazyLoad($serviceEventName); + } + } else { + $this->lazyLoad($eventName); + } + return parent::getListeners($eventName); + } + /** + * {@inheritdoc} + */ + public function getListenerPriority($eventName, $listener) + { + $this->lazyLoad($eventName); + return parent::getListenerPriority($eventName, $listener); + } + /** + * Adds a service as event subscriber. + * + * @param string $serviceId The service ID of the subscriber service + * @param string $class The service's class name (which must implement EventSubscriberInterface) + */ + public function addSubscriberService($serviceId, $class) + { + foreach ($class::getSubscribedEvents() as $eventName => $params) { + if (is_string($params)) { + $this->listenerIds[$eventName][] = array($serviceId, $params, 0); + } elseif (is_string($params[0])) { + $this->listenerIds[$eventName][] = array($serviceId, $params[0], isset($params[1]) ? $params[1] : 0); + } else { + foreach ($params as $listener) { + $this->listenerIds[$eventName][] = array($serviceId, $listener[0], isset($listener[1]) ? $listener[1] : 0); + } + } + } + } + public function getContainer() + { + return $this->container; + } + /** + * Lazily loads listeners for this event from the dependency injection + * container. + * + * @param string $eventName The name of the event to dispatch. The name of + * the event is the name of the method that is + * invoked on listeners. + */ + protected function lazyLoad($eventName) + { + if (isset($this->listenerIds[$eventName])) { + foreach ($this->listenerIds[$eventName] as $args) { + list($serviceId, $method, $priority) = $args; + $listener = $this->container->get($serviceId); + $key = $serviceId . '.' . $method; + if (!isset($this->listeners[$eventName][$key])) { + $this->addListener($eventName, array($listener, $method), $priority); + } elseif ($this->listeners[$eventName][$key] !== $listener) { + parent::removeListener($eventName, array($this->listeners[$eventName][$key], $method)); + $this->addListener($eventName, array($listener, $method), $priority); + } + $this->listeners[$eventName][$key] = $listener; + } + } + } +} diff --git a/vendor/Aws2/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/vendor/Aws2/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php new file mode 100644 index 00000000..3b04352f --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php @@ -0,0 +1,307 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Debug; + +use DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcherInterface; +use DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface; +use DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event; +use DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\Stopwatch\Stopwatch; +use DeliciousBrains\WP_Offload_S3\Aws2\Psr\Log\LoggerInterface; +/** + * Collects some data about event listeners. + * + * This event dispatcher delegates the dispatching to another one. + * + * @author Fabien Potencier + */ +class TraceableEventDispatcher implements \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcherInterface +{ + protected $logger; + protected $stopwatch; + private $called; + private $dispatcher; + private $wrappedListeners; + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcherInterface $dispatcher, \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\Stopwatch\Stopwatch $stopwatch, \DeliciousBrains\WP_Offload_S3\Aws2\Psr\Log\LoggerInterface $logger = null) + { + $this->dispatcher = $dispatcher; + $this->stopwatch = $stopwatch; + $this->logger = $logger; + $this->called = array(); + $this->wrappedListeners = array(); + } + /** + * {@inheritdoc} + */ + public function addListener($eventName, $listener, $priority = 0) + { + $this->dispatcher->addListener($eventName, $listener, $priority); + } + /** + * {@inheritdoc} + */ + public function addSubscriber(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface $subscriber) + { + $this->dispatcher->addSubscriber($subscriber); + } + /** + * {@inheritdoc} + */ + public function removeListener($eventName, $listener) + { + if (isset($this->wrappedListeners[$eventName])) { + foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { + if ($wrappedListener->getWrappedListener() === $listener) { + $listener = $wrappedListener; + unset($this->wrappedListeners[$eventName][$index]); + break; + } + } + } + return $this->dispatcher->removeListener($eventName, $listener); + } + /** + * {@inheritdoc} + */ + public function removeSubscriber(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface $subscriber) + { + return $this->dispatcher->removeSubscriber($subscriber); + } + /** + * {@inheritdoc} + */ + public function getListeners($eventName = null) + { + return $this->dispatcher->getListeners($eventName); + } + /** + * {@inheritdoc} + */ + public function getListenerPriority($eventName, $listener) + { + if (!method_exists($this->dispatcher, 'getListenerPriority')) { + return 0; + } + return $this->dispatcher->getListenerPriority($eventName, $listener); + } + /** + * {@inheritdoc} + */ + public function hasListeners($eventName = null) + { + return $this->dispatcher->hasListeners($eventName); + } + /** + * {@inheritdoc} + */ + public function dispatch($eventName, \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event $event = null) + { + if (null === $event) { + $event = new \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event(); + } + if (null !== $this->logger && $event->isPropagationStopped()) { + $this->logger->debug(sprintf('The "%s" event is already stopped. No listeners have been called.', $eventName)); + } + $this->preProcess($eventName); + $this->preDispatch($eventName, $event); + $e = $this->stopwatch->start($eventName, 'section'); + $this->dispatcher->dispatch($eventName, $event); + if ($e->isStarted()) { + $e->stop(); + } + $this->postDispatch($eventName, $event); + $this->postProcess($eventName); + return $event; + } + /** + * {@inheritdoc} + */ + public function getCalledListeners() + { + $called = array(); + foreach ($this->called as $eventName => $listeners) { + foreach ($listeners as $listener) { + $info = $this->getListenerInfo($listener->getWrappedListener(), $eventName); + $called[$eventName . '.' . $info['pretty']] = $info; + } + } + return $called; + } + /** + * {@inheritdoc} + */ + public function getNotCalledListeners() + { + try { + $allListeners = $this->getListeners(); + } catch (\Exception $e) { + if (null !== $this->logger) { + $this->logger->info('An exception was thrown while getting the uncalled listeners.', array('exception' => $e)); + } + // unable to retrieve the uncalled listeners + return array(); + } + $notCalled = array(); + foreach ($allListeners as $eventName => $listeners) { + foreach ($listeners as $listener) { + $called = false; + if (isset($this->called[$eventName])) { + foreach ($this->called[$eventName] as $l) { + if ($l->getWrappedListener() === $listener) { + $called = true; + break; + } + } + } + if (!$called) { + $info = $this->getListenerInfo($listener, $eventName); + $notCalled[$eventName . '.' . $info['pretty']] = $info; + } + } + } + uasort($notCalled, array($this, 'sortListenersByPriority')); + return $notCalled; + } + /** + * Proxies all method calls to the original event dispatcher. + * + * @param string $method The method name + * @param array $arguments The method arguments + * + * @return mixed + */ + public function __call($method, $arguments) + { + return call_user_func_array(array($this->dispatcher, $method), $arguments); + } + /** + * Called before dispatching the event. + * + * @param string $eventName The event name + * @param Event $event The event + */ + protected function preDispatch($eventName, \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event $event) + { + } + /** + * Called after dispatching the event. + * + * @param string $eventName The event name + * @param Event $event The event + */ + protected function postDispatch($eventName, \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event $event) + { + } + private function preProcess($eventName) + { + foreach ($this->dispatcher->getListeners($eventName) as $listener) { + $info = $this->getListenerInfo($listener, $eventName); + $name = isset($info['class']) ? $info['class'] : $info['type']; + $wrappedListener = new \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Debug\WrappedListener($listener, $name, $this->stopwatch, $this); + $this->wrappedListeners[$eventName][] = $wrappedListener; + $this->dispatcher->removeListener($eventName, $listener); + $this->dispatcher->addListener($eventName, $wrappedListener, $info['priority']); + } + } + private function postProcess($eventName) + { + unset($this->wrappedListeners[$eventName]); + $skipped = false; + foreach ($this->dispatcher->getListeners($eventName) as $listener) { + if (!$listener instanceof WrappedListener) { + // #12845: a new listener was added during dispatch. + continue; + } + // Unwrap listener + $priority = $this->getListenerPriority($eventName, $listener); + $this->dispatcher->removeListener($eventName, $listener); + $this->dispatcher->addListener($eventName, $listener->getWrappedListener(), $priority); + $info = $this->getListenerInfo($listener->getWrappedListener(), $eventName); + if ($listener->wasCalled()) { + if (null !== $this->logger) { + $this->logger->debug(sprintf('Notified event "%s" to listener "%s".', $eventName, $info['pretty'])); + } + if (!isset($this->called[$eventName])) { + $this->called[$eventName] = new \SplObjectStorage(); + } + $this->called[$eventName]->attach($listener); + } + if (null !== $this->logger && $skipped) { + $this->logger->debug(sprintf('Listener "%s" was not called for event "%s".', $info['pretty'], $eventName)); + } + if ($listener->stoppedPropagation()) { + if (null !== $this->logger) { + $this->logger->debug(sprintf('Listener "%s" stopped propagation of the event "%s".', $info['pretty'], $eventName)); + } + $skipped = true; + } + } + } + /** + * Returns information about the listener. + * + * @param object $listener The listener + * @param string $eventName The event name + * + * @return array Information about the listener + */ + private function getListenerInfo($listener, $eventName) + { + $info = array('event' => $eventName, 'priority' => $this->getListenerPriority($eventName, $listener)); + // unwrap for correct listener info + if ($listener instanceof WrappedListener) { + $listener = $listener->getWrappedListener(); + } + if ($listener instanceof \Closure) { + $info += array('type' => 'Closure', 'pretty' => 'closure'); + } elseif (is_string($listener)) { + try { + $r = new \ReflectionFunction($listener); + $file = $r->getFileName(); + $line = $r->getStartLine(); + } catch (\ReflectionException $e) { + $file = null; + $line = null; + } + $info += array('type' => 'Function', 'function' => $listener, 'file' => $file, 'line' => $line, 'pretty' => $listener); + } elseif (is_array($listener) || is_object($listener) && is_callable($listener)) { + if (!is_array($listener)) { + $listener = array($listener, '__invoke'); + } + $class = is_object($listener[0]) ? get_class($listener[0]) : $listener[0]; + try { + $r = new \ReflectionMethod($class, $listener[1]); + $file = $r->getFileName(); + $line = $r->getStartLine(); + } catch (\ReflectionException $e) { + $file = null; + $line = null; + } + $info += array('type' => 'Method', 'class' => $class, 'method' => $listener[1], 'file' => $file, 'line' => $line, 'pretty' => $class . '::' . $listener[1]); + } + return $info; + } + private function sortListenersByPriority($a, $b) + { + if (is_int($a['priority']) && !is_int($b['priority'])) { + return 1; + } + if (!is_int($a['priority']) && is_int($b['priority'])) { + return -1; + } + if ($a['priority'] === $b['priority']) { + return 0; + } + if ($a['priority'] > $b['priority']) { + return -1; + } + return 1; + } +} diff --git a/vendor/Aws2/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php b/vendor/Aws2/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php new file mode 100644 index 00000000..2c16303f --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Debug; + +use DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcherInterface; +/** + * @author Fabien Potencier + */ +interface TraceableEventDispatcherInterface extends EventDispatcherInterface +{ + /** + * Gets the called listeners. + * + * @return array An array of called listeners + */ + public function getCalledListeners(); + /** + * Gets the not called listeners. + * + * @return array An array of not called listeners + */ + public function getNotCalledListeners(); +} diff --git a/vendor/Aws2/symfony/event-dispatcher/Debug/WrappedListener.php b/vendor/Aws2/symfony/event-dispatcher/Debug/WrappedListener.php new file mode 100644 index 00000000..f81b8cbc --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/Debug/WrappedListener.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Debug; + +use DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\Stopwatch\Stopwatch; +use DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event; +use DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcherInterface; +/** + * @author Fabien Potencier + */ +class WrappedListener +{ + private $listener; + private $name; + private $called; + private $stoppedPropagation; + private $stopwatch; + private $dispatcher; + public function __construct($listener, $name, \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\Stopwatch\Stopwatch $stopwatch, \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcherInterface $dispatcher = null) + { + $this->listener = $listener; + $this->name = $name; + $this->stopwatch = $stopwatch; + $this->dispatcher = $dispatcher; + $this->called = false; + $this->stoppedPropagation = false; + } + public function getWrappedListener() + { + return $this->listener; + } + public function wasCalled() + { + return $this->called; + } + public function stoppedPropagation() + { + return $this->stoppedPropagation; + } + public function __invoke(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event $event, $eventName, \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcherInterface $dispatcher) + { + $this->called = true; + $e = $this->stopwatch->start($this->name, 'event_listener'); + call_user_func($this->listener, $event, $eventName, $this->dispatcher ?: $dispatcher); + if ($e->isStarted()) { + $e->stop(); + } + if ($event->isPropagationStopped()) { + $this->stoppedPropagation = true; + } + } +} diff --git a/vendor/Aws2/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php b/vendor/Aws2/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php new file mode 100644 index 00000000..28d92c83 --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\DependencyInjection; + +use DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\DependencyInjection\ContainerBuilder; +use DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +/** + * Compiler pass to register tagged services for an event dispatcher. + */ +class RegisterListenersPass implements \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface +{ + protected $dispatcherService; + protected $listenerTag; + protected $subscriberTag; + /** + * @param string $dispatcherService Service name of the event dispatcher in processed container + * @param string $listenerTag Tag name used for listener + * @param string $subscriberTag Tag name used for subscribers + */ + public function __construct($dispatcherService = 'event_dispatcher', $listenerTag = 'kernel.event_listener', $subscriberTag = 'kernel.event_subscriber') + { + $this->dispatcherService = $dispatcherService; + $this->listenerTag = $listenerTag; + $this->subscriberTag = $subscriberTag; + } + public function process(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\DependencyInjection\ContainerBuilder $container) + { + if (!$container->hasDefinition($this->dispatcherService) && !$container->hasAlias($this->dispatcherService)) { + return; + } + $definition = $container->findDefinition($this->dispatcherService); + foreach ($container->findTaggedServiceIds($this->listenerTag) as $id => $events) { + $def = $container->getDefinition($id); + if (!$def->isPublic()) { + throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event listeners are lazy-loaded.', $id)); + } + if ($def->isAbstract()) { + throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event listeners are lazy-loaded.', $id)); + } + foreach ($events as $event) { + $priority = isset($event['priority']) ? $event['priority'] : 0; + if (!isset($event['event'])) { + throw new \InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag)); + } + if (!isset($event['method'])) { + $event['method'] = 'on' . preg_replace_callback(array('/(?<=\\b)[a-z]/i', '/[^a-z0-9]/i'), function ($matches) { + return strtoupper($matches[0]); + }, $event['event']); + $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']); + } + $definition->addMethodCall('addListenerService', array($event['event'], array($id, $event['method']), $priority)); + } + } + foreach ($container->findTaggedServiceIds($this->subscriberTag) as $id => $attributes) { + $def = $container->getDefinition($id); + if (!$def->isPublic()) { + throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event subscribers are lazy-loaded.', $id)); + } + if ($def->isAbstract()) { + throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event subscribers are lazy-loaded.', $id)); + } + // We must assume that the class value has been correctly filled, even if the service is created by a factory + $class = $container->getParameterBag()->resolveValue($def->getClass()); + $interface = 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\EventSubscriberInterface'; + if (!is_subclass_of($class, $interface)) { + if (!class_exists($class, false)) { + throw new \InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); + } + throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, $interface)); + } + $definition->addMethodCall('addSubscriberService', array($id, $class)); + } + } +} diff --git a/vendor/Aws2/symfony/event-dispatcher/Event.php b/vendor/Aws2/symfony/event-dispatcher/Event.php new file mode 100644 index 00000000..83637936 --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/Event.php @@ -0,0 +1,109 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher; + +/** + * Event is the base class for classes containing event data. + * + * This class contains no event data. It is used by events that do not pass + * state information to an event handler when an event is raised. + * + * You can call the method stopPropagation() to abort the execution of + * further listeners in your event listener. + * + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Bernhard Schussek + */ +class Event +{ + /** + * @var bool Whether no further event listeners should be triggered + */ + private $propagationStopped = false; + /** + * @var EventDispatcherInterface Dispatcher that dispatched this event + */ + private $dispatcher; + /** + * @var string This event's name + */ + private $name; + /** + * Returns whether further event listeners should be triggered. + * + * @see Event::stopPropagation() + * + * @return bool Whether propagation was already stopped for this event + */ + public function isPropagationStopped() + { + return $this->propagationStopped; + } + /** + * Stops the propagation of the event to further event listeners. + * + * If multiple event listeners are connected to the same event, no + * further event listener will be triggered once any trigger calls + * stopPropagation(). + */ + public function stopPropagation() + { + $this->propagationStopped = true; + } + /** + * Stores the EventDispatcher that dispatches this Event. + * + * @param EventDispatcherInterface $dispatcher + * + * @deprecated since version 2.4, to be removed in 3.0. The event dispatcher is passed to the listener call. + */ + public function setDispatcher(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcherInterface $dispatcher) + { + $this->dispatcher = $dispatcher; + } + /** + * Returns the EventDispatcher that dispatches this Event. + * + * @return EventDispatcherInterface + * + * @deprecated since version 2.4, to be removed in 3.0. The event dispatcher is passed to the listener call. + */ + public function getDispatcher() + { + @trigger_error('The ' . __METHOD__ . ' method is deprecated since version 2.4 and will be removed in 3.0. The event dispatcher instance can be received in the listener call instead.', E_USER_DEPRECATED); + return $this->dispatcher; + } + /** + * Gets the event's name. + * + * @return string + * + * @deprecated since version 2.4, to be removed in 3.0. The event name is passed to the listener call. + */ + public function getName() + { + @trigger_error('The ' . __METHOD__ . ' method is deprecated since version 2.4 and will be removed in 3.0. The event name can be received in the listener call instead.', E_USER_DEPRECATED); + return $this->name; + } + /** + * Sets the event's name property. + * + * @param string $name The event name + * + * @deprecated since version 2.4, to be removed in 3.0. The event name is passed to the listener call. + */ + public function setName($name) + { + $this->name = $name; + } +} diff --git a/vendor/Aws2/symfony/event-dispatcher/EventDispatcher.php b/vendor/Aws2/symfony/event-dispatcher/EventDispatcher.php new file mode 100644 index 00000000..7d34eb10 --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/EventDispatcher.php @@ -0,0 +1,178 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher; + +/** + * The EventDispatcherInterface is the central point of Symfony's event listener system. + * + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Bernhard Schussek + * @author Fabien Potencier + * @author Jordi Boggiano + * @author Jordan Alliot + */ +class EventDispatcher implements \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcherInterface +{ + private $listeners = array(); + private $sorted = array(); + /** + * {@inheritdoc} + */ + public function dispatch($eventName, \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event $event = null) + { + if (null === $event) { + $event = new \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event(); + } + $event->setDispatcher($this); + $event->setName($eventName); + if ($listeners = $this->getListeners($eventName)) { + $this->doDispatch($listeners, $eventName, $event); + } + return $event; + } + /** + * {@inheritdoc} + */ + public function getListeners($eventName = null) + { + if (null !== $eventName) { + if (!isset($this->listeners[$eventName])) { + return array(); + } + if (!isset($this->sorted[$eventName])) { + $this->sortListeners($eventName); + } + return $this->sorted[$eventName]; + } + foreach ($this->listeners as $eventName => $eventListeners) { + if (!isset($this->sorted[$eventName])) { + $this->sortListeners($eventName); + } + } + return array_filter($this->sorted); + } + /** + * Gets the listener priority for a specific event. + * + * Returns null if the event or the listener does not exist. + * + * @param string $eventName The name of the event + * @param callable $listener The listener + * + * @return int|null The event listener priority + */ + public function getListenerPriority($eventName, $listener) + { + if (!isset($this->listeners[$eventName])) { + return; + } + foreach ($this->listeners[$eventName] as $priority => $listeners) { + if (false !== in_array($listener, $listeners, true)) { + return $priority; + } + } + } + /** + * {@inheritdoc} + */ + public function hasListeners($eventName = null) + { + return (bool) $this->getListeners($eventName); + } + /** + * {@inheritdoc} + */ + public function addListener($eventName, $listener, $priority = 0) + { + $this->listeners[$eventName][$priority][] = $listener; + unset($this->sorted[$eventName]); + } + /** + * {@inheritdoc} + */ + public function removeListener($eventName, $listener) + { + if (!isset($this->listeners[$eventName])) { + return; + } + foreach ($this->listeners[$eventName] as $priority => $listeners) { + if (false !== ($key = array_search($listener, $listeners, true))) { + unset($this->listeners[$eventName][$priority][$key], $this->sorted[$eventName]); + } + } + } + /** + * {@inheritdoc} + */ + public function addSubscriber(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\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); + } + } + } + } + /** + * {@inheritdoc} + */ + public function removeSubscriber(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface $subscriber) + { + foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { + if (is_array($params) && is_array($params[0])) { + foreach ($params as $listener) { + $this->removeListener($eventName, array($subscriber, $listener[0])); + } + } else { + $this->removeListener($eventName, array($subscriber, is_string($params) ? $params : $params[0])); + } + } + } + /** + * Triggers the listeners of an event. + * + * This method can be overridden to add functionality that is executed + * for each listener. + * + * @param callable[] $listeners The event listeners + * @param string $eventName The name of the event to dispatch + * @param Event $event The event object to pass to the event handlers/listeners + */ + protected function doDispatch($listeners, $eventName, \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event $event) + { + foreach ($listeners as $listener) { + if ($event->isPropagationStopped()) { + break; + } + call_user_func($listener, $event, $eventName, $this); + } + } + /** + * Sorts the internal list of listeners for the given event by priority. + * + * @param string $eventName The name of the event + */ + private function sortListeners($eventName) + { + krsort($this->listeners[$eventName]); + $this->sorted[$eventName] = call_user_func_array('array_merge', $this->listeners[$eventName]); + } +} diff --git a/vendor/Aws2/symfony/event-dispatcher/EventDispatcherInterface.php b/vendor/Aws2/symfony/event-dispatcher/EventDispatcherInterface.php new file mode 100644 index 00000000..b867ce96 --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/EventDispatcherInterface.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher; + +/** + * The EventDispatcherInterface is the central point of Symfony's event listener system. + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @author Bernhard Schussek + */ +interface EventDispatcherInterface +{ + /** + * Dispatches an event to all registered listeners. + * + * @param string $eventName The name of the event to dispatch. The name of + * the event is the name of the method that is + * invoked on listeners. + * @param Event $event The event to pass to the event handlers/listeners + * If not supplied, an empty Event instance is created + * + * @return Event + */ + public function dispatch($eventName, \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event $event = null); + /** + * Adds an event listener that listens on the specified events. + * + * @param string $eventName The event to listen on + * @param callable $listener The listener + * @param int $priority The higher this value, the earlier an event + * listener will be triggered in the chain (defaults to 0) + */ + public function addListener($eventName, $listener, $priority = 0); + /** + * Adds an event subscriber. + * + * The subscriber is asked for all the events he is + * interested in and added as a listener for these events. + */ + public function addSubscriber(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface $subscriber); + /** + * Removes an event listener from the specified events. + * + * @param string $eventName The event to remove a listener from + * @param callable $listener The listener to remove + */ + public function removeListener($eventName, $listener); + public function removeSubscriber(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface $subscriber); + /** + * Gets the listeners of a specific event or all listeners sorted by descending priority. + * + * @param string $eventName The name of the event + * + * @return array The event listeners for the specified event, or all event listeners by event name + */ + public function getListeners($eventName = null); + /** + * Checks whether an event has any registered listeners. + * + * @param string $eventName The name of the event + * + * @return bool true if the specified event has any listeners, false otherwise + */ + public function hasListeners($eventName = null); +} diff --git a/vendor/Aws2/symfony/event-dispatcher/EventSubscriberInterface.php b/vendor/Aws2/symfony/event-dispatcher/EventSubscriberInterface.php new file mode 100644 index 00000000..2a34f70b --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/EventSubscriberInterface.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher; + +/** + * An EventSubscriber knows himself what events he is interested in. + * If an EventSubscriber is added to an EventDispatcherInterface, the manager invokes + * {@link getSubscribedEvents} and registers the subscriber as a listener for all + * returned events. + * + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Bernhard Schussek + */ +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(); +} diff --git a/vendor/Aws2/symfony/event-dispatcher/GenericEvent.php b/vendor/Aws2/symfony/event-dispatcher/GenericEvent.php new file mode 100644 index 00000000..3f814231 --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/GenericEvent.php @@ -0,0 +1,159 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher; + +/** + * Event encapsulation class. + * + * Encapsulates events thus decoupling the observer from the subject they encapsulate. + * + * @author Drak + */ +class GenericEvent extends \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event implements \ArrayAccess, \IteratorAggregate +{ + protected $subject; + protected $arguments; + /** + * Encapsulate an event with $subject and $args. + * + * @param mixed $subject The subject of the event, usually an object or a callable + * @param array $arguments Arguments to store in the event + */ + public function __construct($subject = null, array $arguments = array()) + { + $this->subject = $subject; + $this->arguments = $arguments; + } + /** + * Getter for subject property. + * + * @return mixed $subject The observer subject + */ + public function getSubject() + { + return $this->subject; + } + /** + * Get argument by key. + * + * @param string $key Key + * + * @return mixed Contents of array key + * + * @throws \InvalidArgumentException if key is not found + */ + public function getArgument($key) + { + if ($this->hasArgument($key)) { + return $this->arguments[$key]; + } + throw new \InvalidArgumentException(sprintf('Argument "%s" not found.', $key)); + } + /** + * Add argument to event. + * + * @param string $key Argument name + * @param mixed $value Value + * + * @return $this + */ + public function setArgument($key, $value) + { + $this->arguments[$key] = $value; + return $this; + } + /** + * Getter for all arguments. + * + * @return array + */ + public function getArguments() + { + return $this->arguments; + } + /** + * Set args property. + * + * @param array $args Arguments + * + * @return $this + */ + public function setArguments(array $args = array()) + { + $this->arguments = $args; + return $this; + } + /** + * Has argument. + * + * @param string $key Key of arguments array + * + * @return bool + */ + public function hasArgument($key) + { + return array_key_exists($key, $this->arguments); + } + /** + * ArrayAccess for argument getter. + * + * @param string $key Array key + * + * @return mixed + * + * @throws \InvalidArgumentException if key does not exist in $this->args + */ + public function offsetGet($key) + { + return $this->getArgument($key); + } + /** + * ArrayAccess for argument setter. + * + * @param string $key Array key to set + * @param mixed $value Value + */ + public function offsetSet($key, $value) + { + $this->setArgument($key, $value); + } + /** + * ArrayAccess for unset argument. + * + * @param string $key Array key + */ + public function offsetUnset($key) + { + if ($this->hasArgument($key)) { + unset($this->arguments[$key]); + } + } + /** + * ArrayAccess has argument. + * + * @param string $key Array key + * + * @return bool + */ + public function offsetExists($key) + { + return $this->hasArgument($key); + } + /** + * IteratorAggregate for iterating over the object like an array. + * + * @return \ArrayIterator + */ + public function getIterator() + { + return new \ArrayIterator($this->arguments); + } +} diff --git a/vendor/Aws2/symfony/event-dispatcher/ImmutableEventDispatcher.php b/vendor/Aws2/symfony/event-dispatcher/ImmutableEventDispatcher.php new file mode 100644 index 00000000..6a4b6a74 --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/ImmutableEventDispatcher.php @@ -0,0 +1,81 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher; + +/** + * A read-only proxy for an event dispatcher. + * + * @author Bernhard Schussek + */ +class ImmutableEventDispatcher implements \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcherInterface +{ + private $dispatcher; + public function __construct(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventDispatcherInterface $dispatcher) + { + $this->dispatcher = $dispatcher; + } + /** + * {@inheritdoc} + */ + public function dispatch($eventName, \DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\Event $event = null) + { + return $this->dispatcher->dispatch($eventName, $event); + } + /** + * {@inheritdoc} + */ + public function addListener($eventName, $listener, $priority = 0) + { + throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); + } + /** + * {@inheritdoc} + */ + public function addSubscriber(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface $subscriber) + { + throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); + } + /** + * {@inheritdoc} + */ + public function removeListener($eventName, $listener) + { + throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); + } + /** + * {@inheritdoc} + */ + public function removeSubscriber(\DeliciousBrains\WP_Offload_S3\Aws2\Symfony\Component\EventDispatcher\EventSubscriberInterface $subscriber) + { + throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); + } + /** + * {@inheritdoc} + */ + public function getListeners($eventName = null) + { + return $this->dispatcher->getListeners($eventName); + } + /** + * {@inheritdoc} + */ + public function getListenerPriority($eventName, $listener) + { + return $this->dispatcher->getListenerPriority($eventName, $listener); + } + /** + * {@inheritdoc} + */ + public function hasListeners($eventName = null) + { + return $this->dispatcher->hasListeners($eventName); + } +} diff --git a/vendor/Aws2/symfony/event-dispatcher/LICENSE b/vendor/Aws2/symfony/event-dispatcher/LICENSE new file mode 100644 index 00000000..17d16a13 --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2017 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/Aws2/symfony/event-dispatcher/README.md b/vendor/Aws2/symfony/event-dispatcher/README.md new file mode 100644 index 00000000..185c3fec --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/README.md @@ -0,0 +1,15 @@ +EventDispatcher Component +========================= + +The EventDispatcher component provides tools that allow your application +components to communicate with each other by dispatching events and listening to +them. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/event_dispatcher/index.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/Aws2/symfony/event-dispatcher/composer.json b/vendor/Aws2/symfony/event-dispatcher/composer.json new file mode 100644 index 00000000..60445cd3 --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/composer.json @@ -0,0 +1,46 @@ +{ + "name": "symfony\/event-dispatcher", + "type": "library", + "description": "Symfony EventDispatcher Component", + "keywords": [], + "homepage": "https:\/\/symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https:\/\/symfony.com\/contributors" + } + ], + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony\/dependency-injection": "~2.6|~3.0.0", + "symfony\/expression-language": "~2.6|~3.0.0", + "symfony\/config": "^2.0.5|~3.0.0", + "symfony\/stopwatch": "~2.3|~3.0.0", + "psr\/log": "~1.0" + }, + "suggest": { + "symfony\/dependency-injection": "", + "symfony\/http-kernel": "" + }, + "autoload": { + "psr-4": { + "DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "\/Tests\/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + } +} \ No newline at end of file diff --git a/vendor/Aws2/symfony/event-dispatcher/phpunit.xml.dist b/vendor/Aws2/symfony/event-dispatcher/phpunit.xml.dist new file mode 100644 index 00000000..b3ad1bdf --- /dev/null +++ b/vendor/Aws2/symfony/event-dispatcher/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + + + + + ./Tests/ + + + + + + ./ + + ./Resources + ./Tests + ./vendor + + + + diff --git a/vendor/Aws2/vendor/autoload.php b/vendor/Aws2/vendor/autoload.php new file mode 100644 index 00000000..0f596424 --- /dev/null +++ b/vendor/Aws2/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see 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') && ini_get('apc.enabled') ? $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])) { + foreach ($this->prefixDirsPsr4[$search] as $dir) { + $length = $this->prefixLengthsPsr4[$first][$search]; + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { + 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; +} diff --git a/vendor/Aws2/vendor/composer/LICENSE b/vendor/Aws2/vendor/composer/LICENSE new file mode 100644 index 00000000..f27399a0 --- /dev/null +++ b/vendor/Aws2/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/vendor/Aws2/vendor/composer/autoload_classmap.php b/vendor/Aws2/vendor/composer/autoload_classmap.php new file mode 100644 index 00000000..754df636 --- /dev/null +++ b/vendor/Aws2/vendor/composer/autoload_classmap.php @@ -0,0 +1,517 @@ + $baseDir . '/guzzle/guzzle/phing/tasks/ComposerLintTask.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Aws' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Aws.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\AbstractClient' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Client/AbstractClient.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\AwsClientInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Client/AwsClientInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\ClientBuilder' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Client/ClientBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\DefaultClient' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Client/DefaultClient.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\ExpiredCredentialsChecker' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Client/ExpiredCredentialsChecker.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\ThrottlingErrorChecker' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Client/ThrottlingErrorChecker.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\UploadBodyListener' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Client/UploadBodyListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\UserAgentListener' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Client/UserAgentListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Command\\AwsQueryVisitor' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Command/AwsQueryVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Command\\JsonCommand' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Command/JsonCommand.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Command\\QueryCommand' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Command/QueryCommand.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Command\\XmlResponseLocationVisitor' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Command/XmlResponseLocationVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\AbstractCredentialsDecorator' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Credentials/AbstractCredentialsDecorator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\AbstractRefreshableCredentials' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Credentials/AbstractRefreshableCredentials.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\CacheableCredentials' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Credentials/CacheableCredentials.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\Credentials' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Credentials/Credentials.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\CredentialsInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Credentials/CredentialsInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\NullCredentials' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Credentials/NullCredentials.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\RefreshableInstanceProfileCredentials' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Credentials/RefreshableInstanceProfileCredentials.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Enum.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum\\ClientOptions' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Enum/ClientOptions.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum\\DateFormat' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Enum/DateFormat.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum\\Region' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Enum/Region.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum\\Size' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Enum/Size.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum\\Time' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Enum/Time.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum\\UaString' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Enum/UaString.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\AwsExceptionInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/AwsExceptionInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\BadMethodCallException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/BadMethodCallException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\DomainException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/DomainException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\ExceptionFactoryInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/ExceptionFactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\ExceptionListener' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/ExceptionListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\InstanceProfileCredentialsException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/InstanceProfileCredentialsException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\InvalidArgumentException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/InvalidArgumentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\LogicException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/LogicException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\MultipartUploadException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/MultipartUploadException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\NamespaceExceptionFactory' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/NamespaceExceptionFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\OutOfBoundsException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/OutOfBoundsException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\OverflowException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/OverflowException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\Parser\\AbstractJsonExceptionParser' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/AbstractJsonExceptionParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\Parser\\DefaultXmlExceptionParser' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/DefaultXmlExceptionParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\Parser\\ExceptionParserInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/ExceptionParserInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\Parser\\JsonQueryExceptionParser' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/JsonQueryExceptionParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\Parser\\JsonRestExceptionParser' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/JsonRestExceptionParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\RequiredExtensionNotLoadedException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/RequiredExtensionNotLoadedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\RuntimeException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/RuntimeException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\ServiceResponseException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/ServiceResponseException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\TransferException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/TransferException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\UnexpectedValueException' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Exception/UnexpectedValueException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\AutoScaling' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\CloudFormation' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\CloudFront' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\CloudSearch' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\CloudTrail' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\CloudWatch' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\DataPipeline' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\DirectConnect' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\DynamoDb' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Ec2' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\ElastiCache' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\ElasticBeanstalk' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\ElasticLoadBalancing' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\ElasticTranscoder' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Emr' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Facade' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/Facade.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\FacadeInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/FacadeInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Glacier' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Iam' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\ImportExport' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Kinesis' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\OpsWorks' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Rds' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Redshift' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Route53' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\S3' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Ses' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\SimpleDb' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Sns' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Sqs' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\StorageGateway' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Sts' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Support' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Swf' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Hash\\ChunkHash' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Hash/ChunkHash.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Hash\\ChunkHashInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Hash/ChunkHashInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Hash\\HashUtils' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Hash/HashUtils.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Hash\\TreeHash' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Hash/TreeHash.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\HostNameUtils' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/HostNameUtils.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\InstanceMetadata\\InstanceMetadataClient' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/InstanceMetadata/InstanceMetadataClient.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\InstanceMetadata\\Waiter\\ServiceAvailable' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/InstanceMetadata/Waiter/ServiceAvailable.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Iterator\\AwsResourceIterator' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Iterator/AwsResourceIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Iterator\\AwsResourceIteratorFactory' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Iterator/AwsResourceIteratorFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\AbstractTransfer' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\AbstractTransferState' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractTransferState.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\AbstractUploadBuilder' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\AbstractUploadId' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadId.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\AbstractUploadPart' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadPart.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\TransferInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/TransferInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\TransferStateInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/TransferStateInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\UploadIdInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/UploadIdInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\UploadPartInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/UploadPartInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\RulesEndpointProvider' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/RulesEndpointProvider.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\AbstractSignature' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Signature/AbstractSignature.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\EndpointSignatureInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Signature/EndpointSignatureInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\SignatureInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\SignatureListener' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\SignatureV2' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV2.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\SignatureV3Https' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV3Https.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\SignatureV4' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV4.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\AbstractResourceWaiter' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Waiter/AbstractResourceWaiter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\AbstractWaiter' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Waiter/AbstractWaiter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\CallableWaiter' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Waiter/CallableWaiter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\CompositeWaiterFactory' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Waiter/CompositeWaiterFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\ConfigResourceWaiter' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Waiter/ConfigResourceWaiter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\ResourceWaiterInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Waiter/ResourceWaiterInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\WaiterClassFactory' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterClassFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\WaiterConfig' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterConfig.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\WaiterConfigFactory' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterConfigFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\WaiterFactoryInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterFactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\WaiterInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\AcpListener' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/AcpListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\BucketStyleListener' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/BucketStyleListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Command/S3Command.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\CannedAcl' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/CannedAcl.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\EncodingType' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/EncodingType.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Event' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/Event.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\GranteeType' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/GranteeType.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Group' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/Group.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\MFADelete' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/MFADelete.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\MetadataDirective' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/MetadataDirective.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Payer' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/Payer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Permission' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/Permission.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Protocol' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/Protocol.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\ServerSideEncryption' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/ServerSideEncryption.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Status' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/Status.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Storage' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/Storage.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\StorageClass' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Enum/StorageClass.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\AccessDeniedException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/AccessDeniedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\AccountProblemException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/AccountProblemException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\AmbiguousGrantByEmailAddressException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/AmbiguousGrantByEmailAddressException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\BadDigestException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/BadDigestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\BucketAlreadyExistsException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/BucketAlreadyExistsException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\BucketAlreadyOwnedByYouException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/BucketAlreadyOwnedByYouException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\BucketNotEmptyException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/BucketNotEmptyException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\CredentialsNotSupportedException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/CredentialsNotSupportedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\CrossLocationLoggingProhibitedException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/CrossLocationLoggingProhibitedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\DeleteMultipleObjectsException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/DeleteMultipleObjectsException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\EntityTooLargeException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/EntityTooLargeException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\EntityTooSmallException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/EntityTooSmallException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\ExpiredTokenException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/ExpiredTokenException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\IllegalVersioningConfigurationException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/IllegalVersioningConfigurationException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\IncompleteBodyException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/IncompleteBodyException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\IncorrectNumberOfFilesInPostRequestException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/IncorrectNumberOfFilesInPostRequestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InlineDataTooLargeException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InlineDataTooLargeException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InternalErrorException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InternalErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidAccessKeyIdException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidAccessKeyIdException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidAddressingHeaderException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidAddressingHeaderException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidArgumentException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidArgumentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidBucketNameException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidBucketNameException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidBucketStateException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidBucketStateException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidDigestException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidDigestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidLocationConstraintException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidLocationConstraintException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidPartException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidPartException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidPartOrderException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidPartOrderException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidPayerException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidPayerException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidPolicyDocumentException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidPolicyDocumentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidRangeException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidRangeException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidRequestException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidRequestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidSOAPRequestException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidSOAPRequestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidSecurityException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidSecurityException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidStorageClassException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidStorageClassException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidTagErrorException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidTagErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidTargetBucketForLoggingException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidTargetBucketForLoggingException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidTokenException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidTokenException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidURIException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidURIException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\KeyTooLongException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/KeyTooLongException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MalformedACLErrorException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/MalformedACLErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MalformedPOSTRequestException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/MalformedPOSTRequestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MalformedXMLException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/MalformedXMLException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MaxMessageLengthExceededException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/MaxMessageLengthExceededException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MaxPostPreDataLengthExceededErrorException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/MaxPostPreDataLengthExceededErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MetadataTooLargeException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/MetadataTooLargeException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MethodNotAllowedException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/MethodNotAllowedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MissingAttachmentException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/MissingAttachmentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MissingContentLengthException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/MissingContentLengthException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MissingRequestBodyErrorException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/MissingRequestBodyErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MissingSecurityElementException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/MissingSecurityElementException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MissingSecurityHeaderException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/MissingSecurityHeaderException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoLoggingStatusForKeyException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoLoggingStatusForKeyException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchBucketException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchBucketException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchBucketPolicyException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchBucketPolicyException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchCORSConfigurationException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchCORSConfigurationException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchKeyException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchKeyException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchLifecycleConfigurationException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchLifecycleConfigurationException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchTagSetException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchTagSetException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchUploadException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchUploadException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchVersionException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchVersionException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchWebsiteConfigurationException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchWebsiteConfigurationException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NotImplementedException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NotImplementedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NotSignedUpException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NotSignedUpException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NotSuchBucketPolicyException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/NotSuchBucketPolicyException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\ObjectAlreadyInActiveTierErrorException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/ObjectAlreadyInActiveTierErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\ObjectNotInActiveTierErrorException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/ObjectNotInActiveTierErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\OperationAbortedException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/OperationAbortedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\Parser\\S3ExceptionParser' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/Parser/S3ExceptionParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\PermanentRedirectException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/PermanentRedirectException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\PreconditionFailedException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/PreconditionFailedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\RedirectException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/RedirectException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\RequestIsNotMultiPartContentException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/RequestIsNotMultiPartContentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\RequestTimeTooSkewedException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/RequestTimeTooSkewedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\RequestTimeoutException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/RequestTimeoutException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\RequestTorrentOfBucketErrorException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/RequestTorrentOfBucketErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\S3Exception' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/S3Exception.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\ServiceUnavailableException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/ServiceUnavailableException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\SignatureDoesNotMatchException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/SignatureDoesNotMatchException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\SlowDownException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/SlowDownException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\TemporaryRedirectException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/TemporaryRedirectException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\TokenRefreshRequiredException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/TokenRefreshRequiredException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\TooManyBucketsException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/TooManyBucketsException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\UnexpectedContentException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/UnexpectedContentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\UnresolvableGrantByEmailAddressException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/UnresolvableGrantByEmailAddressException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\UserKeyMustBeSpecifiedException' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Exception/UserKeyMustBeSpecifiedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\IncompleteMultipartUploadChecker' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/IncompleteMultipartUploadChecker.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Iterator\\ListBucketsIterator' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Iterator/ListBucketsIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Iterator\\ListMultipartUploadsIterator' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Iterator/ListMultipartUploadsIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Iterator\\ListObjectVersionsIterator' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Iterator/ListObjectVersionsIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Iterator\\ListObjectsIterator' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Iterator/ListObjectsIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Iterator\\OpendirIterator' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Iterator/OpendirIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\Acp' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/Acp.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\AcpBuilder' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/AcpBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\ClearBucket' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/ClearBucket.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\DeleteObjectsBatch' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/DeleteObjectsBatch.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\DeleteObjectsTransfer' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/DeleteObjectsTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\Grant' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/Grant.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\Grantee' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/Grantee.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\AbstractTransfer' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/AbstractTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\ParallelTransfer' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/ParallelTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\SerialTransfer' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/SerialTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\TransferState' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/TransferState.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\UploadBuilder' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\UploadId' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadId.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\UploadPart' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadPart.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\PostObject' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Model/PostObject.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\ResumableDownload' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/ResumableDownload.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/S3Client.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Md5Listener' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/S3Md5Listener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Signature' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/S3Signature.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3SignatureInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/S3SignatureInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3SignatureV4' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/S3SignatureV4.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\SocketTimeoutChecker' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/SocketTimeoutChecker.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\SseCpkListener' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/SseCpkListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\StreamWrapper' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/StreamWrapper.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\AbstractSync' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Sync/AbstractSync.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\AbstractSyncBuilder' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Sync/AbstractSyncBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\ChangedFilesIterator' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Sync/ChangedFilesIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\DownloadSync' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Sync/DownloadSync.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\DownloadSyncBuilder' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Sync/DownloadSyncBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\FilenameConverterInterface' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Sync/FilenameConverterInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\KeyConverter' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Sync/KeyConverter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\UploadSync' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Sync/UploadSync.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\UploadSyncBuilder' => $baseDir . '/aws/aws-sdk-php/src/Aws/S3/Sync/UploadSyncBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\AbstractBatchDecorator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/AbstractBatchDecorator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\Batch' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/Batch.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchBuilder' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/BatchBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchClosureDivisor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/BatchClosureDivisor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchClosureTransfer' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/BatchClosureTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchCommandTransfer' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/BatchCommandTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchDivisorInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/BatchDivisorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/BatchInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchRequestTransfer' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/BatchRequestTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchSizeDivisor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/BatchSizeDivisor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchTransferInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/BatchTransferInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\ExceptionBufferingBatch' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/ExceptionBufferingBatch.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\Exception\\BatchTransferException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/Exception/BatchTransferException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\FlushingBatch' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/FlushingBatch.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\HistoryBatch' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/HistoryBatch.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\NotifyingBatch' => $baseDir . '/guzzle/guzzle/src/Guzzle/Batch/NotifyingBatch.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\AbstractCacheAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Cache/AbstractCacheAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\CacheAdapterFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\CacheAdapterInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\ClosureCacheAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Cache/ClosureCacheAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\DoctrineCacheAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Cache/DoctrineCacheAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\NullCacheAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Cache/NullCacheAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\Zf1CacheAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Cache/Zf1CacheAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\Zf2CacheAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Cache/Zf2CacheAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\AbstractHasDispatcher' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/AbstractHasDispatcher.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Collection' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/Collection.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Event' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/Event.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Exception\\BadMethodCallException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/Exception/BadMethodCallException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Exception\\ExceptionCollection' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/Exception/ExceptionCollection.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Exception\\GuzzleException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/Exception/GuzzleException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Exception\\InvalidArgumentException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/Exception/InvalidArgumentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Exception\\RuntimeException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/Exception/RuntimeException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Exception\\UnexpectedValueException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/Exception/UnexpectedValueException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\FromConfigInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/FromConfigInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\HasDispatcherInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/HasDispatcherInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\ToArrayInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/ToArrayInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Version' => $baseDir . '/guzzle/guzzle/src/Guzzle/Common/Version.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\AbstractEntityBodyDecorator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/AbstractEntityBodyDecorator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\CachingEntityBody' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/CachingEntityBody.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Client' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Client.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\ClientInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/ClientInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Curl\\CurlHandle' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Curl/CurlHandle.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Curl\\CurlMulti' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Curl\\CurlMultiInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Curl\\CurlMultiProxy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiProxy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Curl\\CurlVersion' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Curl/CurlVersion.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Curl\\RequestMediator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Curl/RequestMediator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\EntityBody' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/EntityBody.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\EntityBodyInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/EntityBodyInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\BadResponseException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Exception/BadResponseException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\ClientErrorResponseException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Exception/ClientErrorResponseException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\CouldNotRewindStreamException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Exception/CouldNotRewindStreamException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\CurlException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Exception/CurlException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\HttpException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Exception/HttpException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\MultiTransferException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Exception/MultiTransferException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\RequestException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Exception/RequestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\ServerErrorResponseException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Exception/ServerErrorResponseException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\TooManyRedirectsException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Exception/TooManyRedirectsException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\IoEmittingEntityBody' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/IoEmittingEntityBody.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\AbstractMessage' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/AbstractMessage.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\EntityEnclosingRequest' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequest.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\EntityEnclosingRequestInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequestInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/Header.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\CacheControl' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/Header/CacheControl.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\HeaderCollection' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderCollection.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\HeaderFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\HeaderFactoryInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\HeaderInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\Link' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/Header/Link.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\MessageInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/MessageInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\PostFile' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/PostFile.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\PostFileInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/PostFileInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Request' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/Request.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\RequestFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\RequestFactoryInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\RequestInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/RequestInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Response' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Message/Response.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Mimetypes' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Mimetypes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\QueryAggregator\\CommaAggregator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/CommaAggregator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\QueryAggregator\\DuplicateAggregator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/DuplicateAggregator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\QueryAggregator\\PhpAggregator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/PhpAggregator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\QueryAggregator\\QueryAggregatorInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\QueryString' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/QueryString.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\ReadLimitEntityBody' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/ReadLimitEntityBody.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\RedirectPlugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/RedirectPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\StaticClient' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/StaticClient.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Url' => $baseDir . '/guzzle/guzzle/src/Guzzle/Http/Url.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Inflection\\Inflector' => $baseDir . '/guzzle/guzzle/src/Guzzle/Inflection/Inflector.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Inflection\\InflectorInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Inflection/InflectorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Inflection\\MemoizingInflector' => $baseDir . '/guzzle/guzzle/src/Guzzle/Inflection/MemoizingInflector.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Inflection\\PreComputedInflector' => $baseDir . '/guzzle/guzzle/src/Guzzle/Inflection/PreComputedInflector.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Iterator\\AppendIterator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Iterator/AppendIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Iterator\\ChunkedIterator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Iterator/ChunkedIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Iterator\\FilterIterator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Iterator/FilterIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Iterator\\MapIterator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Iterator/MapIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Iterator\\MethodProxyIterator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Iterator/MethodProxyIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\AbstractLogAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Log/AbstractLogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\ArrayLogAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Log/ArrayLogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\ClosureLogAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Log/ClosureLogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\LogAdapterInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Log/LogAdapterInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\MessageFormatter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Log/MessageFormatter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\MonologLogAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Log/MonologLogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\PsrLogAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Log/PsrLogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\Zf1LogAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Log/Zf1LogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\Zf2LogAdapter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Log/Zf2LogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Cookie\\CookieParser' => $baseDir . '/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Cookie\\CookieParserInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParserInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Message\\AbstractMessageParser' => $baseDir . '/guzzle/guzzle/src/Guzzle/Parser/Message/AbstractMessageParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Message\\MessageParser' => $baseDir . '/guzzle/guzzle/src/Guzzle/Parser/Message/MessageParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Message\\MessageParserInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Parser/Message/MessageParserInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Message\\PeclHttpMessageParser' => $baseDir . '/guzzle/guzzle/src/Guzzle/Parser/Message/PeclHttpMessageParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\ParserRegistry' => $baseDir . '/guzzle/guzzle/src/Guzzle/Parser/ParserRegistry.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\UriTemplate\\PeclUriTemplate' => $baseDir . '/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/PeclUriTemplate.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\UriTemplate\\UriTemplate' => $baseDir . '/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/UriTemplate.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\UriTemplate\\UriTemplateInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/UriTemplateInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Url\\UrlParser' => $baseDir . '/guzzle/guzzle/src/Guzzle/Parser/Url/UrlParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Url\\UrlParserInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Parser/Url/UrlParserInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Async\\AsyncPlugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Async/AsyncPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\AbstractBackoffStrategy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/AbstractBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\AbstractErrorCodeBackoffStrategy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/AbstractErrorCodeBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\BackoffLogger' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffLogger.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\BackoffPlugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\BackoffStrategyInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffStrategyInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\CallbackBackoffStrategy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/CallbackBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\ConstantBackoffStrategy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ConstantBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\CurlBackoffStrategy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/CurlBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\ExponentialBackoffStrategy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ExponentialBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\HttpBackoffStrategy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/HttpBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\LinearBackoffStrategy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/LinearBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\ReasonPhraseBackoffStrategy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ReasonPhraseBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\TruncatedBackoffStrategy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/TruncatedBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\CacheKeyProviderInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/CacheKeyProviderInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\CachePlugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/CachePlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\CacheStorageInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/CacheStorageInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\CallbackCanCacheStrategy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/CallbackCanCacheStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\CanCacheStrategyInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/CanCacheStrategyInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\DefaultCacheKeyProvider' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCacheKeyProvider.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\DefaultCacheStorage' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCacheStorage.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCanCacheStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\DefaultRevalidation' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultRevalidation.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\DenyRevalidation' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/DenyRevalidation.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\RevalidationInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/RevalidationInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\SkipRevalidation' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/SkipRevalidation.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cookie\\Cookie' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cookie\\CookieJar\\ArrayCookieJar' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/ArrayCookieJar.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cookie\\CookieJar\\CookieJarInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/CookieJarInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cookie\\CookieJar\\FileCookieJar' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/FileCookieJar.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cookie\\CookiePlugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookiePlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cookie\\Exception\\InvalidCookieException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Exception/InvalidCookieException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\CurlAuth\\CurlAuthPlugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/CurlAuth/CurlAuthPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\ErrorResponse\\ErrorResponseExceptionInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponseExceptionInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\ErrorResponse\\ErrorResponsePlugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponsePlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\ErrorResponse\\Exception\\ErrorResponseException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/Exception/ErrorResponseException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\History\\HistoryPlugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/History/HistoryPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Log\\LogPlugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Log/LogPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Md5\\CommandContentMd5Plugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Md5/CommandContentMd5Plugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Md5\\Md5ValidatorPlugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Md5/Md5ValidatorPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Mock\\MockPlugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Mock/MockPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Oauth\\OauthPlugin' => $baseDir . '/guzzle/guzzle/src/Guzzle/Plugin/Oauth/OauthPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\AbstractConfigLoader' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/AbstractConfigLoader.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Builder\\ServiceBuilder' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Builder\\ServiceBuilderInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Builder\\ServiceBuilderLoader' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderLoader.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\CachingConfigLoader' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/CachingConfigLoader.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Client' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Client.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\ClientInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/ClientInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\AbstractCommand' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/AbstractCommand.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\ClosureCommand' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/ClosureCommand.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\CommandInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/CommandInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\CreateResponseClassEvent' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/CreateResponseClassEvent.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\DefaultRequestSerializer' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/DefaultRequestSerializer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\DefaultResponseParser' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/DefaultResponseParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\AliasFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/Factory/AliasFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\CompositeFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/Factory/CompositeFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\ConcreteClassFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/Factory/ConcreteClassFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\FactoryInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/Factory/FactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\MapFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/Factory/MapFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\ServiceDescriptionFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/Factory/ServiceDescriptionFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\AbstractRequestVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/AbstractRequestVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\BodyVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/BodyVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\HeaderVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/HeaderVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\JsonVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/JsonVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\PostFieldVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/PostFieldVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\PostFileVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/PostFileVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\QueryVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/QueryVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\RequestVisitorInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/RequestVisitorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\ResponseBodyVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/ResponseBodyVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\XmlVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/XmlVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\AbstractResponseVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/AbstractResponseVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\BodyVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/BodyVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\HeaderVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/HeaderVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\JsonVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/JsonVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\ReasonPhraseVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/ReasonPhraseVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\ResponseVisitorInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/ResponseVisitorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\StatusCodeVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/StatusCodeVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\XmlVisitor' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/XmlVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\VisitorFlyweight' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/VisitorFlyweight.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\OperationCommand' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/OperationCommand.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\OperationResponseParser' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/OperationResponseParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\RequestSerializerInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/RequestSerializerInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\ResponseClassInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/ResponseClassInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\ResponseParserInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Command/ResponseParserInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\ConfigLoaderInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/ConfigLoaderInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\Operation' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Description/Operation.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\OperationInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Description/OperationInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\Parameter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Description/Parameter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\SchemaFormatter' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Description/SchemaFormatter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\SchemaValidator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\ServiceDescription' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescription.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\ServiceDescriptionInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescriptionInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\ServiceDescriptionLoader' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescriptionLoader.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\ValidatorInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Description/ValidatorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\CommandException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Exception/CommandException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\CommandTransferException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Exception/CommandTransferException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\DescriptionBuilderException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Exception/DescriptionBuilderException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\InconsistentClientTransferException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Exception/InconsistentClientTransferException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\ResponseClassException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Exception/ResponseClassException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\ServiceBuilderException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Exception/ServiceBuilderException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\ServiceNotFoundException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Exception/ServiceNotFoundException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\ValidationException' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Exception/ValidationException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\AbstractResourceIteratorFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Resource/AbstractResourceIteratorFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\CompositeResourceIteratorFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Resource/CompositeResourceIteratorFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\MapResourceIteratorFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Resource/MapResourceIteratorFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\Model' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Resource/Model.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\ResourceIterator' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\ResourceIteratorApplyBatched' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorApplyBatched.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\ResourceIteratorClassFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorClassFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\ResourceIteratorFactoryInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorFactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\ResourceIteratorInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Stream\\PhpStreamRequestFactory' => $baseDir . '/guzzle/guzzle/src/Guzzle/Stream/PhpStreamRequestFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Stream\\Stream' => $baseDir . '/guzzle/guzzle/src/Guzzle/Stream/Stream.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Stream\\StreamInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Stream/StreamInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Stream\\StreamRequestFactoryInterface' => $baseDir . '/guzzle/guzzle/src/Guzzle/Stream/StreamRequestFactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher' => $baseDir . '/symfony/event-dispatcher/ContainerAwareEventDispatcher.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => $baseDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcherInterface' => $baseDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => $baseDir . '/symfony/event-dispatcher/Debug/WrappedListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => $baseDir . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\Event' => $baseDir . '/symfony/event-dispatcher/Event.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\EventDispatcher' => $baseDir . '/symfony/event-dispatcher/EventDispatcher.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => $baseDir . '/symfony/event-dispatcher/EventDispatcherInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => $baseDir . '/symfony/event-dispatcher/EventSubscriberInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\GenericEvent' => $baseDir . '/symfony/event-dispatcher/GenericEvent.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => $baseDir . '/symfony/event-dispatcher/ImmutableEventDispatcher.php', + 'GuzzlePearPharPackageTask' => $baseDir . '/guzzle/guzzle/phing/tasks/GuzzlePearPharPackageTask.php', + 'GuzzleSubSplitTask' => $baseDir . '/guzzle/guzzle/phing/tasks/GuzzleSubSplitTask.php', +); diff --git a/vendor/Aws2/vendor/composer/autoload_namespaces.php b/vendor/Aws2/vendor/composer/autoload_namespaces.php new file mode 100644 index 00000000..b7fc0125 --- /dev/null +++ b/vendor/Aws2/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ += 50600 && !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\ComposerStaticInitb127febfbbf51dd979ed3800a48c7fc1::getInitializer($loader)); + } else { + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->setClassMapAuthoritative(true); + $loader->register(true); + + return $loader; + } +} diff --git a/vendor/Aws2/vendor/composer/autoload_static.php b/vendor/Aws2/vendor/composer/autoload_static.php new file mode 100644 index 00000000..c1a73308 --- /dev/null +++ b/vendor/Aws2/vendor/composer/autoload_static.php @@ -0,0 +1,527 @@ + __DIR__ . '/../..' . '/guzzle/guzzle/phing/tasks/ComposerLintTask.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Aws' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Aws.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\AbstractClient' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Client/AbstractClient.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\AwsClientInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Client/AwsClientInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\ClientBuilder' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Client/ClientBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\DefaultClient' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Client/DefaultClient.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\ExpiredCredentialsChecker' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Client/ExpiredCredentialsChecker.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\ThrottlingErrorChecker' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Client/ThrottlingErrorChecker.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\UploadBodyListener' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Client/UploadBodyListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Client\\UserAgentListener' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Client/UserAgentListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Command\\AwsQueryVisitor' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Command/AwsQueryVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Command\\JsonCommand' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Command/JsonCommand.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Command\\QueryCommand' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Command/QueryCommand.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Command\\XmlResponseLocationVisitor' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Command/XmlResponseLocationVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\AbstractCredentialsDecorator' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Credentials/AbstractCredentialsDecorator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\AbstractRefreshableCredentials' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Credentials/AbstractRefreshableCredentials.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\CacheableCredentials' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Credentials/CacheableCredentials.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\Credentials' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Credentials/Credentials.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\CredentialsInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Credentials/CredentialsInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\NullCredentials' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Credentials/NullCredentials.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Credentials\\RefreshableInstanceProfileCredentials' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Credentials/RefreshableInstanceProfileCredentials.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Enum.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum\\ClientOptions' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Enum/ClientOptions.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum\\DateFormat' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Enum/DateFormat.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum\\Region' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Enum/Region.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum\\Size' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Enum/Size.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum\\Time' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Enum/Time.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Enum\\UaString' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Enum/UaString.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\AwsExceptionInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/AwsExceptionInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\BadMethodCallException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/BadMethodCallException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\DomainException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/DomainException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\ExceptionFactoryInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/ExceptionFactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\ExceptionListener' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/ExceptionListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\InstanceProfileCredentialsException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/InstanceProfileCredentialsException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\InvalidArgumentException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/InvalidArgumentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\LogicException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/LogicException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\MultipartUploadException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/MultipartUploadException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\NamespaceExceptionFactory' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/NamespaceExceptionFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\OutOfBoundsException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/OutOfBoundsException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\OverflowException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/OverflowException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\Parser\\AbstractJsonExceptionParser' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/AbstractJsonExceptionParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\Parser\\DefaultXmlExceptionParser' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/DefaultXmlExceptionParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\Parser\\ExceptionParserInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/ExceptionParserInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\Parser\\JsonQueryExceptionParser' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/JsonQueryExceptionParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\Parser\\JsonRestExceptionParser' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/Parser/JsonRestExceptionParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\RequiredExtensionNotLoadedException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/RequiredExtensionNotLoadedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\RuntimeException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/RuntimeException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\ServiceResponseException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/ServiceResponseException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\TransferException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/TransferException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Exception\\UnexpectedValueException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Exception/UnexpectedValueException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\AutoScaling' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\CloudFormation' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\CloudFront' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\CloudSearch' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\CloudTrail' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\CloudWatch' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\DataPipeline' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\DirectConnect' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\DynamoDb' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Ec2' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\ElastiCache' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\ElasticBeanstalk' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\ElasticLoadBalancing' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\ElasticTranscoder' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Emr' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Facade' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/Facade.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\FacadeInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/FacadeInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Glacier' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Iam' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\ImportExport' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Kinesis' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\OpsWorks' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Rds' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Redshift' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Route53' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\S3' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Ses' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\SimpleDb' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Sns' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Sqs' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\StorageGateway' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Sts' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Support' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Facade\\Swf' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Facade/facade-classes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Hash\\ChunkHash' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Hash/ChunkHash.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Hash\\ChunkHashInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Hash/ChunkHashInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Hash\\HashUtils' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Hash/HashUtils.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Hash\\TreeHash' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Hash/TreeHash.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\HostNameUtils' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/HostNameUtils.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\InstanceMetadata\\InstanceMetadataClient' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/InstanceMetadata/InstanceMetadataClient.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\InstanceMetadata\\Waiter\\ServiceAvailable' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/InstanceMetadata/Waiter/ServiceAvailable.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Iterator\\AwsResourceIterator' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Iterator/AwsResourceIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Iterator\\AwsResourceIteratorFactory' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Iterator/AwsResourceIteratorFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\AbstractTransfer' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\AbstractTransferState' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractTransferState.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\AbstractUploadBuilder' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\AbstractUploadId' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadId.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\AbstractUploadPart' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/AbstractUploadPart.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\TransferInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/TransferInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\TransferStateInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/TransferStateInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\UploadIdInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/UploadIdInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Model\\MultipartUpload\\UploadPartInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Model/MultipartUpload/UploadPartInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\RulesEndpointProvider' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/RulesEndpointProvider.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\AbstractSignature' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Signature/AbstractSignature.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\EndpointSignatureInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Signature/EndpointSignatureInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\SignatureInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\SignatureListener' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\SignatureV2' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV2.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\SignatureV3Https' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV3Https.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Signature\\SignatureV4' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Signature/SignatureV4.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\AbstractResourceWaiter' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Waiter/AbstractResourceWaiter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\AbstractWaiter' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Waiter/AbstractWaiter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\CallableWaiter' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Waiter/CallableWaiter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\CompositeWaiterFactory' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Waiter/CompositeWaiterFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\ConfigResourceWaiter' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Waiter/ConfigResourceWaiter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\ResourceWaiterInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Waiter/ResourceWaiterInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\WaiterClassFactory' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterClassFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\WaiterConfig' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterConfig.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\WaiterConfigFactory' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterConfigFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\WaiterFactoryInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterFactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\Common\\Waiter\\WaiterInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/Common/Waiter/WaiterInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\AcpListener' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/AcpListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\BucketStyleListener' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/BucketStyleListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Command\\S3Command' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Command/S3Command.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\CannedAcl' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/CannedAcl.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\EncodingType' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/EncodingType.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Event' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/Event.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\GranteeType' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/GranteeType.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Group' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/Group.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\MFADelete' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/MFADelete.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\MetadataDirective' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/MetadataDirective.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Payer' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/Payer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Permission' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/Permission.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Protocol' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/Protocol.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\ServerSideEncryption' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/ServerSideEncryption.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Status' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/Status.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\Storage' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/Storage.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Enum\\StorageClass' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Enum/StorageClass.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\AccessDeniedException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/AccessDeniedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\AccountProblemException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/AccountProblemException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\AmbiguousGrantByEmailAddressException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/AmbiguousGrantByEmailAddressException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\BadDigestException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/BadDigestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\BucketAlreadyExistsException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/BucketAlreadyExistsException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\BucketAlreadyOwnedByYouException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/BucketAlreadyOwnedByYouException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\BucketNotEmptyException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/BucketNotEmptyException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\CredentialsNotSupportedException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/CredentialsNotSupportedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\CrossLocationLoggingProhibitedException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/CrossLocationLoggingProhibitedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\DeleteMultipleObjectsException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/DeleteMultipleObjectsException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\EntityTooLargeException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/EntityTooLargeException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\EntityTooSmallException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/EntityTooSmallException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\ExpiredTokenException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/ExpiredTokenException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\IllegalVersioningConfigurationException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/IllegalVersioningConfigurationException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\IncompleteBodyException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/IncompleteBodyException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\IncorrectNumberOfFilesInPostRequestException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/IncorrectNumberOfFilesInPostRequestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InlineDataTooLargeException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InlineDataTooLargeException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InternalErrorException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InternalErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidAccessKeyIdException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidAccessKeyIdException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidAddressingHeaderException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidAddressingHeaderException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidArgumentException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidArgumentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidBucketNameException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidBucketNameException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidBucketStateException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidBucketStateException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidDigestException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidDigestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidLocationConstraintException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidLocationConstraintException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidPartException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidPartException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidPartOrderException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidPartOrderException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidPayerException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidPayerException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidPolicyDocumentException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidPolicyDocumentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidRangeException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidRangeException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidRequestException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidRequestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidSOAPRequestException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidSOAPRequestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidSecurityException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidSecurityException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidStorageClassException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidStorageClassException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidTagErrorException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidTagErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidTargetBucketForLoggingException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidTargetBucketForLoggingException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidTokenException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidTokenException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\InvalidURIException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/InvalidURIException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\KeyTooLongException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/KeyTooLongException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MalformedACLErrorException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/MalformedACLErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MalformedPOSTRequestException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/MalformedPOSTRequestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MalformedXMLException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/MalformedXMLException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MaxMessageLengthExceededException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/MaxMessageLengthExceededException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MaxPostPreDataLengthExceededErrorException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/MaxPostPreDataLengthExceededErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MetadataTooLargeException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/MetadataTooLargeException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MethodNotAllowedException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/MethodNotAllowedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MissingAttachmentException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/MissingAttachmentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MissingContentLengthException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/MissingContentLengthException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MissingRequestBodyErrorException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/MissingRequestBodyErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MissingSecurityElementException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/MissingSecurityElementException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\MissingSecurityHeaderException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/MissingSecurityHeaderException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoLoggingStatusForKeyException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoLoggingStatusForKeyException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchBucketException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchBucketException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchBucketPolicyException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchBucketPolicyException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchCORSConfigurationException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchCORSConfigurationException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchKeyException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchKeyException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchLifecycleConfigurationException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchLifecycleConfigurationException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchTagSetException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchTagSetException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchUploadException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchUploadException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchVersionException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchVersionException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NoSuchWebsiteConfigurationException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NoSuchWebsiteConfigurationException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NotImplementedException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NotImplementedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NotSignedUpException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NotSignedUpException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\NotSuchBucketPolicyException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/NotSuchBucketPolicyException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\ObjectAlreadyInActiveTierErrorException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/ObjectAlreadyInActiveTierErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\ObjectNotInActiveTierErrorException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/ObjectNotInActiveTierErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\OperationAbortedException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/OperationAbortedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\Parser\\S3ExceptionParser' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/Parser/S3ExceptionParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\PermanentRedirectException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/PermanentRedirectException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\PreconditionFailedException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/PreconditionFailedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\RedirectException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/RedirectException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\RequestIsNotMultiPartContentException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/RequestIsNotMultiPartContentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\RequestTimeTooSkewedException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/RequestTimeTooSkewedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\RequestTimeoutException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/RequestTimeoutException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\RequestTorrentOfBucketErrorException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/RequestTorrentOfBucketErrorException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\S3Exception' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/S3Exception.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\ServiceUnavailableException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/ServiceUnavailableException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\SignatureDoesNotMatchException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/SignatureDoesNotMatchException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\SlowDownException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/SlowDownException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\TemporaryRedirectException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/TemporaryRedirectException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\TokenRefreshRequiredException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/TokenRefreshRequiredException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\TooManyBucketsException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/TooManyBucketsException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\UnexpectedContentException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/UnexpectedContentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\UnresolvableGrantByEmailAddressException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/UnresolvableGrantByEmailAddressException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Exception\\UserKeyMustBeSpecifiedException' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Exception/UserKeyMustBeSpecifiedException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\IncompleteMultipartUploadChecker' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/IncompleteMultipartUploadChecker.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Iterator\\ListBucketsIterator' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Iterator/ListBucketsIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Iterator\\ListMultipartUploadsIterator' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Iterator/ListMultipartUploadsIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Iterator\\ListObjectVersionsIterator' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Iterator/ListObjectVersionsIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Iterator\\ListObjectsIterator' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Iterator/ListObjectsIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Iterator\\OpendirIterator' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Iterator/OpendirIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\Acp' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/Acp.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\AcpBuilder' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/AcpBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\ClearBucket' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/ClearBucket.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\DeleteObjectsBatch' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/DeleteObjectsBatch.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\DeleteObjectsTransfer' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/DeleteObjectsTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\Grant' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/Grant.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\Grantee' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/Grantee.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\AbstractTransfer' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/AbstractTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\ParallelTransfer' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/ParallelTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\SerialTransfer' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/SerialTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\TransferState' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/TransferState.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\UploadBuilder' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\UploadId' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadId.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\MultipartUpload\\UploadPart' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/MultipartUpload/UploadPart.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Model\\PostObject' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Model/PostObject.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\ResumableDownload' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/ResumableDownload.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Client' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/S3Client.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Md5Listener' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/S3Md5Listener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3Signature' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/S3Signature.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3SignatureInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/S3SignatureInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\S3SignatureV4' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/S3SignatureV4.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\SocketTimeoutChecker' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/SocketTimeoutChecker.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\SseCpkListener' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/SseCpkListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\StreamWrapper' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/StreamWrapper.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\AbstractSync' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Sync/AbstractSync.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\AbstractSyncBuilder' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Sync/AbstractSyncBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\ChangedFilesIterator' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Sync/ChangedFilesIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\DownloadSync' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Sync/DownloadSync.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\DownloadSyncBuilder' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Sync/DownloadSyncBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\FilenameConverterInterface' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Sync/FilenameConverterInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\KeyConverter' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Sync/KeyConverter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\UploadSync' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Sync/UploadSync.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Aws\\S3\\Sync\\UploadSyncBuilder' => __DIR__ . '/../..' . '/aws/aws-sdk-php/src/Aws/S3/Sync/UploadSyncBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\AbstractBatchDecorator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/AbstractBatchDecorator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\Batch' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/Batch.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchBuilder' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/BatchBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchClosureDivisor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/BatchClosureDivisor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchClosureTransfer' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/BatchClosureTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchCommandTransfer' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/BatchCommandTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchDivisorInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/BatchDivisorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/BatchInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchRequestTransfer' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/BatchRequestTransfer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchSizeDivisor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/BatchSizeDivisor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\BatchTransferInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/BatchTransferInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\ExceptionBufferingBatch' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/ExceptionBufferingBatch.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\Exception\\BatchTransferException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/Exception/BatchTransferException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\FlushingBatch' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/FlushingBatch.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\HistoryBatch' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/HistoryBatch.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Batch\\NotifyingBatch' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Batch/NotifyingBatch.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\AbstractCacheAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Cache/AbstractCacheAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\CacheAdapterFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\CacheAdapterInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\ClosureCacheAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Cache/ClosureCacheAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\DoctrineCacheAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Cache/DoctrineCacheAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\NullCacheAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Cache/NullCacheAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\Zf1CacheAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Cache/Zf1CacheAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Cache\\Zf2CacheAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Cache/Zf2CacheAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\AbstractHasDispatcher' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/AbstractHasDispatcher.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Collection' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/Collection.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Event' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/Event.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Exception\\BadMethodCallException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/Exception/BadMethodCallException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Exception\\ExceptionCollection' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/Exception/ExceptionCollection.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Exception\\GuzzleException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/Exception/GuzzleException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Exception\\InvalidArgumentException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/Exception/InvalidArgumentException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Exception\\RuntimeException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/Exception/RuntimeException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Exception\\UnexpectedValueException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/Exception/UnexpectedValueException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\FromConfigInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/FromConfigInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\HasDispatcherInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/HasDispatcherInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\ToArrayInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/ToArrayInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Common\\Version' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Common/Version.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\AbstractEntityBodyDecorator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/AbstractEntityBodyDecorator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\CachingEntityBody' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/CachingEntityBody.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Client' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Client.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\ClientInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/ClientInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Curl\\CurlHandle' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Curl/CurlHandle.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Curl\\CurlMulti' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Curl\\CurlMultiInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Curl\\CurlMultiProxy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiProxy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Curl\\CurlVersion' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Curl/CurlVersion.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Curl\\RequestMediator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Curl/RequestMediator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\EntityBody' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/EntityBody.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\EntityBodyInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/EntityBodyInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\BadResponseException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Exception/BadResponseException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\ClientErrorResponseException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Exception/ClientErrorResponseException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\CouldNotRewindStreamException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Exception/CouldNotRewindStreamException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\CurlException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Exception/CurlException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\HttpException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Exception/HttpException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\MultiTransferException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Exception/MultiTransferException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\RequestException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Exception/RequestException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\ServerErrorResponseException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Exception/ServerErrorResponseException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Exception\\TooManyRedirectsException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Exception/TooManyRedirectsException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\IoEmittingEntityBody' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/IoEmittingEntityBody.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\AbstractMessage' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/AbstractMessage.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\EntityEnclosingRequest' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequest.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\EntityEnclosingRequestInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequestInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/Header.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\CacheControl' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/Header/CacheControl.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\HeaderCollection' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderCollection.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\HeaderFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\HeaderFactoryInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\HeaderInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Header\\Link' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/Header/Link.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\MessageInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/MessageInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\PostFile' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/PostFile.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\PostFileInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/PostFileInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Request' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/Request.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\RequestFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\RequestFactoryInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\RequestInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/RequestInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Message\\Response' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Message/Response.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Mimetypes' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Mimetypes.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\QueryAggregator\\CommaAggregator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/CommaAggregator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\QueryAggregator\\DuplicateAggregator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/DuplicateAggregator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\QueryAggregator\\PhpAggregator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/PhpAggregator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\QueryAggregator\\QueryAggregatorInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\QueryString' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/QueryString.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\ReadLimitEntityBody' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/ReadLimitEntityBody.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\RedirectPlugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/RedirectPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\StaticClient' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/StaticClient.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Http\\Url' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Http/Url.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Inflection\\Inflector' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Inflection/Inflector.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Inflection\\InflectorInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Inflection/InflectorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Inflection\\MemoizingInflector' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Inflection/MemoizingInflector.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Inflection\\PreComputedInflector' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Inflection/PreComputedInflector.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Iterator\\AppendIterator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Iterator/AppendIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Iterator\\ChunkedIterator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Iterator/ChunkedIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Iterator\\FilterIterator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Iterator/FilterIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Iterator\\MapIterator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Iterator/MapIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Iterator\\MethodProxyIterator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Iterator/MethodProxyIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\AbstractLogAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Log/AbstractLogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\ArrayLogAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Log/ArrayLogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\ClosureLogAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Log/ClosureLogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\LogAdapterInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Log/LogAdapterInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\MessageFormatter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Log/MessageFormatter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\MonologLogAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Log/MonologLogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\PsrLogAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Log/PsrLogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\Zf1LogAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Log/Zf1LogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Log\\Zf2LogAdapter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Log/Zf2LogAdapter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Cookie\\CookieParser' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Cookie\\CookieParserInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParserInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Message\\AbstractMessageParser' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Parser/Message/AbstractMessageParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Message\\MessageParser' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Parser/Message/MessageParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Message\\MessageParserInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Parser/Message/MessageParserInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Message\\PeclHttpMessageParser' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Parser/Message/PeclHttpMessageParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\ParserRegistry' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Parser/ParserRegistry.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\UriTemplate\\PeclUriTemplate' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/PeclUriTemplate.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\UriTemplate\\UriTemplate' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/UriTemplate.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\UriTemplate\\UriTemplateInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/UriTemplateInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Url\\UrlParser' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Parser/Url/UrlParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Parser\\Url\\UrlParserInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Parser/Url/UrlParserInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Async\\AsyncPlugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Async/AsyncPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\AbstractBackoffStrategy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/AbstractBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\AbstractErrorCodeBackoffStrategy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/AbstractErrorCodeBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\BackoffLogger' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffLogger.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\BackoffPlugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\BackoffStrategyInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffStrategyInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\CallbackBackoffStrategy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/CallbackBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\ConstantBackoffStrategy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ConstantBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\CurlBackoffStrategy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/CurlBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\ExponentialBackoffStrategy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ExponentialBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\HttpBackoffStrategy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/HttpBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\LinearBackoffStrategy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/LinearBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\ReasonPhraseBackoffStrategy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ReasonPhraseBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Backoff\\TruncatedBackoffStrategy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Backoff/TruncatedBackoffStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\CacheKeyProviderInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/CacheKeyProviderInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\CachePlugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/CachePlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\CacheStorageInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/CacheStorageInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\CallbackCanCacheStrategy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/CallbackCanCacheStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\CanCacheStrategyInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/CanCacheStrategyInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\DefaultCacheKeyProvider' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCacheKeyProvider.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\DefaultCacheStorage' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCacheStorage.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCanCacheStrategy.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\DefaultRevalidation' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultRevalidation.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\DenyRevalidation' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/DenyRevalidation.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\RevalidationInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/RevalidationInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cache\\SkipRevalidation' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cache/SkipRevalidation.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cookie\\Cookie' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cookie\\CookieJar\\ArrayCookieJar' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/ArrayCookieJar.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cookie\\CookieJar\\CookieJarInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/CookieJarInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cookie\\CookieJar\\FileCookieJar' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/FileCookieJar.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cookie\\CookiePlugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookiePlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Cookie\\Exception\\InvalidCookieException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Exception/InvalidCookieException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\CurlAuth\\CurlAuthPlugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/CurlAuth/CurlAuthPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\ErrorResponse\\ErrorResponseExceptionInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponseExceptionInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\ErrorResponse\\ErrorResponsePlugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponsePlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\ErrorResponse\\Exception\\ErrorResponseException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/Exception/ErrorResponseException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\History\\HistoryPlugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/History/HistoryPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Log\\LogPlugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Log/LogPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Md5\\CommandContentMd5Plugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Md5/CommandContentMd5Plugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Md5\\Md5ValidatorPlugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Md5/Md5ValidatorPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Mock\\MockPlugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Mock/MockPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Plugin\\Oauth\\OauthPlugin' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Plugin/Oauth/OauthPlugin.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\AbstractConfigLoader' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/AbstractConfigLoader.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Builder\\ServiceBuilder' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilder.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Builder\\ServiceBuilderInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Builder\\ServiceBuilderLoader' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderLoader.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\CachingConfigLoader' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/CachingConfigLoader.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Client' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Client.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\ClientInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/ClientInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\AbstractCommand' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/AbstractCommand.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\ClosureCommand' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/ClosureCommand.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\CommandInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/CommandInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\CreateResponseClassEvent' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/CreateResponseClassEvent.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\DefaultRequestSerializer' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/DefaultRequestSerializer.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\DefaultResponseParser' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/DefaultResponseParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\AliasFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/Factory/AliasFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\CompositeFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/Factory/CompositeFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\ConcreteClassFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/Factory/ConcreteClassFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\FactoryInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/Factory/FactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\MapFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/Factory/MapFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\Factory\\ServiceDescriptionFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/Factory/ServiceDescriptionFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\AbstractRequestVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/AbstractRequestVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\BodyVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/BodyVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\HeaderVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/HeaderVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\JsonVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/JsonVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\PostFieldVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/PostFieldVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\PostFileVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/PostFileVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\QueryVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/QueryVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\RequestVisitorInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/RequestVisitorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\ResponseBodyVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/ResponseBodyVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Request\\XmlVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/XmlVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\AbstractResponseVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/AbstractResponseVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\BodyVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/BodyVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\HeaderVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/HeaderVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\JsonVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/JsonVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\ReasonPhraseVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/ReasonPhraseVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\ResponseVisitorInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/ResponseVisitorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\StatusCodeVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/StatusCodeVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\Response\\XmlVisitor' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/XmlVisitor.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\LocationVisitor\\VisitorFlyweight' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/VisitorFlyweight.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\OperationCommand' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/OperationCommand.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\OperationResponseParser' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/OperationResponseParser.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\RequestSerializerInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/RequestSerializerInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\ResponseClassInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/ResponseClassInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Command\\ResponseParserInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Command/ResponseParserInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\ConfigLoaderInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/ConfigLoaderInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\Operation' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Description/Operation.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\OperationInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Description/OperationInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\Parameter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Description/Parameter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\SchemaFormatter' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Description/SchemaFormatter.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\SchemaValidator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\ServiceDescription' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescription.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\ServiceDescriptionInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescriptionInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\ServiceDescriptionLoader' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescriptionLoader.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Description\\ValidatorInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Description/ValidatorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\CommandException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Exception/CommandException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\CommandTransferException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Exception/CommandTransferException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\DescriptionBuilderException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Exception/DescriptionBuilderException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\InconsistentClientTransferException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Exception/InconsistentClientTransferException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\ResponseClassException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Exception/ResponseClassException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\ServiceBuilderException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Exception/ServiceBuilderException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\ServiceNotFoundException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Exception/ServiceNotFoundException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Exception\\ValidationException' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Exception/ValidationException.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\AbstractResourceIteratorFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Resource/AbstractResourceIteratorFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\CompositeResourceIteratorFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Resource/CompositeResourceIteratorFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\MapResourceIteratorFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Resource/MapResourceIteratorFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\Model' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Resource/Model.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\ResourceIterator' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIterator.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\ResourceIteratorApplyBatched' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorApplyBatched.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\ResourceIteratorClassFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorClassFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\ResourceIteratorFactoryInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorFactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Service\\Resource\\ResourceIteratorInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Stream\\PhpStreamRequestFactory' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Stream/PhpStreamRequestFactory.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Stream\\Stream' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Stream/Stream.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Stream\\StreamInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Stream/StreamInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Guzzle\\Stream\\StreamRequestFactoryInterface' => __DIR__ . '/../..' . '/guzzle/guzzle/src/Guzzle/Stream/StreamRequestFactoryInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher' => __DIR__ . '/../..' . '/symfony/event-dispatcher/ContainerAwareEventDispatcher.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => __DIR__ . '/../..' . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcherInterface' => __DIR__ . '/../..' . '/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => __DIR__ . '/../..' . '/symfony/event-dispatcher/Debug/WrappedListener.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => __DIR__ . '/../..' . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\Event' => __DIR__ . '/../..' . '/symfony/event-dispatcher/Event.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\EventDispatcher' => __DIR__ . '/../..' . '/symfony/event-dispatcher/EventDispatcher.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/../..' . '/symfony/event-dispatcher/EventDispatcherInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => __DIR__ . '/../..' . '/symfony/event-dispatcher/EventSubscriberInterface.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\GenericEvent' => __DIR__ . '/../..' . '/symfony/event-dispatcher/GenericEvent.php', + 'DeliciousBrains\\WP_Offload_S3\\Aws2\\Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => __DIR__ . '/../..' . '/symfony/event-dispatcher/ImmutableEventDispatcher.php', + 'GuzzlePearPharPackageTask' => __DIR__ . '/../..' . '/guzzle/guzzle/phing/tasks/GuzzlePearPharPackageTask.php', + 'GuzzleSubSplitTask' => __DIR__ . '/../..' . '/guzzle/guzzle/phing/tasks/GuzzleSubSplitTask.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->classMap = ComposerStaticInitb127febfbbf51dd979ed3800a48c7fc1::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/view/addon.php b/view/addon.php new file mode 100644 index 00000000..558755ba --- /dev/null +++ b/view/addon.php @@ -0,0 +1,61 @@ +%s', $class, esc_url( $url ), esc_html( $title ) ); +}; + +$activate_url = function() use ( $slug ) { + $plugin_path = $slug . '/' . $slug . '.php'; + + return wp_nonce_url( self_admin_url( 'plugins.php?action=activate&plugin=' . $plugin_path ), 'activate-plugin_' . $plugin_path ); +}; + +$install_url = function() use ( $slug ) { + return wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $slug ), 'install-plugin_' . $slug ); +}; +?> +
    + + + + +
    + + +

    + + +
    + +
    + +
    +
    \ No newline at end of file diff --git a/view/bucket-setting.php b/view/bucket-setting.php index dfaeb11a..72a74af9 100644 --- a/view/bucket-setting.php +++ b/view/bucket-setting.php @@ -1,6 +1,7 @@ get_aws()->needs_access_keys(); +$constant = strtoupper( str_replace( '-', '_', $prefix ) . '_BUCKET' ); +$tr_class = ( isset( $tr_class ) ) ? $tr_class : ''; ?> @@ -12,11 +13,11 @@ - get_defined_setting( 'bucket', false ) ) { ?> - - get_defined_setting( 'bucket', false ) ) { echo '' . __( 'defined in wp-config.php', 'amazon-s3-and-cloudfront' ) . ''; - } ?> + } elseif ( ! $needs_keys ) { ?> + + get_setting( 'region' ); @@ -25,12 +26,22 @@ } ?> get_setting( 'manual_bucket' ) ? 'manual' : ''; ?> - + get_defined_setting( 'bucket', false ) && $needs_keys ) { + $needs_keys_notice = array( + 'message' => sprintf( __( 'Bucket Select DisabledDefine your AWS keys to configure the bucket', 'amazon-s3-and-cloudfront' ), '#settings' ), + 'id' => 'as3cf-bucket-select-needs-keys', + 'inline' => true, + 'type' => 'notice-warning', + ); + $this->render_view( 'notice', $needs_keys_notice ); + } + $lock_bucket_args = array( 'message' => __( 'Bucket Select Disabled — Bucket selection has been disabled while files are copied between buckets.', 'amazon-s3-and-cloudfront' ), 'id' => 'as3cf-bucket-select-locked', diff --git a/view/error-fatal.php b/view/error-fatal.php index 1db162fe..a81183f0 100644 --- a/view/error-fatal.php +++ b/view/error-fatal.php @@ -1,4 +1,4 @@ -
    +

    diff --git a/view/footer.php b/view/footer.php new file mode 100644 index 00000000..7f5eaa32 --- /dev/null +++ b/view/footer.php @@ -0,0 +1 @@ +
    \ No newline at end of file diff --git a/view/header.php b/view/header.php new file mode 100644 index 00000000..16e8ba76 --- /dev/null +++ b/view/header.php @@ -0,0 +1,3 @@ +
    + +

    \ No newline at end of file diff --git a/view/settings-tabs.php b/view/settings-tabs.php index eb39b9aa..7b6d4a5d 100644 --- a/view/settings-tabs.php +++ b/view/settings-tabs.php @@ -1,8 +1,10 @@ \ No newline at end of file + + diff --git a/view/settings.php b/view/settings.php index 4d7f25b0..94ef57b8 100644 --- a/view/settings.php +++ b/view/settings.php @@ -1,217 +1,12 @@ get_plugin_prefix_slug(); +/* @var \Amazon_S3_And_CloudFront|\Amazon_S3_And_CloudFront_Pro $this */ ?> -
    -

    - -

    -
    -get_setting( 'bucket' ); -$selected_bucket_prefix = $this->get_object_prefix(); ?> -
    - - - render_bucket_permission_errors(); ?> - -
    -
    - - - get_settings_nonce_key() ) ?> - - - - render_view( 'bucket-setting', - array( - 'prefix' => $prefix, - 'selected_bucket' => $selected_bucket, - 'selected_bucket_prefix' => $selected_bucket_prefix, - 'tr_class' => "as3cf-border-bottom {$prefix}-bucket-setting", - ) - ); ?> - - get_setting_args( 'copy-to-s3' ); ?> - - - - - - - - get_setting_args( 'serve-from-s3' ); ?> - - - - - - - - - - - render_view( 'domain-setting' ); ?> - get_setting_args( 'enable-object-prefix' ); ?> - - - - - - get_setting_args( 'use-yearmonth-folders' ); ?> - - - - - get_setting_args( 'force-https' ); ?> - - - - - - - - - get_setting_args( 'remove-local-file' ); ?> - - - - - get_setting_args( 'object-versioning' ); ?> - - - - -

    - render_view( 'checkbox', $args ); ?> - - -

    -

    - not copied to S3.', 'amazon-s3-and-cloudfront' ); ?> - settings_more_info_link( 'copy-to-s3', 'media+copy+files+to+S3' ); ?> -

    - -
    - render_view( 'checkbox', $args ); ?> - - -

    -

    - - settings_more_info_link( 'serve-from-s3', 'media+rewrite+file+urls' ); ?> -

    - -

    -
    - Preview -
    - get_url_preview(); // xss ok ?> -
    -
    -
    - - render_view( 'checkbox', $args ); ?> - - -

    -

    - - settings_more_info_link( 'object-prefix', 'media+path' ); ?> -

    -

    - get_setting_args( 'object-prefix' ); ?> - /> -

    -
    - render_view( 'checkbox', $args ); ?> - - -

    -

    - - settings_more_info_link( 'use-yearmonth-folders', 'media+year+month' ); ?> -

    -
    - render_view( 'checkbox', $args ); ?> - - -

    -

    - - settings_more_info_link( 'force-https', 'media+force+https' ); ?> -

    -

    - render_view( 'checkbox', $args ); ?> - - -

    -

    - settings_more_info_link( 'remove-local-file', 'media+remove+files+from+server' ); ?> -

    - Broken URLs — There will be broken URLs for files that don\'t exist locally. You can fix this by enabling Rewrite File URLs to use the S3 URLs.', 'amazon-s3-and-cloudfront' ) ); - $lost_files_args = array( - 'message' => $lost_files_msg, - 'id' => 'as3cf-lost-files-notice', - 'inline' => true, - 'type' => 'error', - 'style' => 'display: none', - ); - $this->render_view( 'notice', $lost_files_args ); - - $remove_local_link = $this->more_info_link( '/wp-offload-s3/doc/compatibility-with-other-plugins/', 'error-media+remove+files+from+server' ); - $remove_local_msg = apply_filters( 'as3cf_remove_local_notice', sprintf( __( 'Warning — Some plugins depend on the file being present on the local server and may not work when the file is removed. %s', 'amazon-s3-and-cloudfront' ), $remove_local_link ) ); - $remove_local_args = array( - 'message' => $remove_local_msg, - 'id' => 'as3cf-remove-local-notice', - 'inline' => true, - 'type' => 'notice-warning', - 'style' => 'display: none', - ); - $this->render_view( 'notice', $remove_local_args ); ?> -
    - render_view( 'checkbox', $args ); ?> - - -

    -

    - - settings_more_info_link( 'object-versioning', 'media+object+versioning' ); ?> -

    -
    -

    - -

    -
    -
    - - render_view( 'bucket-select', array( 'prefix' => $prefix, 'selected_bucket' => $selected_bucket ) ); ?> -
    - -get_settings_tabs(); -if ( ! empty( $tabs['support'] ) ) { - $this->render_view( 'support' ); -} -?> +render_view( 'settings/media' ) ?> +render_view( 'settings/addons' ) ?> +render_view( 'settings/settings' ) ?> +render_view( 'settings/support' ) ?> -is_pro() ) { - $this->render_view( 'sidebar' ); -} -?> +render_view( 'sidebar' ); ?> diff --git a/view/settings/addons.php b/view/settings/addons.php new file mode 100644 index 00000000..4cf870e9 --- /dev/null +++ b/view/settings/addons.php @@ -0,0 +1,21 @@ + +
    + + is_pro() ) : ?> +
    +

    + Get Addons — The following addons are available with a WP Offload S3 Gold license or better.
    Visit deliciousbrains.com to purchase in just a few clicks.', 'amazon-s3-and-cloudfront' ), + esc_url( $this->get_my_account_url() ) + ); + ?> +

    +
    + + +
    + render_addons(); ?> +
    +
    diff --git a/view/settings/media.php b/view/settings/media.php new file mode 100644 index 00000000..89f6531d --- /dev/null +++ b/view/settings/media.php @@ -0,0 +1,204 @@ +get_plugin_prefix_slug(); +$selected_bucket = $this->get_setting( 'bucket' ); +$selected_bucket_prefix = $this->get_object_prefix(); +?> +
    + + get_aws()->needs_access_keys() ) : ?> + +
    + + Define your AWS keys to configure WP Offload S3', 'amazon-s3-and-cloudfront' ), '#settings' ) ?> +
    + + + + + + + render_bucket_permission_errors() ?> + +
    +
    + + + get_settings_nonce_key() ) ?> + + + + render_view( 'bucket-setting', + array( + 'prefix' => $prefix, + 'selected_bucket' => $selected_bucket, + 'selected_bucket_prefix' => $selected_bucket_prefix, + 'tr_class' => "as3cf-border-bottom {$prefix}-bucket-setting", + ) + ); ?> + + + + + get_setting_args( 'copy-to-s3' ); ?> + + + + + get_setting_args( 'serve-from-s3' ); ?> + + + + + + + + + + + render_view( 'domain-setting' ); ?> + get_setting_args( 'enable-object-prefix' ); ?> + + + + + + get_setting_args( 'use-yearmonth-folders' ); ?> + + + + + + get_setting_args( 'force-https' ); ?> + + + + + + + + + get_setting_args( 'remove-local-file' ); ?> + + + + + get_setting_args( 'object-versioning' ); ?> + + + + +

    + render_view( 'checkbox', $args ); ?> + + +

    +

    + not copied to S3.', 'amazon-s3-and-cloudfront' ); ?> + settings_more_info_link( 'copy-to-s3', 'media+copy+files+to+S3' ); ?> +

    + +
    + render_view( 'checkbox', $args ); ?> + + +

    +

    + + settings_more_info_link( 'serve-from-s3', 'media+rewrite+file+urls' ); ?> +

    + +

    +
    + Preview +
    + get_url_preview(); // xss ok ?> +
    +
    +
    + + render_view( 'checkbox', $args ); ?> + + +

    +

    + + settings_more_info_link( 'object-prefix', 'media+path' ); ?> +

    +

    + get_setting_args( 'object-prefix' ); ?> + /> +

    +
    + render_view( 'checkbox', $args ); ?> + + +

    +

    + + settings_more_info_link( 'use-yearmonth-folders', 'media+year+month' ); ?> +

    +
    + render_view( 'checkbox', $args ); ?> + + +

    +

    + + settings_more_info_link( 'force-https', 'media+force+https' ); ?> +

    +

    + render_view( 'checkbox', $args ); ?> + + +

    +

    + settings_more_info_link( 'remove-local-file', 'media+remove+files+from+server' ); ?> +

    + Broken URLs — There will be broken URLs for files that don\'t exist locally. You can fix this by enabling Rewrite File URLs to use the S3 URLs.', 'amazon-s3-and-cloudfront' ) ); + $lost_files_args = array( + 'message' => $lost_files_msg, + 'id' => 'as3cf-lost-files-notice', + 'inline' => true, + 'type' => 'error', + 'style' => 'display: none', + ); + $this->render_view( 'notice', $lost_files_args ); + + $remove_local_link = $this->more_info_link( '/wp-offload-s3/doc/compatibility-with-other-plugins/', 'error-media+remove+files+from+server' ); + $remove_local_msg = apply_filters( 'as3cf_remove_local_notice', sprintf( __( 'Warning — Some plugins depend on the file being present on the local server and may not work when the file is removed. %s', 'amazon-s3-and-cloudfront' ), $remove_local_link ) ); + $remove_local_args = array( + 'message' => $remove_local_msg, + 'id' => 'as3cf-remove-local-notice', + 'inline' => true, + 'type' => 'notice-warning', + 'style' => 'display: none', + ); + $this->render_view( 'notice', $remove_local_args ); ?> +
    + render_view( 'checkbox', $args ); ?> + + +

    +

    + + settings_more_info_link( 'object-versioning', 'media+object+versioning' ); ?> +

    +
    +

    + +

    +
    +
    + + render_view( 'bucket-select', array( 'prefix' => $prefix, 'selected_bucket' => $selected_bucket ) ); ?> + + +
    diff --git a/view/settings/settings.php b/view/settings/settings.php new file mode 100644 index 00000000..756d422f --- /dev/null +++ b/view/settings/settings.php @@ -0,0 +1,136 @@ +get_aws(); +$key_constant = $aws->access_key_id_constant(); +$secret_constant = $aws->secret_access_key_constant(); +$any_constant_defined = (bool) $key_constant || $secret_constant; +$hide_form_initially = false; +$database_warning_url = $aws->dbrains_url( '/wp-offload-s3/doc/quick-start-guide/#save-access-keys', array( + 'utm_campaign' => 'support+docs', +) ); +?> +
    +
    + + + +
    + +

    + + use_ec2_iam_roles() ) : ?> +

    + +

    + + + are_access_keys_set() ) : ?> +
    +

    + +

    +
    + + +

    + not recommended), simply remove the lines from your wp-config.', 'amazon-s3-and-cloudfront' ), $database_warning_url ) ?> +

    + + + +

    + +

    + + + + get_access_key_id() || $aws->get_secret_access_key() ) : ?> +

    + not recommended).', 'amazon-s3-and-cloudfront' ), $database_warning_url ) ?> +

    + +

    + click here to reveal a form.', 'amazon-s3-and-cloudfront' ) ?> +

    + + + + +
    +
    + + + + + + + + + + +
    +
    + + > + + + +
    +
    +
    + + > + + + +
    +
    + + +
    +

    + + more_info_link( '/wp-offload-s3/doc/quick-start-guide/#save-access-keys' ) ?> +

    +
    + + + + +   + get_access_key_id() || $aws->get_secret_access_key() ) : ?> + + + + + +
    +
    +
    + + needs_access_keys() ) : ?> +

    + + Check out the Quick Start Guide →', 'amazon-s3-and-cloudfront' ), $aws->dbrains_url( '/wp-offload-s3/doc/quick-start-guide/', array( + 'utm_campaign' => 'support+docs', + ) ) ) ?> +

    + + + +
    +
    + diff --git a/view/support.php b/view/settings/support.php similarity index 79% rename from view/support.php rename to view/settings/support.php index 29cf0cd0..a1be2b94 100644 --- a/view/support.php +++ b/view/settings/support.php @@ -1,4 +1,4 @@ -
    +
    is_pro() ) { $this->render_view( 'wordpress-org-support' ); diff --git a/wordpress-s3.php b/wordpress-s3.php index 610ee949..63965d21 100644 --- a/wordpress-s3.php +++ b/wordpress-s3.php @@ -4,7 +4,7 @@ Plugin URI: http://wordpress.org/extend/plugins/amazon-s3-and-cloudfront/ Description: Automatically copies media uploads to Amazon S3 for storage and delivery. Optionally configure Amazon CloudFront for even faster delivery. Author: Delicious Brains -Version: 1.2.1 +Version: 1.3 Author URI: https://deliciousbrains.com/ Network: True Text Domain: amazon-s3-and-cloudfront @@ -26,29 +26,27 @@ // Then completely rewritten. */ -$GLOBALS['aws_meta']['amazon-s3-and-cloudfront']['version'] = '1.2.1'; +$GLOBALS['aws_meta']['amazon-s3-and-cloudfront']['version'] = '1.3'; -$aws_plugin_version_required = '1.0.4'; +require_once dirname( __FILE__ ) . '/classes/as3cf-compatibility-check.php'; -require_once dirname( __FILE__ ) . '/classes/wp-aws-compatibility-check.php'; -require_once dirname( __FILE__ ) . '/classes/as3cf-utils.php'; - -add_action( 'activated_plugin', array( 'AS3CF_Utils', 'deactivate_other_instances' ) ); +add_action( 'activated_plugin', array( 'AS3CF_Compatibility_Check', 'deactivate_other_instances' ) ); global $as3cf_compat_check; -$as3cf_compat_check = new WP_AWS_Compatibility_Check( +$as3cf_compat_check = new AS3CF_Compatibility_Check( 'WP Offload S3 Lite', 'amazon-s3-and-cloudfront', - __FILE__, - 'Amazon Web Services', - 'amazon-web-services', - $aws_plugin_version_required + __FILE__ ); -function as3cf_init( $aws ) { +function as3cf_init() { + if ( class_exists( 'Amazon_S3_And_CloudFront' ) ) { + return; + } + global $as3cf_compat_check; - if ( method_exists( 'WP_AWS_Compatibility_Check', 'is_plugin_active' ) && $as3cf_compat_check->is_plugin_active( 'amazon-s3-and-cloudfront-pro/amazon-s3-and-cloudfront-pro.php' ) ) { + if ( method_exists( 'AS3CF_Compatibility_Check', 'is_plugin_active' ) && $as3cf_compat_check->is_plugin_active( 'amazon-s3-and-cloudfront-pro/amazon-s3-and-cloudfront-pro.php' ) ) { // Don't load if pro plugin installed return; } @@ -59,21 +57,31 @@ function as3cf_init( $aws ) { global $as3cf; $abspath = dirname( __FILE__ ); + + // Autoloaders + require_once $abspath . '/vendor/Aws2/vendor/autoload.php'; + require_once $abspath . '/wp-offload-s3-autoloader.php'; + require_once $abspath . '/include/functions.php'; + require_once $abspath . '/classes/as3cf-utils.php'; require_once $abspath . '/classes/as3cf-error.php'; require_once $abspath . '/classes/as3cf-filter.php'; require_once $abspath . '/classes/filters/as3cf-local-to-s3.php'; require_once $abspath . '/classes/filters/as3cf-s3-to-local.php'; require_once $abspath . '/classes/as3cf-notices.php'; require_once $abspath . '/classes/as3cf-stream-wrapper.php'; + require_once $abspath . '/classes/as3cf-plugin-base.php'; require_once $abspath . '/classes/as3cf-plugin-compatibility.php'; require_once $abspath . '/classes/amazon-s3-and-cloudfront.php'; - // Autoloader - require_once $abspath . '/wp-offload-s3-autoloader.php'; new WP_Offload_S3_Autoloader( 'WP_Offload_S3', $abspath ); - $as3cf = new Amazon_S3_And_CloudFront( __FILE__, $aws ); + $as3cf = new Amazon_S3_And_CloudFront( __FILE__ ); + + do_action( 'as3cf_init', $as3cf ); } -add_action( 'aws_init', 'as3cf_init' ); +add_action( 'init', 'as3cf_init' ); + +// If AWS still active need to be around to satisfy addon version checks until upgraded. +add_action( 'aws_init', 'as3cf_init', 11 );