BackWPup – WordPress Backup Plugin - Version 1.7.8

Version Description

  • Updated AWS SDK to ver.1.3.5 for Amazon S3
  • some extra outputs on job start
  • resart Script execution time on many job operations.
  • some changes too prevent cache addons
  • prevent job run twice on same time on background
Download this release

Release Info

Developer daveshine
Plugin Icon 128x128 BackWPup – WordPress Backup Plugin
Version 1.7.8
Comparing to
See all releases

Code changes from version 1.7.7 to 1.7.8

app/backwpup_dojob.php CHANGED
@@ -101,6 +101,8 @@ class backwpup_dojob {
101
  $jobs[$this->jobid]['lastbackupdownloadurl']='';
102
  $jobs[$this->jobid]['lastlogfile']=$this->logdir.$this->logfile;
103
  $jobs[$this->jobid]['cronnextrun']=backwpup_cron_next($jobs[$this->jobid]['cron']); //set next run
 
 
104
  update_option('backwpup_jobs',$jobs); //Save job Settings
105
  $this->job=backwpup_check_job_vars($jobs[$this->jobid],$this->jobid);//Set and check job settings
106
  //set waht to do
@@ -189,7 +191,9 @@ class backwpup_dojob {
189
  $massage=$timestamp."<span>[".$args[0]."] ".$args[1]."</span>";
190
  break;
191
  }
192
-
 
 
193
  if (!empty($massage)) {
194
  //wirte log file
195
  $fd=fopen($this->logdir.$this->logfile,'a');
@@ -1433,6 +1437,7 @@ class backwpup_dojob {
1433
 
1434
  $jobs=get_option('backwpup_jobs');
1435
  $jobs[$this->jobid]['lastrun']=$jobs[$this->jobid]['starttime'];
 
1436
  $jobs[$this->jobid]['lastruntime']=current_time('timestamp')-$jobs[$this->jobid]['starttime'];
1437
  $jobs[$this->jobid]['logfile']='';
1438
  $jobs[$this->jobid]['lastlogfile']=$logfile;
101
  $jobs[$this->jobid]['lastbackupdownloadurl']='';
102
  $jobs[$this->jobid]['lastlogfile']=$this->logdir.$this->logfile;
103
  $jobs[$this->jobid]['cronnextrun']=backwpup_cron_next($jobs[$this->jobid]['cron']); //set next run
104
+ if ($jobs[$this->jobid]['activated'])
105
+ trigger_error(__('Next scheduled run is on:','backwpup').' '.date('D, j M Y H:i',$jobs[$this->jobid]['cronnextrun']).'; '.$jobs[$this->jobid]['cron'],E_USER_NOTICE);
106
  update_option('backwpup_jobs',$jobs); //Save job Settings
107
  $this->job=backwpup_check_job_vars($jobs[$this->jobid],$this->jobid);//Set and check job settings
108
  //set waht to do
191
  $massage=$timestamp."<span>[".$args[0]."] ".$args[1]."</span>";
192
  break;
193
  }
194
+
195
+ @set_time_limit(300);//set script run time limit new to 300sec.
196
+
197
  if (!empty($massage)) {
198
  //wirte log file
199
  $fd=fopen($this->logdir.$this->logfile,'a');
1437
 
1438
  $jobs=get_option('backwpup_jobs');
1439
  $jobs[$this->jobid]['lastrun']=$jobs[$this->jobid]['starttime'];
1440
+ $jobs[$this->jobid]['cronnextrun']=backwpup_cron_next($jobs[$this->jobid]['cron']); //set next run
1441
  $jobs[$this->jobid]['lastruntime']=current_time('timestamp')-$jobs[$this->jobid]['starttime'];
1442
  $jobs[$this->jobid]['logfile']='';
1443
  $jobs[$this->jobid]['lastlogfile']=$logfile;
app/libs/aws/README.md CHANGED
@@ -41,6 +41,8 @@ The source tree for includes the following files and directories:
41
  run on your server to determine whether or not your PHP environment meets the minimum requirements.
42
  * `_docs` -- Informational documents, the contents of which should be fairly self-explanatory.
43
  * `_samples` -- Code samples that you can run out of the box.
 
 
44
  * `lib` -- Contains any third-party libraries that the SDK depends on. The licenses for these projects will
45
  always be Apache 2.0-compatible.
46
  * `services` -- Contains the service-specific classes that communicate with AWS. These classes are always
@@ -112,7 +114,10 @@ From the command-line, you can install the SDK with PEAR as follows:
112
  pear channel-discover pear.amazonwebservices.com
113
  pear install aws/sdk
114
 
115
- You may need to use `sudo` for the above commands.
 
 
 
116
 
117
  ### Configuration
118
 
41
  run on your server to determine whether or not your PHP environment meets the minimum requirements.
42
  * `_docs` -- Informational documents, the contents of which should be fairly self-explanatory.
43
  * `_samples` -- Code samples that you can run out of the box.
44
+ * `extensions` -- Extra code that can be used to enhance usage of the SDK, but isn't a service class or a
45
+ third-party library.
46
  * `lib` -- Contains any third-party libraries that the SDK depends on. The licenses for these projects will
47
  always be Apache 2.0-compatible.
48
  * `services` -- Contains the service-specific classes that communicate with AWS. These classes are always
114
  pear channel-discover pear.amazonwebservices.com
115
  pear install aws/sdk
116
 
117
+ You may need to use `sudo` for the above commands. Once the SDK has been installed via PEAR, you can load it into
118
+ your project with:
119
+
120
+ require_once 'AWSSDKforPHP/sdk.class.php';
121
 
122
  ### Configuration
123
 
app/libs/aws/lib/cachecore/LICENSE CHANGED
@@ -1,25 +1,25 @@
1
- Copyright (c) 2006-2010 Ryan Parman, Foleeo Inc., and contributors. All rights reserved.
2
-
3
- Redistribution and use in source and binary forms, with or without modification, are
4
- permitted provided that the following conditions are met:
5
-
6
- * Redistributions of source code must retain the above copyright notice, this list of
7
- conditions and the following disclaimer.
8
-
9
- * Redistributions in binary form must reproduce the above copyright notice, this list
10
- of conditions and the following disclaimer in the documentation and/or other materials
11
- provided with the distribution.
12
-
13
- * Neither the name of Ryan Parman, Foleeo Inc. nor the names of its contributors may be used to
14
- endorse or promote products derived from this software without specific prior written
15
- permission.
16
-
17
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
18
- OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
20
- AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24
- OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25
- POSSIBILITY OF SUCH DAMAGE.
1
+ Copyright (c) 2006-2010 Ryan Parman, Foleeo Inc., and contributors. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without modification, are
4
+ permitted provided that the following conditions are met:
5
+
6
+ * Redistributions of source code must retain the above copyright notice, this list of
7
+ conditions and the following disclaimer.
8
+
9
+ * Redistributions in binary form must reproduce the above copyright notice, this list
10
+ of conditions and the following disclaimer in the documentation and/or other materials
11
+ provided with the distribution.
12
+
13
+ * Neither the name of Ryan Parman, Foleeo Inc. nor the names of its contributors may be used to
14
+ endorse or promote products derived from this software without specific prior written
15
+ permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
18
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
20
+ AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25
+ POSSIBILITY OF SUCH DAMAGE.
app/libs/aws/lib/cachecore/README CHANGED
@@ -1 +1 @@
1
- A simple caching system for PHP5 that provides a single interface for a variety of storage types.
1
+ A simple caching system for PHP5 that provides a single interface for a variety of storage types.
app/libs/aws/lib/cachecore/_sql/README CHANGED
@@ -1,5 +1,5 @@
1
- The .sql files in this directory contain the code to create the tables for database caching.
2
-
3
- If you're not using database caching, you can safely ignore these.
4
-
5
- If you ARE using database caching, simply load the correct *.sql file into your database to set up the required tables.
1
+ The .sql files in this directory contain the code to create the tables for database caching.
2
+
3
+ If you're not using database caching, you can safely ignore these.
4
+
5
+ If you ARE using database caching, simply load the correct *.sql file into your database to set up the required tables.
app/libs/aws/lib/cachecore/_sql/mysql.sql CHANGED
@@ -1,7 +1,7 @@
1
- CREATE TABLE `cache` (
2
- `id` char(40) NOT NULL default '',
3
- `expires` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
4
- `data` longtext,
5
- PRIMARY KEY (`id`),
6
- UNIQUE KEY `id` (`id`)
7
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8
1
+ CREATE TABLE `cache` (
2
+ `id` char(40) NOT NULL default '',
3
+ `expires` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
4
+ `data` longtext,
5
+ PRIMARY KEY (`id`),
6
+ UNIQUE KEY `id` (`id`)
7
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8
app/libs/aws/lib/cachecore/_sql/pgsql.sql CHANGED
@@ -1,6 +1,6 @@
1
- CREATE TABLE "cache" (
2
- expires timestamp without time zone NOT NULL,
3
- id character(40) NOT NULL,
4
- data text NOT NULL
5
- )
6
  WITH (OIDS=TRUE);
1
+ CREATE TABLE "cache" (
2
+ expires timestamp without time zone NOT NULL,
3
+ id character(40) NOT NULL,
4
+ data text NOT NULL
5
+ )
6
  WITH (OIDS=TRUE);
app/libs/aws/lib/cachecore/_sql/sqlite3.sql CHANGED
@@ -1,2 +1,2 @@
1
- CREATE TABLE cache (id TEXT, expires NUMERIC, data BLOB);
2
  CREATE UNIQUE INDEX idx ON cache(id ASC);
1
+ CREATE TABLE cache (id TEXT, expires NUMERIC, data BLOB);
2
  CREATE UNIQUE INDEX idx ON cache(id ASC);
app/libs/aws/lib/cachecore/cacheapc.class.php CHANGED
@@ -1,119 +1,119 @@
1
- <?php
2
- /**
3
- * Container for all APC-based cache methods. Inherits additional methods from <CacheCore>. Adheres
4
- * to the ICacheCore interface.
5
- *
6
- * @version 2009.10.10
7
- * @copyright 2006-2010 Ryan Parman
8
- * @copyright 2006-2010 Foleeo, Inc.
9
- * @copyright 2008-2010 Contributors
10
- * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
- * @link http://github.com/skyzyx/cachecore CacheCore
12
- * @link http://getcloudfusion.com CloudFusion
13
- * @link http://php.net/apc APC
14
- */
15
- class CacheAPC extends CacheCore implements ICacheCore
16
- {
17
-
18
- /*%******************************************************************************************%*/
19
- // CONSTRUCTOR
20
-
21
- /**
22
- * Constructs a new instance of this class.
23
- *
24
- * @param string $name (Required) A name to uniquely identify the cache object.
25
- * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
26
- * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
27
- * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
28
- * @return object Reference to the cache object.
29
- */
30
- public function __construct($name, $location, $expires, $gzip = true)
31
- {
32
- parent::__construct($name, null, $expires, $gzip);
33
- $this->id = $this->name;
34
- }
35
-
36
- /**
37
- * Creates a new cache.
38
- *
39
- * @param mixed $data (Required) The data to cache.
40
- * @return boolean Whether the operation was successful.
41
- */
42
- public function create($data)
43
- {
44
- $data = serialize($data);
45
- $data = $this->gzip ? gzcompress($data) : $data;
46
-
47
- return apc_add($this->id, $data, $this->expires);
48
- }
49
-
50
- /**
51
- * Reads a cache.
52
- *
53
- * @return mixed Either the content of the cache object, or boolean `false`.
54
- */
55
- public function read()
56
- {
57
- if ($data = apc_fetch($this->id))
58
- {
59
- $data = $this->gzip ? gzuncompress($data) : $data;
60
- return unserialize($data);
61
- }
62
-
63
- return false;
64
- }
65
-
66
- /**
67
- * Updates an existing cache.
68
- *
69
- * @param mixed $data (Required) The data to cache.
70
- * @return boolean Whether the operation was successful.
71
- */
72
- public function update($data)
73
- {
74
- $data = serialize($data);
75
- $data = $this->gzip ? gzcompress($data) : $data;
76
-
77
- return apc_store($this->id, $data, $this->expires);
78
- }
79
-
80
- /**
81
- * Deletes a cache.
82
- *
83
- * @return boolean Whether the operation was successful.
84
- */
85
- public function delete()
86
- {
87
- return apc_delete($this->id);
88
- }
89
-
90
- /**
91
- * Implemented here, but always returns `false`. APC manages its own expirations.
92
- *
93
- * @return boolean Whether the cache is expired or not.
94
- */
95
- public function is_expired()
96
- {
97
- return false;
98
- }
99
-
100
- /**
101
- * Implemented here, but always returns `false`. APC manages its own expirations.
102
- *
103
- * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`.
104
- */
105
- public function timestamp()
106
- {
107
- return false;
108
- }
109
-
110
- /**
111
- * Implemented here, but always returns `false`. APC manages its own expirations.
112
- *
113
- * @return boolean Whether the operation was successful.
114
- */
115
- public function reset()
116
- {
117
- return false;
118
- }
119
- }
1
+ <?php
2
+ /**
3
+ * Container for all APC-based cache methods. Inherits additional methods from <CacheCore>. Adheres
4
+ * to the ICacheCore interface.
5
+ *
6
+ * @version 2009.10.10
7
+ * @copyright 2006-2010 Ryan Parman
8
+ * @copyright 2006-2010 Foleeo, Inc.
9
+ * @copyright 2008-2010 Contributors
10
+ * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
+ * @link http://github.com/skyzyx/cachecore CacheCore
12
+ * @link http://getcloudfusion.com CloudFusion
13
+ * @link http://php.net/apc APC
14
+ */
15
+ class CacheAPC extends CacheCore implements ICacheCore
16
+ {
17
+
18
+ /*%******************************************************************************************%*/
19
+ // CONSTRUCTOR
20
+
21
+ /**
22
+ * Constructs a new instance of this class.
23
+ *
24
+ * @param string $name (Required) A name to uniquely identify the cache object.
25
+ * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
26
+ * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
27
+ * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
28
+ * @return object Reference to the cache object.
29
+ */
30
+ public function __construct($name, $location, $expires, $gzip = true)
31
+ {
32
+ parent::__construct($name, null, $expires, $gzip);
33
+ $this->id = $this->name;
34
+ }
35
+
36
+ /**
37
+ * Creates a new cache.
38
+ *
39
+ * @param mixed $data (Required) The data to cache.
40
+ * @return boolean Whether the operation was successful.
41
+ */
42
+ public function create($data)
43
+ {
44
+ $data = serialize($data);
45
+ $data = $this->gzip ? gzcompress($data) : $data;
46
+
47
+ return apc_add($this->id, $data, $this->expires);
48
+ }
49
+
50
+ /**
51
+ * Reads a cache.
52
+ *
53
+ * @return mixed Either the content of the cache object, or boolean `false`.
54
+ */
55
+ public function read()
56
+ {
57
+ if ($data = apc_fetch($this->id))
58
+ {
59
+ $data = $this->gzip ? gzuncompress($data) : $data;
60
+ return unserialize($data);
61
+ }
62
+
63
+ return false;
64
+ }
65
+
66
+ /**
67
+ * Updates an existing cache.
68
+ *
69
+ * @param mixed $data (Required) The data to cache.
70
+ * @return boolean Whether the operation was successful.
71
+ */
72
+ public function update($data)
73
+ {
74
+ $data = serialize($data);
75
+ $data = $this->gzip ? gzcompress($data) : $data;
76
+
77
+ return apc_store($this->id, $data, $this->expires);
78
+ }
79
+
80
+ /**
81
+ * Deletes a cache.
82
+ *
83
+ * @return boolean Whether the operation was successful.
84
+ */
85
+ public function delete()
86
+ {
87
+ return apc_delete($this->id);
88
+ }
89
+
90
+ /**
91
+ * Implemented here, but always returns `false`. APC manages its own expirations.
92
+ *
93
+ * @return boolean Whether the cache is expired or not.
94
+ */
95
+ public function is_expired()
96
+ {
97
+ return false;
98
+ }
99
+
100
+ /**
101
+ * Implemented here, but always returns `false`. APC manages its own expirations.
102
+ *
103
+ * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`.
104
+ */
105
+ public function timestamp()
106
+ {
107
+ return false;
108
+ }
109
+
110
+ /**
111
+ * Implemented here, but always returns `false`. APC manages its own expirations.
112
+ *
113
+ * @return boolean Whether the operation was successful.
114
+ */
115
+ public function reset()
116
+ {
117
+ return false;
118
+ }
119
+ }
app/libs/aws/lib/cachecore/cachecore.class.php CHANGED
@@ -1,141 +1,141 @@
1
- <?php
2
- /**
3
- * Container for all shared caching methods. This is not intended to be instantiated directly, but is
4
- * extended by the cache-specific classes.
5
- *
6
- * @version 2010.10.13
7
- * @copyright 2006-2010 Ryan Parman
8
- * @copyright 2006-2010 Foleeo, Inc.
9
- * @copyright 2008-2010 Contributors
10
- * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
- * @link http://github.com/skyzyx/cachecore CacheCore
12
- * @link http://getcloudfusion.com CloudFusion
13
- */
14
- class CacheCore
15
- {
16
- /**
17
- * A name to uniquely identify the cache object by.
18
- */
19
- var $name;
20
-
21
- /**
22
- * Where to store the cache.
23
- */
24
- var $location;
25
-
26
- /**
27
- * The number of seconds before a cache object is considered stale.
28
- */
29
- var $expires;
30
-
31
- /**
32
- * Used internally to uniquely identify the location + name of the cache object.
33
- */
34
- var $id;
35
-
36
- /**
37
- * Stores the time when the cache object was created.
38
- */
39
- var $timestamp;
40
-
41
- /**
42
- * Stores whether or not the content should be gzipped when stored
43
- */
44
- var $gzip;
45
-
46
-
47
- /*%******************************************************************************************%*/
48
- // CONSTRUCTOR
49
-
50
- /**
51
- * Constructs a new instance of this class.
52
- *
53
- * @param string $name (Required) A name to uniquely identify the cache object.
54
- * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
55
- * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
56
- * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
57
- * @return object Reference to the cache object.
58
- */
59
- public function __construct($name, $location, $expires, $gzip = true)
60
- {
61
- if (!extension_loaded('zlib'))
62
- {
63
- $gzip = false;
64
- }
65
-
66
- $this->name = $name;
67
- $this->location = $location;
68
- $this->expires = $expires;
69
- $this->gzip = $gzip;
70
-
71
- return $this;
72
- }
73
-
74
- /**
75
- * Allows for chaining from the constructor. Requires PHP 5.3 or newer.
76
- *
77
- * @param string $name (Required) A name to uniquely identify the cache object.
78
- * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
79
- * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
80
- * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
81
- * @return object Reference to the cache object.
82
- */
83
- public static function init($name, $location, $expires, $gzip = true)
84
- {
85
- if (version_compare(PHP_VERSION, '5.3.0', '<'))
86
- {
87
- throw new Exception('PHP 5.3 or newer is required to use CacheCore::init().');
88
- }
89
-
90
- $self = get_called_class();
91
- return new $self($name, $location, $expires, $gzip);
92
- }
93
-
94
- /**
95
- * Provides a simple, straightforward cache-logic mechanism. Useful for non-complex response caches.
96
- *
97
- * @param string|function $callback (Required) The name of the function to fire when we need to fetch new data to cache.
98
- * @param array params (Optional) Parameters to pass into the callback function, as an array.
99
- * @return array The cached data being requested.
100
- */
101
- public function response_manager($callback, $params = null)
102
- {
103
- // Automatically handle $params values.
104
- $params = is_array($params) ? $params : array($params);
105
-
106
- if ($data = $this->read())
107
- {
108
- if ($this->is_expired())
109
- {
110
- if ($data = call_user_func_array($callback, $params))
111
- {
112
- $this->update($data);
113
- }
114
- else
115
- {
116
- $this->reset();
117
- $data = $this->read();
118
- }
119
- }
120
- }
121
- else
122
- {
123
- if ($data = call_user_func_array($callback, $params))
124
- {
125
- $this->create($data);
126
- }
127
- }
128
-
129
- return $data;
130
- }
131
- }
132
-
133
-
134
- /*%******************************************************************************************%*/
135
- // CORE DEPENDENCIES
136
-
137
- // Include the ICacheCore interface.
138
- if (file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'icachecore.interface.php'))
139
- {
140
- include_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'icachecore.interface.php';
141
- }
1
+ <?php
2
+ /**
3
+ * Container for all shared caching methods. This is not intended to be instantiated directly, but is
4
+ * extended by the cache-specific classes.
5
+ *
6
+ * @version 2010.10.13
7
+ * @copyright 2006-2010 Ryan Parman
8
+ * @copyright 2006-2010 Foleeo, Inc.
9
+ * @copyright 2008-2010 Contributors
10
+ * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
+ * @link http://github.com/skyzyx/cachecore CacheCore
12
+ * @link http://getcloudfusion.com CloudFusion
13
+ */
14
+ class CacheCore
15
+ {
16
+ /**
17
+ * A name to uniquely identify the cache object by.
18
+ */
19
+ var $name;
20
+
21
+ /**
22
+ * Where to store the cache.
23
+ */
24
+ var $location;
25
+
26
+ /**
27
+ * The number of seconds before a cache object is considered stale.
28
+ */
29
+ var $expires;
30
+
31
+ /**
32
+ * Used internally to uniquely identify the location + name of the cache object.
33
+ */
34
+ var $id;
35
+
36
+ /**
37
+ * Stores the time when the cache object was created.
38
+ */
39
+ var $timestamp;
40
+
41
+ /**
42
+ * Stores whether or not the content should be gzipped when stored
43
+ */
44
+ var $gzip;
45
+
46
+
47
+ /*%******************************************************************************************%*/
48
+ // CONSTRUCTOR
49
+
50
+ /**
51
+ * Constructs a new instance of this class.
52
+ *
53
+ * @param string $name (Required) A name to uniquely identify the cache object.
54
+ * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
55
+ * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
56
+ * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
57
+ * @return object Reference to the cache object.
58
+ */
59
+ public function __construct($name, $location, $expires, $gzip = true)
60
+ {
61
+ if (!extension_loaded('zlib'))
62
+ {
63
+ $gzip = false;
64
+ }
65
+
66
+ $this->name = $name;
67
+ $this->location = $location;
68
+ $this->expires = $expires;
69
+ $this->gzip = $gzip;
70
+
71
+ return $this;
72
+ }
73
+
74
+ /**
75
+ * Allows for chaining from the constructor. Requires PHP 5.3 or newer.
76
+ *
77
+ * @param string $name (Required) A name to uniquely identify the cache object.
78
+ * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
79
+ * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
80
+ * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
81
+ * @return object Reference to the cache object.
82
+ */
83
+ public static function init($name, $location, $expires, $gzip = true)
84
+ {
85
+ if (version_compare(PHP_VERSION, '5.3.0', '<'))
86
+ {
87
+ throw new Exception('PHP 5.3 or newer is required to use CacheCore::init().');
88
+ }
89
+
90
+ $self = get_called_class();
91
+ return new $self($name, $location, $expires, $gzip);
92
+ }
93
+
94
+ /**
95
+ * Provides a simple, straightforward cache-logic mechanism. Useful for non-complex response caches.
96
+ *
97
+ * @param string|function $callback (Required) The name of the function to fire when we need to fetch new data to cache.
98
+ * @param array params (Optional) Parameters to pass into the callback function, as an array.
99
+ * @return array The cached data being requested.
100
+ */
101
+ public function response_manager($callback, $params = null)
102
+ {
103
+ // Automatically handle $params values.
104
+ $params = is_array($params) ? $params : array($params);
105
+
106
+ if ($data = $this->read())
107
+ {
108
+ if ($this->is_expired())
109
+ {
110
+ if ($data = call_user_func_array($callback, $params))
111
+ {
112
+ $this->update($data);
113
+ }
114
+ else
115
+ {
116
+ $this->reset();
117
+ $data = $this->read();
118
+ }
119
+ }
120
+ }
121
+ else
122
+ {
123
+ if ($data = call_user_func_array($callback, $params))
124
+ {
125
+ $this->create($data);
126
+ }
127
+ }
128
+
129
+ return $data;
130
+ }
131
+ }
132
+
133
+
134
+ /*%******************************************************************************************%*/
135
+ // CORE DEPENDENCIES
136
+
137
+ // Include the ICacheCore interface.
138
+ if (file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'icachecore.interface.php'))
139
+ {
140
+ include_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'icachecore.interface.php';
141
+ }
app/libs/aws/lib/cachecore/cachefile.class.php CHANGED
@@ -1,170 +1,170 @@
1
- <?php
2
- /**
3
- * Container for all file-based cache methods. Inherits additional methods from <CacheCore>. Adheres
4
- * to the ICacheCore interface.
5
- *
6
- * @version 2009.10.10
7
- * @copyright 2006-2010 Ryan Parman
8
- * @copyright 2006-2010 Foleeo, Inc.
9
- * @copyright 2008-2010 Contributors
10
- * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
- * @link http://github.com/skyzyx/cachecore CacheCore
12
- * @link http://getcloudfusion.com CloudFusion
13
- */
14
- class CacheFile extends CacheCore implements ICacheCore
15
- {
16
-
17
- /*%******************************************************************************************%*/
18
- // CONSTRUCTOR
19
-
20
- /**
21
- * Constructs a new instance of this class.
22
- *
23
- * @param string $name (Required) A name to uniquely identify the cache object.
24
- * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
25
- * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
26
- * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
27
- * @return object Reference to the cache object.
28
- */
29
- public function __construct($name, $location, $expires, $gzip = true)
30
- {
31
- parent::__construct($name, $location, $expires, $gzip);
32
- $this->id = $this->location . '/' . $this->name . '.cache';
33
- }
34
-
35
- /**
36
- * Creates a new cache.
37
- *
38
- * @param mixed $data (Required) The data to cache.
39
- * @return boolean Whether the operation was successful.
40
- */
41
- public function create($data)
42
- {
43
- if (file_exists($this->id))
44
- {
45
- return false;
46
- }
47
- elseif (file_exists($this->location) && is_writeable($this->location))
48
- {
49
- $data = serialize($data);
50
- $data = $this->gzip ? gzcompress($data) : $data;
51
-
52
- return (bool) file_put_contents($this->id, $data);
53
- }
54
-
55
- return false;
56
- }
57
-
58
- /**
59
- * Reads a cache.
60
- *
61
- * @return mixed Either the content of the cache object, or boolean `false`.
62
- */
63
- public function read()
64
- {
65
- if (file_exists($this->id) && is_readable($this->id))
66
- {
67
- $data = file_get_contents($this->id);
68
- $data = $this->gzip ? gzuncompress($data) : $data;
69
- $data = unserialize($data);
70
-
71
- if ($data === false)
72
- {
73
- /*
74
- This should only happen when someone changes the gzip settings and there is
75
- existing data or someone has been mucking about in the cache folder manually.
76
- Delete the bad entry since the file cache doesn't clean up after itself and
77
- then return false so fresh data will be retrieved.
78
- */
79
- $this->delete();
80
- return false;
81
- }
82
-
83
- return $data;
84
- }
85
-
86
- return false;
87
- }
88
-
89
- /**
90
- * Updates an existing cache.
91
- *
92
- * @param mixed $data (Required) The data to cache.
93
- * @return boolean Whether the operation was successful.
94
- */
95
- public function update($data)
96
- {
97
- if (file_exists($this->id) && is_writeable($this->id))
98
- {
99
- $data = serialize($data);
100
- $data = $this->gzip ? gzcompress($data) : $data;
101
-
102
- return (bool) file_put_contents($this->id, $data);
103
- }
104
-
105
- return false;
106
- }
107
-
108
- /**
109
- * Deletes a cache.
110
- *
111
- * @return boolean Whether the operation was successful.
112
- */
113
- public function delete()
114
- {
115
- if (file_exists($this->id))
116
- {
117
- return unlink($this->id);
118
- }
119
-
120
- return false;
121
- }
122
-
123
- /**
124
- * Checks whether the cache object is expired or not.
125
- *
126
- * @return boolean Whether the cache is expired or not.
127
- */
128
- public function is_expired()
129
- {
130
- if ($this->timestamp() + $this->expires < time())
131
- {
132
- return true;
133
- }
134
-
135
- return false;
136
- }
137
-
138
- /**
139
- * Retrieves the timestamp of the cache.
140
- *
141
- * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`.
142
- */
143
- public function timestamp()
144
- {
145
- clearstatcache();
146
-
147
- if (file_exists($this->id))
148
- {
149
- $this->timestamp = filemtime($this->id);
150
- return $this->timestamp;
151
- }
152
-
153
- return false;
154
- }
155
-
156
- /**
157
- * Resets the freshness of the cache.
158
- *
159
- * @return boolean Whether the operation was successful.
160
- */
161
- public function reset()
162
- {
163
- if (file_exists($this->id))
164
- {
165
- return touch($this->id);
166
- }
167
-
168
- return false;
169
- }
170
- }
1
+ <?php
2
+ /**
3
+ * Container for all file-based cache methods. Inherits additional methods from <CacheCore>. Adheres
4
+ * to the ICacheCore interface.
5
+ *
6
+ * @version 2009.10.10
7
+ * @copyright 2006-2010 Ryan Parman
8
+ * @copyright 2006-2010 Foleeo, Inc.
9
+ * @copyright 2008-2010 Contributors
10
+ * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
+ * @link http://github.com/skyzyx/cachecore CacheCore
12
+ * @link http://getcloudfusion.com CloudFusion
13
+ */
14
+ class CacheFile extends CacheCore implements ICacheCore
15
+ {
16
+
17
+ /*%******************************************************************************************%*/
18
+ // CONSTRUCTOR
19
+
20
+ /**
21
+ * Constructs a new instance of this class.
22
+ *
23
+ * @param string $name (Required) A name to uniquely identify the cache object.
24
+ * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
25
+ * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
26
+ * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
27
+ * @return object Reference to the cache object.
28
+ */
29
+ public function __construct($name, $location, $expires, $gzip = true)
30
+ {
31
+ parent::__construct($name, $location, $expires, $gzip);
32
+ $this->id = $this->location . '/' . $this->name . '.cache';
33
+ }
34
+
35
+ /**
36
+ * Creates a new cache.
37
+ *
38
+ * @param mixed $data (Required) The data to cache.
39
+ * @return boolean Whether the operation was successful.
40
+ */
41
+ public function create($data)
42
+ {
43
+ if (file_exists($this->id))
44
+ {
45
+ return false;
46
+ }
47
+ elseif (file_exists($this->location) && is_writeable($this->location))
48
+ {
49
+ $data = serialize($data);
50
+ $data = $this->gzip ? gzcompress($data) : $data;
51
+
52
+ return (bool) file_put_contents($this->id, $data);
53
+ }
54
+
55
+ return false;
56
+ }
57
+
58
+ /**
59
+ * Reads a cache.
60
+ *
61
+ * @return mixed Either the content of the cache object, or boolean `false`.
62
+ */
63
+ public function read()
64
+ {
65
+ if (file_exists($this->id) && is_readable($this->id))
66
+ {
67
+ $data = file_get_contents($this->id);
68
+ $data = $this->gzip ? gzuncompress($data) : $data;
69
+ $data = unserialize($data);
70
+
71
+ if ($data === false)
72
+ {
73
+ /*
74
+ This should only happen when someone changes the gzip settings and there is
75
+ existing data or someone has been mucking about in the cache folder manually.
76
+ Delete the bad entry since the file cache doesn't clean up after itself and
77
+ then return false so fresh data will be retrieved.
78
+ */
79
+ $this->delete();
80
+ return false;
81
+ }
82
+
83
+ return $data;
84
+ }
85
+
86
+ return false;
87
+ }
88
+
89
+ /**
90
+ * Updates an existing cache.
91
+ *
92
+ * @param mixed $data (Required) The data to cache.
93
+ * @return boolean Whether the operation was successful.
94
+ */
95
+ public function update($data)
96
+ {
97
+ if (file_exists($this->id) && is_writeable($this->id))
98
+ {
99
+ $data = serialize($data);
100
+ $data = $this->gzip ? gzcompress($data) : $data;
101
+
102
+ return (bool) file_put_contents($this->id, $data);
103
+ }
104
+
105
+ return false;
106
+ }
107
+
108
+ /**
109
+ * Deletes a cache.
110
+ *
111
+ * @return boolean Whether the operation was successful.
112
+ */
113
+ public function delete()
114
+ {
115
+ if (file_exists($this->id))
116
+ {
117
+ return unlink($this->id);
118
+ }
119
+
120
+ return false;
121
+ }
122
+
123
+ /**
124
+ * Checks whether the cache object is expired or not.
125
+ *
126
+ * @return boolean Whether the cache is expired or not.
127
+ */
128
+ public function is_expired()
129
+ {
130
+ if ($this->timestamp() + $this->expires < time())
131
+ {
132
+ return true;
133
+ }
134
+
135
+ return false;
136
+ }
137
+
138
+ /**
139
+ * Retrieves the timestamp of the cache.
140
+ *
141
+ * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`.
142
+ */
143
+ public function timestamp()
144
+ {
145
+ clearstatcache();
146
+
147
+ if (file_exists($this->id))
148
+ {
149
+ $this->timestamp = filemtime($this->id);
150
+ return $this->timestamp;
151
+ }
152
+
153
+ return false;
154
+ }
155
+
156
+ /**
157
+ * Resets the freshness of the cache.
158
+ *
159
+ * @return boolean Whether the operation was successful.
160
+ */
161
+ public function reset()
162
+ {
163
+ if (file_exists($this->id))
164
+ {
165
+ return touch($this->id);
166
+ }
167
+
168
+ return false;
169
+ }
170
+ }
app/libs/aws/lib/cachecore/cachemc.class.php CHANGED
@@ -1,176 +1,176 @@
1
- <?php
2
- /**
3
- * Container for all Memcache-based cache methods. Inherits additional methods from <CacheCore>. Adheres
4
- * to the ICacheCore interface.
5
- *
6
- * @version 2010.05.17
7
- * @copyright 2006-2010 Ryan Parman
8
- * @copyright 2006-2010 Foleeo, Inc.
9
- * @copyright 2008-2010 Contributors
10
- * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
- * @link http://github.com/skyzyx/cachecore CacheCore
12
- * @link http://getcloudfusion.com CloudFusion
13
- * @link http://php.net/memcache Memcache
14
- * @link http://php.net/memcached Memcached
15
- */
16
- class CacheMC extends CacheCore implements ICacheCore
17
- {
18
- /**
19
- * Holds the Memcache object.
20
- */
21
- var $memcache = null;
22
-
23
- /**
24
- * Whether the Memcached extension is being used (as opposed to Memcache).
25
- */
26
- var $is_memcached = false;
27
-
28
-
29
- /*%******************************************************************************************%*/
30
- // CONSTRUCTOR
31
-
32
- /**
33
- * Constructs a new instance of this class.
34
- *
35
- * @param string $name (Required) A name to uniquely identify the cache object.
36
- * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
37
- * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
38
- * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
39
- * @return object Reference to the cache object.
40
- */
41
- public function __construct($name, $location, $expires, $gzip = true)
42
- {
43
- parent::__construct($name, null, $expires, $gzip);
44
- $this->id = $this->name;
45
-
46
- // Prefer Memcached over Memcache.
47
- if (class_exists('Memcached'))
48
- {
49
- $this->memcache = new Memcached();
50
- $this->is_memcached = true;
51
- }
52
- elseif (class_exists('Memcache'))
53
- {
54
- $this->memcache = new Memcache();
55
- }
56
- else
57
- {
58
- return false;
59
- }
60
-
61
- // Enable compression, if available
62
- if ($this->gzip)
63
- {
64
- if ($this->is_memcached)
65
- {
66
- $this->memcache->setOption(Memcached::OPT_COMPRESSION, true);
67
- }
68
- else
69
- {
70
- $this->gzip = MEMCACHE_COMPRESSED;
71
- }
72
- }
73
-
74
- // Process Memcached servers.
75
- if (isset($location) && sizeof($location) > 0)
76
- {
77
- foreach ($location as $loc)
78
- {
79
- if (isset($loc['port']) && !empty($loc['port']))
80
- {
81
- $this->memcache->addServer($loc['host'], $loc['port']);
82
- }
83
- else
84
- {
85
- $this->memcache->addServer($loc['host'], 11211);
86
- }
87
- }
88
- }
89
-
90
- return $this;
91
- }
92
-
93
- /**
94
- * Creates a new cache.
95
- *
96
- * @param mixed $data (Required) The data to cache.
97
- * @return boolean Whether the operation was successful.
98
- */
99
- public function create($data)
100
- {
101
- if ($this->is_memcached)
102
- {
103
- return $this->memcache->set($this->id, $data, $this->expires);
104
- }
105
- return $this->memcache->set($this->id, $data, $this->gzip, $this->expires);
106
- }
107
-
108
- /**
109
- * Reads a cache.
110
- *
111
- * @return mixed Either the content of the cache object, or boolean `false`.
112
- */
113
- public function read()
114
- {
115
- if ($this->is_memcached)
116
- {
117
- return $this->memcache->get($this->id);
118
- }
119
- return $this->memcache->get($this->id, $this->gzip);
120
- }
121
-
122
- /**
123
- * Updates an existing cache.
124
- *
125
- * @param mixed $data (Required) The data to cache.
126
- * @return boolean Whether the operation was successful.
127
- */
128
- public function update($data)
129
- {
130
- if ($this->is_memcached)
131
- {
132
- return $this->memcache->replace($this->id, $data, $this->expires);
133
- }
134
- return $this->memcache->replace($this->id, $data, $this->gzip, $this->expires);
135
- }
136
-
137
- /**
138
- * Deletes a cache.
139
- *
140
- * @return boolean Whether the operation was successful.
141
- */
142
- public function delete()
143
- {
144
- return $this->memcache->delete($this->id);
145
- }
146
-
147
- /**
148
- * Implemented here, but always returns `false`. Memcache manages its own expirations.
149
- *
150
- * @return boolean Whether the cache is expired or not.
151
- */
152
- public function is_expired()
153
- {
154
- return false;
155
- }
156
-
157
- /**
158
- * Implemented here, but always returns `false`. Memcache manages its own expirations.
159
- *
160
- * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`.
161
- */
162
- public function timestamp()
163
- {
164
- return false;
165
- }
166
-
167
- /**
168
- * Implemented here, but always returns `false`. Memcache manages its own expirations.
169
- *
170
- * @return boolean Whether the operation was successful.
171
- */
172
- public function reset()
173
- {
174
- return false;
175
- }
176
- }
1
+ <?php
2
+ /**
3
+ * Container for all Memcache-based cache methods. Inherits additional methods from <CacheCore>. Adheres
4
+ * to the ICacheCore interface.
5
+ *
6
+ * @version 2010.05.17
7
+ * @copyright 2006-2010 Ryan Parman
8
+ * @copyright 2006-2010 Foleeo, Inc.
9
+ * @copyright 2008-2010 Contributors
10
+ * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
+ * @link http://github.com/skyzyx/cachecore CacheCore
12
+ * @link http://getcloudfusion.com CloudFusion
13
+ * @link http://php.net/memcache Memcache
14
+ * @link http://php.net/memcached Memcached
15
+ */
16
+ class CacheMC extends CacheCore implements ICacheCore
17
+ {
18
+ /**
19
+ * Holds the Memcache object.
20
+ */
21
+ var $memcache = null;
22
+
23
+ /**
24
+ * Whether the Memcached extension is being used (as opposed to Memcache).
25
+ */
26
+ var $is_memcached = false;
27
+
28
+
29
+ /*%******************************************************************************************%*/
30
+ // CONSTRUCTOR
31
+
32
+ /**
33
+ * Constructs a new instance of this class.
34
+ *
35
+ * @param string $name (Required) A name to uniquely identify the cache object.
36
+ * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
37
+ * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
38
+ * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
39
+ * @return object Reference to the cache object.
40
+ */
41
+ public function __construct($name, $location, $expires, $gzip = true)
42
+ {
43
+ parent::__construct($name, null, $expires, $gzip);
44
+ $this->id = $this->name;
45
+
46
+ // Prefer Memcached over Memcache.
47
+ if (class_exists('Memcached'))
48
+ {
49
+ $this->memcache = new Memcached();
50
+ $this->is_memcached = true;
51
+ }
52
+ elseif (class_exists('Memcache'))
53
+ {
54
+ $this->memcache = new Memcache();
55
+ }
56
+ else
57
+ {
58
+ return false;
59
+ }
60
+
61
+ // Enable compression, if available
62
+ if ($this->gzip)
63
+ {
64
+ if ($this->is_memcached)
65
+ {
66
+ $this->memcache->setOption(Memcached::OPT_COMPRESSION, true);
67
+ }
68
+ else
69
+ {
70
+ $this->gzip = MEMCACHE_COMPRESSED;
71
+ }
72
+ }
73
+
74
+ // Process Memcached servers.
75
+ if (isset($location) && sizeof($location) > 0)
76
+ {
77
+ foreach ($location as $loc)
78
+ {
79
+ if (isset($loc['port']) && !empty($loc['port']))
80
+ {
81
+ $this->memcache->addServer($loc['host'], $loc['port']);
82
+ }
83
+ else
84
+ {
85
+ $this->memcache->addServer($loc['host'], 11211);
86
+ }
87
+ }
88
+ }
89
+
90
+ return $this;
91
+ }
92
+
93
+ /**
94
+ * Creates a new cache.
95
+ *
96
+ * @param mixed $data (Required) The data to cache.
97
+ * @return boolean Whether the operation was successful.
98
+ */
99
+ public function create($data)
100
+ {
101
+ if ($this->is_memcached)
102
+ {
103
+ return $this->memcache->set($this->id, $data, $this->expires);
104
+ }
105
+ return $this->memcache->set($this->id, $data, $this->gzip, $this->expires);
106
+ }
107
+
108
+ /**
109
+ * Reads a cache.
110
+ *
111
+ * @return mixed Either the content of the cache object, or boolean `false`.
112
+ */
113
+ public function read()
114
+ {
115
+ if ($this->is_memcached)
116
+ {
117
+ return $this->memcache->get($this->id);
118
+ }
119
+ return $this->memcache->get($this->id, $this->gzip);
120
+ }
121
+
122
+ /**
123
+ * Updates an existing cache.
124
+ *
125
+ * @param mixed $data (Required) The data to cache.
126
+ * @return boolean Whether the operation was successful.
127
+ */
128
+ public function update($data)
129
+ {
130
+ if ($this->is_memcached)
131
+ {
132
+ return $this->memcache->replace($this->id, $data, $this->expires);
133
+ }
134
+ return $this->memcache->replace($this->id, $data, $this->gzip, $this->expires);
135
+ }
136
+
137
+ /**
138
+ * Deletes a cache.
139
+ *
140
+ * @return boolean Whether the operation was successful.
141
+ */
142
+ public function delete()
143
+ {
144
+ return $this->memcache->delete($this->id);
145
+ }
146
+
147
+ /**
148
+ * Implemented here, but always returns `false`. Memcache manages its own expirations.
149
+ *
150
+ * @return boolean Whether the cache is expired or not.
151
+ */
152
+ public function is_expired()
153
+ {
154
+ return false;
155
+ }
156
+
157
+ /**
158
+ * Implemented here, but always returns `false`. Memcache manages its own expirations.
159
+ *
160
+ * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`.
161
+ */
162
+ public function timestamp()
163
+ {
164
+ return false;
165
+ }
166
+
167
+ /**
168
+ * Implemented here, but always returns `false`. Memcache manages its own expirations.
169
+ *
170
+ * @return boolean Whether the operation was successful.
171
+ */
172
+ public function reset()
173
+ {
174
+ return false;
175
+ }
176
+ }
app/libs/aws/lib/cachecore/cachepdo.class.php CHANGED
@@ -1,290 +1,290 @@
1
- <?php
2
- /**
3
- * Container for all PDO-based cache methods. Inherits additional methods from <CacheCore>. Adheres
4
- * to the ICacheCore interface.
5
- *
6
- * @version 2009.10.10
7
- * @copyright 2006-2010 Ryan Parman
8
- * @copyright 2006-2010 Foleeo, Inc.
9
- * @copyright 2008-2010 Contributors
10
- * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
- * @link http://github.com/skyzyx/cachecore CacheCore
12
- * @link http://getcloudfusion.com CloudFusion
13
- * @link http://php.net/pdo PDO
14
- */
15
- class CachePDO extends CacheCore implements ICacheCore
16
- {
17
- /**
18
- * Reference to the PDO connection object.
19
- */
20
- var $pdo = null;
21
-
22
- /**
23
- * Holds the parsed URL components.
24
- */
25
- var $dsn = null;
26
-
27
- /**
28
- * Holds the PDO-friendly version of the connection string.
29
- */
30
- var $dsn_string = null;
31
-
32
- /**
33
- * Holds the prepared statement for creating an entry.
34
- */
35
- var $create = null;
36
-
37
- /**
38
- * Holds the prepared statement for reading an entry.
39
- */
40
- var $read = null;
41
-
42
- /**
43
- * Holds the prepared statement for updating an entry.
44
- */
45
- var $update = null;
46
-
47
- /**
48
- * Holds the prepared statement for resetting the expiry of an entry.
49
- */
50
- var $reset = null;
51
-
52
- /**
53
- * Holds the prepared statement for deleting an entry.
54
- */
55
- var $delete = null;
56
-
57
- /**
58
- * Holds the response of the read so we only need to fetch it once instead of doing
59
- * multiple queries.
60
- */
61
- var $store_read = null;
62
-
63
-
64
- /*%******************************************************************************************%*/
65
- // CONSTRUCTOR
66
-
67
- /**
68
- * Constructs a new instance of this class.
69
- *
70
- * Tested with [MySQL 5.0.x](http://mysql.com), [PostgreSQL](http://postgresql.com), and
71
- * [SQLite 3.x](http://sqlite.org). SQLite 2.x is assumed to work. No other PDO-supported databases have
72
- * been tested (e.g. Oracle, Microsoft SQL Server, IBM DB2, ODBC, Sybase, Firebird). Feel free to send
73
- * patches for additional database support.
74
- *
75
- * See <http://php.net/pdo> for more information.
76
- *
77
- * @param string $name (Required) A name to uniquely identify the cache object.
78
- * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
79
- * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
80
- * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
81
- * @return object Reference to the cache object.
82
- */
83
- public function __construct($name, $location, $expires, $gzip = true)
84
- {
85
- // Make sure the name is no longer than 40 characters.
86
- $name = sha1($name);
87
-
88
- // Call parent constructor and set id.
89
- parent::__construct($name, $location, $expires, $gzip);
90
- $this->id = $this->name;
91
- $options = array();
92
-
93
- // Check if the location contains :// (e.g. mysql://user:pass@hostname:port/table)
94
- if (stripos($location, '://') === false)
95
- {
96
- // No? Just pass it through.
97
- $this->dsn = parse_url($location);
98
- $this->dsn_string = $location;
99
- }
100
- else
101
- {
102
- // Yes? Parse and set the DSN
103
- $this->dsn = parse_url($location);
104
- $this->dsn_string = $this->dsn['scheme'] . ':host=' . $this->dsn['host'] . ((isset($this->dsn['port'])) ? ';port=' . $this->dsn['port'] : '') . ';dbname=' . substr($this->dsn['path'], 1);
105
- }
106
-
107
- // Make sure that user/pass are defined.
108
- $user = isset($this->dsn['user']) ? $this->dsn['user'] : null;
109
- $pass = isset($this->dsn['pass']) ? $this->dsn['pass'] : null;
110
-
111
- // Set persistence for databases that support it.
112
- switch ($this->dsn['scheme'])
113
- {
114
- case 'mysql': // MySQL
115
- case 'pgsql': // PostgreSQL
116
- $options[PDO::ATTR_PERSISTENT] = true;
117
- break;
118
- }
119
-
120
- // Instantiate a new PDO object with a persistent connection.
121
- $this->pdo = new PDO($this->dsn_string, $user, $pass, $options);
122
-
123
- // Define prepared statements for improved performance.
124
- $this->create = $this->pdo->prepare("INSERT INTO cache (id, expires, data) VALUES (:id, :expires, :data)");
125
- $this->read = $this->pdo->prepare("SELECT id, expires, data FROM cache WHERE id = :id");
126
- $this->reset = $this->pdo->prepare("UPDATE cache SET expires = :expires WHERE id = :id");
127
- $this->delete = $this->pdo->prepare("DELETE FROM cache WHERE id = :id");
128
- }
129
-
130
- /**
131
- * Creates a new cache.
132
- *
133
- * @param mixed $data (Required) The data to cache.
134
- * @return boolean Whether the operation was successful.
135
- */
136
- public function create($data)
137
- {
138
- $data = serialize($data);
139
- $data = $this->gzip ? gzcompress($data) : $data;
140
-
141
- $this->create->bindParam(':id', $this->id);
142
- $this->create->bindParam(':data', $data);
143
- $this->create->bindParam(':expires', $this->generate_timestamp());
144
-
145
- return (bool) $this->create->execute();
146
- }
147
-
148
- /**
149
- * Reads a cache.
150
- *
151
- * @return mixed Either the content of the cache object, or boolean `false`.
152
- */
153
- public function read()
154
- {
155
- if (!$this->store_read)
156
- {
157
- $this->read->bindParam(':id', $this->id);
158
- $this->read->execute();
159
- $this->store_read = $this->read->fetch(PDO::FETCH_ASSOC);
160
- }
161
-
162
- if ($this->store_read)
163
- {
164
- $data = $this->store_read['data'];
165
- $data = $this->gzip ? gzuncompress($data) : $data;
166
-
167
- return unserialize($data);
168
- }
169
-
170
- return false;
171
- }
172
-
173
- /**
174
- * Updates an existing cache.
175
- *
176
- * @param mixed $data (Required) The data to cache.
177
- * @return boolean Whether the operation was successful.
178
- */
179
- public function update($data)
180
- {
181
- $this->delete();
182
- return $this->create($data);
183
- }
184
-
185
- /**
186
- * Deletes a cache.
187
- *
188
- * @return boolean Whether the operation was successful.
189
- */
190
- public function delete()
191
- {
192
- $this->delete->bindParam(':id', $this->id);
193
- return $this->delete->execute();
194
- }
195
-
196
- /**
197
- * Checks whether the cache object is expired or not.
198
- *
199
- * @return boolean Whether the cache is expired or not.
200
- */
201
- public function is_expired()
202
- {
203
- if ($this->timestamp() + $this->expires < time())
204
- {
205
- return true;
206
- }
207
-
208
- return false;
209
- }
210
-
211
- /**
212
- * Retrieves the timestamp of the cache.
213
- *
214
- * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`.
215
- */
216
- public function timestamp()
217
- {
218
- if (!$this->store_read)
219
- {
220
- $this->read->bindParam(':id', $this->id);
221
- $this->read->execute();
222
- $this->store_read = $this->read->fetch(PDO::FETCH_ASSOC);
223
- }
224
-
225
- if ($this->store_read)
226
- {
227
- $value = $this->store_read['expires'];
228
-
229
- // If 'expires' isn't yet an integer, convert it into one.
230
- if (!is_numeric($value))
231
- {
232
- $value = strtotime($value);
233
- }
234
-
235
- $this->timestamp = date('U', $value);
236
- return $this->timestamp;
237
- }
238
-
239
- return false;
240
- }
241
-
242
- /**
243
- * Resets the freshness of the cache.
244
- *
245
- * @return boolean Whether the operation was successful.
246
- */
247
- public function reset()
248
- {
249
- $this->reset->bindParam(':id', $this->id);
250
- $this->reset->bindParam(':expires', $this->generate_timestamp());
251
- return (bool) $this->reset->execute();
252
- }
253
-
254
- /**
255
- * Returns a list of supported PDO database drivers. Identical to <PDO::getAvailableDrivers()>.
256
- *
257
- * @return array The list of supported database drivers.
258
- * @link http://php.net/pdo.getavailabledrivers PHP Method
259
- */
260
- public function get_drivers()
261
- {
262
- return PDO::getAvailableDrivers();
263
- }
264
-
265
- /**
266
- * Returns a timestamp value apropriate to the current database type.
267
- *
268
- * @return mixed Timestamp for MySQL and PostgreSQL, integer value for SQLite.
269
- */
270
- protected function generate_timestamp()
271
- {
272
- // Define 'expires' settings differently.
273
- switch ($this->dsn['scheme'])
274
- {
275
- // These support timestamps.
276
- case 'mysql': // MySQL
277
- case 'pgsql': // PostgreSQL
278
- $expires = date(DATE_FORMAT_MYSQL, time());
279
- break;
280
-
281
- // These support integers.
282
- case 'sqlite': // SQLite 3
283
- case 'sqlite2': // SQLite 2
284
- $expires = time();
285
- break;
286
- }
287
-
288
- return $expires;
289
- }
290
- }
1
+ <?php
2
+ /**
3
+ * Container for all PDO-based cache methods. Inherits additional methods from <CacheCore>. Adheres
4
+ * to the ICacheCore interface.
5
+ *
6
+ * @version 2009.10.10
7
+ * @copyright 2006-2010 Ryan Parman
8
+ * @copyright 2006-2010 Foleeo, Inc.
9
+ * @copyright 2008-2010 Contributors
10
+ * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
+ * @link http://github.com/skyzyx/cachecore CacheCore
12
+ * @link http://getcloudfusion.com CloudFusion
13
+ * @link http://php.net/pdo PDO
14
+ */
15
+ class CachePDO extends CacheCore implements ICacheCore
16
+ {
17
+ /**
18
+ * Reference to the PDO connection object.
19
+ */
20
+ var $pdo = null;
21
+
22
+ /**
23
+ * Holds the parsed URL components.
24
+ */
25
+ var $dsn = null;
26
+
27
+ /**
28
+ * Holds the PDO-friendly version of the connection string.
29
+ */
30
+ var $dsn_string = null;
31
+
32
+ /**
33
+ * Holds the prepared statement for creating an entry.
34
+ */
35
+ var $create = null;
36
+
37
+ /**
38
+ * Holds the prepared statement for reading an entry.
39
+ */
40
+ var $read = null;
41
+
42
+ /**
43
+ * Holds the prepared statement for updating an entry.
44
+ */
45
+ var $update = null;
46
+
47
+ /**
48
+ * Holds the prepared statement for resetting the expiry of an entry.
49
+ */
50
+ var $reset = null;
51
+
52
+ /**
53
+ * Holds the prepared statement for deleting an entry.
54
+ */
55
+ var $delete = null;
56
+
57
+ /**
58
+ * Holds the response of the read so we only need to fetch it once instead of doing
59
+ * multiple queries.
60
+ */
61
+ var $store_read = null;
62
+
63
+
64
+ /*%******************************************************************************************%*/
65
+ // CONSTRUCTOR
66
+
67
+ /**
68
+ * Constructs a new instance of this class.
69
+ *
70
+ * Tested with [MySQL 5.0.x](http://mysql.com), [PostgreSQL](http://postgresql.com), and
71
+ * [SQLite 3.x](http://sqlite.org). SQLite 2.x is assumed to work. No other PDO-supported databases have
72
+ * been tested (e.g. Oracle, Microsoft SQL Server, IBM DB2, ODBC, Sybase, Firebird). Feel free to send
73
+ * patches for additional database support.
74
+ *
75
+ * See <http://php.net/pdo> for more information.
76
+ *
77
+ * @param string $name (Required) A name to uniquely identify the cache object.
78
+ * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
79
+ * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
80
+ * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
81
+ * @return object Reference to the cache object.
82
+ */
83
+ public function __construct($name, $location, $expires, $gzip = true)
84
+ {
85
+ // Make sure the name is no longer than 40 characters.
86
+ $name = sha1($name);
87
+
88
+ // Call parent constructor and set id.
89
+ parent::__construct($name, $location, $expires, $gzip);
90
+ $this->id = $this->name;
91
+ $options = array();
92
+
93
+ // Check if the location contains :// (e.g. mysql://user:pass@hostname:port/table)
94
+ if (stripos($location, '://') === false)
95
+ {
96
+ // No? Just pass it through.
97
+ $this->dsn = parse_url($location);
98
+ $this->dsn_string = $location;
99
+ }
100
+ else
101
+ {
102
+ // Yes? Parse and set the DSN
103
+ $this->dsn = parse_url($location);
104
+ $this->dsn_string = $this->dsn['scheme'] . ':host=' . $this->dsn['host'] . ((isset($this->dsn['port'])) ? ';port=' . $this->dsn['port'] : '') . ';dbname=' . substr($this->dsn['path'], 1);
105
+ }
106
+
107
+ // Make sure that user/pass are defined.
108
+ $user = isset($this->dsn['user']) ? $this->dsn['user'] : null;
109
+ $pass = isset($this->dsn['pass']) ? $this->dsn['pass'] : null;
110
+
111
+ // Set persistence for databases that support it.
112
+ switch ($this->dsn['scheme'])
113
+ {
114
+ case 'mysql': // MySQL
115
+ case 'pgsql': // PostgreSQL
116
+ $options[PDO::ATTR_PERSISTENT] = true;
117
+ break;
118
+ }
119
+
120
+ // Instantiate a new PDO object with a persistent connection.
121
+ $this->pdo = new PDO($this->dsn_string, $user, $pass, $options);
122
+
123
+ // Define prepared statements for improved performance.
124
+ $this->create = $this->pdo->prepare("INSERT INTO cache (id, expires, data) VALUES (:id, :expires, :data)");
125
+ $this->read = $this->pdo->prepare("SELECT id, expires, data FROM cache WHERE id = :id");
126
+ $this->reset = $this->pdo->prepare("UPDATE cache SET expires = :expires WHERE id = :id");
127
+ $this->delete = $this->pdo->prepare("DELETE FROM cache WHERE id = :id");
128
+ }
129
+
130
+ /**
131
+ * Creates a new cache.
132
+ *
133
+ * @param mixed $data (Required) The data to cache.
134
+ * @return boolean Whether the operation was successful.
135
+ */
136
+ public function create($data)
137
+ {
138
+ $data = serialize($data);
139
+ $data = $this->gzip ? gzcompress($data) : $data;
140
+
141
+ $this->create->bindParam(':id', $this->id);
142
+ $this->create->bindParam(':data', $data);
143
+ $this->create->bindParam(':expires', $this->generate_timestamp());
144
+
145
+ return (bool) $this->create->execute();
146
+ }
147
+
148
+ /**
149
+ * Reads a cache.
150
+ *
151
+ * @return mixed Either the content of the cache object, or boolean `false`.
152
+ */
153
+ public function read()
154
+ {
155
+ if (!$this->store_read)
156
+ {
157
+ $this->read->bindParam(':id', $this->id);
158
+ $this->read->execute();
159
+ $this->store_read = $this->read->fetch(PDO::FETCH_ASSOC);
160
+ }
161
+
162
+ if ($this->store_read)
163
+ {
164
+ $data = $this->store_read['data'];
165
+ $data = $this->gzip ? gzuncompress($data) : $data;
166
+
167
+ return unserialize($data);
168
+ }
169
+
170
+ return false;
171
+ }
172
+
173
+ /**
174
+ * Updates an existing cache.
175
+ *
176
+ * @param mixed $data (Required) The data to cache.
177
+ * @return boolean Whether the operation was successful.
178
+ */
179
+ public function update($data)
180
+ {
181
+ $this->delete();
182
+ return $this->create($data);
183
+ }
184
+
185
+ /**
186
+ * Deletes a cache.
187
+ *
188
+ * @return boolean Whether the operation was successful.
189
+ */
190
+ public function delete()
191
+ {
192
+ $this->delete->bindParam(':id', $this->id);
193
+ return $this->delete->execute();
194
+ }
195
+
196
+ /**
197
+ * Checks whether the cache object is expired or not.
198
+ *
199
+ * @return boolean Whether the cache is expired or not.
200
+ */
201
+ public function is_expired()
202
+ {
203
+ if ($this->timestamp() + $this->expires < time())
204
+ {
205
+ return true;
206
+ }
207
+
208
+ return false;
209
+ }
210
+
211
+ /**
212
+ * Retrieves the timestamp of the cache.
213
+ *
214
+ * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`.
215
+ */
216
+ public function timestamp()
217
+ {
218
+ if (!$this->store_read)
219
+ {
220
+ $this->read->bindParam(':id', $this->id);
221
+ $this->read->execute();
222
+ $this->store_read = $this->read->fetch(PDO::FETCH_ASSOC);
223
+ }
224
+
225
+ if ($this->store_read)
226
+ {
227
+ $value = $this->store_read['expires'];
228
+
229
+ // If 'expires' isn't yet an integer, convert it into one.
230
+ if (!is_numeric($value))
231
+ {
232
+ $value = strtotime($value);
233
+ }
234
+
235
+ $this->timestamp = date('U', $value);
236
+ return $this->timestamp;
237
+ }
238
+
239
+ return false;
240
+ }
241
+
242
+ /**
243
+ * Resets the freshness of the cache.
244
+ *
245
+ * @return boolean Whether the operation was successful.
246
+ */
247
+ public function reset()
248
+ {
249
+ $this->reset->bindParam(':id', $this->id);
250
+ $this->reset->bindParam(':expires', $this->generate_timestamp());
251
+ return (bool) $this->reset->execute();
252
+ }
253
+
254
+ /**
255
+ * Returns a list of supported PDO database drivers. Identical to <PDO::getAvailableDrivers()>.
256
+ *
257
+ * @return array The list of supported database drivers.
258
+ * @link http://php.net/pdo.getavailabledrivers PHP Method
259
+ */
260
+ public function get_drivers()
261
+ {
262
+ return PDO::getAvailableDrivers();
263
+ }
264
+
265
+ /**
266
+ * Returns a timestamp value apropriate to the current database type.
267
+ *
268
+ * @return mixed Timestamp for MySQL and PostgreSQL, integer value for SQLite.
269
+ */
270
+ protected function generate_timestamp()
271
+ {
272
+ // Define 'expires' settings differently.
273
+ switch ($this->dsn['scheme'])
274
+ {
275
+ // These support timestamps.
276
+ case 'mysql': // MySQL
277
+ case 'pgsql': // PostgreSQL
278
+ $expires = date(DATE_FORMAT_MYSQL, time());
279
+ break;
280
+
281
+ // These support integers.
282
+ case 'sqlite': // SQLite 3
283
+ case 'sqlite2': // SQLite 2
284
+ $expires = time();
285
+ break;
286
+ }
287
+
288
+ return $expires;
289
+ }
290
+ }
app/libs/aws/lib/cachecore/cachexcache.class.php CHANGED
@@ -1,122 +1,122 @@
1
- <?php
2
- /**
3
- * Container for all XCache-based cache methods. Inherits additional methods from <CacheCore>. Adheres
4
- * to the ICacheCore interface.
5
- *
6
- * @version 2009.10.10
7
- * @copyright 2006-2010 Ryan Parman
8
- * @copyright 2006-2010 Foleeo, Inc.
9
- * @copyright 2008-2010 Contributors
10
- * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
- * @link http://github.com/skyzyx/cachecore CacheCore
12
- * @link http://getcloudfusion.com CloudFusion
13
- * @link http://xcache.lighttpd.net XCache
14
- */
15
- class CacheXCache extends CacheCore implements ICacheCore
16
- {
17
-
18
- /*%******************************************************************************************%*/
19
- // CONSTRUCTOR
20
-
21
- /**
22
- * Constructs a new instance of this class.
23
- *
24
- * @param string $name (Required) A name to uniquely identify the cache object.
25
- * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
26
- * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
27
- * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
28
- * @return object Reference to the cache object.
29
- */
30
- public function __construct($name, $location, $expires, $gzip = true)
31
- {
32
- parent::__construct($name, null, $expires, $gzip);
33
- $this->id = $this->name;
34
- }
35
-
36
- /**
37
- * Creates a new cache.
38
- *
39
- * @param mixed $data (Required) The data to cache.
40
- * @return boolean Whether the operation was successful.
41
- */
42
- public function create($data)
43
- {
44
- $data = serialize($data);
45
- $data = $this->gzip ? gzcompress($data) : $data;
46
-
47
- return xcache_set($this->id, $data, $this->expires);
48
- }
49
-
50
- /**
51
- * Reads a cache.
52
- *
53
- * @return mixed Either the content of the cache object, or boolean `false`.
54
- */
55
- public function read()
56
- {
57
- if ($data = xcache_get($this->id))
58
- {
59
- $data = $this->gzip ? gzuncompress($data) : $data;
60
- return unserialize($data);
61
- }
62
-
63
- return false;
64
- }
65
-
66
- /**
67
- * Updates an existing cache.
68
- *
69
- * @param mixed $data (Required) The data to cache.
70
- * @return boolean Whether the operation was successful.
71
- */
72
- public function update($data)
73
- {
74
- $data = serialize($data);
75
- $data = $this->gzip ? gzcompress($data) : $data;
76
-
77
- return xcache_set($this->id, $data, $this->expires);
78
- }
79
-
80
- /**
81
- * Deletes a cache.
82
- *
83
- * @return boolean Whether the operation was successful.
84
- */
85
- public function delete()
86
- {
87
- return xcache_unset($this->id);
88
- }
89
-
90
- /**
91
- * Defined here, but always returns false. XCache manages it's own expirations. It's worth
92
- * mentioning that if the server is configured for a long xcache.var_gc_interval then it IS
93
- * possible for expired data to remain in the var cache, though it is not possible to access
94
- * it.
95
- *
96
- * @return boolean Whether the cache is expired or not.
97
- */
98
- public function is_expired()
99
- {
100
- return false;
101
- }
102
-
103
- /**
104
- * Implemented here, but always returns `false`. XCache manages its own expirations.
105
- *
106
- * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`.
107
- */
108
- public function timestamp()
109
- {
110
- return false;
111
- }
112
-
113
- /**
114
- * Implemented here, but always returns `false`. XCache manages its own expirations.
115
- *
116
- * @return boolean Whether the operation was successful.
117
- */
118
- public function reset()
119
- {
120
- return false;
121
- }
122
- }
1
+ <?php
2
+ /**
3
+ * Container for all XCache-based cache methods. Inherits additional methods from <CacheCore>. Adheres
4
+ * to the ICacheCore interface.
5
+ *
6
+ * @version 2009.10.10
7
+ * @copyright 2006-2010 Ryan Parman
8
+ * @copyright 2006-2010 Foleeo, Inc.
9
+ * @copyright 2008-2010 Contributors
10
+ * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
+ * @link http://github.com/skyzyx/cachecore CacheCore
12
+ * @link http://getcloudfusion.com CloudFusion
13
+ * @link http://xcache.lighttpd.net XCache
14
+ */
15
+ class CacheXCache extends CacheCore implements ICacheCore
16
+ {
17
+
18
+ /*%******************************************************************************************%*/
19
+ // CONSTRUCTOR
20
+
21
+ /**
22
+ * Constructs a new instance of this class.
23
+ *
24
+ * @param string $name (Required) A name to uniquely identify the cache object.
25
+ * @param string $location (Required) The location to store the cache object in. This may vary by cache method.
26
+ * @param integer $expires (Required) The number of seconds until a cache object is considered stale.
27
+ * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. Defaults to true.
28
+ * @return object Reference to the cache object.
29
+ */
30
+ public function __construct($name, $location, $expires, $gzip = true)
31
+ {
32
+ parent::__construct($name, null, $expires, $gzip);
33
+ $this->id = $this->name;
34
+ }
35
+
36
+ /**
37
+ * Creates a new cache.
38
+ *
39
+ * @param mixed $data (Required) The data to cache.
40
+ * @return boolean Whether the operation was successful.
41
+ */
42
+ public function create($data)
43
+ {
44
+ $data = serialize($data);
45
+ $data = $this->gzip ? gzcompress($data) : $data;
46
+
47
+ return xcache_set($this->id, $data, $this->expires);
48
+ }
49
+
50
+ /**
51
+ * Reads a cache.
52
+ *
53
+ * @return mixed Either the content of the cache object, or boolean `false`.
54
+ */
55
+ public function read()
56
+ {
57
+ if ($data = xcache_get($this->id))
58
+ {
59
+ $data = $this->gzip ? gzuncompress($data) : $data;
60
+ return unserialize($data);
61
+ }
62
+
63
+ return false;
64
+ }
65
+
66
+ /**
67
+ * Updates an existing cache.
68
+ *
69
+ * @param mixed $data (Required) The data to cache.
70
+ * @return boolean Whether the operation was successful.
71
+ */
72
+ public function update($data)
73
+ {
74
+ $data = serialize($data);
75
+ $data = $this->gzip ? gzcompress($data) : $data;
76
+
77
+ return xcache_set($this->id, $data, $this->expires);
78
+ }
79
+
80
+ /**
81
+ * Deletes a cache.
82
+ *
83
+ * @return boolean Whether the operation was successful.
84
+ */
85
+ public function delete()
86
+ {
87
+ return xcache_unset($this->id);
88
+ }
89
+
90
+ /**
91
+ * Defined here, but always returns false. XCache manages it's own expirations. It's worth
92
+ * mentioning that if the server is configured for a long xcache.var_gc_interval then it IS
93
+ * possible for expired data to remain in the var cache, though it is not possible to access
94
+ * it.
95
+ *
96
+ * @return boolean Whether the cache is expired or not.
97
+ */
98
+ public function is_expired()
99
+ {
100
+ return false;
101
+ }
102
+
103
+ /**
104
+ * Implemented here, but always returns `false`. XCache manages its own expirations.
105
+ *
106
+ * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`.
107
+ */
108
+ public function timestamp()
109
+ {
110
+ return false;
111
+ }
112
+
113
+ /**
114
+ * Implemented here, but always returns `false`. XCache manages its own expirations.
115
+ *
116
+ * @return boolean Whether the operation was successful.
117
+ */
118
+ public function reset()
119
+ {
120
+ return false;
121
+ }
122
+ }
app/libs/aws/lib/cachecore/icachecore.interface.php CHANGED
@@ -1,66 +1,66 @@
1
- <?php
2
- /**
3
- * Defines the methods that all implementing classes MUST have. Covers CRUD (create, read, update,
4
- * delete) methods, as well as others that are used in the base <CacheCore> class.
5
- *
6
- * @version 2009.03.22
7
- * @copyright 2006-2010 Ryan Parman
8
- * @copyright 2006-2010 Foleeo, Inc.
9
- * @copyright 2008-2010 Contributors
10
- * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
- * @link http://github.com/skyzyx/cachecore CacheCore
12
- * @link http://getcloudfusion.com CloudFusion
13
- */
14
- interface ICacheCore
15
- {
16
- /**
17
- * Creates a new cache.
18
- *
19
- * @param mixed $data (Required) The data to cache.
20
- * @return boolean Whether the operation was successful.
21
- */
22
- public function create($data);
23
-
24
- /**
25
- * Reads a cache.
26
- *
27
- * @return mixed Either the content of the cache object, or boolean `false`.
28
- */
29
- public function read();
30
-
31
- /**
32
- * Updates an existing cache.
33
- *
34
- * @param mixed $data (Required) The data to cache.
35
- * @return boolean Whether the operation was successful.
36
- */
37
- public function update($data);
38
-
39
- /**
40
- * Deletes a cache.
41
- *
42
- * @return boolean Whether the operation was successful.
43
- */
44
- public function delete();
45
-
46
- /**
47
- * Checks whether the cache object is expired or not.
48
- *
49
- * @return boolean Whether the cache is expired or not.
50
- */
51
- public function is_expired();
52
-
53
- /**
54
- * Retrieves the timestamp of the cache.
55
- *
56
- * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`.
57
- */
58
- public function timestamp();
59
-
60
- /**
61
- * Resets the freshness of the cache.
62
- *
63
- * @return boolean Whether the operation was successful.
64
- */
65
- public function reset();
66
- }
1
+ <?php
2
+ /**
3
+ * Defines the methods that all implementing classes MUST have. Covers CRUD (create, read, update,
4
+ * delete) methods, as well as others that are used in the base <CacheCore> class.
5
+ *
6
+ * @version 2009.03.22
7
+ * @copyright 2006-2010 Ryan Parman
8
+ * @copyright 2006-2010 Foleeo, Inc.
9
+ * @copyright 2008-2010 Contributors
10
+ * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
+ * @link http://github.com/skyzyx/cachecore CacheCore
12
+ * @link http://getcloudfusion.com CloudFusion
13
+ */
14
+ interface ICacheCore
15
+ {
16
+ /**
17
+ * Creates a new cache.
18
+ *
19
+ * @param mixed $data (Required) The data to cache.
20
+ * @return boolean Whether the operation was successful.
21
+ */
22
+ public function create($data);
23
+
24
+ /**
25
+ * Reads a cache.
26
+ *
27
+ * @return mixed Either the content of the cache object, or boolean `false`.
28
+ */
29
+ public function read();
30
+
31
+ /**
32
+ * Updates an existing cache.
33
+ *
34
+ * @param mixed $data (Required) The data to cache.
35
+ * @return boolean Whether the operation was successful.
36
+ */
37
+ public function update($data);
38
+
39
+ /**
40
+ * Deletes a cache.
41
+ *
42
+ * @return boolean Whether the operation was successful.
43
+ */
44
+ public function delete();
45
+
46
+ /**
47
+ * Checks whether the cache object is expired or not.
48
+ *
49
+ * @return boolean Whether the cache is expired or not.
50
+ */
51
+ public function is_expired();
52
+
53
+ /**
54
+ * Retrieves the timestamp of the cache.
55
+ *
56
+ * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`.
57
+ */
58
+ public function timestamp();
59
+
60
+ /**
61
+ * Resets the freshness of the cache.
62
+ *
63
+ * @return boolean Whether the operation was successful.
64
+ */
65
+ public function reset();
66
+ }
app/libs/aws/lib/requestcore/LICENSE CHANGED
@@ -1,25 +1,25 @@
1
- Copyright (c) 2006-2010 Ryan Parman, Foleeo Inc., and contributors. All rights reserved.
2
-
3
- Redistribution and use in source and binary forms, with or without modification, are
4
- permitted provided that the following conditions are met:
5
-
6
- * Redistributions of source code must retain the above copyright notice, this list of
7
- conditions and the following disclaimer.
8
-
9
- * Redistributions in binary form must reproduce the above copyright notice, this list
10
- of conditions and the following disclaimer in the documentation and/or other materials
11
- provided with the distribution.
12
-
13
- * Neither the name of Ryan Parman, Foleeo Inc. nor the names of its contributors may be used to
14
- endorse or promote products derived from this software without specific prior written
15
- permission.
16
-
17
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
18
- OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
20
- AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24
- OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25
- POSSIBILITY OF SUCH DAMAGE.
1
+ Copyright (c) 2006-2010 Ryan Parman, Foleeo Inc., and contributors. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without modification, are
4
+ permitted provided that the following conditions are met:
5
+
6
+ * Redistributions of source code must retain the above copyright notice, this list of
7
+ conditions and the following disclaimer.
8
+
9
+ * Redistributions in binary form must reproduce the above copyright notice, this list
10
+ of conditions and the following disclaimer in the documentation and/or other materials
11
+ provided with the distribution.
12
+
13
+ * Neither the name of Ryan Parman, Foleeo Inc. nor the names of its contributors may be used to
14
+ endorse or promote products derived from this software without specific prior written
15
+ permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
18
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
20
+ AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25
+ POSSIBILITY OF SUCH DAMAGE.
app/libs/aws/lib/requestcore/cacert.pem ADDED
@@ -0,0 +1,3990 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##
2
+ ## ca-bundle.crt -- Bundle of CA Root Certificates
3
+ ##
4
+ ## Certificate data from Mozilla as of: Wed Apr 13 08:13:21 2011
5
+ ##
6
+ ## This is a bundle of X.509 certificates of public Certificate Authorities
7
+ ## (CA). These were automatically extracted from Mozilla's root certificates
8
+ ## file (certdata.txt). This file can be found in the mozilla source tree:
9
+ ## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
10
+ ##
11
+ ## It contains the certificates in PEM format and therefore
12
+ ## can be directly used with curl / libcurl / php_curl, or with
13
+ ## an Apache+mod_ssl webserver for SSL client authentication.
14
+ ## Just configure this file as the SSLCACertificateFile.
15
+ ##
16
+
17
+ # Ryan Parman elects to use cacert.pem under the Mozilla Public License, version 1.1.
18
+ # Amazon elects to use cacert.pem under the Mozilla Public License, version 1.1.
19
+ #
20
+ # ***** BEGIN LICENSE BLOCK *****
21
+ # Version: MPL 1.1/GPL 2.0/LGPL 2.1
22
+ #
23
+ # The contents of this file are subject to the Mozilla Public License Version
24
+ # 1.1 (the "License"); you may not use this file except in compliance with
25
+ # the License. You may obtain a copy of the License at
26
+ # http://www.mozilla.org/MPL/
27
+ #
28
+ # Software distributed under the License is distributed on an "AS IS" basis,
29
+ # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
30
+ # for the specific language governing rights and limitations under the
31
+ # License.
32
+ #
33
+ # The Original Code is the Netscape security libraries.
34
+ #
35
+ # The Initial Developer of the Original Code is
36
+ # Netscape Communications Corporation.
37
+ # Portions created by the Initial Developer are Copyright (C) 1994-2000
38
+ # the Initial Developer. All Rights Reserved.
39
+ #
40
+ # Contributor(s):
41
+ #
42
+ # Alternatively, the contents of this file may be used under the terms of
43
+ # either the GNU General Public License Version 2 or later (the "GPL"), or
44
+ # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
45
+ # in which case the provisions of the GPL or the LGPL are applicable instead
46
+ # of those above. If you wish to allow use of your version of this file only
47
+ # under the terms of either the GPL or the LGPL, and not to allow others to
48
+ # use your version of this file under the terms of the MPL, indicate your
49
+ # decision by deleting the provisions above and replace them with the notice
50
+ # and other provisions required by the GPL or the LGPL. If you do not delete
51
+ # the provisions above, a recipient may use your version of this file under
52
+ # the terms of any one of the MPL, the GPL or the LGPL.
53
+ #
54
+ # ***** END LICENSE BLOCK *****
55
+ # @(#) $RCSfile: certdata.txt,v $ $Revision: 1.74 $ $Date: 2011/04/13 00:10:24 $
56
+
57
+ GTE CyberTrust Global Root
58
+ ==========================
59
+ -----BEGIN CERTIFICATE-----
60
+ MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
61
+ Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
62
+ A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
63
+ MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
64
+ Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
65
+ IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
66
+ sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
67
+ HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
68
+ AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
69
+ M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
70
+ NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
71
+ -----END CERTIFICATE-----
72
+
73
+ Thawte Server CA
74
+ ================
75
+ -----BEGIN CERTIFICATE-----
76
+ MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
77
+ DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
78
+ dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
79
+ AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
80
+ b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
81
+ BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
82
+ c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
83
+ A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
84
+ ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
85
+ /Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
86
+ 1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
87
+ MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
88
+ GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
89
+ GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
90
+ -----END CERTIFICATE-----
91
+
92
+ Thawte Premium Server CA
93
+ ========================
94
+ -----BEGIN CERTIFICATE-----
95
+ MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
96
+ DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
97
+ dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
98
+ AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
99
+ ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
100
+ AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
101
+ VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
102
+ aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
103
+ cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
104
+ aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
105
+ Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
106
+ qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
107
+ SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
108
+ 8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
109
+ UCemDaYj+bvLpgcUQg==
110
+ -----END CERTIFICATE-----
111
+
112
+ Equifax Secure CA
113
+ =================
114
+ -----BEGIN CERTIFICATE-----
115
+ MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
116
+ ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
117
+ MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
118
+ B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
119
+ nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
120
+ fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
121
+ 8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
122
+ A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
123
+ CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
124
+ A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
125
+ spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
126
+ Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
127
+ zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
128
+ BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
129
+ 70+sB3c4
130
+ -----END CERTIFICATE-----
131
+
132
+ Digital Signature Trust Co. Global CA 1
133
+ =======================================
134
+ -----BEGIN CERTIFICATE-----
135
+ MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
136
+ ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
137
+ MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
138
+ IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
139
+ A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
140
+ NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
141
+ o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
142
+ BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
143
+ dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
144
+ IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
145
+ MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
146
+ BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
147
+ ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
148
+ kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
149
+ RbyhkwS7hp86W0N6w4pl
150
+ -----END CERTIFICATE-----
151
+
152
+ Digital Signature Trust Co. Global CA 3
153
+ =======================================
154
+ -----BEGIN CERTIFICATE-----
155
+ MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
156
+ ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
157
+ MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
158
+ IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
159
+ A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
160
+ VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
161
+ xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
162
+ BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
163
+ dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
164
+ IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
165
+ MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
166
+ BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
167
+ AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
168
+ up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
169
+ mPnHfxsb1gYgAlihw6ID
170
+ -----END CERTIFICATE-----
171
+
172
+ Verisign Class 1 Public Primary Certification Authority
173
+ =======================================================
174
+ -----BEGIN CERTIFICATE-----
175
+ MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVT
176
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
177
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTla
178
+ MF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3Mg
179
+ MSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEF
180
+ AAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw
181
+ 0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7
182
+ NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf
183
+ 7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnx
184
+ giJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0A
185
+ NACY89FxlA==
186
+ -----END CERTIFICATE-----
187
+
188
+ Verisign Class 2 Public Primary Certification Authority
189
+ =======================================================
190
+ -----BEGIN CERTIFICATE-----
191
+ MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
192
+ FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5
193
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
194
+ XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAy
195
+ IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
196
+ A4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6
197
+ Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/
198
+ S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIobK/o5wXTX
199
+ XtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUY
200
+ YAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2
201
+ lw0Xd8rY
202
+ -----END CERTIFICATE-----
203
+
204
+ Verisign Class 3 Public Primary Certification Authority
205
+ =======================================================
206
+ -----BEGIN CERTIFICATE-----
207
+ MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
208
+ FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
209
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
210
+ XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
211
+ IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
212
+ A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
213
+ f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
214
+ hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
215
+ TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
216
+ WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
217
+ Tqj/ZA1k
218
+ -----END CERTIFICATE-----
219
+
220
+ Verisign Class 1 Public Primary Certification Authority - G2
221
+ ============================================================
222
+ -----BEGIN CERTIFICATE-----
223
+ MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
224
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
225
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
226
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
227
+ dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
228
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
229
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
230
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
231
+ dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd
232
+ k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq
233
+ WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB
234
+ MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM
235
+ XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC
236
+ lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ
237
+ -----END CERTIFICATE-----
238
+
239
+ Verisign Class 2 Public Primary Certification Authority - G2
240
+ ============================================================
241
+ -----BEGIN CERTIFICATE-----
242
+ MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV
243
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
244
+ cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
245
+ Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
246
+ c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV
247
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
248
+ cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
249
+ Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
250
+ c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx
251
+ nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC
252
+ wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA
253
+ ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK
254
+ 1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk
255
+ LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg==
256
+ -----END CERTIFICATE-----
257
+
258
+ Verisign Class 3 Public Primary Certification Authority - G2
259
+ ============================================================
260
+ -----BEGIN CERTIFICATE-----
261
+ MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
262
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
263
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
264
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
265
+ dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
266
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
267
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
268
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
269
+ dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
270
+ FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
271
+ lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
272
+ MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
273
+ 1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
274
+ Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
275
+ -----END CERTIFICATE-----
276
+
277
+ Verisign Class 4 Public Primary Certification Authority - G2
278
+ ============================================================
279
+ -----BEGIN CERTIFICATE-----
280
+ MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
281
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy
282
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
283
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
284
+ dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
285
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy
286
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
287
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
288
+ dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4
289
+ xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDH
290
+ qGKB3FtKqsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQAB
291
+ MA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGIL4LcY/oCRaxF
292
+ WdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0ycyfYaT5DdPauxYma51N86Xv2S/PB
293
+ ZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRPT8qAkbYp
294
+ -----END CERTIFICATE-----
295
+
296
+ GlobalSign Root CA
297
+ ==================
298
+ -----BEGIN CERTIFICATE-----
299
+ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
300
+ GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
301
+ b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
302
+ BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
303
+ VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
304
+ DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
305
+ THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
306
+ Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
307
+ c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
308
+ gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
309
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
310
+ AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
311
+ Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
312
+ j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
313
+ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
314
+ X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
315
+ -----END CERTIFICATE-----
316
+
317
+ GlobalSign Root CA - R2
318
+ =======================
319
+ -----BEGIN CERTIFICATE-----
320
+ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
321
+ YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
322
+ bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
323
+ aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
324
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
325
+ ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
326
+ s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
327
+ S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
328
+ TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
329
+ ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
330
+ FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
331
+ YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
332
+ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
333
+ 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
334
+ 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
335
+ 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
336
+ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
337
+ -----END CERTIFICATE-----
338
+
339
+ ValiCert Class 1 VA
340
+ ===================
341
+ -----BEGIN CERTIFICATE-----
342
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
343
+ b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
344
+ YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
345
+ bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
346
+ MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
347
+ d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
348
+ UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
349
+ LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
350
+ A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
351
+ GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
352
+ DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
353
+ lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
354
+ icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
355
+ Orf1LXLI
356
+ -----END CERTIFICATE-----
357
+
358
+ ValiCert Class 2 VA
359
+ ===================
360
+ -----BEGIN CERTIFICATE-----
361
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
362
+ b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
363
+ YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
364
+ bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
365
+ MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
366
+ d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
367
+ UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
368
+ LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
369
+ A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
370
+ CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
371
+ ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
372
+ SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
373
+ UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
374
+ W9ViH0Pd
375
+ -----END CERTIFICATE-----
376
+
377
+ RSA Root Certificate 1
378
+ ======================
379
+ -----BEGIN CERTIFICATE-----
380
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
381
+ b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
382
+ YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
383
+ bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
384
+ MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
385
+ d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
386
+ UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
387
+ LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
388
+ A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
389
+ 3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
390
+ BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
391
+ 3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
392
+ V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
393
+ on+jjBXu
394
+ -----END CERTIFICATE-----
395
+
396
+ Verisign Class 1 Public Primary Certification Authority - G3
397
+ ============================================================
398
+ -----BEGIN CERTIFICATE-----
399
+ MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
400
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
401
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
402
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
403
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
404
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
405
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
406
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg
407
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
408
+ ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E
409
+ bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ
410
+ rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+
411
+ Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB
412
+ FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
413
+ q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N
414
+ y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
415
+ ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h
416
+ a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc
417
+ D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
418
+ -----END CERTIFICATE-----
419
+
420
+ Verisign Class 2 Public Primary Certification Authority - G3
421
+ ============================================================
422
+ -----BEGIN CERTIFICATE-----
423
+ MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT
424
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y
425
+ azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug
426
+ b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0
427
+ aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ
428
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
429
+ c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
430
+ aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD
431
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
432
+ AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6
433
+ tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7
434
+ C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS
435
+ 0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs
436
+ Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0
437
+ JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf
438
+ 0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
439
+ sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx
440
+ JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j
441
+ GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
442
+ -----END CERTIFICATE-----
443
+
444
+ Verisign Class 3 Public Primary Certification Authority - G3
445
+ ============================================================
446
+ -----BEGIN CERTIFICATE-----
447
+ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
448
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
449
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
450
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
451
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
452
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
453
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
454
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
455
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
456
+ ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
457
+ EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
458
+ cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
459
+ EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
460
+ 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
461
+ ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
462
+ j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
463
+ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
464
+ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
465
+ t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
466
+ -----END CERTIFICATE-----
467
+
468
+ Verisign Class 4 Public Primary Certification Authority - G3
469
+ ============================================================
470
+ -----BEGIN CERTIFICATE-----
471
+ MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
472
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
473
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
474
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
475
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
476
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
477
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
478
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
479
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
480
+ ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
481
+ tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
482
+ 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
483
+ Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
484
+ Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
485
+ j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
486
+ mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
487
+ fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
488
+ RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
489
+ UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
490
+ -----END CERTIFICATE-----
491
+
492
+ Entrust.net Secure Server CA
493
+ ============================
494
+ -----BEGIN CERTIFICATE-----
495
+ MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
496
+ BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
497
+ cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
498
+ ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
499
+ cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
500
+ A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
501
+ eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
502
+ dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
503
+ aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
504
+ aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
505
+ gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
506
+ ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
507
+ CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
508
+ dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
509
+ bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
510
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
511
+ dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
512
+ NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
513
+ HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
514
+ BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
515
+ Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
516
+ n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
517
+ -----END CERTIFICATE-----
518
+
519
+ Entrust.net Premium 2048 Secure Server CA
520
+ =========================================
521
+ -----BEGIN CERTIFICATE-----
522
+ MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
523
+ ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
524
+ bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
525
+ BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
526
+ NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
527
+ d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
528
+ MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
529
+ ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
530
+ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
531
+ Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
532
+ hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
533
+ nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
534
+ VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
535
+ AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
536
+ gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
537
+ AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
538
+ oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
539
+ o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
540
+ 2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
541
+ OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
542
+ -----END CERTIFICATE-----
543
+
544
+ Baltimore CyberTrust Root
545
+ =========================
546
+ -----BEGIN CERTIFICATE-----
547
+ MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
548
+ ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
549
+ ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
550
+ SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
551
+ dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
552
+ uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
553
+ UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
554
+ G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
555
+ XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
556
+ l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
557
+ VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
558
+ BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
559
+ cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
560
+ hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
561
+ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
562
+ RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
563
+ -----END CERTIFICATE-----
564
+
565
+ Equifax Secure Global eBusiness CA
566
+ ==================================
567
+ -----BEGIN CERTIFICATE-----
568
+ MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
569
+ RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
570
+ bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
571
+ HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
572
+ b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
573
+ PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
574
+ qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
575
+ hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
576
+ BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
577
+ MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
578
+ I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
579
+ NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
580
+ -----END CERTIFICATE-----
581
+
582
+ Equifax Secure eBusiness CA 1
583
+ =============================
584
+ -----BEGIN CERTIFICATE-----
585
+ MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
586
+ RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
587
+ LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
588
+ ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
589
+ IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
590
+ 1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
591
+ IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
592
+ MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
593
+ Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
594
+ AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
595
+ lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
596
+ KpYrtWKmpj29f5JZzVoqgrI3eQ==
597
+ -----END CERTIFICATE-----
598
+
599
+ Equifax Secure eBusiness CA 2
600
+ =============================
601
+ -----BEGIN CERTIFICATE-----
602
+ MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
603
+ ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
604
+ MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
605
+ DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
606
+ nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
607
+ 2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
608
+ BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
609
+ A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
610
+ JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
611
+ A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
612
+ uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
613
+ Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
614
+ jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
615
+ 78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
616
+ V+GRMOrN
617
+ -----END CERTIFICATE-----
618
+
619
+ AddTrust Low-Value Services Root
620
+ ================================
621
+ -----BEGIN CERTIFICATE-----
622
+ MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
623
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
624
+ cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
625
+ CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
626
+ ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
627
+ AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
628
+ 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
629
+ oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
630
+ Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
631
+ GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
632
+ HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
633
+ AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
634
+ RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
635
+ HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
636
+ ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
637
+ iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
638
+ eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
639
+ mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
640
+ ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
641
+ -----END CERTIFICATE-----
642
+
643
+ AddTrust External Root
644
+ ======================
645
+ -----BEGIN CERTIFICATE-----
646
+ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
647
+ QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
648
+ VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
649
+ NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
650
+ cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
651
+ Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
652
+ +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
653
+ Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
654
+ aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
655
+ 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
656
+ 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
657
+ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
658
+ VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
659
+ VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
660
+ IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
661
+ j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
662
+ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
663
+ e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
664
+ G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
665
+ -----END CERTIFICATE-----
666
+
667
+ AddTrust Public Services Root
668
+ =============================
669
+ -----BEGIN CERTIFICATE-----
670
+ MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
671
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
672
+ cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
673
+ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
674
+ dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
675
+ AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
676
+ nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
677
+ d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
678
+ Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
679
+ HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
680
+ A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
681
+ /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
682
+ FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
683
+ A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
684
+ JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
685
+ +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
686
+ GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
687
+ Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
688
+ EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
689
+ -----END CERTIFICATE-----
690
+
691
+ AddTrust Qualified Certificates Root
692
+ ====================================
693
+ -----BEGIN CERTIFICATE-----
694
+ MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
695
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
696
+ cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
697
+ CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
698
+ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
699
+ 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
700
+ 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
701
+ KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
702
+ L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
703
+ wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
704
+ MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
705
+ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
706
+ BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
707
+ azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
708
+ ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
709
+ GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
710
+ dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
711
+ RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
712
+ iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
713
+ -----END CERTIFICATE-----
714
+
715
+ Entrust Root Certification Authority
716
+ ====================================
717
+ -----BEGIN CERTIFICATE-----
718
+ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
719
+ BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
720
+ b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
721
+ A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
722
+ MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
723
+ MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
724
+ Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
725
+ dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
726
+ ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
727
+ A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
728
+ Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
729
+ j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
730
+ rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
731
+ DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
732
+ MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
733
+ hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
734
+ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
735
+ Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
736
+ v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
737
+ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
738
+ tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
739
+ -----END CERTIFICATE-----
740
+
741
+ RSA Security 2048 v3
742
+ ====================
743
+ -----BEGIN CERTIFICATE-----
744
+ MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
745
+ ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
746
+ MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
747
+ BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
748
+ AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
749
+ Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
750
+ WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
751
+ KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
752
+ +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
753
+ MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
754
+ FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
755
+ v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
756
+ 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
757
+ VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
758
+ nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
759
+ pKnXwiJPZ9d37CAFYd4=
760
+ -----END CERTIFICATE-----
761
+
762
+ GeoTrust Global CA
763
+ ==================
764
+ -----BEGIN CERTIFICATE-----
765
+ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
766
+ Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
767
+ MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
768
+ LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
769
+ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
770
+ BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
771
+ 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
772
+ T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
773
+ vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
774
+ AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
775
+ DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
776
+ zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
777
+ d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
778
+ mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
779
+ XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
780
+ Mw==
781
+ -----END CERTIFICATE-----
782
+
783
+ GeoTrust Global CA 2
784
+ ====================
785
+ -----BEGIN CERTIFICATE-----
786
+ MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
787
+ R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
788
+ MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
789
+ LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
790
+ ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
791
+ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
792
+ LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
793
+ Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
794
+ HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
795
+ MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
796
+ K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
797
+ srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
798
+ ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
799
+ OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
800
+ x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
801
+ H4z1Ir+rzoPz4iIprn2DQKi6bA==
802
+ -----END CERTIFICATE-----
803
+
804
+ GeoTrust Universal CA
805
+ =====================
806
+ -----BEGIN CERTIFICATE-----
807
+ MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
808
+ R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
809
+ MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
810
+ Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
811
+ ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
812
+ JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
813
+ RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
814
+ 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
815
+ 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
816
+ qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
817
+ Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
818
+ Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
819
+ KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
820
+ ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
821
+ XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
822
+ hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
823
+ aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
824
+ qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
825
+ oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
826
+ xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
827
+ KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
828
+ DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
829
+ xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
830
+ p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
831
+ P/rmMuGNG2+k5o7Y+SlIis5z/iw=
832
+ -----END CERTIFICATE-----
833
+
834
+ GeoTrust Universal CA 2
835
+ =======================
836
+ -----BEGIN CERTIFICATE-----
837
+ MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
838
+ R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
839
+ MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
840
+ SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
841
+ A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
842
+ DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
843
+ j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
844
+ JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
845
+ QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
846
+ WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
847
+ 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
848
+ ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
849
+ SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
850
+ 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
851
+ +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
852
+ BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
853
+ dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
854
+ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
855
+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
856
+ A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
857
+ Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
858
+ pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
859
+ FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
860
+ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
861
+ X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
862
+ -----END CERTIFICATE-----
863
+
864
+ UTN-USER First-Network Applications
865
+ ===================================
866
+ -----BEGIN CERTIFICATE-----
867
+ MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE
868
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
869
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp
870
+ BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5
871
+ WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T
872
+ YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
873
+ dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB
874
+ cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug
875
+ mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj
876
+ DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu
877
+ Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi
878
+ P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE
879
+ j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w
880
+ HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j
881
+ cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G
882
+ CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
883
+ IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK
884
+ RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp
885
+ xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq
886
+ DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE
887
+ -----END CERTIFICATE-----
888
+
889
+ America Online Root Certification Authority 1
890
+ =============================================
891
+ -----BEGIN CERTIFICATE-----
892
+ MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
893
+ QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
894
+ Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
895
+ A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
896
+ T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
897
+ ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
898
+ v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
899
+ DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
900
+ sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
901
+ 8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
902
+ AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
903
+ o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
904
+ GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
905
+ VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
906
+ 3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
907
+ Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
908
+ sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
909
+ -----END CERTIFICATE-----
910
+
911
+ America Online Root Certification Authority 2
912
+ =============================================
913
+ -----BEGIN CERTIFICATE-----
914
+ MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
915
+ QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
916
+ Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
917
+ A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
918
+ T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
919
+ ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
920
+ fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
921
+ f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
922
+ qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
923
+ RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
924
+ gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
925
+ 6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
926
+ FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
927
+ Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
928
+ B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
929
+ aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
930
+ AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
931
+ T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
932
+ +DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
933
+ JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
934
+ zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
935
+ ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
936
+ 1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
937
+ GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
938
+ Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
939
+ cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
940
+ -----END CERTIFICATE-----
941
+
942
+ Visa eCommerce Root
943
+ ===================
944
+ -----BEGIN CERTIFICATE-----
945
+ MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
946
+ EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
947
+ QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
948
+ WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
949
+ VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
950
+ bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
951
+ F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
952
+ RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
953
+ TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
954
+ /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
955
+ GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
956
+ MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
957
+ CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
958
+ YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
959
+ zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
960
+ YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
961
+ 398znM/jra6O1I7mT1GvFpLgXPYHDw==
962
+ -----END CERTIFICATE-----
963
+
964
+ TC TrustCenter, Germany, Class 2 CA
965
+ ===================================
966
+ -----BEGIN CERTIFICATE-----
967
+ MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI
968
+ EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
969
+ U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD
970
+ bGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05
971
+ ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt
972
+ YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy
973
+ aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg
974
+ MiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI
975
+ hvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLs
976
+ qh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5N
977
+ u6hLVxa8/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB
978
+ Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy
979
+ LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBAIRS+yjf
980
+ /x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ2
981
+ 9ELw+HkuCkhcq8xRT3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac
982
+ ASZ4smZHcFFk
983
+ -----END CERTIFICATE-----
984
+
985
+ TC TrustCenter, Germany, Class 3 CA
986
+ ===================================
987
+ -----BEGIN CERTIFICATE-----
988
+ MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI
989
+ EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
990
+ U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD
991
+ bGFzcyAzIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05
992
+ ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt
993
+ YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy
994
+ aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg
995
+ MyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI
996
+ hvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN
997
+ 2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+7
998
+ 7uMMfTDWw1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB
999
+ Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy
1000
+ LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBABY9xs3B
1001
+ u4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm
1002
+ 5gZOngylerpuw3yCGdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS
1003
+ CdS7kjXvD9s0
1004
+ -----END CERTIFICATE-----
1005
+
1006
+ Certum Root CA
1007
+ ==============
1008
+ -----BEGIN CERTIFICATE-----
1009
+ MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
1010
+ ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
1011
+ Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
1012
+ by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
1013
+ wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
1014
+ kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
1015
+ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
1016
+ Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
1017
+ NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
1018
+ hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
1019
+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
1020
+ GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
1021
+ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
1022
+ qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
1023
+ -----END CERTIFICATE-----
1024
+
1025
+ Comodo AAA Services root
1026
+ ========================
1027
+ -----BEGIN CERTIFICATE-----
1028
+ MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
1029
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
1030
+ TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
1031
+ MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
1032
+ c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
1033
+ BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
1034
+ ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
1035
+ C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
1036
+ i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
1037
+ Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
1038
+ Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
1039
+ Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
1040
+ BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
1041
+ cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
1042
+ LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
1043
+ 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
1044
+ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
1045
+ 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
1046
+ 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
1047
+ -----END CERTIFICATE-----
1048
+
1049
+ Comodo Secure Services root
1050
+ ===========================
1051
+ -----BEGIN CERTIFICATE-----
1052
+ MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
1053
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
1054
+ TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
1055
+ MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
1056
+ Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
1057
+ BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
1058
+ ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
1059
+ 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
1060
+ rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
1061
+ oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
1062
+ p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
1063
+ FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
1064
+ gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
1065
+ YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
1066
+ aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
1067
+ 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
1068
+ Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
1069
+ DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
1070
+ pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
1071
+ RR3B7Hzs/Sk=
1072
+ -----END CERTIFICATE-----
1073
+
1074
+ Comodo Trusted Services root
1075
+ ============================
1076
+ -----BEGIN CERTIFICATE-----
1077
+ MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
1078
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
1079
+ TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
1080
+ MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
1081
+ bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
1082
+ IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
1083
+ AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
1084
+ 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
1085
+ /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
1086
+ juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
1087
+ ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
1088
+ DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
1089
+ /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
1090
+ ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
1091
+ cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
1092
+ uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
1093
+ pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
1094
+ BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
1095
+ R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
1096
+ 9y5Xt5hwXsjEeLBi
1097
+ -----END CERTIFICATE-----
1098
+
1099
+ QuoVadis Root CA
1100
+ ================
1101
+ -----BEGIN CERTIFICATE-----
1102
+ MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
1103
+ ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
1104
+ eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
1105
+ MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
1106
+ cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
1107
+ EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
1108
+ AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
1109
+ J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
1110
+ F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
1111
+ YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
1112
+ AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
1113
+ PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
1114
+ ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
1115
+ MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
1116
+ YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
1117
+ ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
1118
+ Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
1119
+ Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
1120
+ BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
1121
+ FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
1122
+ aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
1123
+ tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
1124
+ fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
1125
+ LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
1126
+ gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
1127
+ 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
1128
+ 5nrQNiOKSnQ2+Q==
1129
+ -----END CERTIFICATE-----
1130
+
1131
+ QuoVadis Root CA 2
1132
+ ==================
1133
+ -----BEGIN CERTIFICATE-----
1134
+ MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
1135
+ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
1136
+ ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
1137
+ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
1138
+ DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
1139
+ XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
1140
+ lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
1141
+ lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
1142
+ lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
1143
+ 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
1144
+ wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
1145
+ D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
1146
+ BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
1147
+ J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
1148
+ DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
1149
+ a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
1150
+ ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
1151
+ Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
1152
+ UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
1153
+ VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
1154
+ +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
1155
+ IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
1156
+ WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
1157
+ f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
1158
+ 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
1159
+ VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
1160
+ -----END CERTIFICATE-----
1161
+
1162
+ QuoVadis Root CA 3
1163
+ ==================
1164
+ -----BEGIN CERTIFICATE-----
1165
+ MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
1166
+ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
1167
+ OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
1168
+ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
1169
+ DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
1170
+ DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
1171
+ KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
1172
+ DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
1173
+ BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
1174
+ p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
1175
+ nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
1176
+ MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
1177
+ Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
1178
+ uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
1179
+ BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
1180
+ YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
1181
+ aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
1182
+ BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
1183
+ VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
1184
+ ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
1185
+ AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
1186
+ qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
1187
+ hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
1188
+ POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
1189
+ Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
1190
+ 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
1191
+ bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
1192
+ g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
1193
+ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
1194
+ qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
1195
+ -----END CERTIFICATE-----
1196
+
1197
+ Security Communication Root CA
1198
+ ==============================
1199
+ -----BEGIN CERTIFICATE-----
1200
+ MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
1201
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
1202
+ HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
1203
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
1204
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
1205
+ 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
1206
+ DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
1207
+ 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
1208
+ DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
1209
+ JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
1210
+ DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
1211
+ 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
1212
+ mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
1213
+ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
1214
+ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
1215
+ FL39vmwLAw==
1216
+ -----END CERTIFICATE-----
1217
+
1218
+ Sonera Class 1 Root CA
1219
+ ======================
1220
+ -----BEGIN CERTIFICATE-----
1221
+ MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
1222
+ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw
1223
+ NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
1224
+ IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88
1225
+ 7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9
1226
+ EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl
1227
+ 0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645
1228
+ 2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa
1229
+ HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT
1230
+ iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9
1231
+ 28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV
1232
+ yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR
1233
+ vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P
1234
+ qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z
1235
+ IRlXvVWa
1236
+ -----END CERTIFICATE-----
1237
+
1238
+ Sonera Class 2 Root CA
1239
+ ======================
1240
+ -----BEGIN CERTIFICATE-----
1241
+ MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
1242
+ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
1243
+ NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
1244
+ IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
1245
+ /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
1246
+ dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
1247
+ f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
1248
+ tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
1249
+ nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
1250
+ XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
1251
+ 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
1252
+ cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
1253
+ Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
1254
+ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
1255
+ llpwrN9M
1256
+ -----END CERTIFICATE-----
1257
+
1258
+ Staat der Nederlanden Root CA
1259
+ =============================
1260
+ -----BEGIN CERTIFICATE-----
1261
+ MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
1262
+ ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
1263
+ Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
1264
+ HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
1265
+ bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
1266
+ vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
1267
+ jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
1268
+ C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
1269
+ vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
1270
+ 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
1271
+ HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
1272
+ dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
1273
+ BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
1274
+ EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
1275
+ MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
1276
+ nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
1277
+ iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
1278
+ -----END CERTIFICATE-----
1279
+
1280
+ TDC Internet Root CA
1281
+ ====================
1282
+ -----BEGIN CERTIFICATE-----
1283
+ MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
1284
+ ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
1285
+ NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
1286
+ ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
1287
+ MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
1288
+ xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
1289
+ znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
1290
+ 5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
1291
+ otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
1292
+ AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
1293
+ VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
1294
+ MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
1295
+ AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
1296
+ UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
1297
+ CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
1298
+ gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
1299
+ 2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
1300
+ O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
1301
+ Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
1302
+ -----END CERTIFICATE-----
1303
+
1304
+ TDC OCES Root CA
1305
+ ================
1306
+ -----BEGIN CERTIFICATE-----
1307
+ MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE
1308
+ ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5
1309
+ MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB
1310
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH
1311
+ nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0
1312
+ zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV
1313
+ iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde
1314
+ dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO
1315
+ 3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB
1316
+ 5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k
1317
+ ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm
1318
+ cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp
1319
+ Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
1320
+ LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM
1321
+ MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
1322
+ aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
1323
+ MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647
1324
+ +RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6
1325
+ NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4
1326
+ A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc
1327
+ A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9
1328
+ AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1
1329
+ AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==
1330
+ -----END CERTIFICATE-----
1331
+
1332
+ UTN DATACorp SGC Root CA
1333
+ ========================
1334
+ -----BEGIN CERTIFICATE-----
1335
+ MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
1336
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
1337
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
1338
+ BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
1339
+ MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
1340
+ HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
1341
+ dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
1342
+ AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
1343
+ raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
1344
+ wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
1345
+ 9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
1346
+ 33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
1347
+ DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
1348
+ BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
1349
+ LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
1350
+ DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
1351
+ Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
1352
+ I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
1353
+ EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
1354
+ DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
1355
+ -----END CERTIFICATE-----
1356
+
1357
+ UTN USERFirst Email Root CA
1358
+ ===========================
1359
+ -----BEGIN CERTIFICATE-----
1360
+ MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
1361
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
1362
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0
1363
+ BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05
1364
+ OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx
1365
+ FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx
1366
+ ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz
1367
+ dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
1368
+ MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx
1369
+ B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8
1370
+ om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG
1371
+ TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl
1372
+ yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE
1373
+ AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV
1374
+ HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll
1375
+ bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
1376
+ AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne
1377
+ xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+
1378
+ 5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV
1379
+ NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ
1380
+ w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
1381
+ -----END CERTIFICATE-----
1382
+
1383
+ UTN USERFirst Hardware Root CA
1384
+ ==============================
1385
+ -----BEGIN CERTIFICATE-----
1386
+ MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
1387
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
1388
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
1389
+ BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
1390
+ OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
1391
+ eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
1392
+ ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
1393
+ DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
1394
+ wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
1395
+ tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
1396
+ i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
1397
+ Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
1398
+ gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
1399
+ lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
1400
+ UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
1401
+ BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
1402
+ //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
1403
+ XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
1404
+ lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
1405
+ iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
1406
+ nfhmqA==
1407
+ -----END CERTIFICATE-----
1408
+
1409
+ UTN USERFirst Object Root CA
1410
+ ============================
1411
+ -----BEGIN CERTIFICATE-----
1412
+ MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE
1413
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
1414
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb
1415
+ BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz
1416
+ NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx
1417
+ HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy
1418
+ dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB
1419
+ BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR
1420
+ loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ
1421
+ w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu
1422
+ lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7
1423
+ RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL
1424
+ BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8
1425
+ ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly
1426
+ c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw
1427
+ DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw
1428
+ NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO
1429
+ PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE
1430
+ qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG
1431
+ hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=
1432
+ -----END CERTIFICATE-----
1433
+
1434
+ Camerfirma Chambers of Commerce Root
1435
+ ====================================
1436
+ -----BEGIN CERTIFICATE-----
1437
+ MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
1438
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
1439
+ ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
1440
+ NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
1441
+ cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
1442
+ MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
1443
+ AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
1444
+ xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
1445
+ NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
1446
+ DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
1447
+ d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
1448
+ EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
1449
+ cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
1450
+ AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
1451
+ bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
1452
+ VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
1453
+ aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
1454
+ fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
1455
+ L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
1456
+ UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
1457
+ ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
1458
+ erfutGWaIZDgqtCYvDi1czyL+Nw=
1459
+ -----END CERTIFICATE-----
1460
+
1461
+ Camerfirma Global Chambersign Root
1462
+ ==================================
1463
+ -----BEGIN CERTIFICATE-----
1464
+ MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
1465
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
1466
+ ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
1467
+ NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
1468
+ YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
1469
+ MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
1470
+ ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
1471
+ 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
1472
+ by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
1473
+ 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
1474
+ 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
1475
+ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
1476
+ aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
1477
+ Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
1478
+ aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
1479
+ ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
1480
+ bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
1481
+ PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
1482
+ gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
1483
+ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
1484
+ IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
1485
+ t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
1486
+ -----END CERTIFICATE-----
1487
+
1488
+ NetLock Qualified (Class QA) Root
1489
+ =================================
1490
+ -----BEGIN CERTIFICATE-----
1491
+ MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
1492
+ CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
1493
+ BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn
1494
+ eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0
1495
+ bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER
1496
+ MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0
1497
+ LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0
1498
+ dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP
1499
+ aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV
1500
+ CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e
1501
+ 8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb
1502
+ m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ
1503
+ 0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM
1504
+ 0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
1505
+ HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2
1506
+ YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh
1507
+ biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p
1508
+ a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz
1509
+ YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg
1510
+ YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg
1511
+ ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov
1512
+ L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr
1513
+ Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0
1514
+ aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg
1515
+ YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0
1516
+ IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3
1517
+ DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN
1518
+ wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg
1519
+ W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc
1520
+ R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR
1521
+ 5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko
1522
+ -----END CERTIFICATE-----
1523
+
1524
+ NetLock Notary (Class A) Root
1525
+ =============================
1526
+ -----BEGIN CERTIFICATE-----
1527
+ MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
1528
+ EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
1529
+ dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
1530
+ ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
1531
+ DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
1532
+ EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
1533
+ VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
1534
+ cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
1535
+ D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
1536
+ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
1537
+ /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
1538
+ tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
1539
+ 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
1540
+ A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
1541
+ Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
1542
+ bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
1543
+ IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
1544
+ LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
1545
+ ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
1546
+ IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
1547
+ IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
1548
+ b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
1549
+ bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
1550
+ Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
1551
+ bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
1552
+ ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
1553
+ ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
1554
+ CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
1555
+ KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
1556
+ 8CgHrTwXZoi1/baI
1557
+ -----END CERTIFICATE-----
1558
+
1559
+ NetLock Business (Class B) Root
1560
+ ===============================
1561
+ -----BEGIN CERTIFICATE-----
1562
+ MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
1563
+ CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
1564
+ BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
1565
+ VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
1566
+ VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
1567
+ bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
1568
+ VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
1569
+ iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
1570
+ o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
1571
+ 1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
1572
+ HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
1573
+ RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
1574
+ dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
1575
+ ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
1576
+ c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
1577
+ YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
1578
+ c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
1579
+ Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
1580
+ bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
1581
+ IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
1582
+ YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
1583
+ cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
1584
+ 43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
1585
+ stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
1586
+ -----END CERTIFICATE-----
1587
+
1588
+ NetLock Express (Class C) Root
1589
+ ==============================
1590
+ -----BEGIN CERTIFICATE-----
1591
+ MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
1592
+ CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
1593
+ BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
1594
+ KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
1595
+ BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
1596
+ dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
1597
+ ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
1598
+ jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
1599
+ W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
1600
+ euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
1601
+ DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
1602
+ RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
1603
+ YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
1604
+ IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
1605
+ aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
1606
+ ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
1607
+ ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
1608
+ dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
1609
+ emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
1610
+ IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
1611
+ UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
1612
+ YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
1613
+ xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
1614
+ gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
1615
+ -----END CERTIFICATE-----
1616
+
1617
+ XRamp Global CA Root
1618
+ ====================
1619
+ -----BEGIN CERTIFICATE-----
1620
+ MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
1621
+ BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
1622
+ dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
1623
+ dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
1624
+ HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
1625
+ U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
1626
+ dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
1627
+ IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
1628
+ foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
1629
+ zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
1630
+ AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
1631
+ xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
1632
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
1633
+ oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
1634
+ AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
1635
+ /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
1636
+ qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
1637
+ nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
1638
+ 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
1639
+ -----END CERTIFICATE-----
1640
+
1641
+ Go Daddy Class 2 CA
1642
+ ===================
1643
+ -----BEGIN CERTIFICATE-----
1644
+ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
1645
+ VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
1646
+ ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
1647
+ A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
1648
+ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
1649
+ ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
1650
+ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
1651
+ qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
1652
+ YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
1653
+ vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
1654
+ BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
1655
+ atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
1656
+ MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
1657
+ A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
1658
+ PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
1659
+ I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
1660
+ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
1661
+ Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
1662
+ vZ8=
1663
+ -----END CERTIFICATE-----
1664
+
1665
+ Starfield Class 2 CA
1666
+ ====================
1667
+ -----BEGIN CERTIFICATE-----
1668
+ MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
1669
+ U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
1670
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
1671
+ MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
1672
+ A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
1673
+ SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
1674
+ bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
1675
+ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
1676
+ epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
1677
+ F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
1678
+ MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
1679
+ hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
1680
+ bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
1681
+ QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
1682
+ afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
1683
+ PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
1684
+ xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
1685
+ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
1686
+ QBFGmh95DmK/D5fs4C8fF5Q=
1687
+ -----END CERTIFICATE-----
1688
+
1689
+ StartCom Certification Authority
1690
+ ================================
1691
+ -----BEGIN CERTIFICATE-----
1692
+ MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
1693
+ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
1694
+ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
1695
+ NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
1696
+ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
1697
+ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
1698
+ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
1699
+ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
1700
+ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
1701
+ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
1702
+ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
1703
+ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
1704
+ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
1705
+ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
1706
+ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
1707
+ 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
1708
+ FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
1709
+ Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
1710
+ YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
1711
+ AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
1712
+ Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
1713
+ U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
1714
+ LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
1715
+ cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
1716
+ cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
1717
+ dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
1718
+ AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
1719
+ 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
1720
+ vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
1721
+ fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
1722
+ fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
1723
+ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
1724
+ yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
1725
+ 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
1726
+ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
1727
+ g14=
1728
+ -----END CERTIFICATE-----
1729
+
1730
+ Taiwan GRCA
1731
+ ===========
1732
+ -----BEGIN CERTIFICATE-----
1733
+ MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
1734
+ EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
1735
+ DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
1736
+ dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
1737
+ ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
1738
+ w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
1739
+ BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
1740
+ 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
1741
+ htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
1742
+ J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
1743
+ Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
1744
+ B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
1745
+ O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
1746
+ lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
1747
+ HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
1748
+ 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
1749
+ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
1750
+ Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
1751
+ Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
1752
+ D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
1753
+ DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
1754
+ Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
1755
+ 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
1756
+ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
1757
+ +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
1758
+ -----END CERTIFICATE-----
1759
+
1760
+ Firmaprofesional Root CA
1761
+ ========================
1762
+ -----BEGIN CERTIFICATE-----
1763
+ MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
1764
+ GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
1765
+ Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
1766
+ ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
1767
+ MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
1768
+ OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
1769
+ ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
1770
+ AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
1771
+ j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
1772
+ lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
1773
+ 3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
1774
+ NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
1775
+ KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
1776
+ AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
1777
+ DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
1778
+ ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
1779
+ u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
1780
+ wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
1781
+ 7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
1782
+ VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
1783
+ -----END CERTIFICATE-----
1784
+
1785
+ Wells Fargo Root CA
1786
+ ===================
1787
+ -----BEGIN CERTIFICATE-----
1788
+ MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
1789
+ BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
1790
+ cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
1791
+ MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
1792
+ bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
1793
+ MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
1794
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
1795
+ x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
1796
+ E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
1797
+ OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
1798
+ sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
1799
+ YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
1800
+ BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
1801
+ ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
1802
+ m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
1803
+ OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
1804
+ x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
1805
+ tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
1806
+ -----END CERTIFICATE-----
1807
+
1808
+ Swisscom Root CA 1
1809
+ ==================
1810
+ -----BEGIN CERTIFICATE-----
1811
+ MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
1812
+ EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
1813
+ dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
1814
+ MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
1815
+ aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
1816
+ IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
1817
+ MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
1818
+ NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
1819
+ AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
1820
+ b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
1821
+ 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
1822
+ cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
1823
+ WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
1824
+ haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
1825
+ MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
1826
+ HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
1827
+ BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
1828
+ MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
1829
+ jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
1830
+ MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
1831
+ VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
1832
+ vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
1833
+ OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
1834
+ 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
1835
+ nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
1836
+ x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
1837
+ NY6E0F/6MBr1mmz0DlP5OlvRHA==
1838
+ -----END CERTIFICATE-----
1839
+
1840
+ DigiCert Assured ID Root CA
1841
+ ===========================
1842
+ -----BEGIN CERTIFICATE-----
1843
+ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
1844
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
1845
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
1846
+ MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
1847
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
1848
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
1849
+ 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
1850
+ UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
1851
+ /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
1852
+ oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
1853
+ GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
1854
+ 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
1855
+ hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
1856
+ EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
1857
+ SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
1858
+ 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
1859
+ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
1860
+ -----END CERTIFICATE-----
1861
+
1862
+ DigiCert Global Root CA
1863
+ =======================
1864
+ -----BEGIN CERTIFICATE-----
1865
+ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
1866
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
1867
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
1868
+ MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
1869
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
1870
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
1871
+ TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
1872
+ BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
1873
+ 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
1874
+ 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
1875
+ o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
1876
+ 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
1877
+ BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
1878
+ EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
1879
+ tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
1880
+ UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
1881
+ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
1882
+ -----END CERTIFICATE-----
1883
+
1884
+ DigiCert High Assurance EV Root CA
1885
+ ==================================
1886
+ -----BEGIN CERTIFICATE-----
1887
+ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
1888
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
1889
+ KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
1890
+ MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
1891
+ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
1892
+ Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
1893
+ Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
1894
+ OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
1895
+ MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
1896
+ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
1897
+ h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
1898
+ Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
1899
+ JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
1900
+ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
1901
+ myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
1902
+ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
1903
+ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
1904
+ -----END CERTIFICATE-----
1905
+
1906
+ Certplus Class 2 Primary CA
1907
+ ===========================
1908
+ -----BEGIN CERTIFICATE-----
1909
+ MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
1910
+ BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
1911
+ OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
1912
+ dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
1913
+ ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
1914
+ 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
1915
+ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
1916
+ YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
1917
+ e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
1918
+ CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
1919
+ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
1920
+ L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
1921
+ P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
1922
+ TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
1923
+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
1924
+ //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
1925
+ l7+ijrRU
1926
+ -----END CERTIFICATE-----
1927
+
1928
+ DST Root CA X3
1929
+ ==============
1930
+ -----BEGIN CERTIFICATE-----
1931
+ MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
1932
+ ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
1933
+ DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
1934
+ cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
1935
+ ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
1936
+ rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
1937
+ UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
1938
+ xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
1939
+ utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
1940
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
1941
+ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
1942
+ dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
1943
+ GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
1944
+ RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
1945
+ fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
1946
+ -----END CERTIFICATE-----
1947
+
1948
+ DST ACES CA X6
1949
+ ==============
1950
+ -----BEGIN CERTIFICATE-----
1951
+ MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
1952
+ EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
1953
+ MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
1954
+ MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
1955
+ CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
1956
+ AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
1957
+ DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
1958
+ pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
1959
+ GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
1960
+ MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
1961
+ EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
1962
+ Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
1963
+ dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
1964
+ CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
1965
+ 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
1966
+ Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
1967
+ nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
1968
+ vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
1969
+ oKfN5XozNmr6mis=
1970
+ -----END CERTIFICATE-----
1971
+
1972
+ TURKTRUST Certificate Services Provider Root 1
1973
+ ==============================================
1974
+ -----BEGIN CERTIFICATE-----
1975
+ MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
1976
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
1977
+ MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
1978
+ acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
1979
+ MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
1980
+ U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
1981
+ TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
1982
+ aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
1983
+ AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
1984
+ yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
1985
+ Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
1986
+ 8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
1987
+ W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
1988
+ BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
1989
+ sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
1990
+ q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
1991
+ B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
1992
+ nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
1993
+ -----END CERTIFICATE-----
1994
+
1995
+ TURKTRUST Certificate Services Provider Root 2
1996
+ ==============================================
1997
+ -----BEGIN CERTIFICATE-----
1998
+ MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
1999
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
2000
+ MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
2001
+ QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
2002
+ MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
2003
+ dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
2004
+ A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
2005
+ acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
2006
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
2007
+ LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
2008
+ x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
2009
+ QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
2010
+ 5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
2011
+ AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
2012
+ A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
2013
+ Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
2014
+ Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
2015
+ hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
2016
+ 9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
2017
+ UrbnBEI=
2018
+ -----END CERTIFICATE-----
2019
+
2020
+ SwissSign Platinum CA - G2
2021
+ ==========================
2022
+ -----BEGIN CERTIFICATE-----
2023
+ MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT
2024
+ BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw
2025
+ HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM
2026
+ U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ
2027
+ KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu
2028
+ 669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF
2029
+ eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne
2030
+ WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo
2031
+ j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6
2032
+ 8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T
2033
+ aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy
2034
+ domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D
2035
+ +m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV
2036
+ CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
2037
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv
2038
+ zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
2039
+ IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1
2040
+ Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3
2041
+ NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4
2042
+ U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8
2043
+ KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl
2044
+ 9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B
2045
+ aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs
2046
+ OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY
2047
+ Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci
2048
+ IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
2049
+ -----END CERTIFICATE-----
2050
+
2051
+ SwissSign Gold CA - G2
2052
+ ======================
2053
+ -----BEGIN CERTIFICATE-----
2054
+ MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
2055
+ EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
2056
+ MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
2057
+ c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
2058
+ AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
2059
+ t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
2060
+ jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
2061
+ vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
2062
+ ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
2063
+ AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
2064
+ jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
2065
+ peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
2066
+ 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
2067
+ GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
2068
+ AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
2069
+ OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
2070
+ L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
2071
+ 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
2072
+ 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
2073
+ Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
2074
+ Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
2075
+ mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
2076
+ vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
2077
+ KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
2078
+ NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
2079
+ viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
2080
+ -----END CERTIFICATE-----
2081
+
2082
+ SwissSign Silver CA - G2
2083
+ ========================
2084
+ -----BEGIN CERTIFICATE-----
2085
+ MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
2086
+ BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
2087
+ DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
2088
+ aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
2089
+ 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
2090
+ N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
2091
+ +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
2092
+ 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
2093
+ MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
2094
+ qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
2095
+ FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
2096
+ ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
2097
+ celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
2098
+ CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
2099
+ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
2100
+ tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
2101
+ cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
2102
+ 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
2103
+ kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
2104
+ 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
2105
+ /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
2106
+ DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
2107
+ e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
2108
+ WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
2109
+ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
2110
+ DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
2111
+ -----END CERTIFICATE-----
2112
+
2113
+ GeoTrust Primary Certification Authority
2114
+ ========================================
2115
+ -----BEGIN CERTIFICATE-----
2116
+ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
2117
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
2118
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
2119
+ CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
2120
+ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
2121
+ CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
2122
+ b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
2123
+ nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
2124
+ RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
2125
+ tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
2126
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
2127
+ hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
2128
+ Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
2129
+ NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
2130
+ Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
2131
+ 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
2132
+ -----END CERTIFICATE-----
2133
+
2134
+ thawte Primary Root CA
2135
+ ======================
2136
+ -----BEGIN CERTIFICATE-----
2137
+ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
2138
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
2139
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
2140
+ cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
2141
+ MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
2142
+ SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
2143
+ KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
2144
+ FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
2145
+ oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
2146
+ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
2147
+ q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
2148
+ aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
2149
+ afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
2150
+ VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
2151
+ AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
2152
+ uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
2153
+ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
2154
+ jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
2155
+ z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
2156
+ -----END CERTIFICATE-----
2157
+
2158
+ VeriSign Class 3 Public Primary Certification Authority - G5
2159
+ ============================================================
2160
+ -----BEGIN CERTIFICATE-----
2161
+ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
2162
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
2163
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
2164
+ IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
2165
+ ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
2166
+ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
2167
+ biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
2168
+ dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
2169
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
2170
+ ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
2171
+ j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
2172
+ Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
2173
+ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
2174
+ fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
2175
+ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
2176
+ Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
2177
+ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
2178
+ SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
2179
+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
2180
+ KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
2181
+ Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
2182
+ ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
2183
+ -----END CERTIFICATE-----
2184
+
2185
+ SecureTrust CA
2186
+ ==============
2187
+ -----BEGIN CERTIFICATE-----
2188
+ MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
2189
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
2190
+ dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
2191
+ BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
2192
+ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
2193
+ OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
2194
+ DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
2195
+ GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
2196
+ 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
2197
+ ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
2198
+ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
2199
+ aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
2200
+ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
2201
+ SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
2202
+ mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
2203
+ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
2204
+ 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
2205
+ -----END CERTIFICATE-----
2206
+
2207
+ Secure Global CA
2208
+ ================
2209
+ -----BEGIN CERTIFICATE-----
2210
+ MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
2211
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
2212
+ bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
2213
+ MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
2214
+ Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
2215
+ YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
2216
+ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
2217
+ 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
2218
+ HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
2219
+ 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
2220
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
2221
+ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
2222
+ MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
2223
+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
2224
+ CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
2225
+ 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
2226
+ f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
2227
+ -----END CERTIFICATE-----
2228
+
2229
+ COMODO Certification Authority
2230
+ ==============================
2231
+ -----BEGIN CERTIFICATE-----
2232
+ MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
2233
+ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
2234
+ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
2235
+ dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
2236
+ MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
2237
+ T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
2238
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
2239
+ +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
2240
+ xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
2241
+ 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
2242
+ 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
2243
+ rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
2244
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
2245
+ b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
2246
+ AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
2247
+ OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
2248
+ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
2249
+ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
2250
+ +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
2251
+ -----END CERTIFICATE-----
2252
+
2253
+ DigiNotar Root CA
2254
+ =================
2255
+ -----BEGIN CERTIFICATE-----
2256
+ MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQG
2257
+ EwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEgMB4G
2258
+ CSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwHhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgx
2259
+ OTIxWjBfMQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90
2260
+ YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3
2261
+ DQEBAQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B8cp86Yxq
2262
+ 7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXYtsMW2YiwsYcdcNqGtA8U
2263
+ i3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIlHgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8
2264
+ ZkqQfioLBQftFl9VkHXYRskbg+IIvvEjzJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEq
2265
+ bYRAhU52mXyC8/O3AlnUJgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4
2266
+ iHomGgVMktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXva5pk
2267
+ XuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57pK6kwe6AYHw4YC+Vb
2268
+ qdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMipuih2TkGl/VujQKQjBR7P4DNG5y6
2269
+ xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovTyD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHc
2270
+ BmfFlHqabWJMfczgZICynkeOowIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
2271
+ AwIBBjAdBgNVHQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC
2272
+ jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXyfJ9oHbtdzno5
2273
+ wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBoY6pFITlIYXg23PFDk9Qlx/KA
2274
+ ZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHoM/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedT
2275
+ FLJgQT2EkTFoPSdE2+Xe9PpjRchMPpj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKf
2276
+ yvBovWsdst+Nbwed2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoA
2277
+ ZbwH/M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQlnQ7KN+ZQ
2278
+ /YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jEO1hZibCMjFCz2IbLaKPE
2279
+ CudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU9jQZjHkJNsphFyUXC4KYcwx3dMPVDceo
2280
+ EkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr
2281
+ -----END CERTIFICATE-----
2282
+
2283
+ Network Solutions Certificate Authority
2284
+ =======================================
2285
+ -----BEGIN CERTIFICATE-----
2286
+ MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
2287
+ EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
2288
+ IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
2289
+ MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
2290
+ MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
2291
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
2292
+ jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
2293
+ aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
2294
+ crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
2295
+ /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
2296
+ AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
2297
+ BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
2298
+ bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
2299
+ A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
2300
+ 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
2301
+ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
2302
+ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
2303
+ ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
2304
+ -----END CERTIFICATE-----
2305
+
2306
+ WellsSecure Public Root Certificate Authority
2307
+ =============================================
2308
+ -----BEGIN CERTIFICATE-----
2309
+ MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
2310
+ F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
2311
+ NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
2312
+ MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
2313
+ bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
2314
+ VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
2315
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
2316
+ iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
2317
+ i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
2318
+ bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
2319
+ K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
2320
+ AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
2321
+ cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
2322
+ lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
2323
+ i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
2324
+ GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
2325
+ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
2326
+ K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
2327
+ bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
2328
+ qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
2329
+ E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
2330
+ tylv2G0xffX8oRAHh84vWdw+WNs=
2331
+ -----END CERTIFICATE-----
2332
+
2333
+ COMODO ECC Certification Authority
2334
+ ==================================
2335
+ -----BEGIN CERTIFICATE-----
2336
+ MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
2337
+ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
2338
+ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
2339
+ dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
2340
+ GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
2341
+ Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
2342
+ b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
2343
+ 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
2344
+ wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
2345
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
2346
+ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
2347
+ U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
2348
+ -----END CERTIFICATE-----
2349
+
2350
+ MD5 Collisions Forged Rogue CA 25c3
2351
+ ===================================
2352
+ -----BEGIN CERTIFICATE-----
2353
+ MIIEMjCCA5ugAwIBAgIBQjANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
2354
+ RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
2355
+ bmVzcyBDQS0xMB4XDTA0MDczMTAwMDAwMVoXDTA0MDkwMjAwMDAwMVowPDE6MDgGA1UEAxMxTUQ1
2356
+ IENvbGxpc2lvbnMgSW5jLiAoaHR0cDovL3d3dy5waHJlZWRvbS5vcmcvbWQ1KTCBnzANBgkqhkiG
2357
+ 9w0BAQEFAAOBjQAwgYkCgYEAuqZZySwo1iqw+O2fRqSkN+4OGWhZ0bMDmVHWFppeN2sV4A5L9YRk
2358
+ +KPbQW811ZsVH9vEOFJwgZdej6C193458DKsHq1E0rP6SMPOkZvs9Jx84Vr1yDdrmoPe58oglzFC
2359
+ cxWRaPSIr/koKMXpD3OwF0sTTJl10ETmfghsGvJPG0ECAwEAAaOCAiQwggIgMAsGA1UdDwQEAwIB
2360
+ xjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSnBGAfq3JDCMV/CJBVVhzWzuY46zAfBgNVHSME
2361
+ GDAWgBS+qKB0clBrRLfJI9j7qP+zV2tobDCCAb4GCWCGSAGG+EIBDQSCAa8WggGrMwAAACdeOeCJ
2362
+ YQ9Oo8VFCza7AdFTqsMIj2/4Tz6Hh0QR3GDg35JV+bhzG1STxZ/QRsRgtjVizbmvHKhpGslbPJY3
2363
+ wO1n77v+wIucUC8pvYMino4I+qwTcKJYf2JiihH3ifbftmdZcxb7YxaKtJE4zi71tr5MpJRJ5GUR
2364
+ CkIVycEw4mnVRX2lJru5YexiZPA54ee8aNhQUZ4dYNPRo6cK+AMgoXABF5E2TwJwMYaD3fcP2Acd
2365
+ EbMTBKXc8K5QsSgOY2kqDIJvj0cz32yiBpLxT0W+2TA2oyuM1neuNWN/Tkyak0g22Z8CAwEAAaOB
2366
+ vTCBujAOBgNVHQ8BAf8EBAMCBPAwHQYDVR0OBBYEFM2mg/qlYDf3ljcXKd5BePGHiVXnMDsGA1Ud
2367
+ HwQ0MDIwMKAuoCyGKmh0dHA6Ly9jcmwuZ2VvdHJ1c3QuY29tL2NybHMvZ2xvYmFsY2ExLmNybDAf
2368
+ BgNVHSMEGDAWgBS+qKB0clBrRLfJI9j7qP+zV2tobDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB
2369
+ BQUHAwIwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQQFAAOBgQCnIQKN0Q6igHcl/UNgFY/s75BH
2370
+ 1IRCFSYRHM3CPBApqbbfq1d1kdrlK7OQRRwwY1Y/itlQ+u1YbMBlrGZX3hzGdjv1AA6ORc5/TJDs
2371
+ K8bNs7SPYtD+t8UmckTt9phbrsvRlfXaCL5oRrF1yOwdjx56lPGqU3iiRa5U6tGedMh2Zw==
2372
+ -----END CERTIFICATE-----
2373
+
2374
+ IGC/A
2375
+ =====
2376
+ -----BEGIN CERTIFICATE-----
2377
+ MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
2378
+ VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
2379
+ Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
2380
+ MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
2381
+ EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
2382
+ STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
2383
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
2384
+ TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
2385
+ So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
2386
+ HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
2387
+ frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
2388
+ tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
2389
+ egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
2390
+ iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
2391
+ q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
2392
+ MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
2393
+ Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
2394
+ lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
2395
+ 0mBWWg==
2396
+ -----END CERTIFICATE-----
2397
+
2398
+ Security Communication EV RootCA1
2399
+ =================================
2400
+ -----BEGIN CERTIFICATE-----
2401
+ MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
2402
+ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
2403
+ dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
2404
+ BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
2405
+ Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
2406
+ AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
2407
+ /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
2408
+ WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
2409
+ ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
2410
+ bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
2411
+ 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
2412
+ SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
2413
+ iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
2414
+ Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
2415
+ mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
2416
+ T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
2417
+ -----END CERTIFICATE-----
2418
+
2419
+ OISTE WISeKey Global Root GA CA
2420
+ ===============================
2421
+ -----BEGIN CERTIFICATE-----
2422
+ MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
2423
+ BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
2424
+ A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
2425
+ bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
2426
+ VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
2427
+ IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
2428
+ IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
2429
+ Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
2430
+ Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
2431
+ d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
2432
+ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
2433
+ LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
2434
+ AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
2435
+ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
2436
+ MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
2437
+ +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
2438
+ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
2439
+ okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
2440
+ -----END CERTIFICATE-----
2441
+
2442
+ S-TRUST Authentication and Encryption Root CA 2005 PN
2443
+ =====================================================
2444
+ -----BEGIN CERTIFICATE-----
2445
+ MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
2446
+ BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh
2447
+ cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT
2448
+ LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w
2449
+ NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk
2450
+ ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj
2451
+ aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp
2452
+ b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
2453
+ MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob
2454
+ 4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL
2455
+ g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf
2456
+ eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3
2457
+ KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB
2458
+ /wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv
2459
+ bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU
2460
+ D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD
2461
+ pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08
2462
+ P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA
2463
+ nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit
2464
+ F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b
2465
+ Hz2eBIPdltkdOpQ=
2466
+ -----END CERTIFICATE-----
2467
+
2468
+ Microsec e-Szigno Root CA
2469
+ =========================
2470
+ -----BEGIN CERTIFICATE-----
2471
+ MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
2472
+ BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
2473
+ EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
2474
+ MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
2475
+ dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
2476
+ GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
2477
+ AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
2478
+ d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
2479
+ oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
2480
+ QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
2481
+ PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
2482
+ MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
2483
+ IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
2484
+ VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
2485
+ LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
2486
+ dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
2487
+ AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
2488
+ 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
2489
+ AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
2490
+ egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
2491
+ Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
2492
+ PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
2493
+ c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
2494
+ cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
2495
+ IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
2496
+ WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
2497
+ MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
2498
+ MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
2499
+ Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
2500
+ HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
2501
+ nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
2502
+ aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
2503
+ 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
2504
+ yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
2505
+ S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
2506
+ -----END CERTIFICATE-----
2507
+
2508
+ Certigna
2509
+ ========
2510
+ -----BEGIN CERTIFICATE-----
2511
+ MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
2512
+ EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
2513
+ MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
2514
+ Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
2515
+ XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
2516
+ GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
2517
+ ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
2518
+ DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
2519
+ Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
2520
+ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
2521
+ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
2522
+ SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
2523
+ hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
2524
+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
2525
+ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
2526
+ 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
2527
+ WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
2528
+ -----END CERTIFICATE-----
2529
+
2530
+ AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
2531
+ ======================================
2532
+ -----BEGIN CERTIFICATE-----
2533
+ MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
2534
+ AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
2535
+ LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
2536
+ HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
2537
+ U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
2538
+ IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
2539
+ AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
2540
+ yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
2541
+ 2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
2542
+ 4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
2543
+ 2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
2544
+ 8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
2545
+ HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
2546
+ Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
2547
+ 5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
2548
+ czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
2549
+ AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
2550
+ ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
2551
+ BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
2552
+ cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
2553
+ AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
2554
+ EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
2555
+ /zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
2556
+ MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
2557
+ 3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
2558
+ eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
2559
+ /RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
2560
+ RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
2561
+ Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
2562
+ -----END CERTIFICATE-----
2563
+
2564
+ TC TrustCenter Class 2 CA II
2565
+ ============================
2566
+ -----BEGIN CERTIFICATE-----
2567
+ MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
2568
+ REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
2569
+ IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
2570
+ MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
2571
+ c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
2572
+ AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
2573
+ AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
2574
+ IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
2575
+ xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
2576
+ Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
2577
+ SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
2578
+ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
2579
+ 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
2580
+ Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
2581
+ cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
2582
+ SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
2583
+ TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
2584
+ dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
2585
+ KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
2586
+ TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
2587
+ JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
2588
+ vQ==
2589
+ -----END CERTIFICATE-----
2590
+
2591
+ TC TrustCenter Class 3 CA II
2592
+ ============================
2593
+ -----BEGIN CERTIFICATE-----
2594
+ MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
2595
+ REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
2596
+ IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
2597
+ MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
2598
+ c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
2599
+ AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
2600
+ AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
2601
+ yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
2602
+ 6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
2603
+ uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
2604
+ 2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
2605
+ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
2606
+ 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
2607
+ Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
2608
+ cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
2609
+ SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
2610
+ TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
2611
+ O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
2612
+ yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
2613
+ IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
2614
+ 092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
2615
+ 5A==
2616
+ -----END CERTIFICATE-----
2617
+
2618
+ TC TrustCenter Universal CA I
2619
+ =============================
2620
+ -----BEGIN CERTIFICATE-----
2621
+ MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
2622
+ REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
2623
+ IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
2624
+ MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
2625
+ VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
2626
+ JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
2627
+ ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
2628
+ qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
2629
+ xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
2630
+ ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
2631
+ gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
2632
+ BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2633
+ AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
2634
+ 1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
2635
+ vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
2636
+ ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
2637
+ ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
2638
+ 7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
2639
+ -----END CERTIFICATE-----
2640
+
2641
+ Deutsche Telekom Root CA 2
2642
+ ==========================
2643
+ -----BEGIN CERTIFICATE-----
2644
+ MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
2645
+ RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
2646
+ A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
2647
+ MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
2648
+ A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
2649
+ b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
2650
+ bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
2651
+ KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
2652
+ AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
2653
+ Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
2654
+ jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
2655
+ HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
2656
+ E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
2657
+ zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
2658
+ rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
2659
+ dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
2660
+ Cm26OWMohpLzGITY+9HPBVZkVw==
2661
+ -----END CERTIFICATE-----
2662
+
2663
+ ComSign CA
2664
+ ==========
2665
+ -----BEGIN CERTIFICATE-----
2666
+ MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD
2667
+ EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy
2668
+ MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp
2669
+ Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q
2670
+ ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy
2671
+ P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN
2672
+ GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk
2673
+ YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM
2674
+ rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy
2675
+ oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P
2676
+ AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+
2677
+ VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2
2678
+ QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI
2679
+ mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb
2680
+ /627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG
2681
+ zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U
2682
+ AGegcQCCSA==
2683
+ -----END CERTIFICATE-----
2684
+
2685
+ ComSign Secured CA
2686
+ ==================
2687
+ -----BEGIN CERTIFICATE-----
2688
+ MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
2689
+ AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
2690
+ NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
2691
+ QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
2692
+ ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
2693
+ 49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
2694
+ 7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
2695
+ kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
2696
+ 9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
2697
+ AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
2698
+ U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
2699
+ j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
2700
+ AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
2701
+ BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
2702
+ FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
2703
+ 51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
2704
+ OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
2705
+ -----END CERTIFICATE-----
2706
+
2707
+ Cybertrust Global Root
2708
+ ======================
2709
+ -----BEGIN CERTIFICATE-----
2710
+ MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
2711
+ ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
2712
+ MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
2713
+ ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
2714
+ +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
2715
+ 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
2716
+ AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
2717
+ 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
2718
+ 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
2719
+ BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
2720
+ MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
2721
+ A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
2722
+ lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
2723
+ 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
2724
+ hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
2725
+ X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
2726
+ WL1WMRJOEcgh4LMRkWXbtKaIOM5V
2727
+ -----END CERTIFICATE-----
2728
+
2729
+ ePKI Root Certification Authority
2730
+ =================================
2731
+ -----BEGIN CERTIFICATE-----
2732
+ MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
2733
+ EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
2734
+ Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
2735
+ MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
2736
+ MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
2737
+ AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
2738
+ IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
2739
+ lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
2740
+ qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
2741
+ 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
2742
+ WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
2743
+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
2744
+ lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
2745
+ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
2746
+ Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
2747
+ MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
2748
+ ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
2749
+ 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
2750
+ KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
2751
+ xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
2752
+ NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
2753
+ GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
2754
+ xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
2755
+ gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
2756
+ sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
2757
+ BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
2758
+ -----END CERTIFICATE-----
2759
+
2760
+ 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
2761
+ =============================================================================================================================
2762
+ -----BEGIN CERTIFICATE-----
2763
+ MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
2764
+ DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
2765
+ aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
2766
+ b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
2767
+ BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
2768
+ S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
2769
+ MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
2770
+ IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
2771
+ n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
2772
+ IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
2773
+ dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
2774
+ cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
2775
+ AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
2776
+ Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
2777
+ xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
2778
+ 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
2779
+ hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
2780
+ BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
2781
+ MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
2782
+ N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
2783
+ y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
2784
+ LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
2785
+ dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
2786
+ -----END CERTIFICATE-----
2787
+
2788
+ Buypass Class 2 CA 1
2789
+ ====================
2790
+ -----BEGIN CERTIFICATE-----
2791
+ MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
2792
+ QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
2793
+ MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
2794
+ c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
2795
+ hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
2796
+ cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
2797
+ 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
2798
+ 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
2799
+ uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
2800
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
2801
+ AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
2802
+ 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
2803
+ 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
2804
+ fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
2805
+ wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
2806
+ -----END CERTIFICATE-----
2807
+
2808
+ Buypass Class 3 CA 1
2809
+ ====================
2810
+ -----BEGIN CERTIFICATE-----
2811
+ MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
2812
+ QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
2813
+ MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
2814
+ c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
2815
+ hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
2816
+ ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
2817
+ n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
2818
+ AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
2819
+ 1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
2820
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
2821
+ AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
2822
+ pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
2823
+ EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
2824
+ htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
2825
+ el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
2826
+ -----END CERTIFICATE-----
2827
+
2828
+ EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
2829
+ ==========================================================================
2830
+ -----BEGIN CERTIFICATE-----
2831
+ MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
2832
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
2833
+ QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
2834
+ Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
2835
+ ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
2836
+ IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
2837
+ SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
2838
+ X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
2839
+ gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
2840
+ eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
2841
+ TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
2842
+ Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
2843
+ uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
2844
+ qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
2845
+ ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
2846
+ Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
2847
+ /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
2848
+ Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
2849
+ FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
2850
+ zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
2851
+ XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
2852
+ bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
2853
+ RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
2854
+ 1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
2855
+ 2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
2856
+ Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
2857
+ AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
2858
+ -----END CERTIFICATE-----
2859
+
2860
+ certSIGN ROOT CA
2861
+ ================
2862
+ -----BEGIN CERTIFICATE-----
2863
+ MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
2864
+ VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
2865
+ Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
2866
+ CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
2867
+ JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
2868
+ rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
2869
+ ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
2870
+ 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
2871
+ AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
2872
+ Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
2873
+ AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
2874
+ SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
2875
+ x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
2876
+ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
2877
+ TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
2878
+ -----END CERTIFICATE-----
2879
+
2880
+ CNNIC ROOT
2881
+ ==========
2882
+ -----BEGIN CERTIFICATE-----
2883
+ MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
2884
+ ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
2885
+ OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
2886
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
2887
+ o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
2888
+ VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
2889
+ VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
2890
+ czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
2891
+ y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
2892
+ wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
2893
+ lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
2894
+ Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
2895
+ O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
2896
+ BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
2897
+ G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
2898
+ mxE=
2899
+ -----END CERTIFICATE-----
2900
+
2901
+ ApplicationCA - Japanese Government
2902
+ ===================================
2903
+ -----BEGIN CERTIFICATE-----
2904
+ MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
2905
+ SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
2906
+ MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
2907
+ cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
2908
+ CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
2909
+ fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
2910
+ wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
2911
+ jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
2912
+ nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
2913
+ WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
2914
+ BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
2915
+ vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
2916
+ o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
2917
+ /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
2918
+ io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
2919
+ dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
2920
+ rosot4LKGAfmt1t06SAZf7IbiVQ=
2921
+ -----END CERTIFICATE-----
2922
+
2923
+ GeoTrust Primary Certification Authority - G3
2924
+ =============================================
2925
+ -----BEGIN CERTIFICATE-----
2926
+ MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
2927
+ BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
2928
+ IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
2929
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
2930
+ NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
2931
+ YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
2932
+ LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
2933
+ hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
2934
+ K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
2935
+ c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
2936
+ IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
2937
+ dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
2938
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
2939
+ 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
2940
+ cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
2941
+ Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
2942
+ AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
2943
+ t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
2944
+ -----END CERTIFICATE-----
2945
+
2946
+ thawte Primary Root CA - G2
2947
+ ===========================
2948
+ -----BEGIN CERTIFICATE-----
2949
+ MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
2950
+ VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
2951
+ IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
2952
+ Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
2953
+ MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
2954
+ b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
2955
+ IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
2956
+ LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
2957
+ 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
2958
+ mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
2959
+ G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
2960
+ rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
2961
+ -----END CERTIFICATE-----
2962
+
2963
+ thawte Primary Root CA - G3
2964
+ ===========================
2965
+ -----BEGIN CERTIFICATE-----
2966
+ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
2967
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
2968
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
2969
+ cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
2970
+ ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
2971
+ d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
2972
+ VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
2973
+ A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
2974
+ MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
2975
+ P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
2976
+ +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
2977
+ 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
2978
+ vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
2979
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
2980
+ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
2981
+ A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
2982
+ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
2983
+ 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
2984
+ er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
2985
+ -----END CERTIFICATE-----
2986
+
2987
+ GeoTrust Primary Certification Authority - G2
2988
+ =============================================
2989
+ -----BEGIN CERTIFICATE-----
2990
+ MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
2991
+ VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
2992
+ Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
2993
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
2994
+ OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
2995
+ MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
2996
+ b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
2997
+ BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
2998
+ KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
2999
+ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
3000
+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
3001
+ ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
3002
+ npaqBA+K
3003
+ -----END CERTIFICATE-----
3004
+
3005
+ VeriSign Universal Root Certification Authority
3006
+ ===============================================
3007
+ -----BEGIN CERTIFICATE-----
3008
+ MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
3009
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
3010
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
3011
+ IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
3012
+ IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
3013
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
3014
+ cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
3015
+ IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
3016
+ aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
3017
+ 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
3018
+ MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
3019
+ 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
3020
+ AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
3021
+ tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
3022
+ CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
3023
+ a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
3024
+ DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
3025
+ Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
3026
+ Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
3027
+ P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
3028
+ wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
3029
+ mJO37M2CYfE45k+XmCpajQ==
3030
+ -----END CERTIFICATE-----
3031
+
3032
+ VeriSign Class 3 Public Primary Certification Authority - G4
3033
+ ============================================================
3034
+ -----BEGIN CERTIFICATE-----
3035
+ MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
3036
+ VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
3037
+ b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
3038
+ ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
3039
+ YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
3040
+ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
3041
+ cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
3042
+ b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
3043
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
3044
+ Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
3045
+ rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
3046
+ /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
3047
+ HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
3048
+ Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
3049
+ A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
3050
+ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
3051
+ -----END CERTIFICATE-----
3052
+
3053
+ NetLock Arany (Class Gold) Főtanúsítvány
3054
+ ============================================
3055
+ -----BEGIN CERTIFICATE-----
3056
+ MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
3057
+ A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
3058
+ dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
3059
+ cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
3060
+ MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
3061
+ ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
3062
+ biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
3063
+ c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
3064
+ 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
3065
+ /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
3066
+ H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
3067
+ fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
3068
+ neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
3069
+ BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
3070
+ qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
3071
+ YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
3072
+ bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
3073
+ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
3074
+ dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
3075
+ -----END CERTIFICATE-----
3076
+
3077
+ Staat der Nederlanden Root CA - G2
3078
+ ==================================
3079
+ -----BEGIN CERTIFICATE-----
3080
+ MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
3081
+ CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
3082
+ Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
3083
+ TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
3084
+ ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
3085
+ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
3086
+ vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
3087
+ CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
3088
+ e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
3089
+ OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
3090
+ CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
3091
+ 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
3092
+ trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
3093
+ qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
3094
+ AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
3095
+ ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
3096
+ HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
3097
+ A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
3098
+ +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
3099
+ f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
3100
+ kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
3101
+ CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
3102
+ URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
3103
+ CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
3104
+ oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
3105
+ IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
3106
+ 66+KAQ==
3107
+ -----END CERTIFICATE-----
3108
+
3109
+ CA Disig
3110
+ ========
3111
+ -----BEGIN CERTIFICATE-----
3112
+ MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
3113
+ QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
3114
+ MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
3115
+ bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
3116
+ DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
3117
+ GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
3118
+ Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
3119
+ hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
3120
+ ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
3121
+ gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
3122
+ AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
3123
+ aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
3124
+ ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
3125
+ BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
3126
+ WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
3127
+ mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
3128
+ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
3129
+ ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
3130
+ 4Z7CRneC9VkGjCFMhwnN5ag=
3131
+ -----END CERTIFICATE-----
3132
+
3133
+ Juur-SK
3134
+ =======
3135
+ -----BEGIN CERTIFICATE-----
3136
+ MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
3137
+ c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
3138
+ DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
3139
+ SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
3140
+ aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
3141
+ ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
3142
+ TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
3143
+ +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
3144
+ UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
3145
+ Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
3146
+ MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
3147
+ HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
3148
+ AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
3149
+ cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
3150
+ AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
3151
+ cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
3152
+ FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
3153
+ A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
3154
+ ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
3155
+ abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
3156
+ IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
3157
+ Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
3158
+ yyqcjg==
3159
+ -----END CERTIFICATE-----
3160
+
3161
+ Hongkong Post Root CA 1
3162
+ =======================
3163
+ -----BEGIN CERTIFICATE-----
3164
+ MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
3165
+ DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
3166
+ NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
3167
+ IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
3168
+ AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
3169
+ ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
3170
+ auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
3171
+ qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
3172
+ V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
3173
+ HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
3174
+ h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
3175
+ l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
3176
+ IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
3177
+ T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
3178
+ c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
3179
+ -----END CERTIFICATE-----
3180
+
3181
+ SecureSign RootCA11
3182
+ ===================
3183
+ -----BEGIN CERTIFICATE-----
3184
+ MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
3185
+ SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
3186
+ b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
3187
+ KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
3188
+ cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
3189
+ TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
3190
+ wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
3191
+ g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
3192
+ O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
3193
+ bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
3194
+ t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
3195
+ OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
3196
+ bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
3197
+ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
3198
+ y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
3199
+ lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
3200
+ -----END CERTIFICATE-----
3201
+
3202
+ ACEDICOM Root
3203
+ =============
3204
+ -----BEGIN CERTIFICATE-----
3205
+ MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
3206
+ T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
3207
+ MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
3208
+ A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
3209
+ AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
3210
+ WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
3211
+ YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
3212
+ MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
3213
+ m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
3214
+ HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
3215
+ xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
3216
+ 3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
3217
+ 2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
3218
+ TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
3219
+ 4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
3220
+ 9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
3221
+ bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
3222
+ aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
3223
+ eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
3224
+ zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
3225
+ ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
3226
+ KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
3227
+ nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
3228
+ I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
3229
+ MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
3230
+ tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
3231
+ -----END CERTIFICATE-----
3232
+
3233
+ Verisign Class 1 Public Primary Certification Authority
3234
+ =======================================================
3235
+ -----BEGIN CERTIFICATE-----
3236
+ MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
3237
+ FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5
3238
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
3239
+ XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx
3240
+ IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
3241
+ A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ
3242
+ VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2
3243
+ yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa
3244
+ XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n
3245
+ 0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ
3246
+ RjXZ+Hxb
3247
+ -----END CERTIFICATE-----
3248
+
3249
+ Verisign Class 3 Public Primary Certification Authority
3250
+ =======================================================
3251
+ -----BEGIN CERTIFICATE-----
3252
+ MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
3253
+ FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
3254
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
3255
+ XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
3256
+ IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
3257
+ A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
3258
+ f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
3259
+ hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
3260
+ CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
3261
+ bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
3262
+ D/xwzoiQ
3263
+ -----END CERTIFICATE-----
3264
+
3265
+ Microsec e-Szigno Root CA 2009
3266
+ ==============================
3267
+ -----BEGIN CERTIFICATE-----
3268
+ MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
3269
+ MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
3270
+ c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
3271
+ dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
3272
+ BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
3273
+ U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
3274
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
3275
+ fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
3276
+ 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
3277
+ pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
3278
+ 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
3279
+ AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
3280
+ QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
3281
+ FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
3282
+ lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
3283
+ I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
3284
+ tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
3285
+ yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
3286
+ LXpUq3DDfSJlgnCW
3287
+ -----END CERTIFICATE-----
3288
+
3289
+ E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
3290
+ ===================================================
3291
+ -----BEGIN CERTIFICATE-----
3292
+ MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
3293
+ EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
3294
+ ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
3295
+ MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
3296
+ cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
3297
+ aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
3298
+ AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
3299
+ 8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
3300
+ jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
3301
+ JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
3302
+ 9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
3303
+ AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
3304
+ SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
3305
+ F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
3306
+ D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
3307
+ Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
3308
+ fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
3309
+ -----END CERTIFICATE-----
3310
+
3311
+ GlobalSign Root CA - R3
3312
+ =======================
3313
+ -----BEGIN CERTIFICATE-----
3314
+ MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
3315
+ YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
3316
+ bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
3317
+ aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
3318
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
3319
+ iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
3320
+ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
3321
+ rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
3322
+ OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
3323
+ xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
3324
+ FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
3325
+ lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
3326
+ EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
3327
+ bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
3328
+ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
3329
+ kpeDMdmztcpHWD9f
3330
+ -----END CERTIFICATE-----
3331
+
3332
+ TC TrustCenter Universal CA III
3333
+ ===============================
3334
+ -----BEGIN CERTIFICATE-----
3335
+ MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
3336
+ REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
3337
+ IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
3338
+ Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
3339
+ QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
3340
+ KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
3341
+ AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
3342
+ QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
3343
+ juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
3344
+ CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
3345
+ M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
3346
+ A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
3347
+ BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
3348
+ g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
3349
+ KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
3350
+ BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
3351
+ CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
3352
+ woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
3353
+ -----END CERTIFICATE-----
3354
+
3355
+ Autoridad de Certificacion Firmaprofesional CIF A62634068
3356
+ =========================================================
3357
+ -----BEGIN CERTIFICATE-----
3358
+ MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
3359
+ BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
3360
+ MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
3361
+ QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
3362
+ NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
3363
+ Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
3364
+ B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
3365
+ 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
3366
+ ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
3367
+ plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
3368
+ MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
3369
+ LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
3370
+ bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
3371
+ vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
3372
+ EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
3373
+ DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
3374
+ cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
3375
+ bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
3376
+ ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
3377
+ 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
3378
+ R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
3379
+ T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
3380
+ Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
3381
+ osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
3382
+ crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
3383
+ saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
3384
+ KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
3385
+ 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
3386
+ -----END CERTIFICATE-----
3387
+
3388
+ Izenpe.com
3389
+ ==========
3390
+ -----BEGIN CERTIFICATE-----
3391
+ MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
3392
+ EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
3393
+ MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
3394
+ QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
3395
+ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
3396
+ ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
3397
+ +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
3398
+ PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
3399
+ OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
3400
+ F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
3401
+ 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
3402
+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
3403
+ leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
3404
+ AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
3405
+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
3406
+ NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
3407
+ MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
3408
+ BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
3409
+ Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
3410
+ kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
3411
+ hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
3412
+ g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
3413
+ aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
3414
+ nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
3415
+ ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
3416
+ Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
3417
+ WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
3418
+ -----END CERTIFICATE-----
3419
+
3420
+ Chambers of Commerce Root - 2008
3421
+ ================================
3422
+ -----BEGIN CERTIFICATE-----
3423
+ MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
3424
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
3425
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
3426
+ QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
3427
+ Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
3428
+ ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
3429
+ EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
3430
+ cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
3431
+ AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
3432
+ XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
3433
+ h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
3434
+ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
3435
+ NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
3436
+ D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
3437
+ lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
3438
+ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
3439
+ ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
3440
+ EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
3441
+ G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
3442
+ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
3443
+ bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
3444
+ bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
3445
+ CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
3446
+ AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
3447
+ wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
3448
+ 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
3449
+ RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
3450
+ M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
3451
+ YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
3452
+ 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
3453
+ zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
3454
+ nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
3455
+ OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
3456
+ -----END CERTIFICATE-----
3457
+
3458
+ Global Chambersign Root - 2008
3459
+ ==============================
3460
+ -----BEGIN CERTIFICATE-----
3461
+ MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
3462
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
3463
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
3464
+ QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
3465
+ NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
3466
+ Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
3467
+ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
3468
+ aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
3469
+ VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
3470
+ XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
3471
+ ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
3472
+ /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
3473
+ TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
3474
+ H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
3475
+ Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
3476
+ HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
3477
+ wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
3478
+ AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
3479
+ BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
3480
+ BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
3481
+ aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
3482
+ aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
3483
+ 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
3484
+ dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
3485
+ /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
3486
+ ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
3487
+ dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
3488
+ 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
3489
+ foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
3490
+ qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
3491
+ P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
3492
+ c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
3493
+ 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
3494
+ -----END CERTIFICATE-----
3495
+
3496
+ Bogus Mozilla Addons
3497
+ ====================
3498
+ -----BEGIN CERTIFICATE-----
3499
+ MIIF+DCCBOCgAwIBAgIRAJI51TSPQNFpWnRUcOHyP0MwDQYJKoZIhvcNAQEFBQAwgZcxCzAJBgNV
3500
+ BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRo
3501
+ ZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR8w
3502
+ HQYDVQQDExZVVE4tVVNFUkZpcnN0LUhhcmR3YXJlMB4XDTExMDMxNTAwMDAwMFoXDTE0MDMxNDIz
3503
+ NTk1OVowgeIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQREwUzODQ3NzEQMA4GA1UECBMHRmxvcmlkYTEQ
3504
+ MA4GA1UEBxMHRW5nbGlzaDEXMBUGA1UECRMOU2VhIFZpbGxhZ2UgMTAxFDASBgNVBAoTC0dvb2ds
3505
+ ZSBMdGQuMRMwEQYDVQQLEwpUZWNoIERlcHQuMSgwJgYDVQQLEx9Ib3N0ZWQgYnkgR1RJIEdyb3Vw
3506
+ IENvcnBvcmF0aW9uMRQwEgYDVQQLEwtQbGF0aW51bVNTTDEbMBkGA1UEAxMSYWRkb25zLm1vemls
3507
+ bGEub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq8ZtNvMVc3iDc850hdWu7LLw
3508
+ 4CQfE4O4IKy7mv6Iu6uhHQsfRQCqSbc1Nwxq70dMudG+41cSBI2Sx7bsAby22seBOCCtcoXmDvyB
3509
+ bAetaHY4xUTXzMZKxZc+ZPRR5vB+suxW9yWCTUmYyxaY3SPxiZHRF5dAmSbW4qIrXt+9ifIbGlMt
3510
+ zFBBetA9KgxVcBQB6VhJEHoLk4KL4R7tOoAQgs6WijTwzNfTubRQh1VUCbidQihVAOWMNVS/3SWR
3511
+ RrcN5V2DqOWL+4TkPK522sRDK1t0C/i+XWjxeFu1zn3xXZlA2sruOIFQvpihbLgkrfOvjA/XESgs
3512
+ hBhMfbXZjzC1GwIDAQABo4IB8DCCAewwHwYDVR0jBBgwFoAUoXJfJhsomEOVXQc31YWWnUvSw0Uw
3513
+ HQYDVR0OBBYEFN2A0lQ990xwyqOw3TR6MuToO1o7MA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8E
3514
+ AjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBGBgNVHSAEPzA9MDsGDCsGAQQBsjEB
3515
+ AgEDBDArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21vZG8uY29tL0NQUzB7BgNVHR8E
3516
+ dDByMDigNqA0hjJodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJl
3517
+ LmNybDA2oDSgMoYwaHR0cDovL2NybC5jb21vZG8ubmV0L1VUTi1VU0VSRmlyc3QtSGFyZHdhcmUu
3518
+ Y3JsMHEGCCsGAQUFBwEBBGUwYzA7BggrBgEFBQcwAoYvaHR0cDovL2NydC5jb21vZG9jYS5jb20v
3519
+ VVROQWRkVHJ1c3RTZXJ2ZXJDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2Nh
3520
+ LmNvbTA1BgNVHREELjAsghJhZGRvbnMubW96aWxsYS5vcmeCFnd3dy5hZGRvbnMubW96aWxsYS5v
3521
+ cmcwDQYJKoZIhvcNAQEFBQADggEBADM7YxX8sewULJPddZTegVrZTpm++0qkOVVNoUB63hMqh6k3
3522
+ z+jV+63Re21vjCCHglTmV0m8ICiEzdYB2ZOLF24jZuWEyIA/xqFwgOTsTR35/JFac2IpmvcgHGHg
3523
+ izmfyrx+jd282bHjn57fFVORIVIL2RojD2Y226yTlkqjpSLPKfeimaj2ttlArtl+tvZYLpusNspk
3524
+ j2VS3IacgqtuUEvaX/oFAIgwDt6NVr+BR409BuKyYpJnj57ImrLlBrhwJLh3fCMKOMN5CNixUZ2s
3525
+ lRHHQBeeoxyP8hGnaCfaSQWEGHxYLQFnXOWfoSm7SjlFL78Rqnmi7bTUtWVDt5NGitM=
3526
+ -----END CERTIFICATE-----
3527
+
3528
+ Bogus Global Trustee
3529
+ ====================
3530
+ -----BEGIN CERTIFICATE-----
3531
+ MIIG3TCCBcWgAwIBAgIRANjzX063hystqwaS4xU4L7AwDQYJKoZIhvcNAQEFBQAwgZcxCzAJBgNV
3532
+ BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRo
3533
+ ZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR8w
3534
+ HQYDVQQDExZVVE4tVVNFUkZpcnN0LUhhcmR3YXJlMB4XDTExMDMxNTAwMDAwMFoXDTE0MDMxNDIz
3535
+ NTk1OVowgeMxCzAJBgNVBAYTAlVTMQ4wDAYDVQQREwUzODQ3NzEQMA4GA1UECBMHRmxvcmlkYTEO
3536
+ MAwGA1UEBxMFVGFtcGExFzAVBgNVBAkTDlNlYSBWaWxsYWdlIDEwMRcwFQYDVQQKEw5HbG9iYWwg
3537
+ VHJ1c3RlZTEXMBUGA1UECxMOR2xvYmFsIFRydXN0ZWUxKDAmBgNVBAsTH0hvc3RlZCBieSBHVEkg
3538
+ R3JvdXAgQ29ycG9yYXRpb24xFDASBgNVBAsTC1BsYXRpbnVtU1NMMRcwFQYDVQQDEw5nbG9iYWwg
3539
+ dHJ1c3RlZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANl08qpBHd/1whZDSVwpv7aJ
3540
+ dCm8nI0MRk9ZfrJBF2Y0DGWJ4Wwl44YKniJFIozdneajld7ciAJVXONbkXXrJmljuS7Gyi4n34i6
3541
+ AiBu/rkLKden1tdIGhzO3R+pJw5iT6GWHt1UOjRjSnb1d31ZZ9gQ1LUPOkMimNv0CcQKcM7dkNQv
3542
+ 73QTw83CiTliFZ3mdKjom/BjbpyJtg6tm/fMgujoLbgL2iLsSYUHiJmYP/R0qQn3gXyXC1mZGHKL
3543
+ 25SCK6foqmuXv4h+dbCLRUUMx6gJ6htBWDA7X3hlFTTS5Dw0DR3YZDyKpVZJmSgtS/LPzdluSWSb
3544
+ qXmQd1WpCButGnSe4AOTCgm3rae0XO+DbLeatMZoQIAdQtFueZupGSGanPmGLQDRNP7gtvlVtvUm
3545
+ xZUWpXxznwopiaw6mPebdGe3kLddCSNqau0sEO5TChDwFh9Xs7ENeZEZsOvNMD+gFF+zxv1cM6ew
3546
+ /5iwVYy5pfJvRyRJIWnMQqJRAECFjIKCqzKly5rc0NkYDd8Z9K+DDcE+MdskSLZ1gKHhyXdkHqfl
3547
+ i38VTUunwtDteZVekTHsGP9On0gU6nW6Ic4pdukfTlGHLrPMBGC6Ix8fZbIKuNVuj0tCiUepgZBb
3548
+ K7K2ruagcHt4kAp6xeXnxfsK9i9pjIwfV+AGmf8R1VIyIJcnmO5lAgMBAAGjggHUMIIB0DAfBgNV
3549
+ HSMEGDAWgBShcl8mGyiYQ5VdBzfVhZadS9LDRTAdBgNVHQ4EFgQUt8PeGkPtQZepjyl4nAO5rEBC
3550
+ AKwwDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
3551
+ AQUFBwMCMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMEMCswKQYIKwYBBQUHAgEWHWh0dHBzOi8v
3552
+ c2VjdXJlLmNvbW9kby5jb20vQ1BTMHsGA1UdHwR0MHIwOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2Rv
3553
+ Y2EuY29tL1VUTi1VU0VSRmlyc3QtSGFyZHdhcmUuY3JsMDagNKAyhjBodHRwOi8vY3JsLmNvbW9k
3554
+ by5uZXQvVVROLVVTRVJGaXJzdC1IYXJkd2FyZS5jcmwwcQYIKwYBBQUHAQEEZTBjMDsGCCsGAQUF
3555
+ BzAChi9odHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9VVE5BZGRUcnVzdFNlcnZlckNBLmNydDAkBggr
3556
+ BgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMBkGA1UdEQQSMBCCDmdsb2JhbCB0cnVz
3557
+ dGVlMA0GCSqGSIb3DQEBBQUAA4IBAQCPunW6OdQm03APxLMCp8USI3HJ/mPpo2J4JERP1LkRPh/H
3558
+ KOdVa+704QCRhorJCWufLqRFOdFhYl6TpQVFeJ9gEiz0bGVlDcxGNIsouqDG9JlxZPMidqxP82LJ
3559
+ pzNaBx89yYaA3NsEL4cn6L9IRIHA8Ekjbh/l5AOGJBOihWJ8WATK5o0Tcgq6VkSiD7z7oD0NKn/7
3560
+ nqkJPbda1IqN4SXopAmEcK0SRLnPuTN6ulzmS6a7BQaY//KYUnt3gCdK2eL6uVLU+/vm1i2ej8EV
3561
+ RI2bdC/ulFpO08SLiqxDnXP2rgyHia2HycnH3boUYHr4tTWdwo3GloENqVKKKUAE6Rm0
3562
+ -----END CERTIFICATE-----
3563
+
3564
+ Bogus GMail
3565
+ ===========
3566
+ -----BEGIN CERTIFICATE-----
3567
+ MIIF7jCCBNagAwIBAgIQBH7L6fylX3vQnq424QyuHjANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
3568
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
3569
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
3570
+ BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNMTEwMzE1MDAwMDAwWhcNMTQwMzE0MjM1
3571
+ OTU5WjCB3zELMAkGA1UEBhMCVVMxDjAMBgNVBBETBTM4NDc3MRAwDgYDVQQIEwdGbG9yaWRhMRAw
3572
+ DgYDVQQHEwdFbmdsaXNoMRcwFQYDVQQJEw5TZWEgVmlsbGFnZSAxMDEUMBIGA1UEChMLR29vZ2xl
3573
+ IEx0ZC4xEzARBgNVBAsTClRlY2ggRGVwdC4xKDAmBgNVBAsTH0hvc3RlZCBieSBHVEkgR3JvdXAg
3574
+ Q29ycG9yYXRpb24xFDASBgNVBAsTC1BsYXRpbnVtU1NMMRgwFgYDVQQDEw9tYWlsLmdvb2dsZS5j
3575
+ b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwc/DyBO7CokbKNCqqu2Aj0RF2Hx86
3576
+ 0GWDTppFqENwhXbwH4cAAh9uOxcXxLXpGUaikiWNYiq0YzAfuYX4NeEWWnZJzFBIUzlZidaEAvua
3577
+ 7BvHUdV2lZDUOiq4pt4CTQb7ze2lRkFfVXTl7H5A3FCcteQ1XR5oIPjp3qNqKL9B0qGz4iWNDBvK
3578
+ PZMMGK7fxbz9vIK6aADXFjJxn2W1EdpoWdCmV2Qbyf6Y5fWlZerh2+70s52zjuqHrhbSHqB8fGk/
3579
+ KRaFAVOnbPFgq92i/CVH1DLREt33SBLg/Jyid5jpiZm4+DjxjAbCeiM2bZudzTDIxzQXHrt9Qsir
3580
+ 5xUW9nO1AgMBAAGjggHqMIIB5jAfBgNVHSMEGDAWgBShcl8mGyiYQ5VdBzfVhZadS9LDRTAdBgNV
3581
+ HQ4EFgQUGCqiyNR6P3utBIu9b54QRhN4cZ0wDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAw
3582
+ HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQME
3583
+ MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5jb20vQ1BTMHsGA1UdHwR0MHIw
3584
+ OKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1VUTi1VU0VSRmlyc3QtSGFyZHdhcmUuY3Js
3585
+ MDagNKAyhjBodHRwOi8vY3JsLmNvbW9kby5uZXQvVVROLVVTRVJGaXJzdC1IYXJkd2FyZS5jcmww
3586
+ cQYIKwYBBQUHAQEEZTBjMDsGCCsGAQUFBzAChi9odHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9VVE5B
3587
+ ZGRUcnVzdFNlcnZlckNBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29t
3588
+ MC8GA1UdEQQoMCaCD21haWwuZ29vZ2xlLmNvbYITd3d3Lm1haWwuZ29vZ2xlLmNvbTANBgkqhkiG
3589
+ 9w0BAQUFAAOCAQEAZwYICifFk24C8t4XP9DTG3z/tc16x3fHvt8SyhnesBNXDAORxHlSz3+3XlUg
3590
+ hEnd9dApLw4E2lmeDhOf9MAym/+hESQql6PyPz0qa6itjBl1lQ4dJf1PxHoVwx3HE0DIDb6XYHKm
3591
+ /iW+j+zVpobDIVxZUtlqC1yfS961+ezi9MXMYlN2iWXkKdq3v5bgYI0NtwlV1kBVHcHyliF1r4mG
3592
+ H12BlykoHinXlsEgAzJ7ADtqNxdao7MabzI7bvGjXaurzCrLMAwfNSOLaURc6qwoYO2ra2Oe9pK8
3593
+ vZpaJkzFmLgOGT78BTHjFtn9kAUDhsZXAR9/eKDPM2qqZmsi0KdJIw==
3594
+ -----END CERTIFICATE-----
3595
+
3596
+ Bogus Google
3597
+ ============
3598
+ -----BEGIN CERTIFICATE-----
3599
+ MIIF5DCCBMygAwIBAgIRAPXIavNhYvE6ZPVPbclYfAYwDQYJKoZIhvcNAQEFBQAwgZcxCzAJBgNV
3600
+ BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRo
3601
+ ZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR8w
3602
+ HQYDVQQDExZVVE4tVVNFUkZpcnN0LUhhcmR3YXJlMB4XDTExMDMxNTAwMDAwMFoXDTE0MDMxNDIz
3603
+ NTk1OVowgd4xCzAJBgNVBAYTAlVTMQ4wDAYDVQQREwUzODQ3NzEQMA4GA1UECBMHRmxvcmlkYTEQ
3604
+ MA4GA1UEBxMHRW5nbGlzaDEXMBUGA1UECRMOU2VhIFZpbGxhZ2UgMTAxFDASBgNVBAoTC0dvb2ds
3605
+ ZSBMdGQuMRMwEQYDVQQLEwpUZWNoIERlcHQuMSgwJgYDVQQLEx9Ib3N0ZWQgYnkgR1RJIEdyb3Vw
3606
+ IENvcnBvcmF0aW9uMRQwEgYDVQQLEwtQbGF0aW51bVNTTDEXMBUGA1UEAxMOd3d3Lmdvb2dsZS5j
3607
+ b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwc/DyBO7CokbKNCqqu2Aj0RF2Hx86
3608
+ 0GWDTppFqENwhXbwH4cAAh9uOxcXxLXpGUaikiWNYiq0YzAfuYX4NeEWWnZJzFBIUzlZidaEAvua
3609
+ 7BvHUdV2lZDUOiq4pt4CTQb7ze2lRkFfVXTl7H5A3FCcteQ1XR5oIPjp3qNqKL9B0qGz4iWNDBvK
3610
+ PZMMGK7fxbz9vIK6aADXFjJxn2W1EdpoWdCmV2Qbyf6Y5fWlZerh2+70s52zjuqHrhbSHqB8fGk/
3611
+ KRaFAVOnbPFgq92i/CVH1DLREt33SBLg/Jyid5jpiZm4+DjxjAbCeiM2bZudzTDIxzQXHrt9Qsir
3612
+ 5xUW9nO1AgMBAAGjggHgMIIB3DAfBgNVHSMEGDAWgBShcl8mGyiYQ5VdBzfVhZadS9LDRTAdBgNV
3613
+ HQ4EFgQUGCqiyNR6P3utBIu9b54QRhN4cZ0wDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAw
3614
+ HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQME
3615
+ MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5jb20vQ1BTMHsGA1UdHwR0MHIw
3616
+ OKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1VUTi1VU0VSRmlyc3QtSGFyZHdhcmUuY3Js
3617
+ MDagNKAyhjBodHRwOi8vY3JsLmNvbW9kby5uZXQvVVROLVVTRVJGaXJzdC1IYXJkd2FyZS5jcmww
3618
+ cQYIKwYBBQUHAQEEZTBjMDsGCCsGAQUFBzAChi9odHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9VVE5B
3619
+ ZGRUcnVzdFNlcnZlckNBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29t
3620
+ MCUGA1UdEQQeMByCDnd3dy5nb29nbGUuY29tggpnb29nbGUuY29tMA0GCSqGSIb3DQEBBQUAA4IB
3621
+ AQBxwJk/Xva9M/+eFsuov91w+dJTOzauyRfIrl5N3WL3t9M+d6P+wHsytcmUBVJQ8l89eYRJT11s
3622
+ sNdZvdRsiPr8xWWG6yhSokL2fLxqxwcuJdGQYiDGjVHCLEU5TgPa9xjozAo62UXYbG40i2KcThX5
3623
+ Q+7ll8A/rTUTxSsGx0H94vd+Ra2b0eFm7fh6S5Q5ei/r6D9D2DXWVvp0523m7axlhP7QTQYS3tpZ
3624
+ ADwJXM+IS+g9tBUhksxtplHijpfx9IJGy8RTXtpcnWWSAWWJAOW2mf8mQPEvGTEIGrFnVYYNrjUz
3625
+ hryXSJLXlmD4zvyW64fEc8yUm1hb83qkJxPWT/Rp
3626
+ -----END CERTIFICATE-----
3627
+
3628
+ Bogus Skype
3629
+ ===========
3630
+ -----BEGIN CERTIFICATE-----
3631
+ MIIF7zCCBNegAwIBAgIRAOkCi5V45BXcGnEKK4gVREcwDQYJKoZIhvcNAQEFBQAwgZcxCzAJBgNV
3632
+ BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRo
3633
+ ZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR8w
3634
+ HQYDVQQDExZVVE4tVVNFUkZpcnN0LUhhcmR3YXJlMB4XDTExMDMxNTAwMDAwMFoXDTE0MDMxNDIz
3635
+ NTk1OVowgd8xCzAJBgNVBAYTAlVTMQ4wDAYDVQQREwUzODQ3NzEQMA4GA1UECBMHRmxvcmlkYTEQ
3636
+ MA4GA1UEBxMHRW5nbGlzaDEXMBUGA1UECRMOU2VhIFZpbGxhZ2UgMTAxFDASBgNVBAoTC0dvb2ds
3637
+ ZSBMdGQuMRMwEQYDVQQLEwpUZWNoIERlcHQuMSgwJgYDVQQLEx9Ib3N0ZWQgYnkgR1RJIEdyb3Vw
3638
+ IENvcnBvcmF0aW9uMRQwEgYDVQQLEwtQbGF0aW51bVNTTDEYMBYGA1UEAxMPbG9naW4uc2t5cGUu
3639
+ Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsHiZhg6icyPUWsNJ67E2jHzKhK48
3640
+ rziIKJmNLVgTsZd4PlIgZ6xbc5hsMlXJcNHZqhXoLiaFgbxW5LyAY9tO1/UCvlFjHjzb39cAXVq5
3641
+ 5Xtq6jggsju27nVUhPmmyjhw3b+w/6WFXbRB/t092SrhMEMamHmToF/gZ2yV+j56rnF7422IQj8l
3642
+ 1O6+aGisraxg4CCjOYO5Wyijk22hvXYK4+uuhycOVI+0SAyaVPRdjjdQ3F6ki2tL3KbzNL53WSKI
3643
+ /xkrbXZkc9oMhwcrmjc60OKM9jYya5p5zNI7k28aTWzmwZ1ArC10w77qXHNlASmxKr9wWcHOxsOi
3644
+ yEVfumc9DwIDAQABo4IB6jCCAeYwHwYDVR0jBBgwFoAUoXJfJhsomEOVXQc31YWWnUvSw0UwHQYD
3645
+ VR0OBBYEFNWOWlETtCkNMbYcjT5RUTEKM6qBMA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAA
3646
+ MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBGBgNVHSAEPzA9MDsGDCsGAQQBsjEBAgED
3647
+ BDArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21vZG8uY29tL0NQUzB7BgNVHR8EdDBy
3648
+ MDigNqA0hjJodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
3649
+ bDA2oDSgMoYwaHR0cDovL2NybC5jb21vZG8ubmV0L1VUTi1VU0VSRmlyc3QtSGFyZHdhcmUuY3Js
3650
+ MHEGCCsGAQUFBwEBBGUwYzA7BggrBgEFBQcwAoYvaHR0cDovL2NydC5jb21vZG9jYS5jb20vVVRO
3651
+ QWRkVHJ1c3RTZXJ2ZXJDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNv
3652
+ bTAvBgNVHREEKDAmgg9sb2dpbi5za3lwZS5jb22CE3d3dy5sb2dpbi5za3lwZS5jb20wDQYJKoZI
3653
+ hvcNAQEFBQADggEBAAjygXWRu84SBBjCTVr7RpAKVET08t0HgfAfpnpvn8+4DixPnMSa9aj2uqTJ
3654
+ el2x4lrKPPpgqGg+y7ot4s3WtuSSPGmtV+qoLzgQhHLlaHHtvutuGO9jer7nJP/AY/1YO0yBktgp
3655
+ q441XdfTCWuF09VzBUTi5buDUxDL8s+3buFpt6GSZMXPzYK7NqA4rdck31P8P2K3t9XHV+OTMXCO
3656
+ JImGymMrObpd2Wpg7KFOiv5T+F6S3y9cJhdtA30CDw+qQ2dtsGK/flPdzOx4c5XlpfYAowT9PwQq
3657
+ s5jFtwMc28lQq7AFHR6+VrTPPkITlJ755wGBpXhvDHp2rAWG7KzCEaw=
3658
+ -----END CERTIFICATE-----
3659
+
3660
+ Bogus Yahoo 1
3661
+ =============
3662
+ -----BEGIN CERTIFICATE-----
3663
+ MIIF7zCCBNegAwIBAgIRANdVj9r18RBbshMoK3B3KaMwDQYJKoZIhvcNAQEFBQAwgZcxCzAJBgNV
3664
+ BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRo
3665
+ ZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR8w
3666
+ HQYDVQQDExZVVE4tVVNFUkZpcnN0LUhhcmR3YXJlMB4XDTExMDMxNTAwMDAwMFoXDTE0MDMxNDIz
3667
+ NTk1OVowgd8xCzAJBgNVBAYTAlVTMQ4wDAYDVQQREwUzODQ3NzEQMA4GA1UECBMHRmxvcmlkYTEQ
3668
+ MA4GA1UEBxMHRW5nbGlzaDEXMBUGA1UECRMOU2VhIFZpbGxhZ2UgMTAxFDASBgNVBAoTC0dvb2ds
3669
+ ZSBMdGQuMRMwEQYDVQQLEwpUZWNoIERlcHQuMSgwJgYDVQQLEx9Ib3N0ZWQgYnkgR1RJIEdyb3Vw
3670
+ IENvcnBvcmF0aW9uMRQwEgYDVQQLEwtQbGF0aW51bVNTTDEYMBYGA1UEAxMPbG9naW4ueWFob28u
3671
+ Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoaQFPe2FRZOKGE3GAwBX4kB38Bzr
3672
+ 0BnfIl0If9EHPEGJRhejCfr8+KkE0ZaPq9dPPPmtGKl0gcRXCjomFs5iPrw/bCHuk43LDaAfmpbQ
3673
+ j631k5OC7nIMoXUVo3uEVrit/1IRcYS8OjALfpio4ag/N1LQ8XxvkNhFCqw5cmph1bvDjPnCzN/9
3674
+ OnG5r7zcOtwMtrHS0Ym7Qbby3lfVFd/8/eIxxd/KwdiPLL/wDltx4DRxw8VNfXrU+u0wSy/qti6e
3675
+ kzziOvhCohru3N/ND6n2eYQajmwCtoblv1FqZvjznNNZDHulmXjNfJn6xpZH2DLUdHYOd0sgdKS3
3676
+ iXWSSrRbVQIDAQABo4IB6jCCAeYwHwYDVR0jBBgwFoAUoXJfJhsomEOVXQc31YWWnUvSw0UwHQYD
3677
+ VR0OBBYEFIZJRfwzGTPUBO0nYe7oAckMfy9+MA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAA
3678
+ MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBGBgNVHSAEPzA9MDsGDCsGAQQBsjEBAgED
3679
+ BDArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21vZG8uY29tL0NQUzB7BgNVHR8EdDBy
3680
+ MDigNqA0hjJodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
3681
+ bDA2oDSgMoYwaHR0cDovL2NybC5jb21vZG8ubmV0L1VUTi1VU0VSRmlyc3QtSGFyZHdhcmUuY3Js
3682
+ MHEGCCsGAQUFBwEBBGUwYzA7BggrBgEFBQcwAoYvaHR0cDovL2NydC5jb21vZG9jYS5jb20vVVRO
3683
+ QWRkVHJ1c3RTZXJ2ZXJDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNv
3684
+ bTAvBgNVHREEKDAmgg9sb2dpbi55YWhvby5jb22CE3d3dy5sb2dpbi55YWhvby5jb20wDQYJKoZI
3685
+ hvcNAQEFBQADggEBAD1XyUgkXO5kgfWuvlUpFv8qL4Tt2fijA8gwZrvI1IEtIfcI96yWQppBdXq6
3686
+ XRAjy5JCYfqK2m1lNBnlqdYtE3jXgUSSqW6AYxXL/jUfAtGKFLCozJQgO6ga8F02UNsNrulk5PaN
3687
+ aX0wyBQXAErlpjX7fQ0inXl2Uiy8lwaImhX0c+bx9ZilzQdEkbinaGdF0nIRYOJxt1BV4oqpDdaS
3688
+ 7gQqizCgogVGNG2SxjuqTaDQqwEZCjK36OPP8dKXSXuspJf38FeuY3eaf5baTf2+3Ac24yW9iXmO
3689
+ KRITi4gH+2vbpM2zLSfp1Mpg14VT+3TGXDWMcB/5sreSJyDHlNVnFDA=
3690
+ -----END CERTIFICATE-----
3691
+
3692
+ Bogus Yahoo 2
3693
+ =============
3694
+ -----BEGIN CERTIFICATE-----
3695
+ MIIF2TCCBMGgAwIBAgIQOSpDTw4H3x+KowXeNODCKTANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
3696
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
3697
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
3698
+ BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNMTEwMzE1MDAwMDAwWhcNMTQwMzE0MjM1
3699
+ OTU5WjCB3zELMAkGA1UEBhMCVVMxDjAMBgNVBBETBTM4NDc3MRAwDgYDVQQIEwdGbG9yaWRhMRAw
3700
+ DgYDVQQHEwdFbmdsaXNoMRcwFQYDVQQJEw5TZWEgVmlsbGFnZSAxMDEUMBIGA1UEChMLR29vZ2xl
3701
+ IEx0ZC4xEzARBgNVBAsTClRlY2ggRGVwdC4xKDAmBgNVBAsTH0hvc3RlZCBieSBHVEkgR3JvdXAg
3702
+ Q29ycG9yYXRpb24xFDASBgNVBAsTC1BsYXRpbnVtU1NMMRgwFgYDVQQDEw9sb2dpbi55YWhvby5j
3703
+ b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQChpAU97YVFk4oYTcYDAFfiQHfwHOvQ
3704
+ Gd8iXQh/0Qc8QYlGF6MJ+vz4qQTRlo+r1088+a0YqXSBxFcKOiYWzmI+vD9sIe6TjcsNoB+altCP
3705
+ rfWTk4LucgyhdRWje4RWuK3/UhFxhLw6MAt+mKjhqD83UtDxfG+Q2EUKrDlyamHVu8OM+cLM3/06
3706
+ cbmvvNw63Ay2sdLRibtBtvLeV9UV3/z94jHF38rB2I8sv/AOW3HgNHHDxU19etT67TBLL+q2Lp6T
3707
+ POI6+EKiGu7c380PqfZ5hBqObAK2huW/UWpm+POc01kMe6WZeM18mfrGlkfYMtR0dg53SyB0pLeJ
3708
+ dZJKtFtVAgMBAAGjggHVMIIB0TAfBgNVHSMEGDAWgBShcl8mGyiYQ5VdBzfVhZadS9LDRTAdBgNV
3709
+ HQ4EFgQUhklF/DMZM9QE7Sdh7ugByQx/L34wDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAw
3710
+ HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQME
3711
+ MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5jb20vQ1BTMHsGA1UdHwR0MHIw
3712
+ OKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1VUTi1VU0VSRmlyc3QtSGFyZHdhcmUuY3Js
3713
+ MDagNKAyhjBodHRwOi8vY3JsLmNvbW9kby5uZXQvVVROLVVTRVJGaXJzdC1IYXJkd2FyZS5jcmww
3714
+ cQYIKwYBBQUHAQEEZTBjMDsGCCsGAQUFBzAChi9odHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9VVE5B
3715
+ ZGRUcnVzdFNlcnZlckNBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29t
3716
+ MBoGA1UdEQQTMBGCD2xvZ2luLnlhaG9vLmNvbTANBgkqhkiG9w0BAQUFAAOCAQEAV2Lhd+v8H7+I
3717
+ U69Y09TWbWcwF0C+4B9k3ocVzOCkVqnRn/kB/gKxseriX+5xFjH5CNXC15qbslo416l/6YdrMfkL
3718
+ rNn9UHHg24KSD4GcjXfp6y7q1CNBh+wtsnizjrFn0u5xAwgSmbMCKW/ei97BqQMKWjMcPREDxkgM
3719
+ mJwVLtmmhVLnBYquMCPr7ShsYOktf49Hiy/Q3Oa7D35f8kiBjlAEY7FRgHWaqbYQHBBfbxhv4A6W
3720
+ Rc7u8bUg2+/absiV4/ZF/cr8pV9JbQYe0t5hPRV9N+UcNY4Gwmv3tKgoLDHLqrSnl0+divavfje5
3721
+ ez3fkmaLj06dxjbnXKarEg/Wzw==
3722
+ -----END CERTIFICATE-----
3723
+
3724
+ Bogus Yahoo 3
3725
+ =============
3726
+ -----BEGIN CERTIFICATE-----
3727
+ MIIF2TCCBMGgAwIBAgIQPnXO1GtpMCEhiDCuhqgqcTANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
3728
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
3729
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
3730
+ BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNMTEwMzE1MDAwMDAwWhcNMTQwMzE0MjM1
3731
+ OTU5WjCB3zELMAkGA1UEBhMCVVMxDjAMBgNVBBETBTM4NDc3MRAwDgYDVQQIEwdGbG9yaWRhMRAw
3732
+ DgYDVQQHEwdFbmdsaXNoMRcwFQYDVQQJEw5TZWEgVmlsbGFnZSAxMDEUMBIGA1UEChMLR29vZ2xl
3733
+ IEx0ZC4xEzARBgNVBAsTClRlY2ggRGVwdC4xKDAmBgNVBAsTH0hvc3RlZCBieSBHVEkgR3JvdXAg
3734
+ Q29ycG9yYXRpb24xFDASBgNVBAsTC1BsYXRpbnVtU1NMMRgwFgYDVQQDEw9sb2dpbi55YWhvby5j
3735
+ b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQChpAU97YVFk4oYTcYDAFfiQHfwHOvQ
3736
+ Gd8iXQh/0Qc8QYlGF6MJ+vz4qQTRlo+r1088+a0YqXSBxFcKOiYWzmI+vD9sIe6TjcsNoB+altCP
3737
+ rfWTk4LucgyhdRWje4RWuK3/UhFxhLw6MAt+mKjhqD83UtDxfG+Q2EUKrDlyamHVu8OM+cLM3/06
3738
+ cbmvvNw63Ay2sdLRibtBtvLeV9UV3/z94jHF38rB2I8sv/AOW3HgNHHDxU19etT67TBLL+q2Lp6T
3739
+ POI6+EKiGu7c380PqfZ5hBqObAK2huW/UWpm+POc01kMe6WZeM18mfrGlkfYMtR0dg53SyB0pLeJ
3740
+ dZJKtFtVAgMBAAGjggHVMIIB0TAfBgNVHSMEGDAWgBShcl8mGyiYQ5VdBzfVhZadS9LDRTAdBgNV
3741
+ HQ4EFgQUhklF/DMZM9QE7Sdh7ugByQx/L34wDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAw
3742
+ HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQME
3743
+ MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5jb20vQ1BTMHsGA1UdHwR0MHIw
3744
+ OKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1VUTi1VU0VSRmlyc3QtSGFyZHdhcmUuY3Js
3745
+ MDagNKAyhjBodHRwOi8vY3JsLmNvbW9kby5uZXQvVVROLVVTRVJGaXJzdC1IYXJkd2FyZS5jcmww
3746
+ cQYIKwYBBQUHAQEEZTBjMDsGCCsGAQUFBzAChi9odHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9VVE5B
3747
+ ZGRUcnVzdFNlcnZlckNBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29t
3748
+ MBoGA1UdEQQTMBGCD2xvZ2luLnlhaG9vLmNvbTANBgkqhkiG9w0BAQUFAAOCAQEAU2mYjihOnCtb
3749
+ Hcxrdyg9u/qlTn5WKaTqEOL05i0G0YTbI86X82i2DzreFQskHZHjbC4wt+lwsMNGgPDTsVG/T9Z4
3750
+ oPysxs8xBGPiNFUFSj32MLrzM+W60pbz1bG2k4kapGi+fu1jtBpIwFPko/A5DDKSx0MNGnHt0EaT
3751
+ v5NibDNLzTYNaV67bJaZIWnES2dy22xquPdo7cWPrWNllQpM4PkPfjc9qtSTumcJw6WkDQNabdUL
3752
+ /vBAFLT2uGl8bcIyS5+1GudGrkxaK6p6XpBXlfrbZgIgHmppZhWcwrb1vFC1/UXHH2i0R1msxBso
3753
+ k05SUxIDWEtxg59m5qx5SP7+Rw==
3754
+ -----END CERTIFICATE-----
3755
+
3756
+ Bogus live.com
3757
+ ==============
3758
+ -----BEGIN CERTIFICATE-----
3759
+ MIIF7DCCBNSgAwIBAgIRALC3Ez7Qlvm1b66RyHS9OsAwDQYJKoZIhvcNAQEFBQAwgZcxCzAJBgNV
3760
+ BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRo
3761
+ ZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR8w
3762
+ HQYDVQQDExZVVE4tVVNFUkZpcnN0LUhhcmR3YXJlMB4XDTExMDMxNTAwMDAwMFoXDTE0MDMxNDIz
3763
+ NTk1OVowgd4xCzAJBgNVBAYTAlVTMQ4wDAYDVQQREwUzODQ3NzEQMA4GA1UECBMHRmxvcmlkYTEQ
3764
+ MA4GA1UEBxMHRW5nbGlzaDEXMBUGA1UECRMOU2VhIFZpbGxhZ2UgMTAxFDASBgNVBAoTC0dvb2ds
3765
+ ZSBMdGQuMRMwEQYDVQQLEwpUZWNoIERlcHQuMSgwJgYDVQQLEx9Ib3N0ZWQgYnkgR1RJIEdyb3Vw
3766
+ IENvcnBvcmF0aW9uMRQwEgYDVQQLEwtQbGF0aW51bVNTTDEXMBUGA1UEAxMObG9naW4ubGl2ZS5j
3767
+ b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDz/Csv7+GtWfBCPMLxgr8sQZPR9pgz
3768
+ lUy8YvGVWAi26Xt3SLDT3Bc/vG7m7B7sjRf+HCTGPmc9kpWiMMCnVyDPcIiXSgWTeZNCly8+/8QU
3769
+ FCiiEza0+O6+Hbx4XWGTX+uI19HkK5rNWOIHRZ9PuLlAajMsWyEDWkqU8nqXWRuotULYgwCqNMyn
3770
+ dtBHA18FrzvhuaE0JbdsX5owhJjCwtfyuEJKEFW9+lOBXY1oZkUsUn7lxATDVOfDOdp6SsW5mIIg
3771
+ 4SxgV7+68kYAvF863OMzl/hKmLnsM08tYGwVkqaBSgvp7HZwNDEXcOZwS46L03XLeEmrZpuGn4+p
3772
+ xAHoyhvnAgMBAAGjggHoMIIB5DAfBgNVHSMEGDAWgBShcl8mGyiYQ5VdBzfVhZadS9LDRTAdBgNV
3773
+ HQ4EFgQU1GT2qeilfte/Y1IDg1PbxUGN6oAwDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAw
3774
+ HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQME
3775
+ MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5jb20vQ1BTMHsGA1UdHwR0MHIw
3776
+ OKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1VUTi1VU0VSRmlyc3QtSGFyZHdhcmUuY3Js
3777
+ MDagNKAyhjBodHRwOi8vY3JsLmNvbW9kby5uZXQvVVROLVVTRVJGaXJzdC1IYXJkd2FyZS5jcmww
3778
+ cQYIKwYBBQUHAQEEZTBjMDsGCCsGAQUFBzAChi9odHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9VVE5B
3779
+ ZGRUcnVzdFNlcnZlckNBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29t
3780
+ MC0GA1UdEQQmMCSCDmxvZ2luLmxpdmUuY29tghJ3d3cubG9naW4ubGl2ZS5jb20wDQYJKoZIhvcN
3781
+ AQEFBQADggEBAFTjpJok0vMdQq0b8B6r+9rVqunPWrMeV3sx8m5XSzGvM7u2DRXHXlkBzkS1t78J
3782
+ ydXcaYTpxRq38D7UwCS9KV+06dZY60URiTQ00xHrNM4qTwA99nLvaWbAn5qsfnBQrFVH2r5DW+yL
3783
+ yMUjhMmftlIIz5EbL4Bp5jQz5rOfpOUNmhX5V/wLqUEL9f9YQZIiJ2YSBscq2Fmnxt9EEk/AqH+n
3784
+ QcjIaf+6BS6XrTvQ6/MVbX4b5brdNL4iEexomDOBAmoLE1V5MXVOOsi2E72XbzcKCy2IDt5nkMKz
3785
+ yiDKmlH0ZD7b9C5F8sdHF6j0+pBaf4CmgqzkbIFGu1KFICT4gOo=
3786
+ -----END CERTIFICATE-----
3787
+
3788
+ Bogus kuix.de
3789
+ =============
3790
+ -----BEGIN CERTIFICATE-----
3791
+ MIIFbDCCBFSgAwIBAgIQcgMhBcUMCFc9jqUwTv7osDANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
3792
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
3793
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
3794
+ BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNMTEwMzE3MDAwMDAwWhcNMTEwNDE2MjM1
3795
+ OTU5WjCB8TELMAkGA1UEBhMCREUxDjAMBgNVBBETBTEyMzQ1MRMwEQYDVQQIEwpUZXN0IFN0YXRl
3796
+ MRIwEAYDVQQHEwlUZXN0IENpdHkxFDASBgNVBAkTC1Rlc3QgU3RyZWV0MRMwEQYDVQQKEwpLYWkg
3797
+ RW5nZXJ0MSIwIAYDVQQLExlGb3IgVGVzdGluZyBQdXJwb3NlcyBPbmx5MS0wKwYDVQQLEyRURVNU
3798
+ IFVTRSBPTkxZIC0gTk8gV0FSUkFOVFkgQVRUQUNIRUQxGTAXBgNVBAsTEENvbW9kbyBUcmlhbCBT
3799
+ U0wxEDAOBgNVBAMTB2t1aXguZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALiqjvWXRwdf
3800
+ 5Xh2bpNrjt9LPNuZL3FTKW6l8yRPSCUjQAHsChUL7G7IniYjZvvp29gohSFPHt97TOVjwQuyYlaU
3801
+ U8u/nKFN2YfFaUg8sb+laFIhHXrclE9EbkclHZ+cktI3HflbW7LdPhjX84dmraP0zo/Rb/C5tO+x
3802
+ 6hVjCs6BAgMBAAGjggHaMIIB1jAfBgNVHSMEGDAWgBShcl8mGyiYQ5VdBzfVhZadS9LDRTAdBgNV
3803
+ HQ4EFgQUQI85JpxMhiOZxlEJpubywf6n9rcwDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAw
3804
+ HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQME
3805
+ MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5jb20vQ1BTMHsGA1UdHwR0MHIw
3806
+ OKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1VUTi1VU0VSRmlyc3QtSGFyZHdhcmUuY3Js
3807
+ MDagNKAyhjBodHRwOi8vY3JsLmNvbW9kby5uZXQvVVROLVVTRVJGaXJzdC1IYXJkd2FyZS5jcmww
3808
+ cQYIKwYBBQUHAQEEZTBjMDsGCCsGAQUFBzAChi9odHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9VVE5B
3809
+ ZGRUcnVzdFNlcnZlckNBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29t
3810
+ MB8GA1UdEQQYMBaCB2t1aXguZGWCC3d3dy5rdWl4LmRlMA0GCSqGSIb3DQEBBQUAA4IBAQCOYR4m
3811
+ HqLZGdDw1L2J+eqSEXlqXnt8n345cwlWUeaGVMdtRnZSymqoNMBgPgPOs8lIl9GfpqFqD/530R4Q
3812
+ s1eAqQYmhKb7ejcTzoTMd3kJLuJEvh+sd253RkHbsLJpkXTRgJZhMQwvCs+10NwILev2dYLeii66
3813
+ PQeQYDlWg+GCyiOs3+PPTXBXwbi3k5rt3IveSqBVKAKrQwxUl2gYous54bn8v3OAZDMSe4dgAuc+
3814
+ cMmHyqk2PAXxBl5xCg4KNpmwh+dpWrGgME59YVjLxqiWgF59wSr/m0pK6ylnig9v5hntgs+BV+Ek
3815
+ raLR+toUl7BsfEfG15QRIezWWtLdj3+R
3816
+ -----END CERTIFICATE-----
3817
+
3818
+ Go Daddy Root Certificate Authority - G2
3819
+ ========================================
3820
+ -----BEGIN CERTIFICATE-----
3821
+ MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
3822
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
3823
+ MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
3824
+ MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
3825
+ b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
3826
+ A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
3827
+ hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
3828
+ 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
3829
+ +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
3830
+ fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
3831
+ NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
3832
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
3833
+ BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
3834
+ vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
3835
+ 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
3836
+ N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
3837
+ LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
3838
+ -----END CERTIFICATE-----
3839
+
3840
+ Starfield Root Certificate Authority - G2
3841
+ =========================================
3842
+ -----BEGIN CERTIFICATE-----
3843
+ MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
3844
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
3845
+ b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
3846
+ eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
3847
+ DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
3848
+ VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
3849
+ dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
3850
+ W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
3851
+ bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
3852
+ N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
3853
+ ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
3854
+ JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
3855
+ AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
3856
+ TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
3857
+ 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
3858
+ F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
3859
+ pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
3860
+ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
3861
+ -----END CERTIFICATE-----
3862
+
3863
+ Starfield Services Root Certificate Authority - G2
3864
+ ==================================================
3865
+ -----BEGIN CERTIFICATE-----
3866
+ MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
3867
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
3868
+ b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
3869
+ IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
3870
+ BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
3871
+ dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
3872
+ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
3873
+ AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
3874
+ h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
3875
+ hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
3876
+ LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
3877
+ rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
3878
+ AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
3879
+ SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
3880
+ E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
3881
+ xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
3882
+ iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
3883
+ YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
3884
+ -----END CERTIFICATE-----
3885
+
3886
+ AffirmTrust Commercial
3887
+ ======================
3888
+ -----BEGIN CERTIFICATE-----
3889
+ MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
3890
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
3891
+ MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
3892
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
3893
+ AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
3894
+ DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
3895
+ C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
3896
+ BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
3897
+ MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
3898
+ HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
3899
+ AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
3900
+ hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
3901
+ qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
3902
+ 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
3903
+ sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
3904
+ -----END CERTIFICATE-----
3905
+
3906
+ AffirmTrust Networking
3907
+ ======================
3908
+ -----BEGIN CERTIFICATE-----
3909
+ MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
3910
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
3911
+ MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
3912
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
3913
+ AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
3914
+ Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
3915
+ dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
3916
+ /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
3917
+ h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
3918
+ HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
3919
+ AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
3920
+ UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
3921
+ 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
3922
+ WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
3923
+ /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
3924
+ -----END CERTIFICATE-----
3925
+
3926
+ AffirmTrust Premium
3927
+ ===================
3928
+ -----BEGIN CERTIFICATE-----
3929
+ MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
3930
+ BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
3931
+ OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
3932
+ dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
3933
+ MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
3934
+ BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
3935
+ 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
3936
+ +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
3937
+ GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
3938
+ p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
3939
+ S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
3940
+ 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
3941
+ /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
3942
+ +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
3943
+ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
3944
+ MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
3945
+ Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
3946
+ 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
3947
+ L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
3948
+ +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
3949
+ BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
3950
+ IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
3951
+ g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
3952
+ zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
3953
+ -----END CERTIFICATE-----
3954
+
3955
+ AffirmTrust Premium ECC
3956
+ =======================
3957
+ -----BEGIN CERTIFICATE-----
3958
+ MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
3959
+ BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
3960
+ MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
3961
+ cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
3962
+ IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
3963
+ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
3964
+ BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
3965
+ BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
3966
+ 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
3967
+ eQ==
3968
+ -----END CERTIFICATE-----
3969
+
3970
+ Certum Trusted Network CA
3971
+ =========================
3972
+ -----BEGIN CERTIFICATE-----
3973
+ MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
3974
+ ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
3975
+ biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
3976
+ MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
3977
+ ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
3978
+ MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
3979
+ AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
3980
+ l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
3981
+ J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
3982
+ fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
3983
+ cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
3984
+ Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
3985
+ DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
3986
+ jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
3987
+ mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
3988
+ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
3989
+ 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
3990
+ -----END CERTIFICATE-----
app/libs/aws/lib/requestcore/requestcore.class.php CHANGED
@@ -1,997 +1,1029 @@
1
- <?php
2
- /**
3
- * Handles all HTTP requests using cURL and manages the responses.
4
- *
5
- * @version 2011.03.01
6
- * @copyright 2006-2011 Ryan Parman
7
- * @copyright 2006-2010 Foleeo Inc.
8
- * @copyright 2010-2011 Amazon.com, Inc. or its affiliates.
9
- * @copyright 2008-2011 Contributors
10
- * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
- */
12
- class RequestCore
13
- {
14
- /**
15
- * The URL being requested.
16
- */
17
- public $request_url;
18
-
19
- /**
20
- * The headers being sent in the request.
21
- */
22
- public $request_headers;
23
-
24
- /**
25
- * The body being sent in the request.
26
- */
27
- public $request_body;
28
-
29
- /**
30
- * The response returned by the request.
31
- */
32
- public $response;
33
-
34
- /**
35
- * The headers returned by the request.
36
- */
37
- public $response_headers;
38
-
39
- /**
40
- * The body returned by the request.
41
- */
42
- public $response_body;
43
-
44
- /**
45
- * The HTTP status code returned by the request.
46
- */
47
- public $response_code;
48
-
49
- /**
50
- * Additional response data.
51
- */
52
- public $response_info;
53
-
54
- /**
55
- * The handle for the cURL object.
56
- */
57
- public $curl_handle;
58
-
59
- /**
60
- * The method by which the request is being made.
61
- */
62
- public $method;
63
-
64
- /**
65
- * Stores the proxy settings to use for the request.
66
- */
67
- public $proxy = null;
68
-
69
- /**
70
- * The username to use for the request.
71
- */
72
- public $username = null;
73
-
74
- /**
75
- * The password to use for the request.
76
- */
77
- public $password = null;
78
-
79
- /**
80
- * Custom CURLOPT settings.
81
- */
82
- public $curlopts = null;
83
-
84
- /**
85
- * The state of debug mode.
86
- */
87
- public $debug_mode = false;
88
-
89
- /**
90
- * The default class to use for HTTP Requests (defaults to <RequestCore>).
91
- */
92
- public $request_class = 'RequestCore';
93
-
94
- /**
95
- * The default class to use for HTTP Responses (defaults to <ResponseCore>).
96
- */
97
- public $response_class = 'ResponseCore';
98
-
99
- /**
100
- * Default useragent string to use.
101
- */
102
- public $useragent = 'RequestCore/1.4.2';
103
-
104
- /**
105
- * File to read from while streaming up.
106
- */
107
- public $read_file = null;
108
-
109
- /**
110
- * The resource to read from while streaming up.
111
- */
112
- public $read_stream = null;
113
-
114
- /**
115
- * The size of the stream to read from.
116
- */
117
- public $read_stream_size = null;
118
-
119
- /**
120
- * The length already read from the stream.
121
- */
122
- public $read_stream_read = 0;
123
-
124
- /**
125
- * File to write to while streaming down.
126
- */
127
- public $write_file = null;
128
-
129
- /**
130
- * The resource to write to while streaming down.
131
- */
132
- public $write_stream = null;
133
-
134
- /**
135
- * Stores the intended starting seek position.
136
- */
137
- public $seek_position = null;
138
-
139
- /**
140
- * The user-defined callback function to call when a stream is read from.
141
- */
142
- public $registered_streaming_read_callback = null;
143
-
144
- /**
145
- * The user-defined callback function to call when a stream is written to.
146
- */
147
- public $registered_streaming_write_callback = null;
148
-
149
-
150
- /*%******************************************************************************************%*/
151
- // CONSTANTS
152
-
153
- /**
154
- * GET HTTP Method
155
- */
156
- const HTTP_GET = 'GET';
157
-
158
- /**
159
- * POST HTTP Method
160
- */
161
- const HTTP_POST = 'POST';
162
-
163
- /**
164
- * PUT HTTP Method
165
- */
166
- const HTTP_PUT = 'PUT';
167
-
168
- /**
169
- * DELETE HTTP Method
170
- */
171
- const HTTP_DELETE = 'DELETE';
172
-
173
- /**
174
- * HEAD HTTP Method
175
- */
176
- const HTTP_HEAD = 'HEAD';
177
-
178
-
179
- /*%******************************************************************************************%*/
180
- // CONSTRUCTOR/DESTRUCTOR
181
-
182
- /**
183
- * Constructs a new instance of this class.
184
- *
185
- * @param string $url (Optional) The URL to request or service endpoint to query.
186
- * @param string $proxy (Optional) The faux-url to use for proxy settings. Takes the following format: `proxy://user:pass@hostname:port`
187
- * @param array $helpers (Optional) An associative array of classnames to use for request, and response functionality. Gets passed in automatically by the calling class.
188
- * @return $this A reference to the current instance.
189
- */
190
- public function __construct($url = null, $proxy = null, $helpers = null)
191
- {
192
- // Set some default values.
193
- $this->request_url = $url;
194
- $this->method = self::HTTP_GET;
195
- $this->request_headers = array();
196
- $this->request_body = '';
197
-
198
- // Set a new Request class if one was set.
199
- if (isset($helpers['request']) && !empty($helpers['request']))
200
- {
201
- $this->request_class = $helpers['request'];
202
- }
203
-
204
- // Set a new Request class if one was set.
205
- if (isset($helpers['response']) && !empty($helpers['response']))
206
- {
207
- $this->response_class = $helpers['response'];
208
- }
209
-
210
- if ($proxy)
211
- {
212
- $this->set_proxy($proxy);
213
- }
214
-
215
- return $this;
216
- }
217
-
218
- /**
219
- * Destructs the instance. Closes opened file handles.
220
- *
221
- * @return $this A reference to the current instance.
222
- */
223
- public function __destruct()
224
- {
225
- if (isset($this->read_file) && isset($this->read_stream))
226
- {
227
- fclose($this->read_stream);
228
- }
229
-
230
- if (isset($this->write_file) && isset($this->write_stream))
231
- {
232
- fclose($this->write_stream);
233
- }
234
-
235
- return $this;
236
- }
237
-
238
-
239
- /*%******************************************************************************************%*/
240
- // REQUEST METHODS
241
-
242
- /**
243
- * Sets the credentials to use for authentication.
244
- *
245
- * @param string $user (Required) The username to authenticate with.
246
- * @param string $pass (Required) The password to authenticate with.
247
- * @return $this A reference to the current instance.
248
- */
249
- public function set_credentials($user, $pass)
250
- {
251
- $this->username = $user;
252
- $this->password = $pass;
253
- return $this;
254
- }
255
-
256
- /**
257
- * Adds a custom HTTP header to the cURL request.
258
- *
259
- * @param string $key (Required) The custom HTTP header to set.
260
- * @param mixed $value (Required) The value to assign to the custom HTTP header.
261
- * @return $this A reference to the current instance.
262
- */
263
- public function add_header($key, $value)
264
- {
265
- $this->request_headers[$key] = $value;
266
- return $this;
267
- }
268
-
269
- /**
270
- * Removes an HTTP header from the cURL request.
271
- *
272
- * @param string $key (Required) The custom HTTP header to set.
273
- * @return $this A reference to the current instance.
274
- */
275
- public function remove_header($key)
276
- {
277
- if (isset($this->request_headers[$key]))
278
- {
279
- unset($this->request_headers[$key]);
280
- }
281
- return $this;
282
- }
283
-
284
- /**
285
- * Set the method type for the request.
286
- *
287
- * @param string $method (Required) One of the following constants: <HTTP_GET>, <HTTP_POST>, <HTTP_PUT>, <HTTP_HEAD>, <HTTP_DELETE>.
288
- * @return $this A reference to the current instance.
289
- */
290
- public function set_method($method)
291
- {
292
- $this->method = strtoupper($method);
293
- return $this;
294
- }
295
-
296
- /**
297
- * Sets a custom useragent string for the class.
298
- *
299
- * @param string $ua (Required) The useragent string to use.
300
- * @return $this A reference to the current instance.
301
- */
302
- public function set_useragent($ua)
303
- {
304
- $this->useragent = $ua;
305
- return $this;
306
- }
307
-
308
- /**
309
- * Set the body to send in the request.
310
- *
311
- * @param string $body (Required) The textual content to send along in the body of the request.
312
- * @return $this A reference to the current instance.
313
- */
314
- public function set_body($body)
315
- {
316
- $this->request_body = $body;
317
- return $this;
318
- }
319
-
320
- /**
321
- * Set the URL to make the request to.
322
- *
323
- * @param string $url (Required) The URL to make the request to.
324
- * @return $this A reference to the current instance.
325
- */
326
- public function set_request_url($url)
327
- {
328
- $this->request_url = $url;
329
- return $this;
330
- }
331
-
332
- /**
333
- * Set additional CURLOPT settings. These will merge with the default settings, and override if
334
- * there is a duplicate.
335
- *
336
- * @param array $curlopts (Optional) A set of key-value pairs that set `CURLOPT` options. These will merge with the existing CURLOPTs, and ones passed here will override the defaults. Keys should be the `CURLOPT_*` constants, not strings.
337
- * @return $this A reference to the current instance.
338
- */
339
- public function set_curlopts($curlopts)
340
- {
341
- $this->curlopts = $curlopts;
342
- return $this;
343
- }
344
-
345
- /**
346
- * Sets the length in bytes to read from the stream while streaming up.
347
- *
348
- * @param integer $size (Required) The length in bytes to read from the stream.
349
- * @return $this A reference to the current instance.
350
- */
351
- public function set_read_stream_size($size)
352
- {
353
- $this->read_stream_size = $size;
354
-
355
- return $this;
356
- }
357
-
358
- /**
359
- * Sets the resource to read from while streaming up. Reads the stream from its current position until
360
- * EOF or `$size` bytes have been read. If `$size` is not given it will be determined by <php:fstat()> and
361
- * <php:ftell()>.
362
- *
363
- * @param resource $resource (Required) The readable resource to read from.
364
- * @param integer $size (Optional) The size of the stream to read.
365
- * @return $this A reference to the current instance.
366
- */
367
- public function set_read_stream($resource, $size = null)
368
- {
369
- if (!isset($size) || $size < 0)
370
- {
371
- $stats = fstat($resource);
372
-
373
- if ($stats && $stats['size'] >= 0)
374
- {
375
- $position = ftell($resource);
376
-
377
- if ($position !== false && $position >= 0)
378
- {
379
- $size = $stats['size'] - $position;
380
- }
381
- }
382
- }
383
-
384
- $this->read_stream = $resource;
385
-
386
- return $this->set_read_stream_size($size);
387
- }
388
-
389
- /**
390
- * Sets the file to read from while streaming up.
391
- *
392
- * @param string $location (Required) The readable location to read from.
393
- * @return $this A reference to the current instance.
394
- */
395
- public function set_read_file($location)
396
- {
397
- $this->read_file = $location;
398
- $read_file_handle = fopen($location, 'r');
399
-
400
- return $this->set_read_stream($read_file_handle);
401
- }
402
-
403
- /**
404
- * Sets the resource to write to while streaming down.
405
- *
406
- * @param resource $resource (Required) The writeable resource to write to.
407
- * @return $this A reference to the current instance.
408
- */
409
- public function set_write_stream($resource)
410
- {
411
- $this->write_stream = $resource;
412
-
413
- return $this;
414
- }
415
-
416
- /**
417
- * Sets the file to write to while streaming down.
418
- *
419
- * @param string $location (Required) The writeable location to write to.
420
- * @return $this A reference to the current instance.
421
- */
422
- public function set_write_file($location)
423
- {
424
- $this->write_file = $location;
425
- $write_file_handle = fopen($location, 'w');
426
-
427
- return $this->set_write_stream($write_file_handle);
428
- }
429
-
430
- /**
431
- * Set the proxy to use for making requests.
432
- *
433
- * @param string $proxy (Required) The faux-url to use for proxy settings. Takes the following format: `proxy://user:pass@hostname:port`
434
- * @return $this A reference to the current instance.
435
- */
436
- public function set_proxy($proxy)
437
- {
438
- $proxy = parse_url($proxy);
439
- $proxy['user'] = isset($proxy['user']) ? $proxy['user'] : null;
440
- $proxy['pass'] = isset($proxy['pass']) ? $proxy['pass'] : null;
441
- $proxy['port'] = isset($proxy['port']) ? $proxy['port'] : null;
442
- $this->proxy = $proxy;
443
- return $this;
444
- }
445
-
446
- /**
447
- * Set the intended starting seek position.
448
- *
449
- * @param integer $position (Required) The byte-position of the stream to begin reading from.
450
- * @return $this A reference to the current instance.
451
- */
452
- public function set_seek_position($position)
453
- {
454
- $this->seek_position = isset($position) ? (integer) $position : null;
455
-
456
- return $this;
457
- }
458
-
459
- /**
460
- * Register a callback function to execute whenever a data stream is read from using
461
- * <CFRequest::streaming_read_callback()>.
462
- *
463
- * The user-defined callback function should accept three arguments:
464
- *
465
- * <ul>
466
- * <li><code>$curl_handle</code> - <code>resource</code> - Required - The cURL handle resource that represents the in-progress transfer.</li>
467
- * <li><code>$file_handle</code> - <code>resource</code> - Required - The file handle resource that represents the file on the local file system.</li>
468
- * <li><code>$length</code> - <code>integer</code> - Required - The length in kilobytes of the data chunk that was transferred.</li>
469
- * </ul>
470
- *
471
- * @param string|array|function $callback (Required) The callback function is called by <php:call_user_func()>, so you can pass the following values: <ul>
472
- * <li>The name of a global function to execute, passed as a string.</li>
473
- * <li>A method to execute, passed as <code>array('ClassName', 'MethodName')</code>.</li>
474
- * <li>An anonymous function (PHP 5.3+).</li></ul>
475
- * @return $this A reference to the current instance.
476
- */
477
- public function register_streaming_read_callback($callback)
478
- {
479
- $this->registered_streaming_read_callback = $callback;
480
-
481
- return $this;
482
- }
483
-
484
- /**
485
- * Register a callback function to execute whenever a data stream is written to using
486
- * <CFRequest::streaming_write_callback()>.
487
- *
488
- * The user-defined callback function should accept two arguments:
489
- *
490
- * <ul>
491
- * <li><code>$curl_handle</code> - <code>resource</code> - Required - The cURL handle resource that represents the in-progress transfer.</li>
492
- * <li><code>$length</code> - <code>integer</code> - Required - The length in kilobytes of the data chunk that was transferred.</li>
493
- * </ul>
494
- *
495
- * @param string|array|function $callback (Required) The callback function is called by <php:call_user_func()>, so you can pass the following values: <ul>
496
- * <li>The name of a global function to execute, passed as a string.</li>
497
- * <li>A method to execute, passed as <code>array('ClassName', 'MethodName')</code>.</li>
498
- * <li>An anonymous function (PHP 5.3+).</li></ul>
499
- * @return $this A reference to the current instance.
500
- */
501
- public function register_streaming_write_callback($callback)
502
- {
503
- $this->registered_streaming_write_callback = $callback;
504
-
505
- return $this;
506
- }
507
-
508
-
509
- /*%******************************************************************************************%*/
510
- // PREPARE, SEND, AND PROCESS REQUEST
511
-
512
- /**
513
- * A callback function that is invoked by cURL for streaming up.
514
- *
515
- * @param resource $curl_handle (Required) The cURL handle for the request.
516
- * @param resource $file_handle (Required) The open file handle resource.
517
- * @param integer $length (Required) The maximum number of bytes to read.
518
- * @return binary Binary data from a stream.
519
- */
520
- public function streaming_read_callback($curl_handle, $file_handle, $length)
521
- {
522
- // Once we've sent as much as we're supposed to send...
523
- if ($this->read_stream_read >= $this->read_stream_size)
524
- {
525
- // Send EOF
526
- return '';
527
- }
528
-
529
- // If we're at the beginning of an upload and need to seek...
530
- if ($this->read_stream_read == 0 && isset($this->seek_position) && $this->seek_position !== ftell($this->read_stream))
531
- {
532
- if (fseek($this->read_stream, $this->seek_position) !== 0)
533
- {
534
- throw new RequestCore_Exception('The stream does not support seeking and is either not at the requested position or the position is unknown.');
535
- }
536
- }
537
-
538
- $read = fread($this->read_stream, min($this->read_stream_size - $this->read_stream_read, $length)); // Remaining upload data or cURL's requested chunk size
539
- $this->read_stream_read += strlen($read);
540
-
541
- $out = $read === false ? '' : $read;
542
-
543
- // Execute callback function
544
- if ($this->registered_streaming_read_callback)
545
- {
546
- call_user_func($this->registered_streaming_read_callback, $curl_handle, $file_handle, $out);
547
- }
548
-
549
- return $out;
550
- }
551
-
552
- /**
553
- * A callback function that is invoked by cURL for streaming down.
554
- *
555
- * @param resource $curl_handle (Required) The cURL handle for the request.
556
- * @param binary $data (Required) The data to write.
557
- * @return integer The number of bytes written.
558
- */
559
- public function streaming_write_callback($curl_handle, $data)
560
- {
561
- $length = strlen($data);
562
- $written_total = 0;
563
- $written_last = 0;
564
-
565
- while ($written_total < $length)
566
- {
567
- $written_last = fwrite($this->write_stream, substr($data, $written_total));
568
-
569
- if ($written_last === false)
570
- {
571
- return $written_total;
572
- }
573
-
574
- $written_total += $written_last;
575
- }
576
-
577
- // Execute callback function
578
- if ($this->registered_streaming_write_callback)
579
- {
580
- call_user_func($this->registered_streaming_write_callback, $curl_handle, $written_total);
581
- }
582
-
583
- return $written_total;
584
- }
585
-
586
- /**
587
- * Prepares and adds the details of the cURL request. This can be passed along to a <php:curl_multi_exec()>
588
- * function.
589
- *
590
- * @return resource The handle for the cURL object.
591
- */
592
- public function prep_request()
593
- {
594
- $curl_handle = curl_init();
595
-
596
- // Set default options.
597
- curl_setopt($curl_handle, CURLOPT_URL, $this->request_url);
598
- curl_setopt($curl_handle, CURLOPT_FILETIME, true);
599
- curl_setopt($curl_handle, CURLOPT_FRESH_CONNECT, false);
600
- curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false);
601
- curl_setopt($curl_handle, CURLOPT_SSL_VERIFYHOST, true);
602
- curl_setopt($curl_handle, CURLOPT_CLOSEPOLICY, CURLCLOSEPOLICY_LEAST_RECENTLY_USED);
603
- curl_setopt($curl_handle, CURLOPT_MAXREDIRS, 5);
604
- curl_setopt($curl_handle, CURLOPT_HEADER, true);
605
- curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
606
- curl_setopt($curl_handle, CURLOPT_TIMEOUT, 5184000);
607
- curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 120);
608
- curl_setopt($curl_handle, CURLOPT_NOSIGNAL, true);
609
- curl_setopt($curl_handle, CURLOPT_REFERER, $this->request_url);
610
- curl_setopt($curl_handle, CURLOPT_USERAGENT, $this->useragent);
611
- curl_setopt($curl_handle, CURLOPT_READFUNCTION, array($this, 'streaming_read_callback'));
612
-
613
- if ($this->debug_mode)
614
- {
615
- curl_setopt($curl_handle, CURLOPT_VERBOSE, true);
616
- }
617
-
618
- if (!ini_get('safe_mode'))
619
- {
620
- curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true);
621
- }
622
-
623
- // Enable a proxy connection if requested.
624
- if ($this->proxy)
625
- {
626
- curl_setopt($curl_handle, CURLOPT_HTTPPROXYTUNNEL, true);
627
-
628
- $host = $this->proxy['host'];
629
- $host .= ($this->proxy['port']) ? ':' . $this->proxy['port'] : '';
630
- curl_setopt($curl_handle, CURLOPT_PROXY, $host);
631
-
632
- if (isset($this->proxy['user']) && isset($this->proxy['pass']))
633
- {
634
- curl_setopt($curl_handle, CURLOPT_PROXYUSERPWD, $this->proxy['user'] . ':' . $this->proxy['pass']);
635
- }
636
- }
637
-
638
- // Set credentials for HTTP Basic/Digest Authentication.
639
- if ($this->username && $this->password)
640
- {
641
- curl_setopt($curl_handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
642
- curl_setopt($curl_handle, CURLOPT_USERPWD, $this->username . ':' . $this->password);
643
- }
644
-
645
- // Handle the encoding if we can.
646
- if (extension_loaded('zlib'))
647
- {
648
- curl_setopt($curl_handle, CURLOPT_ENCODING, '');
649
- }
650
-
651
- // Process custom headers
652
- if (isset($this->request_headers) && count($this->request_headers))
653
- {
654
- $temp_headers = array();
655
-
656
- foreach ($this->request_headers as $k => $v)
657
- {
658
- $temp_headers[] = $k . ': ' . $v;
659
- }
660
-
661
- curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $temp_headers);
662
- }
663
-
664
- switch ($this->method)
665
- {
666
- case self::HTTP_PUT:
667
- curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'PUT');
668
- if (isset($this->read_stream))
669
- {
670
- if (!isset($this->read_stream_size) || $this->read_stream_size < 0)
671
- {
672
- throw new RequestCore_Exception('The stream size for the streaming upload cannot be determined.');
673
- }
674
-
675
- curl_setopt($curl_handle, CURLOPT_INFILESIZE, $this->read_stream_size);
676
- curl_setopt($curl_handle, CURLOPT_UPLOAD, true);
677
- }
678
- else
679
- {
680
- curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $this->request_body);
681
- }
682
- break;
683
-
684
- case self::HTTP_POST:
685
- curl_setopt($curl_handle, CURLOPT_POST, true);
686
- curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $this->request_body);
687
- break;
688
-
689
- case self::HTTP_HEAD:
690
- curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, self::HTTP_HEAD);
691
- curl_setopt($curl_handle, CURLOPT_NOBODY, 1);
692
- break;
693
-
694
- default: // Assumed GET
695
- curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, $this->method);
696
- if (isset($this->write_stream))
697
- {
698
- curl_setopt($curl_handle, CURLOPT_WRITEFUNCTION, array($this, 'streaming_write_callback'));
699
- curl_setopt($curl_handle, CURLOPT_HEADER, false);
700
- }
701
- else
702
- {
703
- curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $this->request_body);
704
- }
705
- break;
706
- }
707
-
708
- // Merge in the CURLOPTs
709
- if (isset($this->curlopts) && sizeof($this->curlopts) > 0)
710
- {
711
- foreach ($this->curlopts as $k => $v)
712
- {
713
- curl_setopt($curl_handle, $k, $v);
714
- }
715
- }
716
-
717
- return $curl_handle;
718
- }
719
-
720
- /**
721
- * Take the post-processed cURL data and break it down into useful header/body/info chunks. Uses the
722
- * data stored in the `curl_handle` and `response` properties unless replacement data is passed in via
723
- * parameters.
724
- *
725
- * @param resource $curl_handle (Optional) The reference to the already executed cURL request.
726
- * @param string $response (Optional) The actual response content itself that needs to be parsed.
727
- * @return ResponseCore A <ResponseCore> object containing a parsed HTTP response.
728
- */
729
- public function process_response($curl_handle = null, $response = null)
730
- {
731
- // Accept a custom one if it's passed.
732
- if ($curl_handle && $response)
733
- {
734
- $this->curl_handle = $curl_handle;
735
- $this->response = $response;
736
- }
737
-
738
- // As long as this came back as a valid resource...
739
- if (is_resource($this->curl_handle))
740
- {
741
- // Determine what's what.
742
- $header_size = curl_getinfo($this->curl_handle, CURLINFO_HEADER_SIZE);
743
- $this->response_headers = substr($this->response, 0, $header_size);
744
- $this->response_body = substr($this->response, $header_size);
745
- $this->response_code = curl_getinfo($this->curl_handle, CURLINFO_HTTP_CODE);
746
- $this->response_info = curl_getinfo($this->curl_handle);
747
-
748
- // Parse out the headers
749
- $this->response_headers = explode("\r\n\r\n", trim($this->response_headers));
750
- $this->response_headers = array_pop($this->response_headers);
751
- $this->response_headers = explode("\r\n", $this->response_headers);
752
- array_shift($this->response_headers);
753
-
754
- // Loop through and split up the headers.
755
- $header_assoc = array();
756
- foreach ($this->response_headers as $header)
757
- {
758
- $kv = explode(': ', $header);
759
- $header_assoc[strtolower($kv[0])] = $kv[1];
760
- }
761
-
762
- // Reset the headers to the appropriate property.
763
- $this->response_headers = $header_assoc;
764
- $this->response_headers['_info'] = $this->response_info;
765
- $this->response_headers['_info']['method'] = $this->method;
766
-
767
- if ($curl_handle && $response)
768
- {
769
- return new $this->response_class($this->response_headers, $this->response_body, $this->response_code, $this->curl_handle);
770
- }
771
- }
772
-
773
- // Return false
774
- return false;
775
- }
776
-
777
- /**
778
- * Sends the request, calling necessary utility functions to update built-in properties.
779
- *
780
- * @param boolean $parse (Optional) Whether to parse the response with ResponseCore or not.
781
- * @return string The resulting unparsed data from the request.
782
- */
783
- public function send_request($parse = false)
784
- {
785
- set_time_limit(0);
786
-
787
- $curl_handle = $this->prep_request();
788
- $this->response = curl_exec($curl_handle);
789
-
790
- if ($this->response === false)
791
- {
792
- throw new RequestCore_Exception('cURL resource: ' . (string) $curl_handle . '; cURL error: ' . curl_error($curl_handle) . ' (' . curl_errno($curl_handle) . ')');
793
- }
794
-
795
- $parsed_response = $this->process_response($curl_handle, $this->response);
796
-
797
- curl_close($curl_handle);
798
-
799
- if ($parse)
800
- {
801
- return $parsed_response;
802
- }
803
-
804
- return $this->response;
805
- }
806
-
807
- /**
808
- * Sends the request using <php:curl_multi_exec()>, enabling parallel requests. Uses the "rolling" method.
809
- *
810
- * @param array $handles (Required) An indexed array of cURL handles to process simultaneously.
811
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
812
- * <li><code>callback</code> - <code>string|array</code> - Optional - The string name of a function to pass the response data to. If this is a method, pass an array where the <code>[0]</code> index is the class and the <code>[1]</code> index is the method name.</li>
813
- * <li><code>limit</code> - <code>integer</code> - Optional - The number of simultaneous requests to make. This can be useful for scaling around slow server responses. Defaults to trusting cURLs judgement as to how many to use.</li></ul>
814
- * @return array Post-processed cURL responses.
815
- */
816
- public function send_multi_request($handles, $opt = null)
817
- {
818
- set_time_limit(0);
819
-
820
- // Skip everything if there are no handles to process.
821
- if (count($handles) === 0) return array();
822
-
823
- if (!$opt) $opt = array();
824
-
825
- // Initialize any missing options
826
- $limit = isset($opt['limit']) ? $opt['limit'] : -1;
827
-
828
- // Initialize
829
- $handle_list = $handles;
830
- $http = new $this->request_class();
831
- $multi_handle = curl_multi_init();
832
- $handles_post = array();
833
- $added = count($handles);
834
- $last_handle = null;
835
- $count = 0;
836
- $i = 0;
837
-
838
- // Loop through the cURL handles and add as many as it set by the limit parameter.
839
- while ($i < $added)
840
- {
841
- if ($limit > 0 && $i >= $limit) break;
842
- curl_multi_add_handle($multi_handle, array_shift($handles));
843
- $i++;
844
- }
845
-
846
- do
847
- {
848
- $active = false;
849
-
850
- // Start executing and wait for a response.
851
- while (($status = curl_multi_exec($multi_handle, $active)) === CURLM_CALL_MULTI_PERFORM)
852
- {
853
- // Start looking for possible responses immediately when we have to add more handles
854
- if (count($handles) > 0) break;
855
- }
856
-
857
- // Figure out which requests finished.
858
- $to_process = array();
859
-
860
- while ($done = curl_multi_info_read($multi_handle))
861
- {
862
- // Since curl_errno() isn't reliable for handles that were in multirequests, we check the 'result' of the info read, which contains the curl error number, (listed here http://curl.haxx.se/libcurl/c/libcurl-errors.html )
863
- if ($done['result'] > 0)
864
- {
865
- throw new RequestCore_Exception('cURL resource: ' . (string) $done['handle'] . '; cURL error: ' . curl_error($done['handle']) . ' (' . $done['result'] . ')');
866
- }
867
-
868
- // Because curl_multi_info_read() might return more than one message about a request, we check to see if this request is already in our array of completed requests
869
- elseif (!isset($to_process[(int) $done['handle']]))
870
- {
871
- $to_process[(int) $done['handle']] = $done;
872
- }
873
- }
874
-
875
- // Actually deal with the request
876
- foreach ($to_process as $pkey => $done)
877
- {
878
- $response = $http->process_response($done['handle'], curl_multi_getcontent($done['handle']));
879
- $key = array_search($done['handle'], $handle_list, true);
880
- $handles_post[$key] = $response;
881
-
882
- if (count($handles) > 0)
883
- {
884
- curl_multi_add_handle($multi_handle, array_shift($handles));
885
- }
886
-
887
- curl_multi_remove_handle($multi_handle, $done['handle']);
888
- curl_close($done['handle']);
889
- }
890
- }
891
- while ($active || count($handles_post) < $added);
892
-
893
- curl_multi_close($multi_handle);
894
-
895
- ksort($handles_post, SORT_NUMERIC);
896
- return $handles_post;
897
- }
898
-
899
-
900
- /*%******************************************************************************************%*/
901
- // RESPONSE METHODS
902
-
903
- /**
904
- * Get the HTTP response headers from the request.
905
- *
906
- * @param string $header (Optional) A specific header value to return. Defaults to all headers.
907
- * @return string|array All or selected header values.
908
- */
909
- public function get_response_header($header = null)
910
- {
911
- if ($header)
912
- {
913
- return $this->response_headers[strtolower($header)];
914
- }
915
- return $this->response_headers;
916
- }
917
-
918
- /**
919
- * Get the HTTP response body from the request.
920
- *
921
- * @return string The response body.
922
- */
923
- public function get_response_body()
924
- {
925
- return $this->response_body;
926
- }
927
-
928
- /**
929
- * Get the HTTP response code from the request.
930
- *
931
- * @return string The HTTP response code.
932
- */
933
- public function get_response_code()
934
- {
935
- return $this->response_code;
936
- }
937
- }
938
-
939
-
940
- /**
941
- * Container for all response-related methods.
942
- */
943
- class ResponseCore
944
- {
945
- /**
946
- * Stores the HTTP header information.
947
- */
948
- public $header;
949
-
950
- /**
951
- * Stores the SimpleXML response.
952
- */
953
- public $body;
954
-
955
- /**
956
- * Stores the HTTP response code.
957
- */
958
- public $status;
959
-
960
- /**
961
- * Constructs a new instance of this class.
962
- *
963
- * @param array $header (Required) Associative array of HTTP headers (typically returned by <RequestCore::get_response_header()>).
964
- * @param string $body (Required) XML-formatted response from AWS.
965
- * @param integer $status (Optional) HTTP response status code from the request.
966
- * @return object Contains an <php:array> `header` property (HTTP headers as an associative array), a <php:SimpleXMLElement> or <php:string> `body` property, and an <php:integer> `status` code.
967
- */
968
- public function __construct($header, $body, $status = null)
969
- {
970
- $this->header = $header;
971
- $this->body = $body;
972
- $this->status = $status;
973
-
974
- return $this;
975
- }
976
-
977
- /**
978
- * Did we receive the status code we expected?
979
- *
980
- * @param integer|array $codes (Optional) The status code(s) to expect. Pass an <php:integer> for a single acceptable value, or an <php:array> of integers for multiple acceptable values.
981
- * @return boolean Whether we received the expected status code or not.
982
- */
983
- public function isOK($codes = array(200, 201, 204, 206))
984
- {
985
- if (is_array($codes))
986
- {
987
- return in_array($this->status, $codes);
988
- }
989
-
990
- return $this->status === $codes;
991
- }
992
- }
993
-
994
- /**
995
- * Default RequestCore Exception.
996
- */
997
- class RequestCore_Exception extends Exception {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Handles all HTTP requests using cURL and manages the responses.
4
+ *
5
+ * @version 2011.06.07
6
+ * @copyright 2006-2011 Ryan Parman
7
+ * @copyright 2006-2010 Foleeo Inc.
8
+ * @copyright 2010-2011 Amazon.com, Inc. or its affiliates.
9
+ * @copyright 2008-2011 Contributors
10
+ * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License
11
+ */
12
+ class RequestCore
13
+ {
14
+ /**
15
+ * The URL being requested.
16
+ */
17
+ public $request_url;
18
+
19
+ /**
20
+ * The headers being sent in the request.
21
+ */
22
+ public $request_headers;
23
+
24
+ /**
25
+ * The body being sent in the request.
26
+ */
27
+ public $request_body;
28
+
29
+ /**
30
+ * The response returned by the request.
31
+ */
32
+ public $response;
33
+
34
+ /**
35
+ * The headers returned by the request.
36
+ */
37
+ public $response_headers;
38
+
39
+ /**
40
+ * The body returned by the request.
41
+ */
42
+ public $response_body;
43
+
44
+ /**
45
+ * The HTTP status code returned by the request.
46
+ */
47
+ public $response_code;
48
+
49
+ /**
50
+ * Additional response data.
51
+ */
52
+ public $response_info;
53
+
54
+ /**
55
+ * The handle for the cURL object.
56
+ */
57
+ public $curl_handle;
58
+
59
+ /**
60
+ * The method by which the request is being made.
61
+ */
62
+ public $method;
63
+
64
+ /**
65
+ * Stores the proxy settings to use for the request.
66
+ */
67
+ public $proxy = null;
68
+
69
+ /**
70
+ * The username to use for the request.
71
+ */
72
+ public $username = null;
73
+
74
+ /**
75
+ * The password to use for the request.
76
+ */
77
+ public $password = null;
78
+
79
+ /**
80
+ * Custom CURLOPT settings.
81
+ */
82
+ public $curlopts = null;
83
+
84
+ /**
85
+ * The state of debug mode.
86
+ */
87
+ public $debug_mode = false;
88
+
89
+ /**
90
+ * The default class to use for HTTP Requests (defaults to <RequestCore>).
91
+ */
92
+ public $request_class = 'RequestCore';
93
+
94
+ /**
95
+ * The default class to use for HTTP Responses (defaults to <ResponseCore>).
96
+ */
97
+ public $response_class = 'ResponseCore';
98
+
99
+ /**
100
+ * Default useragent string to use.
101
+ */
102
+ public $useragent = 'RequestCore/1.4.3';
103
+
104
+ /**
105
+ * File to read from while streaming up.
106
+ */
107
+ public $read_file = null;
108
+
109
+ /**
110
+ * The resource to read from while streaming up.
111
+ */
112
+ public $read_stream = null;
113
+
114
+ /**
115
+ * The size of the stream to read from.
116
+ */
117
+ public $read_stream_size = null;
118
+
119
+ /**
120
+ * The length already read from the stream.
121
+ */
122
+ public $read_stream_read = 0;
123
+
124
+ /**
125
+ * File to write to while streaming down.
126
+ */
127
+ public $write_file = null;
128
+
129
+ /**
130
+ * The resource to write to while streaming down.
131
+ */
132
+ public $write_stream = null;
133
+
134
+ /**
135
+ * Stores the intended starting seek position.
136
+ */
137
+ public $seek_position = null;
138
+
139
+ /**
140
+ * The location of the cacert.pem file to use.
141
+ */
142
+ public $cacert_location = false;
143
+
144
+ /**
145
+ * The state of SSL certificate verification.
146
+ */
147
+ public $ssl_verification = true;
148
+
149
+ /**
150
+ * The user-defined callback function to call when a stream is read from.
151
+ */
152
+ public $registered_streaming_read_callback = null;
153
+
154
+ /**
155
+ * The user-defined callback function to call when a stream is written to.
156
+ */
157
+ public $registered_streaming_write_callback = null;
158
+
159
+
160
+ /*%******************************************************************************************%*/
161
+ // CONSTANTS
162
+
163
+ /**
164
+ * GET HTTP Method
165
+ */
166
+ const HTTP_GET = 'GET';
167
+
168
+ /**
169
+ * POST HTTP Method
170
+ */
171
+ const HTTP_POST = 'POST';
172
+
173
+ /**
174
+ * PUT HTTP Method
175
+ */
176
+ const HTTP_PUT = 'PUT';
177
+
178
+ /**
179
+ * DELETE HTTP Method
180
+ */
181
+ const HTTP_DELETE = 'DELETE';
182
+
183
+ /**
184
+ * HEAD HTTP Method
185
+ */
186
+ const HTTP_HEAD = 'HEAD';
187
+
188
+
189
+ /*%******************************************************************************************%*/
190
+ // CONSTRUCTOR/DESTRUCTOR
191
+
192
+ /**
193
+ * Constructs a new instance of this class.
194
+ *
195
+ * @param string $url (Optional) The URL to request or service endpoint to query.
196
+ * @param string $proxy (Optional) The faux-url to use for proxy settings. Takes the following format: `proxy://user:pass@hostname:port`
197
+ * @param array $helpers (Optional) An associative array of classnames to use for request, and response functionality. Gets passed in automatically by the calling class.
198
+ * @return $this A reference to the current instance.
199
+ */
200
+ public function __construct($url = null, $proxy = null, $helpers = null)
201
+ {
202
+ // Set some default values.
203
+ $this->request_url = $url;
204
+ $this->method = self::HTTP_GET;
205
+ $this->request_headers = array();
206
+ $this->request_body = '';
207
+
208
+ // Set a new Request class if one was set.
209
+ if (isset($helpers['request']) && !empty($helpers['request']))
210
+ {
211
+ $this->request_class = $helpers['request'];
212
+ }
213
+
214
+ // Set a new Request class if one was set.
215
+ if (isset($helpers['response']) && !empty($helpers['response']))
216
+ {
217
+ $this->response_class = $helpers['response'];
218
+ }
219
+
220
+ if ($proxy)
221
+ {
222
+ $this->set_proxy($proxy);
223
+ }
224
+
225
+ return $this;
226
+ }
227
+
228
+ /**
229
+ * Destructs the instance. Closes opened file handles.
230
+ *
231
+ * @return $this A reference to the current instance.
232
+ */
233
+ public function __destruct()
234
+ {
235
+ if (isset($this->read_file) && isset($this->read_stream))
236
+ {
237
+ fclose($this->read_stream);
238
+ }
239
+
240
+ if (isset($this->write_file) && isset($this->write_stream))
241
+ {
242
+ fclose($this->write_stream);
243
+ }
244
+
245
+ return $this;
246
+ }
247
+
248
+
249
+ /*%******************************************************************************************%*/
250
+ // REQUEST METHODS
251
+
252
+ /**
253
+ * Sets the credentials to use for authentication.
254
+ *
255
+ * @param string $user (Required) The username to authenticate with.
256
+ * @param string $pass (Required) The password to authenticate with.
257
+ * @return $this A reference to the current instance.
258
+ */
259
+ public function set_credentials($user, $pass)
260
+ {
261
+ $this->username = $user;
262
+ $this->password = $pass;
263
+ return $this;
264
+ }
265
+
266
+ /**
267
+ * Adds a custom HTTP header to the cURL request.
268
+ *
269
+ * @param string $key (Required) The custom HTTP header to set.
270
+ * @param mixed $value (Required) The value to assign to the custom HTTP header.
271
+ * @return $this A reference to the current instance.
272
+ */
273
+ public function add_header($key, $value)
274
+ {
275
+ $this->request_headers[$key] = $value;
276
+ return $this;
277
+ }
278
+
279
+ /**
280
+ * Removes an HTTP header from the cURL request.
281
+ *
282
+ * @param string $key (Required) The custom HTTP header to set.
283
+ * @return $this A reference to the current instance.
284
+ */
285
+ public function remove_header($key)
286
+ {
287
+ if (isset($this->request_headers[$key]))
288
+ {
289
+ unset($this->request_headers[$key]);
290
+ }
291
+ return $this;
292
+ }
293
+
294
+ /**
295
+ * Set the method type for the request.
296
+ *
297
+ * @param string $method (Required) One of the following constants: <HTTP_GET>, <HTTP_POST>, <HTTP_PUT>, <HTTP_HEAD>, <HTTP_DELETE>.
298
+ * @return $this A reference to the current instance.
299
+ */
300
+ public function set_method($method)
301
+ {
302
+ $this->method = strtoupper($method);
303
+ return $this;
304
+ }
305
+
306
+ /**
307
+ * Sets a custom useragent string for the class.
308
+ *
309
+ * @param string $ua (Required) The useragent string to use.
310
+ * @return $this A reference to the current instance.
311
+ */
312
+ public function set_useragent($ua)
313
+ {
314
+ $this->useragent = $ua;
315
+ return $this;
316
+ }
317
+
318
+ /**
319
+ * Set the body to send in the request.
320
+ *
321
+ * @param string $body (Required) The textual content to send along in the body of the request.
322
+ * @return $this A reference to the current instance.
323
+ */
324
+ public function set_body($body)
325
+ {
326
+ $this->request_body = $body;
327
+ return $this;
328
+ }
329
+
330
+ /**
331
+ * Set the URL to make the request to.
332
+ *
333
+ * @param string $url (Required) The URL to make the request to.
334
+ * @return $this A reference to the current instance.
335
+ */
336
+ public function set_request_url($url)
337
+ {
338
+ $this->request_url = $url;
339
+ return $this;
340
+ }
341
+
342
+ /**
343
+ * Set additional CURLOPT settings. These will merge with the default settings, and override if
344
+ * there is a duplicate.
345
+ *
346
+ * @param array $curlopts (Optional) A set of key-value pairs that set `CURLOPT` options. These will merge with the existing CURLOPTs, and ones passed here will override the defaults. Keys should be the `CURLOPT_*` constants, not strings.
347
+ * @return $this A reference to the current instance.
348
+ */
349
+ public function set_curlopts($curlopts)
350
+ {
351
+ $this->curlopts = $curlopts;
352
+ return $this;
353
+ }
354
+
355
+ /**
356
+ * Sets the length in bytes to read from the stream while streaming up.
357
+ *
358
+ * @param integer $size (Required) The length in bytes to read from the stream.
359
+ * @return $this A reference to the current instance.
360
+ */
361
+ public function set_read_stream_size($size)
362
+ {
363
+ $this->read_stream_size = $size;
364
+
365
+ return $this;
366
+ }
367
+
368
+ /**
369
+ * Sets the resource to read from while streaming up. Reads the stream from its current position until
370
+ * EOF or `$size` bytes have been read. If `$size` is not given it will be determined by <php:fstat()> and
371
+ * <php:ftell()>.
372
+ *
373
+ * @param resource $resource (Required) The readable resource to read from.
374
+ * @param integer $size (Optional) The size of the stream to read.
375
+ * @return $this A reference to the current instance.
376
+ */
377
+ public function set_read_stream($resource, $size = null)
378
+ {
379
+ if (!isset($size) || $size < 0)
380
+ {
381
+ $stats = fstat($resource);
382
+
383
+ if ($stats && $stats['size'] >= 0)
384
+ {
385
+ $position = ftell($resource);
386
+
387
+ if ($position !== false && $position >= 0)
388
+ {
389
+ $size = $stats['size'] - $position;
390
+ }
391
+ }
392
+ }
393
+
394
+ $this->read_stream = $resource;
395
+
396
+ return $this->set_read_stream_size($size);
397
+ }
398
+
399
+ /**
400
+ * Sets the file to read from while streaming up.
401
+ *
402
+ * @param string $location (Required) The readable location to read from.
403
+ * @return $this A reference to the current instance.
404
+ */
405
+ public function set_read_file($location)
406
+ {
407
+ $this->read_file = $location;
408
+ $read_file_handle = fopen($location, 'r');
409
+
410
+ return $this->set_read_stream($read_file_handle);
411
+ }
412
+
413
+ /**
414
+ * Sets the resource to write to while streaming down.
415
+ *
416
+ * @param resource $resource (Required) The writeable resource to write to.
417
+ * @return $this A reference to the current instance.
418
+ */
419
+ public function set_write_stream($resource)
420
+ {
421
+ $this->write_stream = $resource;
422
+
423
+ return $this;
424
+ }
425
+
426
+ /**
427
+ * Sets the file to write to while streaming down.
428
+ *
429
+ * @param string $location (Required) The writeable location to write to.
430
+ * @return $this A reference to the current instance.
431
+ */
432
+ public function set_write_file($location)
433
+ {
434
+ $this->write_file = $location;
435
+ $write_file_handle = fopen($location, 'w');
436
+
437
+ return $this->set_write_stream($write_file_handle);
438
+ }
439
+
440
+ /**
441
+ * Set the proxy to use for making requests.
442
+ *
443
+ * @param string $proxy (Required) The faux-url to use for proxy settings. Takes the following format: `proxy://user:pass@hostname:port`
444
+ * @return $this A reference to the current instance.
445
+ */
446
+ public function set_proxy($proxy)
447
+ {
448
+ $proxy = parse_url($proxy);
449
+ $proxy['user'] = isset($proxy['user']) ? $proxy['user'] : null;
450
+ $proxy['pass'] = isset($proxy['pass']) ? $proxy['pass'] : null;
451
+ $proxy['port'] = isset($proxy['port']) ? $proxy['port'] : null;
452
+ $this->proxy = $proxy;
453
+ return $this;
454
+ }
455
+
456
+ /**
457
+ * Set the intended starting seek position.
458
+ *
459
+ * @param integer $position (Required) The byte-position of the stream to begin reading from.
460
+ * @return $this A reference to the current instance.
461
+ */
462
+ public function set_seek_position($position)
463
+ {
464
+ $this->seek_position = isset($position) ? (integer) $position : null;
465
+
466
+ return $this;
467
+ }
468
+
469
+ /**
470
+ * Register a callback function to execute whenever a data stream is read from using
471
+ * <CFRequest::streaming_read_callback()>.
472
+ *
473
+ * The user-defined callback function should accept three arguments:
474
+ *
475
+ * <ul>
476
+ * <li><code>$curl_handle</code> - <code>resource</code> - Required - The cURL handle resource that represents the in-progress transfer.</li>
477
+ * <li><code>$file_handle</code> - <code>resource</code> - Required - The file handle resource that represents the file on the local file system.</li>
478
+ * <li><code>$length</code> - <code>integer</code> - Required - The length in kilobytes of the data chunk that was transferred.</li>
479
+ * </ul>
480
+ *
481
+ * @param string|array|function $callback (Required) The callback function is called by <php:call_user_func()>, so you can pass the following values: <ul>
482
+ * <li>The name of a global function to execute, passed as a string.</li>
483
+ * <li>A method to execute, passed as <code>array('ClassName', 'MethodName')</code>.</li>
484
+ * <li>An anonymous function (PHP 5.3+).</li></ul>
485
+ * @return $this A reference to the current instance.
486
+ */
487
+ public function register_streaming_read_callback($callback)
488
+ {
489
+ $this->registered_streaming_read_callback = $callback;
490
+
491
+ return $this;
492
+ }
493
+
494
+ /**
495
+ * Register a callback function to execute whenever a data stream is written to using
496
+ * <CFRequest::streaming_write_callback()>.
497
+ *
498
+ * The user-defined callback function should accept two arguments:
499
+ *
500
+ * <ul>
501
+ * <li><code>$curl_handle</code> - <code>resource</code> - Required - The cURL handle resource that represents the in-progress transfer.</li>
502
+ * <li><code>$length</code> - <code>integer</code> - Required - The length in kilobytes of the data chunk that was transferred.</li>
503
+ * </ul>
504
+ *
505
+ * @param string|array|function $callback (Required) The callback function is called by <php:call_user_func()>, so you can pass the following values: <ul>
506
+ * <li>The name of a global function to execute, passed as a string.</li>
507
+ * <li>A method to execute, passed as <code>array('ClassName', 'MethodName')</code>.</li>
508
+ * <li>An anonymous function (PHP 5.3+).</li></ul>
509
+ * @return $this A reference to the current instance.
510
+ */
511
+ public function register_streaming_write_callback($callback)
512
+ {
513
+ $this->registered_streaming_write_callback = $callback;
514
+
515
+ return $this;
516
+ }
517
+
518
+
519
+ /*%******************************************************************************************%*/
520
+ // PREPARE, SEND, AND PROCESS REQUEST
521
+
522
+ /**
523
+ * A callback function that is invoked by cURL for streaming up.
524
+ *
525
+ * @param resource $curl_handle (Required) The cURL handle for the request.
526
+ * @param resource $file_handle (Required) The open file handle resource.
527
+ * @param integer $length (Required) The maximum number of bytes to read.
528
+ * @return binary Binary data from a stream.
529
+ */
530
+ public function streaming_read_callback($curl_handle, $file_handle, $length)
531
+ {
532
+ // Once we've sent as much as we're supposed to send...
533
+ if ($this->read_stream_read >= $this->read_stream_size)
534
+ {
535
+ // Send EOF
536
+ return '';
537
+ }
538
+
539
+ // If we're at the beginning of an upload and need to seek...
540
+ if ($this->read_stream_read == 0 && isset($this->seek_position) && $this->seek_position !== ftell($this->read_stream))
541
+ {
542
+ if (fseek($this->read_stream, $this->seek_position) !== 0)
543
+ {
544
+ throw new RequestCore_Exception('The stream does not support seeking and is either not at the requested position or the position is unknown.');
545
+ }
546
+ }
547
+
548
+ $read = fread($this->read_stream, min($this->read_stream_size - $this->read_stream_read, $length)); // Remaining upload data or cURL's requested chunk size
549
+ $this->read_stream_read += strlen($read);
550
+
551
+ $out = $read === false ? '' : $read;
552
+
553
+ // Execute callback function
554
+ if ($this->registered_streaming_read_callback)
555
+ {
556
+ call_user_func($this->registered_streaming_read_callback, $curl_handle, $file_handle, $out);
557
+ }
558
+
559
+ return $out;
560
+ }
561
+
562
+ /**
563
+ * A callback function that is invoked by cURL for streaming down.
564
+ *
565
+ * @param resource $curl_handle (Required) The cURL handle for the request.
566
+ * @param binary $data (Required) The data to write.
567
+ * @return integer The number of bytes written.
568
+ */
569
+ public function streaming_write_callback($curl_handle, $data)
570
+ {
571
+ $length = strlen($data);
572
+ $written_total = 0;
573
+ $written_last = 0;
574
+
575
+ while ($written_total < $length)
576
+ {
577
+ $written_last = fwrite($this->write_stream, substr($data, $written_total));
578
+
579
+ if ($written_last === false)
580
+ {
581
+ return $written_total;
582
+ }
583
+
584
+ $written_total += $written_last;
585
+ }
586
+
587
+ // Execute callback function
588
+ if ($this->registered_streaming_write_callback)
589
+ {
590
+ call_user_func($this->registered_streaming_write_callback, $curl_handle, $written_total);
591
+ }
592
+
593
+ return $written_total;
594
+ }
595
+
596
+ /**
597
+ * Prepares and adds the details of the cURL request. This can be passed along to a <php:curl_multi_exec()>
598
+ * function.
599
+ *
600
+ * @return resource The handle for the cURL object.
601
+ */
602
+ public function prep_request()
603
+ {
604
+ $curl_handle = curl_init();
605
+
606
+ // Set default options.
607
+ curl_setopt($curl_handle, CURLOPT_URL, $this->request_url);
608
+ curl_setopt($curl_handle, CURLOPT_FILETIME, true);
609
+ curl_setopt($curl_handle, CURLOPT_FRESH_CONNECT, false);
610
+ curl_setopt($curl_handle, CURLOPT_CLOSEPOLICY, CURLCLOSEPOLICY_LEAST_RECENTLY_USED);
611
+ curl_setopt($curl_handle, CURLOPT_MAXREDIRS, 5);
612
+ curl_setopt($curl_handle, CURLOPT_HEADER, true);
613
+ curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
614
+ curl_setopt($curl_handle, CURLOPT_TIMEOUT, 5184000);
615
+ curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 120);
616
+ curl_setopt($curl_handle, CURLOPT_NOSIGNAL, true);
617
+ curl_setopt($curl_handle, CURLOPT_REFERER, $this->request_url);
618
+ curl_setopt($curl_handle, CURLOPT_USERAGENT, $this->useragent);
619
+ curl_setopt($curl_handle, CURLOPT_READFUNCTION, array($this, 'streaming_read_callback'));
620
+
621
+ // Verification of the SSL cert
622
+ if ($this->ssl_verification)
623
+ {
624
+ curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, true);
625
+ curl_setopt($curl_handle, CURLOPT_SSL_VERIFYHOST, true);
626
+ }
627
+ else
628
+ {
629
+ curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false);
630
+ curl_setopt($curl_handle, CURLOPT_SSL_VERIFYHOST, false);
631
+ }
632
+
633
+ // chmod the file as 0755
634
+ if ($this->cacert_location === true)
635
+ {
636
+ curl_setopt($curl_handle, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
637
+ }
638
+ elseif (is_string($this->cacert_location))
639
+ {
640
+ curl_setopt($curl_handle, CURLOPT_CAINFO, $this->cacert_location);
641
+ }
642
+
643
+ // Debug mode
644
+ if ($this->debug_mode)
645
+ {
646
+ curl_setopt($curl_handle, CURLOPT_VERBOSE, true);
647
+ }
648
+
649
+ // Handle open_basedir & safe mode
650
+ if (!ini_get('safe_mode') && !ini_get('open_basedir'))
651
+ {
652
+ curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true);
653
+ }
654
+
655
+ // Enable a proxy connection if requested.
656
+ if ($this->proxy)
657
+ {
658
+ curl_setopt($curl_handle, CURLOPT_HTTPPROXYTUNNEL, true);
659
+
660
+ $host = $this->proxy['host'];
661
+ $host .= ($this->proxy['port']) ? ':' . $this->proxy['port'] : '';
662
+ curl_setopt($curl_handle, CURLOPT_PROXY, $host);
663
+
664
+ if (isset($this->proxy['user']) && isset($this->proxy['pass']))
665
+ {
666
+ curl_setopt($curl_handle, CURLOPT_PROXYUSERPWD, $this->proxy['user'] . ':' . $this->proxy['pass']);
667
+ }
668
+ }
669
+
670
+ // Set credentials for HTTP Basic/Digest Authentication.
671
+ if ($this->username && $this->password)
672
+ {
673
+ curl_setopt($curl_handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
674
+ curl_setopt($curl_handle, CURLOPT_USERPWD, $this->username . ':' . $this->password);
675
+ }
676
+
677
+ // Handle the encoding if we can.
678
+ if (extension_loaded('zlib'))
679
+ {
680
+ curl_setopt($curl_handle, CURLOPT_ENCODING, '');
681
+ }
682
+
683
+ // Process custom headers
684
+ if (isset($this->request_headers) && count($this->request_headers))
685
+ {
686
+ $temp_headers = array();
687
+
688
+ foreach ($this->request_headers as $k => $v)
689
+ {
690
+ $temp_headers[] = $k . ': ' . $v;
691
+ }
692
+
693
+ curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $temp_headers);
694
+ }
695
+
696
+ switch ($this->method)
697
+ {
698
+ case self::HTTP_PUT:
699
+ curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'PUT');
700
+ if (isset($this->read_stream))
701
+ {
702
+ if (!isset($this->read_stream_size) || $this->read_stream_size < 0)
703
+ {
704
+ throw new RequestCore_Exception('The stream size for the streaming upload cannot be determined.');
705
+ }
706
+
707
+ curl_setopt($curl_handle, CURLOPT_INFILESIZE, $this->read_stream_size);
708
+ curl_setopt($curl_handle, CURLOPT_UPLOAD, true);
709
+ }
710
+ else
711
+ {
712
+ curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $this->request_body);
713
+ }
714
+ break;
715
+
716
+ case self::HTTP_POST:
717
+ curl_setopt($curl_handle, CURLOPT_POST, true);
718
+ curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $this->request_body);
719
+ break;
720
+
721
+ case self::HTTP_HEAD:
722
+ curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, self::HTTP_HEAD);
723
+ curl_setopt($curl_handle, CURLOPT_NOBODY, 1);
724
+ break;
725
+
726
+ default: // Assumed GET
727
+ curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, $this->method);
728
+ if (isset($this->write_stream))
729
+ {
730
+ curl_setopt($curl_handle, CURLOPT_WRITEFUNCTION, array($this, 'streaming_write_callback'));
731
+ curl_setopt($curl_handle, CURLOPT_HEADER, false);
732
+ }
733
+ else
734
+ {
735
+ curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $this->request_body);
736
+ }
737
+ break;
738
+ }
739
+
740
+ // Merge in the CURLOPTs
741
+ if (isset($this->curlopts) && sizeof($this->curlopts) > 0)
742
+ {
743
+ foreach ($this->curlopts as $k => $v)
744
+ {
745
+ curl_setopt($curl_handle, $k, $v);
746
+ }
747
+ }
748
+
749
+ return $curl_handle;
750
+ }
751
+
752
+ /**
753
+ * Take the post-processed cURL data and break it down into useful header/body/info chunks. Uses the
754
+ * data stored in the `curl_handle` and `response` properties unless replacement data is passed in via
755
+ * parameters.
756
+ *
757
+ * @param resource $curl_handle (Optional) The reference to the already executed cURL request.
758
+ * @param string $response (Optional) The actual response content itself that needs to be parsed.
759
+ * @return ResponseCore A <ResponseCore> object containing a parsed HTTP response.
760
+ */
761
+ public function process_response($curl_handle = null, $response = null)
762
+ {
763
+ // Accept a custom one if it's passed.
764
+ if ($curl_handle && $response)
765
+ {
766
+ $this->curl_handle = $curl_handle;
767
+ $this->response = $response;
768
+ }
769
+
770
+ // As long as this came back as a valid resource...
771
+ if (is_resource($this->curl_handle))
772
+ {
773
+ // Determine what's what.
774
+ $header_size = curl_getinfo($this->curl_handle, CURLINFO_HEADER_SIZE);
775
+ $this->response_headers = substr($this->response, 0, $header_size);
776
+ $this->response_body = substr($this->response, $header_size);
777
+ $this->response_code = curl_getinfo($this->curl_handle, CURLINFO_HTTP_CODE);
778
+ $this->response_info = curl_getinfo($this->curl_handle);
779
+
780
+ // Parse out the headers
781
+ $this->response_headers = explode("\r\n\r\n", trim($this->response_headers));
782
+ $this->response_headers = array_pop($this->response_headers);
783
+ $this->response_headers = explode("\r\n", $this->response_headers);
784
+ array_shift($this->response_headers);
785
+
786
+ // Loop through and split up the headers.
787
+ $header_assoc = array();
788
+ foreach ($this->response_headers as $header)
789
+ {
790
+ $kv = explode(': ', $header);
791
+ $header_assoc[strtolower($kv[0])] = $kv[1];
792
+ }
793
+
794
+ // Reset the headers to the appropriate property.
795
+ $this->response_headers = $header_assoc;
796
+ $this->response_headers['_info'] = $this->response_info;
797
+ $this->response_headers['_info']['method'] = $this->method;
798
+
799
+ if ($curl_handle && $response)
800
+ {
801
+ return new $this->response_class($this->response_headers, $this->response_body, $this->response_code, $this->curl_handle);
802
+ }
803
+ }
804
+
805
+ // Return false
806
+ return false;
807
+ }
808
+
809
+ /**
810
+ * Sends the request, calling necessary utility functions to update built-in properties.
811
+ *
812
+ * @param boolean $parse (Optional) Whether to parse the response with ResponseCore or not.
813
+ * @return string The resulting unparsed data from the request.
814
+ */
815
+ public function send_request($parse = false)
816
+ {
817
+ set_time_limit(0);
818
+
819
+ $curl_handle = $this->prep_request();
820
+ $this->response = curl_exec($curl_handle);
821
+
822
+ if ($this->response === false)
823
+ {
824
+ throw new RequestCore_Exception('cURL resource: ' . (string) $curl_handle . '; cURL error: ' . curl_error($curl_handle) . ' (' . curl_errno($curl_handle) . ')');
825
+ }
826
+
827
+ $parsed_response = $this->process_response($curl_handle, $this->response);
828
+
829
+ curl_close($curl_handle);
830
+
831
+ if ($parse)
832
+ {
833
+ return $parsed_response;
834
+ }
835
+
836
+ return $this->response;
837
+ }
838
+
839
+ /**
840
+ * Sends the request using <php:curl_multi_exec()>, enabling parallel requests. Uses the "rolling" method.
841
+ *
842
+ * @param array $handles (Required) An indexed array of cURL handles to process simultaneously.
843
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
844
+ * <li><code>callback</code> - <code>string|array</code> - Optional - The string name of a function to pass the response data to. If this is a method, pass an array where the <code>[0]</code> index is the class and the <code>[1]</code> index is the method name.</li>
845
+ * <li><code>limit</code> - <code>integer</code> - Optional - The number of simultaneous requests to make. This can be useful for scaling around slow server responses. Defaults to trusting cURLs judgement as to how many to use.</li></ul>
846
+ * @return array Post-processed cURL responses.
847
+ */
848
+ public function send_multi_request($handles, $opt = null)
849
+ {
850
+ set_time_limit(0);
851
+
852
+ // Skip everything if there are no handles to process.
853
+ if (count($handles) === 0) return array();
854
+
855
+ if (!$opt) $opt = array();
856
+
857
+ // Initialize any missing options
858
+ $limit = isset($opt['limit']) ? $opt['limit'] : -1;
859
+
860
+ // Initialize
861
+ $handle_list = $handles;
862
+ $http = new $this->request_class();
863
+ $multi_handle = curl_multi_init();
864
+ $handles_post = array();
865
+ $added = count($handles);
866
+ $last_handle = null;
867
+ $count = 0;
868
+ $i = 0;
869
+
870
+ // Loop through the cURL handles and add as many as it set by the limit parameter.
871
+ while ($i < $added)
872
+ {
873
+ if ($limit > 0 && $i >= $limit) break;
874
+ curl_multi_add_handle($multi_handle, array_shift($handles));
875
+ $i++;
876
+ }
877
+
878
+ do
879
+ {
880
+ $active = false;
881
+
882
+ // Start executing and wait for a response.
883
+ while (($status = curl_multi_exec($multi_handle, $active)) === CURLM_CALL_MULTI_PERFORM)
884
+ {
885
+ // Start looking for possible responses immediately when we have to add more handles
886
+ if (count($handles) > 0) break;
887
+ }
888
+
889
+ // Figure out which requests finished.
890
+ $to_process = array();
891
+
892
+ while ($done = curl_multi_info_read($multi_handle))
893
+ {
894
+ // Since curl_errno() isn't reliable for handles that were in multirequests, we check the 'result' of the info read, which contains the curl error number, (listed here http://curl.haxx.se/libcurl/c/libcurl-errors.html )
895
+ if ($done['result'] > 0)
896
+ {
897
+ throw new RequestCore_Exception('cURL resource: ' . (string) $done['handle'] . '; cURL error: ' . curl_error($done['handle']) . ' (' . $done['result'] . ')');
898
+ }
899
+
900
+ // Because curl_multi_info_read() might return more than one message about a request, we check to see if this request is already in our array of completed requests
901
+ elseif (!isset($to_process[(int) $done['handle']]))
902
+ {
903
+ $to_process[(int) $done['handle']] = $done;
904
+ }
905
+ }
906
+
907
+ // Actually deal with the request
908
+ foreach ($to_process as $pkey => $done)
909
+ {
910
+ $response = $http->process_response($done['handle'], curl_multi_getcontent($done['handle']));
911
+ $key = array_search($done['handle'], $handle_list, true);
912
+ $handles_post[$key] = $response;
913
+
914
+ if (count($handles) > 0)
915
+ {
916
+ curl_multi_add_handle($multi_handle, array_shift($handles));
917
+ }
918
+
919
+ curl_multi_remove_handle($multi_handle, $done['handle']);
920
+ curl_close($done['handle']);
921
+ }
922
+ }
923
+ while ($active || count($handles_post) < $added);
924
+
925
+ curl_multi_close($multi_handle);
926
+
927
+ ksort($handles_post, SORT_NUMERIC);
928
+ return $handles_post;
929
+ }
930
+
931
+
932
+ /*%******************************************************************************************%*/
933
+ // RESPONSE METHODS
934
+
935
+ /**
936
+ * Get the HTTP response headers from the request.
937
+ *
938
+ * @param string $header (Optional) A specific header value to return. Defaults to all headers.
939
+ * @return string|array All or selected header values.
940
+ */
941
+ public function get_response_header($header = null)
942
+ {
943
+ if ($header)
944
+ {
945
+ return $this->response_headers[strtolower($header)];
946
+ }
947
+ return $this->response_headers;
948
+ }
949
+
950
+ /**
951
+ * Get the HTTP response body from the request.
952
+ *
953
+ * @return string The response body.
954
+ */
955
+ public function get_response_body()
956
+ {
957
+ return $this->response_body;
958
+ }
959
+
960
+ /**
961
+ * Get the HTTP response code from the request.
962
+ *
963
+ * @return string The HTTP response code.
964
+ */
965
+ public function get_response_code()
966
+ {
967
+ return $this->response_code;
968
+ }
969
+ }
970
+
971
+
972
+ /**
973
+ * Container for all response-related methods.
974
+ */
975
+ class ResponseCore
976
+ {
977
+ /**
978
+ * Stores the HTTP header information.
979
+ */
980
+ public $header;
981
+
982
+ /**
983
+ * Stores the SimpleXML response.
984
+ */
985
+ public $body;
986
+
987
+ /**
988
+ * Stores the HTTP response code.
989
+ */
990
+ public $status;
991
+
992
+ /**
993
+ * Constructs a new instance of this class.
994
+ *
995
+ * @param array $header (Required) Associative array of HTTP headers (typically returned by <RequestCore::get_response_header()>).
996
+ * @param string $body (Required) XML-formatted response from AWS.
997
+ * @param integer $status (Optional) HTTP response status code from the request.
998
+ * @return object Contains an <php:array> `header` property (HTTP headers as an associative array), a <php:SimpleXMLElement> or <php:string> `body` property, and an <php:integer> `status` code.
999
+ */
1000
+ public function __construct($header, $body, $status = null)
1001
+ {
1002
+ $this->header = $header;
1003
+ $this->body = $body;
1004
+ $this->status = $status;
1005
+
1006
+ return $this;
1007
+ }
1008
+
1009
+ /**
1010
+ * Did we receive the status code we expected?
1011
+ *
1012
+ * @param integer|array $codes (Optional) The status code(s) to expect. Pass an <php:integer> for a single acceptable value, or an <php:array> of integers for multiple acceptable values.
1013
+ * @return boolean Whether we received the expected status code or not.
1014
+ */
1015
+ public function isOK($codes = array(200, 201, 204, 206))
1016
+ {
1017
+ if (is_array($codes))
1018
+ {
1019
+ return in_array($this->status, $codes);
1020
+ }
1021
+
1022
+ return $this->status === $codes;
1023
+ }
1024
+ }
1025
+
1026
+ /**
1027
+ * Default RequestCore Exception.
1028
+ */
1029
+ class RequestCore_Exception extends Exception {}
app/libs/aws/lib/yaml/LICENSE CHANGED
@@ -1,19 +1,19 @@
1
- Copyright (c) 2008-2009 Fabien Potencier
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy
4
- of this software and associated documentation files (the "Software"), to deal
5
- in the Software without restriction, including without limitation the rights
6
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- copies of the Software, and to permit persons to whom the Software is furnished
8
- to do so, subject to the following conditions:
9
-
10
- The above copyright notice and this permission notice shall be included in all
11
- copies or substantial portions of the Software.
12
-
13
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- THE SOFTWARE.
1
+ Copyright (c) 2008-2009 Fabien Potencier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
app/libs/aws/lib/yaml/lib/sfYaml.php CHANGED
@@ -1,135 +1,135 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the symfony package.
5
- * (c) 2004-2006 Fabien Potencier <fabien.potencier@symfony-project.com>
6
- *
7
- * For the full copyright and license information, please view the LICENSE
8
- * file that was distributed with this source code.
9
- */
10
-
11
- /**
12
- * sfYaml offers convenience methods to load and dump YAML.
13
- *
14
- * @package symfony
15
- * @subpackage yaml
16
- * @author Fabien Potencier <fabien.potencier@symfony-project.com>
17
- * @version SVN: $Id: sfYaml.class.php 8988 2008-05-15 20:24:26Z fabien $
18
- */
19
- class sfYaml
20
- {
21
- static protected
22
- $spec = '1.2';
23
-
24
- /**
25
- * Sets the YAML specification version to use.
26
- *
27
- * @param string $version The YAML specification version
28
- */
29
- static public function setSpecVersion($version)
30
- {
31
- if (!in_array($version, array('1.1', '1.2')))
32
- {
33
- throw new InvalidArgumentException(sprintf('Version %s of the YAML specifications is not supported', $version));
34
- }
35
-
36
- self::$spec = $version;
37
- }
38
-
39
- /**
40
- * Gets the YAML specification version to use.
41
- *
42
- * @return string The YAML specification version
43
- */
44
- static public function getSpecVersion()
45
- {
46
- return self::$spec;
47
- }
48
-
49
- /**
50
- * Loads YAML into a PHP array.
51
- *
52
- * The load method, when supplied with a YAML stream (string or file),
53
- * will do its best to convert YAML in a file into a PHP array.
54
- *
55
- * Usage:
56
- * <code>
57
- * $array = sfYaml::load('config.yml');
58
- * print_r($array);
59
- * </code>
60
- *
61
- * @param string $input Path of YAML file or string containing YAML
62
- *
63
- * @return array The YAML converted to a PHP array
64
- *
65
- * @throws InvalidArgumentException If the YAML is not valid
66
- */
67
- public static function load($input)
68
- {
69
- $file = '';
70
-
71
- // if input is a file, process it
72
- if (strpos($input, "\n") === false && is_file($input))
73
- {
74
- $file = $input;
75
-
76
- ob_start();
77
- $retval = include($input);
78
- $content = ob_get_clean();
79
-
80
- // if an array is returned by the config file assume it's in plain php form else in YAML
81
- $input = is_array($retval) ? $retval : $content;
82
- }
83
-
84
- // if an array is returned by the config file assume it's in plain php form else in YAML
85
- if (is_array($input))
86
- {
87
- return $input;
88
- }
89
-
90
- require_once dirname(__FILE__).'/sfYamlParser.php';
91
-
92
- $yaml = new sfYamlParser();
93
-
94
- try
95
- {
96
- $ret = $yaml->parse($input);
97
- }
98
- catch (Exception $e)
99
- {
100
- throw new InvalidArgumentException(sprintf('Unable to parse %s: %s', $file ? sprintf('file "%s"', $file) : 'string', $e->getMessage()));
101
- }
102
-
103
- return $ret;
104
- }
105
-
106
- /**
107
- * Dumps a PHP array to a YAML string.
108
- *
109
- * The dump method, when supplied with an array, will do its best
110
- * to convert the array into friendly YAML.
111
- *
112
- * @param array $array PHP array
113
- * @param integer $inline The level where you switch to inline YAML
114
- *
115
- * @return string A YAML string representing the original PHP array
116
- */
117
- public static function dump($array, $inline = 2)
118
- {
119
- require_once dirname(__FILE__).'/sfYamlDumper.php';
120
-
121
- $yaml = new sfYamlDumper();
122
-
123
- return $yaml->dump($array, $inline);
124
- }
125
- }
126
-
127
- /**
128
- * Wraps echo to automatically provide a newline.
129
- *
130
- * @param string $string The string to echo with new line
131
- */
132
- function echoln($string)
133
- {
134
- echo $string."\n";
135
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the symfony package.
5
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier@symfony-project.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * sfYaml offers convenience methods to load and dump YAML.
13
+ *
14
+ * @package symfony
15
+ * @subpackage yaml
16
+ * @author Fabien Potencier <fabien.potencier@symfony-project.com>
17
+ * @version SVN: $Id: sfYaml.class.php 8988 2008-05-15 20:24:26Z fabien $
18
+ */
19
+ class sfYaml
20
+ {
21
+ static protected
22
+ $spec = '1.2';
23
+
24
+ /**
25
+ * Sets the YAML specification version to use.
26
+ *
27
+ * @param string $version The YAML specification version
28
+ */
29
+ static public function setSpecVersion($version)
30
+ {
31
+ if (!in_array($version, array('1.1', '1.2')))
32
+ {
33
+ throw new InvalidArgumentException(sprintf('Version %s of the YAML specifications is not supported', $version));
34
+ }
35
+
36
+ self::$spec = $version;
37
+ }
38
+
39
+ /**
40
+ * Gets the YAML specification version to use.
41
+ *
42
+ * @return string The YAML specification version
43
+ */
44
+ static public function getSpecVersion()
45
+ {
46
+ return self::$spec;
47
+ }
48
+
49
+ /**
50
+ * Loads YAML into a PHP array.
51
+ *
52
+ * The load method, when supplied with a YAML stream (string or file),
53
+ * will do its best to convert YAML in a file into a PHP array.
54
+ *
55
+ * Usage:
56
+ * <code>
57
+ * $array = sfYaml::load('config.yml');
58
+ * print_r($array);
59
+ * </code>
60
+ *
61
+ * @param string $input Path of YAML file or string containing YAML
62
+ *
63
+ * @return array The YAML converted to a PHP array
64
+ *
65
+ * @throws InvalidArgumentException If the YAML is not valid
66
+ */
67
+ public static function load($input)
68
+ {
69
+ $file = '';
70
+
71
+ // if input is a file, process it
72
+ if (strpos($input, "\n") === false && is_file($input))
73
+ {
74
+ $file = $input;
75
+
76
+ ob_start();
77
+ $retval = include($input);
78
+ $content = ob_get_clean();
79
+
80
+ // if an array is returned by the config file assume it's in plain php form else in YAML
81
+ $input = is_array($retval) ? $retval : $content;
82
+ }
83
+
84
+ // if an array is returned by the config file assume it's in plain php form else in YAML
85
+ if (is_array($input))
86
+ {
87
+ return $input;
88
+ }
89
+
90
+ require_once dirname(__FILE__).'/sfYamlParser.php';
91
+
92
+ $yaml = new sfYamlParser();
93
+
94
+ try
95
+ {
96
+ $ret = $yaml->parse($input);
97
+ }
98
+ catch (Exception $e)
99
+ {
100
+ throw new InvalidArgumentException(sprintf('Unable to parse %s: %s', $file ? sprintf('file "%s"', $file) : 'string', $e->getMessage()));
101
+ }
102
+
103
+ return $ret;
104
+ }
105
+
106
+ /**
107
+ * Dumps a PHP array to a YAML string.
108
+ *
109
+ * The dump method, when supplied with an array, will do its best
110
+ * to convert the array into friendly YAML.
111
+ *
112
+ * @param array $array PHP array
113
+ * @param integer $inline The level where you switch to inline YAML
114
+ *
115
+ * @return string A YAML string representing the original PHP array
116
+ */
117
+ public static function dump($array, $inline = 2)
118
+ {
119
+ require_once dirname(__FILE__).'/sfYamlDumper.php';
120
+
121
+ $yaml = new sfYamlDumper();
122
+
123
+ return $yaml->dump($array, $inline);
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Wraps echo to automatically provide a newline.
129
+ *
130
+ * @param string $string The string to echo with new line
131
+ */
132
+ function echoln($string)
133
+ {
134
+ echo $string."\n";
135
+ }
app/libs/aws/lib/yaml/lib/sfYamlDumper.php CHANGED
@@ -1,60 +1,60 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the symfony package.
5
- * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
6
- *
7
- * For the full copyright and license information, please view the LICENSE
8
- * file that was distributed with this source code.
9
- */
10
-
11
- require_once(dirname(__FILE__).'/sfYamlInline.php');
12
-
13
- /**
14
- * sfYamlDumper dumps PHP variables to YAML strings.
15
- *
16
- * @package symfony
17
- * @subpackage yaml
18
- * @author Fabien Potencier <fabien.potencier@symfony-project.com>
19
- * @version SVN: $Id: sfYamlDumper.class.php 10575 2008-08-01 13:08:42Z nicolas $
20
- */
21
- class sfYamlDumper
22
- {
23
- /**
24
- * Dumps a PHP value to YAML.
25
- *
26
- * @param mixed $input The PHP value
27
- * @param integer $inline The level where you switch to inline YAML
28
- * @param integer $indent The level o indentation indentation (used internally)
29
- *
30
- * @return string The YAML representation of the PHP value
31
- */
32
- public function dump($input, $inline = 0, $indent = 0)
33
- {
34
- $output = '';
35
- $prefix = $indent ? str_repeat(' ', $indent) : '';
36
-
37
- if ($inline <= 0 || !is_array($input) || empty($input))
38
- {
39
- $output .= $prefix.sfYamlInline::dump($input);
40
- }
41
- else
42
- {
43
- $isAHash = array_keys($input) !== range(0, count($input) - 1);
44
-
45
- foreach ($input as $key => $value)
46
- {
47
- $willBeInlined = $inline - 1 <= 0 || !is_array($value) || empty($value);
48
-
49
- $output .= sprintf('%s%s%s%s',
50
- $prefix,
51
- $isAHash ? sfYamlInline::dump($key).':' : '-',
52
- $willBeInlined ? ' ' : "\n",
53
- $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + 2)
54
- ).($willBeInlined ? "\n" : '');
55
- }
56
- }
57
-
58
- return $output;
59
- }
60
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the symfony package.
5
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ require_once(dirname(__FILE__).'/sfYamlInline.php');
12
+
13
+ /**
14
+ * sfYamlDumper dumps PHP variables to YAML strings.
15
+ *
16
+ * @package symfony
17
+ * @subpackage yaml
18
+ * @author Fabien Potencier <fabien.potencier@symfony-project.com>
19
+ * @version SVN: $Id: sfYamlDumper.class.php 10575 2008-08-01 13:08:42Z nicolas $
20
+ */
21
+ class sfYamlDumper
22
+ {
23
+ /**
24
+ * Dumps a PHP value to YAML.
25
+ *
26
+ * @param mixed $input The PHP value
27
+ * @param integer $inline The level where you switch to inline YAML
28
+ * @param integer $indent The level o indentation indentation (used internally)
29
+ *
30
+ * @return string The YAML representation of the PHP value
31
+ */
32
+ public function dump($input, $inline = 0, $indent = 0)
33
+ {
34
+ $output = '';
35
+ $prefix = $indent ? str_repeat(' ', $indent) : '';
36
+
37
+ if ($inline <= 0 || !is_array($input) || empty($input))
38
+ {
39
+ $output .= $prefix.sfYamlInline::dump($input);
40
+ }
41
+ else
42
+ {
43
+ $isAHash = array_keys($input) !== range(0, count($input) - 1);
44
+
45
+ foreach ($input as $key => $value)
46
+ {
47
+ $willBeInlined = $inline - 1 <= 0 || !is_array($value) || empty($value);
48
+
49
+ $output .= sprintf('%s%s%s%s',
50
+ $prefix,
51
+ $isAHash ? sfYamlInline::dump($key).':' : '-',
52
+ $willBeInlined ? ' ' : "\n",
53
+ $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + 2)
54
+ ).($willBeInlined ? "\n" : '');
55
+ }
56
+ }
57
+
58
+ return $output;
59
+ }
60
+ }
app/libs/aws/lib/yaml/lib/sfYamlInline.php CHANGED
@@ -1,442 +1,442 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the symfony package.
5
- * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
6
- *
7
- * For the full copyright and license information, please view the LICENSE
8
- * file that was distributed with this source code.
9
- */
10
-
11
- require_once dirname(__FILE__).'/sfYaml.php';
12
-
13
- /**
14
- * sfYamlInline implements a YAML parser/dumper for the YAML inline syntax.
15
- *
16
- * @package symfony
17
- * @subpackage yaml
18
- * @author Fabien Potencier <fabien.potencier@symfony-project.com>
19
- * @version SVN: $Id: sfYamlInline.class.php 16177 2009-03-11 08:32:48Z fabien $
20
- */
21
- class sfYamlInline
22
- {
23
- const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\']*(?:\'\'[^\']*)*)\')';
24
-
25
- /**
26
- * Convert a YAML string to a PHP array.
27
- *
28
- * @param string $value A YAML string
29
- *
30
- * @return array A PHP array representing the YAML string
31
- */
32
- static public function load($value)
33
- {
34
- $value = trim($value);
35
-
36
- if (0 == strlen($value))
37
- {
38
- return '';
39
- }
40
-
41
- if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2)
42
- {
43
- $mbEncoding = mb_internal_encoding();
44
- mb_internal_encoding('ASCII');
45
- }
46
-
47
- switch ($value[0])
48
- {
49
- case '[':
50
- $result = self::parseSequence($value);
51
- break;
52
- case '{':
53
- $result = self::parseMapping($value);
54
- break;
55
- default:
56
- $result = self::parseScalar($value);
57
- }
58
-
59
- if (isset($mbEncoding))
60
- {
61
- mb_internal_encoding($mbEncoding);
62
- }
63
-
64
- return $result;
65
- }
66
-
67
- /**
68
- * Dumps a given PHP variable to a YAML string.
69
- *
70
- * @param mixed $value The PHP variable to convert
71
- *
72
- * @return string The YAML string representing the PHP array
73
- */
74
- static public function dump($value)
75
- {
76
- if ('1.1' === sfYaml::getSpecVersion())
77
- {
78
- $trueValues = array('true', 'on', '+', 'yes', 'y');
79
- $falseValues = array('false', 'off', '-', 'no', 'n');
80
- }
81
- else
82
- {
83
- $trueValues = array('true');
84
- $falseValues = array('false');
85
- }
86
-
87
- switch (true)
88
- {
89
- case is_resource($value):
90
- throw new InvalidArgumentException('Unable to dump PHP resources in a YAML file.');
91
- case is_object($value):
92
- return '!!php/object:'.serialize($value);
93
- case is_array($value):
94
- return self::dumpArray($value);
95
- case null === $value:
96
- return 'null';
97
- case true === $value:
98
- return 'true';
99
- case false === $value:
100
- return 'false';
101
- case ctype_digit($value):
102
- return is_string($value) ? "'$value'" : (int) $value;
103
- case is_numeric($value):
104
- return is_infinite($value) ? str_ireplace('INF', '.Inf', strval($value)) : (is_string($value) ? "'$value'" : $value);
105
- case false !== strpos($value, "\n") || false !== strpos($value, "\r"):
106
- return sprintf('"%s"', str_replace(array('"', "\n", "\r"), array('\\"', '\n', '\r'), $value));
107
- case preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ - ? | < > = ! % @ ` ]/x', $value):
108
- return sprintf("'%s'", str_replace('\'', '\'\'', $value));
109
- case '' == $value:
110
- return "''";
111
- case preg_match(self::getTimestampRegex(), $value):
112
- return "'$value'";
113
- case in_array(strtolower($value), $trueValues):
114
- return "'$value'";
115
- case in_array(strtolower($value), $falseValues):
116
- return "'$value'";
117
- case in_array(strtolower($value), array('null', '~')):
118
- return "'$value'";
119
- default:
120
- return $value;
121
- }
122
- }
123
-
124
- /**
125
- * Dumps a PHP array to a YAML string.
126
- *
127
- * @param array $value The PHP array to dump
128
- *
129
- * @return string The YAML string representing the PHP array
130
- */
131
- static protected function dumpArray($value)
132
- {
133
- // array
134
- $keys = array_keys($value);
135
- if (
136
- (1 == count($keys) && '0' == $keys[0])
137
- ||
138
- (count($keys) > 1 && array_reduce($keys, create_function('$v,$w', 'return (integer) $v + $w;'), 0) == count($keys) * (count($keys) - 1) / 2))
139
- {
140
- $output = array();
141
- foreach ($value as $val)
142
- {
143
- $output[] = self::dump($val);
144
- }
145
-
146
- return sprintf('[%s]', implode(', ', $output));
147
- }
148
-
149
- // mapping
150
- $output = array();
151
- foreach ($value as $key => $val)
152
- {
153
- $output[] = sprintf('%s: %s', self::dump($key), self::dump($val));
154
- }
155
-
156
- return sprintf('{ %s }', implode(', ', $output));
157
- }
158
-
159
- /**
160
- * Parses a scalar to a YAML string.
161
- *
162
- * @param scalar $scalar
163
- * @param string $delimiters
164
- * @param array $stringDelimiter
165
- * @param integer $i
166
- * @param boolean $evaluate
167
- *
168
- * @return string A YAML string
169
- */
170
- static public function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true)
171
- {
172
- if (in_array($scalar[$i], $stringDelimiters))
173
- {
174
- // quoted scalar
175
- $output = self::parseQuotedScalar($scalar, $i);
176
- }
177
- else
178
- {
179
- // "normal" string
180
- if (!$delimiters)
181
- {
182
- $output = substr($scalar, $i);
183
- $i += strlen($output);
184
-
185
- // remove comments
186
- if (false !== $strpos = strpos($output, ' #'))
187
- {
188
- $output = rtrim(substr($output, 0, $strpos));
189
- }
190
- }
191
- else if (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match))
192
- {
193
- $output = $match[1];
194
- $i += strlen($output);
195
- }
196
- else
197
- {
198
- throw new InvalidArgumentException(sprintf('Malformed inline YAML string (%s).', $scalar));
199
- }
200
-
201
- $output = $evaluate ? self::evaluateScalar($output) : $output;
202
- }
203
-
204
- return $output;
205
- }
206
-
207
- /**
208
- * Parses a quoted scalar to YAML.
209
- *
210
- * @param string $scalar
211
- * @param integer $i
212
- *
213
- * @return string A YAML string
214
- */
215
- static protected function parseQuotedScalar($scalar, &$i)
216
- {
217
- if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/A', substr($scalar, $i), $match))
218
- {
219
- throw new InvalidArgumentException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i)));
220
- }
221
-
222
- $output = substr($match[0], 1, strlen($match[0]) - 2);
223
-
224
- if ('"' == $scalar[$i])
225
- {
226
- // evaluate the string
227
- $output = str_replace(array('\\"', '\\n', '\\r'), array('"', "\n", "\r"), $output);
228
- }
229
- else
230
- {
231
- // unescape '
232
- $output = str_replace('\'\'', '\'', $output);
233
- }
234
-
235
- $i += strlen($match[0]);
236
-
237
- return $output;
238
- }
239
-
240
- /**
241
- * Parses a sequence to a YAML string.
242
- *
243
- * @param string $sequence
244
- * @param integer $i
245
- *
246
- * @return string A YAML string
247
- */
248
- static protected function parseSequence($sequence, &$i = 0)
249
- {
250
- $output = array();
251
- $len = strlen($sequence);
252
- $i += 1;
253
-
254
- // [foo, bar, ...]
255
- while ($i < $len)
256
- {
257
- switch ($sequence[$i])
258
- {
259
- case '[':
260
- // nested sequence
261
- $output[] = self::parseSequence($sequence, $i);
262
- break;
263
- case '{':
264
- // nested mapping
265
- $output[] = self::parseMapping($sequence, $i);
266
- break;
267
- case ']':
268
- return $output;
269
- case ',':
270
- case ' ':
271
- break;
272
- default:
273
- $isQuoted = in_array($sequence[$i], array('"', "'"));
274
- $value = self::parseScalar($sequence, array(',', ']'), array('"', "'"), $i);
275
-
276
- if (!$isQuoted && false !== strpos($value, ': '))
277
- {
278
- // embedded mapping?
279
- try
280
- {
281
- $value = self::parseMapping('{'.$value.'}');
282
- }
283
- catch (InvalidArgumentException $e)
284
- {
285
- // no, it's not
286
- }
287
- }
288
-
289
- $output[] = $value;
290
-
291
- --$i;
292
- }
293
-
294
- ++$i;
295
- }
296
-
297
- throw new InvalidArgumentException(sprintf('Malformed inline YAML string %s', $sequence));
298
- }
299
-
300
- /**
301
- * Parses a mapping to a YAML string.
302
- *
303
- * @param string $mapping
304
- * @param integer $i
305
- *
306
- * @return string A YAML string
307
- */
308
- static protected function parseMapping($mapping, &$i = 0)
309
- {
310
- $output = array();
311
- $len = strlen($mapping);
312
- $i += 1;
313
-
314
- // {foo: bar, bar:foo, ...}
315
- while ($i < $len)
316
- {
317
- switch ($mapping[$i])
318
- {
319
- case ' ':
320
- case ',':
321
- ++$i;
322
- continue 2;
323
- case '}':
324
- return $output;
325
- }
326
-
327
- // key
328
- $key = self::parseScalar($mapping, array(':', ' '), array('"', "'"), $i, false);
329
-
330
- // value
331
- $done = false;
332
- while ($i < $len)
333
- {
334
- switch ($mapping[$i])
335
- {
336
- case '[':
337
- // nested sequence
338
- $output[$key] = self::parseSequence($mapping, $i);
339
- $done = true;
340
- break;
341
- case '{':
342
- // nested mapping
343
- $output[$key] = self::parseMapping($mapping, $i);
344
- $done = true;
345
- break;
346
- case ':':
347
- case ' ':
348
- break;
349
- default:
350
- $output[$key] = self::parseScalar($mapping, array(',', '}'), array('"', "'"), $i);
351
- $done = true;
352
- --$i;
353
- }
354
-
355
- ++$i;
356
-
357
- if ($done)
358
- {
359
- continue 2;
360
- }
361
- }
362
- }
363
-
364
- throw new InvalidArgumentException(sprintf('Malformed inline YAML string %s', $mapping));
365
- }
366
-
367
- /**
368
- * Evaluates scalars and replaces magic values.
369
- *
370
- * @param string $scalar
371
- *
372
- * @return string A YAML string
373
- */
374
- static protected function evaluateScalar($scalar)
375
- {
376
- $scalar = trim($scalar);
377
-
378
- if ('1.1' === sfYaml::getSpecVersion())
379
- {
380
- $trueValues = array('true', 'on', '+', 'yes', 'y');
381
- $falseValues = array('false', 'off', '-', 'no', 'n');
382
- }
383
- else
384
- {
385
- $trueValues = array('true');
386
- $falseValues = array('false');
387
- }
388
-
389
- switch (true)
390
- {
391
- case 'null' == strtolower($scalar):
392
- case '' == $scalar:
393
- case '~' == $scalar:
394
- return null;
395
- case 0 === strpos($scalar, '!str'):
396
- return (string) substr($scalar, 5);
397
- case 0 === strpos($scalar, '! '):
398
- return intval(self::parseScalar(substr($scalar, 2)));
399
- case 0 === strpos($scalar, '!!php/object:'):
400
- return unserialize(substr($scalar, 13));
401
- case ctype_digit($scalar):
402
- $raw = $scalar;
403
- $cast = intval($scalar);
404
- return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
405
- case in_array(strtolower($scalar), $trueValues):
406
- return true;
407
- case in_array(strtolower($scalar), $falseValues):
408
- return false;
409
- case is_numeric($scalar):
410
- return '0x' == $scalar[0].$scalar[1] ? hexdec($scalar) : floatval($scalar);
411
- case 0 == strcasecmp($scalar, '.inf'):
412
- case 0 == strcasecmp($scalar, '.NaN'):
413
- return -log(0);
414
- case 0 == strcasecmp($scalar, '-.inf'):
415
- return log(0);
416
- case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar):
417
- return floatval(str_replace(',', '', $scalar));
418
- case preg_match(self::getTimestampRegex(), $scalar):
419
- return strtotime($scalar);
420
- default:
421
- return (string) $scalar;
422
- }
423
- }
424
-
425
- static protected function getTimestampRegex()
426
- {
427
- return <<<EOF
428
- ~^
429
- (?P<year>[0-9][0-9][0-9][0-9])
430
- -(?P<month>[0-9][0-9]?)
431
- -(?P<day>[0-9][0-9]?)
432
- (?:(?:[Tt]|[ \t]+)
433
- (?P<hour>[0-9][0-9]?)
434
- :(?P<minute>[0-9][0-9])
435
- :(?P<second>[0-9][0-9])
436
- (?:\.(?P<fraction>[0-9]*))?
437
- (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
438
- (?::(?P<tz_minute>[0-9][0-9]))?))?)?
439
- $~x
440
- EOF;
441
- }
442
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the symfony package.
5
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ require_once dirname(__FILE__).'/sfYaml.php';
12
+
13
+ /**
14
+ * sfYamlInline implements a YAML parser/dumper for the YAML inline syntax.
15
+ *
16
+ * @package symfony
17
+ * @subpackage yaml
18
+ * @author Fabien Potencier <fabien.potencier@symfony-project.com>
19
+ * @version SVN: $Id: sfYamlInline.class.php 16177 2009-03-11 08:32:48Z fabien $
20
+ */
21
+ class sfYamlInline
22
+ {
23
+ const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\']*(?:\'\'[^\']*)*)\')';
24
+
25
+ /**
26
+ * Convert a YAML string to a PHP array.
27
+ *
28
+ * @param string $value A YAML string
29
+ *
30
+ * @return array A PHP array representing the YAML string
31
+ */
32
+ static public function load($value)
33
+ {
34
+ $value = trim($value);
35
+
36
+ if (0 == strlen($value))
37
+ {
38
+ return '';
39
+ }
40
+
41
+ if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2)
42
+ {
43
+ $mbEncoding = mb_internal_encoding();
44
+ mb_internal_encoding('ASCII');
45
+ }
46
+
47
+ switch ($value[0])
48
+ {
49
+ case '[':
50
+ $result = self::parseSequence($value);
51
+ break;
52
+ case '{':
53
+ $result = self::parseMapping($value);
54
+ break;
55
+ default:
56
+ $result = self::parseScalar($value);
57
+ }
58
+
59
+ if (isset($mbEncoding))
60
+ {
61
+ mb_internal_encoding($mbEncoding);
62
+ }
63
+
64
+ return $result;
65
+ }
66
+
67
+ /**
68
+ * Dumps a given PHP variable to a YAML string.
69
+ *
70
+ * @param mixed $value The PHP variable to convert
71
+ *
72
+ * @return string The YAML string representing the PHP array
73
+ */
74
+ static public function dump($value)
75
+ {
76
+ if ('1.1' === sfYaml::getSpecVersion())
77
+ {
78
+ $trueValues = array('true', 'on', '+', 'yes', 'y');
79
+ $falseValues = array('false', 'off', '-', 'no', 'n');
80
+ }
81
+ else
82
+ {
83
+ $trueValues = array('true');
84
+ $falseValues = array('false');
85
+ }
86
+
87
+ switch (true)
88
+ {
89
+ case is_resource($value):
90
+ throw new InvalidArgumentException('Unable to dump PHP resources in a YAML file.');
91
+ case is_object($value):
92
+ return '!!php/object:'.serialize($value);
93
+ case is_array($value):
94
+ return self::dumpArray($value);
95
+ case null === $value:
96
+ return 'null';
97
+ case true === $value:
98
+ return 'true';
99
+ case false === $value:
100
+ return 'false';
101
+ case ctype_digit($value):
102
+ return is_string($value) ? "'$value'" : (int) $value;
103
+ case is_numeric($value):
104
+ return is_infinite($value) ? str_ireplace('INF', '.Inf', strval($value)) : (is_string($value) ? "'$value'" : $value);
105
+ case false !== strpos($value, "\n") || false !== strpos($value, "\r"):
106
+ return sprintf('"%s"', str_replace(array('"', "\n", "\r"), array('\\"', '\n', '\r'), $value));
107
+ case preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ - ? | < > = ! % @ ` ]/x', $value):
108
+ return sprintf("'%s'", str_replace('\'', '\'\'', $value));
109
+ case '' == $value:
110
+ return "''";
111
+ case preg_match(self::getTimestampRegex(), $value):
112
+ return "'$value'";
113
+ case in_array(strtolower($value), $trueValues):
114
+ return "'$value'";
115
+ case in_array(strtolower($value), $falseValues):
116
+ return "'$value'";
117
+ case in_array(strtolower($value), array('null', '~')):
118
+ return "'$value'";
119
+ default:
120
+ return $value;
121
+ }
122
+ }
123
+
124
+ /**
125
+ * Dumps a PHP array to a YAML string.
126
+ *
127
+ * @param array $value The PHP array to dump
128
+ *
129
+ * @return string The YAML string representing the PHP array
130
+ */
131
+ static protected function dumpArray($value)
132
+ {
133
+ // array
134
+ $keys = array_keys($value);
135
+ if (
136
+ (1 == count($keys) && '0' == $keys[0])
137
+ ||
138
+ (count($keys) > 1 && array_reduce($keys, create_function('$v,$w', 'return (integer) $v + $w;'), 0) == count($keys) * (count($keys) - 1) / 2))
139
+ {
140
+ $output = array();
141
+ foreach ($value as $val)
142
+ {
143
+ $output[] = self::dump($val);
144
+ }
145
+
146
+ return sprintf('[%s]', implode(', ', $output));
147
+ }
148
+
149
+ // mapping
150
+ $output = array();
151
+ foreach ($value as $key => $val)
152
+ {
153
+ $output[] = sprintf('%s: %s', self::dump($key), self::dump($val));
154
+ }
155
+
156
+ return sprintf('{ %s }', implode(', ', $output));
157
+ }
158
+
159
+ /**
160
+ * Parses a scalar to a YAML string.
161
+ *
162
+ * @param scalar $scalar
163
+ * @param string $delimiters
164
+ * @param array $stringDelimiter
165
+ * @param integer $i
166
+ * @param boolean $evaluate
167
+ *
168
+ * @return string A YAML string
169
+ */
170
+ static public function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true)
171
+ {
172
+ if (in_array($scalar[$i], $stringDelimiters))
173
+ {
174
+ // quoted scalar
175
+ $output = self::parseQuotedScalar($scalar, $i);
176
+ }
177
+ else
178
+ {
179
+ // "normal" string
180
+ if (!$delimiters)
181
+ {
182
+ $output = substr($scalar, $i);
183
+ $i += strlen($output);
184
+
185
+ // remove comments
186
+ if (false !== $strpos = strpos($output, ' #'))
187
+ {
188
+ $output = rtrim(substr($output, 0, $strpos));
189
+ }
190
+ }
191
+ else if (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match))
192
+ {
193
+ $output = $match[1];
194
+ $i += strlen($output);
195
+ }
196
+ else
197
+ {
198
+ throw new InvalidArgumentException(sprintf('Malformed inline YAML string (%s).', $scalar));
199
+ }
200
+
201
+ $output = $evaluate ? self::evaluateScalar($output) : $output;
202
+ }
203
+
204
+ return $output;
205
+ }
206
+
207
+ /**
208
+ * Parses a quoted scalar to YAML.
209
+ *
210
+ * @param string $scalar
211
+ * @param integer $i
212
+ *
213
+ * @return string A YAML string
214
+ */
215
+ static protected function parseQuotedScalar($scalar, &$i)
216
+ {
217
+ if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/A', substr($scalar, $i), $match))
218
+ {
219
+ throw new InvalidArgumentException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i)));
220
+ }
221
+
222
+ $output = substr($match[0], 1, strlen($match[0]) - 2);
223
+
224
+ if ('"' == $scalar[$i])
225
+ {
226
+ // evaluate the string
227
+ $output = str_replace(array('\\"', '\\n', '\\r'), array('"', "\n", "\r"), $output);
228
+ }
229
+ else
230
+ {
231
+ // unescape '
232
+ $output = str_replace('\'\'', '\'', $output);
233
+ }
234
+
235
+ $i += strlen($match[0]);
236
+
237
+ return $output;
238
+ }
239
+
240
+ /**
241
+ * Parses a sequence to a YAML string.
242
+ *
243
+ * @param string $sequence
244
+ * @param integer $i
245
+ *
246
+ * @return string A YAML string
247
+ */
248
+ static protected function parseSequence($sequence, &$i = 0)
249
+ {
250
+ $output = array();
251
+ $len = strlen($sequence);
252
+ $i += 1;
253
+
254
+ // [foo, bar, ...]
255
+ while ($i < $len)
256
+ {
257
+ switch ($sequence[$i])
258
+ {
259
+ case '[':
260
+ // nested sequence
261
+ $output[] = self::parseSequence($sequence, $i);
262
+ break;
263
+ case '{':
264
+ // nested mapping
265
+ $output[] = self::parseMapping($sequence, $i);
266
+ break;
267
+ case ']':
268
+ return $output;
269
+ case ',':
270
+ case ' ':
271
+ break;
272
+ default:
273
+ $isQuoted = in_array($sequence[$i], array('"', "'"));
274
+ $value = self::parseScalar($sequence, array(',', ']'), array('"', "'"), $i);
275
+
276
+ if (!$isQuoted && false !== strpos($value, ': '))
277
+ {
278
+ // embedded mapping?
279
+ try
280
+ {
281
+ $value = self::parseMapping('{'.$value.'}');
282
+ }
283
+ catch (InvalidArgumentException $e)
284
+ {
285
+ // no, it's not
286
+ }
287
+ }
288
+
289
+ $output[] = $value;
290
+
291
+ --$i;
292
+ }
293
+
294
+ ++$i;
295
+ }
296
+
297
+ throw new InvalidArgumentException(sprintf('Malformed inline YAML string %s', $sequence));
298
+ }
299
+
300
+ /**
301
+ * Parses a mapping to a YAML string.
302
+ *
303
+ * @param string $mapping
304
+ * @param integer $i
305
+ *
306
+ * @return string A YAML string
307
+ */
308
+ static protected function parseMapping($mapping, &$i = 0)
309
+ {
310
+ $output = array();
311
+ $len = strlen($mapping);
312
+ $i += 1;
313
+
314
+ // {foo: bar, bar:foo, ...}
315
+ while ($i < $len)
316
+ {
317
+ switch ($mapping[$i])
318
+ {
319
+ case ' ':
320
+ case ',':
321
+ ++$i;
322
+ continue 2;
323
+ case '}':
324
+ return $output;
325
+ }
326
+
327
+ // key
328
+ $key = self::parseScalar($mapping, array(':', ' '), array('"', "'"), $i, false);
329
+
330
+ // value
331
+ $done = false;
332
+ while ($i < $len)
333
+ {
334
+ switch ($mapping[$i])
335
+ {
336
+ case '[':
337
+ // nested sequence
338
+ $output[$key] = self::parseSequence($mapping, $i);
339
+ $done = true;
340
+ break;
341
+ case '{':
342
+ // nested mapping
343
+ $output[$key] = self::parseMapping($mapping, $i);
344
+ $done = true;
345
+ break;
346
+ case ':':
347
+ case ' ':
348
+ break;
349
+ default:
350
+ $output[$key] = self::parseScalar($mapping, array(',', '}'), array('"', "'"), $i);
351
+ $done = true;
352
+ --$i;
353
+ }
354
+
355
+ ++$i;
356
+
357
+ if ($done)
358
+ {
359
+ continue 2;
360
+ }
361
+ }
362
+ }
363
+
364
+ throw new InvalidArgumentException(sprintf('Malformed inline YAML string %s', $mapping));
365
+ }
366
+
367
+ /**
368
+ * Evaluates scalars and replaces magic values.
369
+ *
370
+ * @param string $scalar
371
+ *
372
+ * @return string A YAML string
373
+ */
374
+ static protected function evaluateScalar($scalar)
375
+ {
376
+ $scalar = trim($scalar);
377
+
378
+ if ('1.1' === sfYaml::getSpecVersion())
379
+ {
380
+ $trueValues = array('true', 'on', '+', 'yes', 'y');
381
+ $falseValues = array('false', 'off', '-', 'no', 'n');
382
+ }
383
+ else
384
+ {
385
+ $trueValues = array('true');
386
+ $falseValues = array('false');
387
+ }
388
+
389
+ switch (true)
390
+ {
391
+ case 'null' == strtolower($scalar):
392
+ case '' == $scalar:
393
+ case '~' == $scalar:
394
+ return null;
395
+ case 0 === strpos($scalar, '!str'):
396
+ return (string) substr($scalar, 5);
397
+ case 0 === strpos($scalar, '! '):
398
+ return intval(self::parseScalar(substr($scalar, 2)));
399
+ case 0 === strpos($scalar, '!!php/object:'):
400
+ return unserialize(substr($scalar, 13));
401
+ case ctype_digit($scalar):
402
+ $raw = $scalar;
403
+ $cast = intval($scalar);
404
+ return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
405
+ case in_array(strtolower($scalar), $trueValues):
406
+ return true;
407
+ case in_array(strtolower($scalar), $falseValues):
408
+ return false;
409
+ case is_numeric($scalar):
410
+ return '0x' == $scalar[0].$scalar[1] ? hexdec($scalar) : floatval($scalar);
411
+ case 0 == strcasecmp($scalar, '.inf'):
412
+ case 0 == strcasecmp($scalar, '.NaN'):
413
+ return -log(0);
414
+ case 0 == strcasecmp($scalar, '-.inf'):
415
+ return log(0);
416
+ case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar):
417
+ return floatval(str_replace(',', '', $scalar));
418
+ case preg_match(self::getTimestampRegex(), $scalar):
419
+ return strtotime($scalar);
420
+ default:
421
+ return (string) $scalar;
422
+ }
423
+ }
424
+
425
+ static protected function getTimestampRegex()
426
+ {
427
+ return <<<EOF
428
+ ~^
429
+ (?P<year>[0-9][0-9][0-9][0-9])
430
+ -(?P<month>[0-9][0-9]?)
431
+ -(?P<day>[0-9][0-9]?)
432
+ (?:(?:[Tt]|[ \t]+)
433
+ (?P<hour>[0-9][0-9]?)
434
+ :(?P<minute>[0-9][0-9])
435
+ :(?P<second>[0-9][0-9])
436
+ (?:\.(?P<fraction>[0-9]*))?
437
+ (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
438
+ (?::(?P<tz_minute>[0-9][0-9]))?))?)?
439
+ $~x
440
+ EOF;
441
+ }
442
+ }
app/libs/aws/lib/yaml/lib/sfYamlParser.php CHANGED
@@ -1,612 +1,612 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the symfony package.
5
- * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
6
- *
7
- * For the full copyright and license information, please view the LICENSE
8
- * file that was distributed with this source code.
9
- */
10
-
11
- require_once(dirname(__FILE__).'/sfYamlInline.php');
12
-
13
- if (!defined('PREG_BAD_UTF8_OFFSET_ERROR'))
14
- {
15
- define('PREG_BAD_UTF8_OFFSET_ERROR', 5);
16
- }
17
-
18
- /**
19
- * sfYamlParser parses YAML strings to convert them to PHP arrays.
20
- *
21
- * @package symfony
22
- * @subpackage yaml
23
- * @author Fabien Potencier <fabien.potencier@symfony-project.com>
24
- * @version SVN: $Id: sfYamlParser.class.php 10832 2008-08-13 07:46:08Z fabien $
25
- */
26
- class sfYamlParser
27
- {
28
- protected
29
- $offset = 0,
30
- $lines = array(),
31
- $currentLineNb = -1,
32
- $currentLine = '',
33
- $refs = array();
34
-
35
- /**
36
- * Constructor
37
- *
38
- * @param integer $offset The offset of YAML document (used for line numbers in error messages)
39
- */
40
- public function __construct($offset = 0)
41
- {
42
- $this->offset = $offset;
43
- }
44
-
45
- /**
46
- * Parses a YAML string to a PHP value.
47
- *
48
- * @param string $value A YAML string
49
- *
50
- * @return mixed A PHP value
51
- *
52
- * @throws InvalidArgumentException If the YAML is not valid
53
- */
54
- public function parse($value)
55
- {
56
- $value = str_replace("\t", ' ', $value); // Convert tabs to spaces.
57
-
58
- $this->currentLineNb = -1;
59
- $this->currentLine = '';
60
- $this->lines = explode("\n", $this->cleanup($value));
61
-
62
- if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2)
63
- {
64
- $mbEncoding = mb_internal_encoding();
65
- mb_internal_encoding('ASCII');
66
- }
67
-
68
- $data = array();
69
- while ($this->moveToNextLine())
70
- {
71
- if ($this->isCurrentLineEmpty())
72
- {
73
- continue;
74
- }
75
-
76
- // tab?
77
- if (preg_match('#^\t+#', $this->currentLine))
78
- {
79
- throw new InvalidArgumentException(sprintf('A YAML file cannot contain tabs as indentation at line %d (%s).', $this->getRealCurrentLineNb() + 1, $this->currentLine));
80
- }
81
-
82
- $isRef = $isInPlace = $isProcessed = false;
83
- if (preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+?))?\s*$#', $this->currentLine, $values))
84
- {
85
- if (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#', $values['value'], $matches))
86
- {
87
- $isRef = $matches['ref'];
88
- $values['value'] = $matches['value'];
89
- }
90
-
91
- // array
92
- if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#'))
93
- {
94
- $c = $this->getRealCurrentLineNb() + 1;
95
- $parser = new sfYamlParser($c);
96
- $parser->refs =& $this->refs;
97
- $data[] = $parser->parse($this->getNextEmbedBlock());
98
- }
99
- else
100
- {
101
- if (isset($values['leadspaces'])
102
- && ' ' == $values['leadspaces']
103
- && preg_match('#^(?P<key>'.sfYamlInline::REGEX_QUOTED_STRING.'|[^ \'"\{].*?) *\:(\s+(?P<value>.+?))?\s*$#', $values['value'], $matches))
104
- {
105
- // this is a compact notation element, add to next block and parse
106
- $c = $this->getRealCurrentLineNb();
107
- $parser = new sfYamlParser($c);
108
- $parser->refs =& $this->refs;
109
-
110
- $block = $values['value'];
111
- if (!$this->isNextLineIndented())
112
- {
113
- $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + 2);
114
- }
115
-
116
- $data[] = $parser->parse($block);
117
- }
118
- else
119
- {
120
- $data[] = $this->parseValue($values['value']);
121
- }
122
- }
123
- }
124
- else if (preg_match('#^(?P<key>'.sfYamlInline::REGEX_QUOTED_STRING.'|[^ \'"].*?) *\:(\s+(?P<value>.+?))?\s*$#', $this->currentLine, $values))
125
- {
126
- $key = sfYamlInline::parseScalar($values['key']);
127
-
128
- if ('<<' === $key)
129
- {
130
- if (isset($values['value']) && '*' === substr($values['value'], 0, 1))
131
- {
132
- $isInPlace = substr($values['value'], 1);
133
- if (!array_key_exists($isInPlace, $this->refs))
134
- {
135
- throw new InvalidArgumentException(sprintf('Reference "%s" does not exist at line %s (%s).', $isInPlace, $this->getRealCurrentLineNb() + 1, $this->currentLine));
136
- }
137
- }
138
- else
139
- {
140
- if (isset($values['value']) && $values['value'] !== '')
141
- {
142
- $value = $values['value'];
143
- }
144
- else
145
- {
146
- $value = $this->getNextEmbedBlock();
147
- }
148
- $c = $this->getRealCurrentLineNb() + 1;
149
- $parser = new sfYamlParser($c);
150
- $parser->refs =& $this->refs;
151
- $parsed = $parser->parse($value);
152
-
153
- $merged = array();
154
- if (!is_array($parsed))
155
- {
156
- throw new InvalidArgumentException(sprintf("YAML merge keys used with a scalar value instead of an array at line %s (%s)", $this->getRealCurrentLineNb() + 1, $this->currentLine));
157
- }
158
- else if (isset($parsed[0]))
159
- {
160
- // Numeric array, merge individual elements
161
- foreach (array_reverse($parsed) as $parsedItem)
162
- {
163
- if (!is_array($parsedItem))
164
- {
165
- throw new InvalidArgumentException(sprintf("Merge items must be arrays at line %s (%s).", $this->getRealCurrentLineNb() + 1, $parsedItem));
166
- }
167
- $merged = array_merge($parsedItem, $merged);
168
- }
169
- }
170
- else
171
- {
172
- // Associative array, merge
173
- $merged = array_merge($merge, $parsed);
174
- }
175
-
176
- $isProcessed = $merged;
177
- }
178
- }
179
- else if (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#', $values['value'], $matches))
180
- {
181
- $isRef = $matches['ref'];
182
- $values['value'] = $matches['value'];
183
- }
184
-
185
- if ($isProcessed)
186
- {
187
- // Merge keys
188
- $data = $isProcessed;
189
- }
190
- // hash
191
- else if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#'))
192
- {
193
- // if next line is less indented or equal, then it means that the current value is null
194
- if ($this->isNextLineIndented())
195
- {
196
- $data[$key] = null;
197
- }
198
- else
199
- {
200
- $c = $this->getRealCurrentLineNb() + 1;
201
- $parser = new sfYamlParser($c);
202
- $parser->refs =& $this->refs;
203
- $data[$key] = $parser->parse($this->getNextEmbedBlock());
204
- }
205
- }
206
- else
207
- {
208
- if ($isInPlace)
209
- {
210
- $data = $this->refs[$isInPlace];
211
- }
212
- else
213
- {
214
- $data[$key] = $this->parseValue($values['value']);
215
- }
216
- }
217
- }
218
- else
219
- {
220
- // 1-liner followed by newline
221
- if (2 == count($this->lines) && empty($this->lines[1]))
222
- {
223
- $value = sfYamlInline::load($this->lines[0]);
224
- if (is_array($value))
225
- {
226
- $first = reset($value);
227
- if ('*' === substr($first, 0, 1))
228
- {
229
- $data = array();
230
- foreach ($value as $alias)
231
- {
232
- $data[] = $this->refs[substr($alias, 1)];
233
- }
234
- $value = $data;
235
- }
236
- }
237
-
238
- if (isset($mbEncoding))
239
- {
240
- mb_internal_encoding($mbEncoding);
241
- }
242
-
243
- return $value;
244
- }
245
-
246
- switch (preg_last_error())
247
- {
248
- case PREG_INTERNAL_ERROR:
249
- $error = 'Internal PCRE error on line';
250
- break;
251
- case PREG_BACKTRACK_LIMIT_ERROR:
252
- $error = 'pcre.backtrack_limit reached on line';
253
- break;
254
- case PREG_RECURSION_LIMIT_ERROR:
255
- $error = 'pcre.recursion_limit reached on line';
256
- break;
257
- case PREG_BAD_UTF8_ERROR:
258
- $error = 'Malformed UTF-8 data on line';
259
- break;
260
- case PREG_BAD_UTF8_OFFSET_ERROR:
261
- $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point on line';
262
- break;
263
- default:
264
- $error = 'Unable to parse line';
265
- }
266
-
267
- throw new InvalidArgumentException(sprintf('%s %d (%s).', $error, $this->getRealCurrentLineNb() + 1, $this->currentLine));
268
- }
269
-
270
- if ($isRef)
271
- {
272
- $this->refs[$isRef] = end($data);
273
- }
274
- }
275
-
276
- if (isset($mbEncoding))
277
- {
278
- mb_internal_encoding($mbEncoding);
279
- }
280
-
281
- return empty($data) ? null : $data;
282
- }
283
-
284
- /**
285
- * Returns the current line number (takes the offset into account).
286
- *
287
- * @return integer The current line number
288
- */
289
- protected function getRealCurrentLineNb()
290
- {
291
- return $this->currentLineNb + $this->offset;
292
- }
293
-
294
- /**
295
- * Returns the current line indentation.
296
- *
297
- * @return integer The current line indentation
298
- */
299
- protected function getCurrentLineIndentation()
300
- {
301
- return strlen($this->currentLine) - strlen(ltrim($this->currentLine, ' '));
302
- }
303
-
304
- /**
305
- * Returns the next embed block of YAML.
306
- *
307
- * @param integer $indentation The indent level at which the block is to be read, or null for default
308
- *
309
- * @return string A YAML string
310
- */
311
- protected function getNextEmbedBlock($indentation = null)
312
- {
313
- $this->moveToNextLine();
314
-
315
- if (null === $indentation)
316
- {
317
- $newIndent = $this->getCurrentLineIndentation();
318
-
319
- if (!$this->isCurrentLineEmpty() && 0 == $newIndent)
320
- {
321
- throw new InvalidArgumentException(sprintf('Indentation problem at line %d (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine));
322
- }
323
- }
324
- else
325
- {
326
- $newIndent = $indentation;
327
- }
328
-
329
- $data = array(substr($this->currentLine, $newIndent));
330
-
331
- while ($this->moveToNextLine())
332
- {
333
- if ($this->isCurrentLineEmpty())
334
- {
335
- if ($this->isCurrentLineBlank())
336
- {
337
- $data[] = substr($this->currentLine, $newIndent);
338
- }
339
-
340
- continue;
341
- }
342
-
343
- $indent = $this->getCurrentLineIndentation();
344
-
345
- if (preg_match('#^(?P<text> *)$#', $this->currentLine, $match))
346
- {
347
- // empty line
348
- $data[] = $match['text'];
349
- }
350
- else if ($indent >= $newIndent)
351
- {
352
- $data[] = substr($this->currentLine, $newIndent);
353
- }
354
- else if (0 == $indent)
355
- {
356
- $this->moveToPreviousLine();
357
-
358
- break;
359
- }
360
- else
361
- {
362
- throw new InvalidArgumentException(sprintf('Indentation problem at line %d (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine));
363
- }
364
- }
365
-
366
- return implode("\n", $data);
367
- }
368
-
369
- /**
370
- * Moves the parser to the next line.
371
- */
372
- protected function moveToNextLine()
373
- {
374
- if ($this->currentLineNb >= count($this->lines) - 1)
375
- {
376
- return false;
377
- }
378
-
379
- $this->currentLine = $this->lines[++$this->currentLineNb];
380
-
381
- return true;
382
- }
383
-
384
- /**
385
- * Moves the parser to the previous line.
386
- */
387
- protected function moveToPreviousLine()
388
- {
389
- $this->currentLine = $this->lines[--$this->currentLineNb];
390
- }
391
-
392
- /**
393
- * Parses a YAML value.
394
- *
395
- * @param string $value A YAML value
396
- *
397
- * @return mixed A PHP value
398
- */
399
- protected function parseValue($value)
400
- {
401
- if ('*' === substr($value, 0, 1))
402
- {
403
- if (false !== $pos = strpos($value, '#'))
404
- {
405
- $value = substr($value, 1, $pos - 2);
406
- }
407
- else
408
- {
409
- $value = substr($value, 1);
410
- }
411
-
412
- if (!array_key_exists($value, $this->refs))
413
- {
414
- throw new InvalidArgumentException(sprintf('Reference "%s" does not exist (%s).', $value, $this->currentLine));
415
- }
416
- return $this->refs[$value];
417
- }
418
-
419
- if (preg_match('/^(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?$/', $value, $matches))
420
- {
421
- $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : '';
422
-
423
- return $this->parseFoldedScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), intval(abs($modifiers)));
424
- }
425
- else
426
- {
427
- return sfYamlInline::load($value);
428
- }
429
- }
430
-
431
- /**
432
- * Parses a folded scalar.
433
- *
434
- * @param string $separator The separator that was used to begin this folded scalar (| or >)
435
- * @param string $indicator The indicator that was used to begin this folded scalar (+ or -)
436
- * @param integer $indentation The indentation that was used to begin this folded scalar
437
- *
438
- * @return string The text value
439
- */
440
- protected function parseFoldedScalar($separator, $indicator = '', $indentation = 0)
441
- {
442
- $separator = '|' == $separator ? "\n" : ' ';
443
- $text = '';
444
-
445
- $notEOF = $this->moveToNextLine();
446
-
447
- while ($notEOF && $this->isCurrentLineBlank())
448
- {
449
- $text .= "\n";
450
-
451
- $notEOF = $this->moveToNextLine();
452
- }
453
-
454
- if (!$notEOF)
455
- {
456
- return '';
457
- }
458
-
459
- if (!preg_match('#^(?P<indent>'.($indentation ? str_repeat(' ', $indentation) : ' +').')(?P<text>.*)$#', $this->currentLine, $matches))
460
- {
461
- $this->moveToPreviousLine();
462
-
463
- return '';
464
- }
465
-
466
- $textIndent = $matches['indent'];
467
- $previousIndent = 0;
468
-
469
- $text .= $matches['text'].$separator;
470
- while ($this->currentLineNb + 1 < count($this->lines))
471
- {
472
- $this->moveToNextLine();
473
-
474
- if (preg_match('#^(?P<indent> {'.strlen($textIndent).',})(?P<text>.+)$#', $this->currentLine, $matches))
475
- {
476
- if (' ' == $separator && $previousIndent != $matches['indent'])
477
- {
478
- $text = substr($text, 0, -1)."\n";
479
- }
480
- $previousIndent = $matches['indent'];
481
-
482
- $text .= str_repeat(' ', $diff = strlen($matches['indent']) - strlen($textIndent)).$matches['text'].($diff ? "\n" : $separator);
483
- }
484
- else if (preg_match('#^(?P<text> *)$#', $this->currentLine, $matches))
485
- {
486
- $text .= preg_replace('#^ {1,'.strlen($textIndent).'}#', '', $matches['text'])."\n";
487
- }
488
- else
489
- {
490
- $this->moveToPreviousLine();
491
-
492
- break;
493
- }
494
- }
495
-
496
- if (' ' == $separator)
497
- {
498
- // replace last separator by a newline
499
- $text = preg_replace('/ (\n*)$/', "\n$1", $text);
500
- }
501
-
502
- switch ($indicator)
503
- {
504
- case '':
505
- $text = preg_replace('#\n+$#s', "\n", $text);
506
- break;
507
- case '+':
508
- break;
509
- case '-':
510
- $text = preg_replace('#\n+$#s', '', $text);
511
- break;
512
- }
513
-
514
- return $text;
515
- }
516
-
517
- /**
518
- * Returns true if the next line is indented.
519
- *
520
- * @return Boolean Returns true if the next line is indented, false otherwise
521
- */
522
- protected function isNextLineIndented()
523
- {
524
- $currentIndentation = $this->getCurrentLineIndentation();
525
- $notEOF = $this->moveToNextLine();
526
-
527
- while ($notEOF && $this->isCurrentLineEmpty())
528
- {
529
- $notEOF = $this->moveToNextLine();
530
- }
531
-
532
- if (false === $notEOF)
533
- {
534
- return false;
535
- }
536
-
537
- $ret = false;
538
- if ($this->getCurrentLineIndentation() <= $currentIndentation)
539
- {
540
- $ret = true;
541
- }
542
-
543
- $this->moveToPreviousLine();
544
-
545
- return $ret;
546
- }
547
-
548
- /**
549
- * Returns true if the current line is blank or if it is a comment line.
550
- *
551
- * @return Boolean Returns true if the current line is empty or if it is a comment line, false otherwise
552
- */
553
- protected function isCurrentLineEmpty()
554
- {
555
- return $this->isCurrentLineBlank() || $this->isCurrentLineComment();
556
- }
557
-
558
- /**
559
- * Returns true if the current line is blank.
560
- *
561
- * @return Boolean Returns true if the current line is blank, false otherwise
562
- */
563
- protected function isCurrentLineBlank()
564
- {
565
- return '' == trim($this->currentLine, ' ');
566
- }
567
-
568
- /**
569
- * Returns true if the current line is a comment line.
570
- *
571
- * @return Boolean Returns true if the current line is a comment line, false otherwise
572
- */
573
- protected function isCurrentLineComment()
574
- {
575
- //checking explicitly the first char of the trim is faster than loops or strpos
576
- $ltrimmedLine = ltrim($this->currentLine, ' ');
577
- return $ltrimmedLine[0] === '#';
578
- }
579
-
580
- /**
581
- * Cleanups a YAML string to be parsed.
582
- *
583
- * @param string $value The input YAML string
584
- *
585
- * @return string A cleaned up YAML string
586
- */
587
- protected function cleanup($value)
588
- {
589
- $value = str_replace(array("\r\n", "\r"), "\n", $value);
590
-
591
- if (!preg_match("#\n$#", $value))
592
- {
593
- $value .= "\n";
594
- }
595
-
596
- // strip YAML header
597
- $count = 0;
598
- $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#s', '', $value, -1, $count);
599
- $this->offset += $count;
600
-
601
- // remove leading comments and/or ---
602
- $trimmedValue = preg_replace('#^((\#.*?\n)|(\-\-\-.*?\n))*#s', '', $value, -1, $count);
603
- if ($count == 1)
604
- {
605
- // items have been removed, update the offset
606
- $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
607
- $value = $trimmedValue;
608
- }
609
-
610
- return $value;
611
- }
612
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the symfony package.
5
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ require_once(dirname(__FILE__).'/sfYamlInline.php');
12
+
13
+ if (!defined('PREG_BAD_UTF8_OFFSET_ERROR'))
14
+ {
15
+ define('PREG_BAD_UTF8_OFFSET_ERROR', 5);
16
+ }
17
+
18
+ /**
19
+ * sfYamlParser parses YAML strings to convert them to PHP arrays.
20
+ *
21
+ * @package symfony
22
+ * @subpackage yaml
23
+ * @author Fabien Potencier <fabien.potencier@symfony-project.com>
24
+ * @version SVN: $Id: sfYamlParser.class.php 10832 2008-08-13 07:46:08Z fabien $
25
+ */
26
+ class sfYamlParser
27
+ {
28
+ protected
29
+ $offset = 0,
30
+ $lines = array(),
31
+ $currentLineNb = -1,
32
+ $currentLine = '',
33
+ $refs = array();
34
+
35
+ /**
36
+ * Constructor
37
+ *
38
+ * @param integer $offset The offset of YAML document (used for line numbers in error messages)
39
+ */
40
+ public function __construct($offset = 0)
41
+ {
42
+ $this->offset = $offset;
43
+ }
44
+
45
+ /**
46
+ * Parses a YAML string to a PHP value.
47
+ *
48
+ * @param string $value A YAML string
49
+ *
50
+ * @return mixed A PHP value
51
+ *
52
+ * @throws InvalidArgumentException If the YAML is not valid
53
+ */
54
+ public function parse($value)
55
+ {
56
+ $value = str_replace("\t", ' ', $value); // Convert tabs to spaces.
57
+
58
+ $this->currentLineNb = -1;
59
+ $this->currentLine = '';
60
+ $this->lines = explode("\n", $this->cleanup($value));
61
+
62
+ if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2)
63
+ {
64
+ $mbEncoding = mb_internal_encoding();
65
+ mb_internal_encoding('ASCII');
66
+ }
67
+
68
+ $data = array();
69
+ while ($this->moveToNextLine())
70
+ {
71
+ if ($this->isCurrentLineEmpty())
72
+ {
73
+ continue;
74
+ }
75
+
76
+ // tab?
77
+ if (preg_match('#^\t+#', $this->currentLine))
78
+ {
79
+ throw new InvalidArgumentException(sprintf('A YAML file cannot contain tabs as indentation at line %d (%s).', $this->getRealCurrentLineNb() + 1, $this->currentLine));
80
+ }
81
+
82
+ $isRef = $isInPlace = $isProcessed = false;
83
+ if (preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+?))?\s*$#', $this->currentLine, $values))
84
+ {
85
+ if (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#', $values['value'], $matches))
86
+ {
87
+ $isRef = $matches['ref'];
88
+ $values['value'] = $matches['value'];
89
+ }
90
+
91
+ // array
92
+ if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#'))
93
+ {
94
+ $c = $this->getRealCurrentLineNb() + 1;
95
+ $parser = new sfYamlParser($c);
96
+ $parser->refs =& $this->refs;
97
+ $data[] = $parser->parse($this->getNextEmbedBlock());
98
+ }
99
+ else
100
+ {
101
+ if (isset($values['leadspaces'])
102
+ && ' ' == $values['leadspaces']
103
+ && preg_match('#^(?P<key>'.sfYamlInline::REGEX_QUOTED_STRING.'|[^ \'"\{].*?) *\:(\s+(?P<value>.+?))?\s*$#', $values['value'], $matches))
104
+ {
105
+ // this is a compact notation element, add to next block and parse
106
+ $c = $this->getRealCurrentLineNb();
107
+ $parser = new sfYamlParser($c);
108
+ $parser->refs =& $this->refs;
109
+
110
+ $block = $values['value'];
111
+ if (!$this->isNextLineIndented())
112
+ {
113
+ $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + 2);
114
+ }
115
+
116
+ $data[] = $parser->parse($block);
117
+ }
118
+ else
119
+ {
120
+ $data[] = $this->parseValue($values['value']);
121
+ }
122
+ }
123
+ }
124
+ else if (preg_match('#^(?P<key>'.sfYamlInline::REGEX_QUOTED_STRING.'|[^ \'"].*?) *\:(\s+(?P<value>.+?))?\s*$#', $this->currentLine, $values))
125
+ {
126
+ $key = sfYamlInline::parseScalar($values['key']);
127
+
128
+ if ('<<' === $key)
129
+ {
130
+ if (isset($values['value']) && '*' === substr($values['value'], 0, 1))
131
+ {
132
+ $isInPlace = substr($values['value'], 1);
133
+ if (!array_key_exists($isInPlace, $this->refs))
134
+ {
135
+ throw new InvalidArgumentException(sprintf('Reference "%s" does not exist at line %s (%s).', $isInPlace, $this->getRealCurrentLineNb() + 1, $this->currentLine));
136
+ }
137
+ }
138
+ else
139
+ {
140
+ if (isset($values['value']) && $values['value'] !== '')
141
+ {
142
+ $value = $values['value'];
143
+ }
144
+ else
145
+ {
146
+ $value = $this->getNextEmbedBlock();
147
+ }
148
+ $c = $this->getRealCurrentLineNb() + 1;
149
+ $parser = new sfYamlParser($c);
150
+ $parser->refs =& $this->refs;
151
+ $parsed = $parser->parse($value);
152
+
153
+ $merged = array();
154
+ if (!is_array($parsed))
155
+ {
156
+ throw new InvalidArgumentException(sprintf("YAML merge keys used with a scalar value instead of an array at line %s (%s)", $this->getRealCurrentLineNb() + 1, $this->currentLine));
157
+ }
158
+ else if (isset($parsed[0]))
159
+ {
160
+ // Numeric array, merge individual elements
161
+ foreach (array_reverse($parsed) as $parsedItem)
162
+ {
163
+ if (!is_array($parsedItem))
164
+ {
165
+ throw new InvalidArgumentException(sprintf("Merge items must be arrays at line %s (%s).", $this->getRealCurrentLineNb() + 1, $parsedItem));
166
+ }
167
+ $merged = array_merge($parsedItem, $merged);
168
+ }
169
+ }
170
+ else
171
+ {
172
+ // Associative array, merge
173
+ $merged = array_merge($merge, $parsed);
174
+ }
175
+
176
+ $isProcessed = $merged;
177
+ }
178
+ }
179
+ else if (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#', $values['value'], $matches))
180
+ {
181
+ $isRef = $matches['ref'];
182
+ $values['value'] = $matches['value'];
183
+ }
184
+
185
+ if ($isProcessed)
186
+ {
187
+ // Merge keys
188
+ $data = $isProcessed;
189
+ }
190
+ // hash
191
+ else if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#'))
192
+ {
193
+ // if next line is less indented or equal, then it means that the current value is null
194
+ if ($this->isNextLineIndented())
195
+ {
196
+ $data[$key] = null;
197
+ }
198
+ else
199
+ {
200
+ $c = $this->getRealCurrentLineNb() + 1;
201
+ $parser = new sfYamlParser($c);
202
+ $parser->refs =& $this->refs;
203
+ $data[$key] = $parser->parse($this->getNextEmbedBlock());
204
+ }
205
+ }
206
+ else
207
+ {
208
+ if ($isInPlace)
209
+ {
210
+ $data = $this->refs[$isInPlace];
211
+ }
212
+ else
213
+ {
214
+ $data[$key] = $this->parseValue($values['value']);
215
+ }
216
+ }
217
+ }
218
+ else
219
+ {
220
+ // 1-liner followed by newline
221
+ if (2 == count($this->lines) && empty($this->lines[1]))
222
+ {
223
+ $value = sfYamlInline::load($this->lines[0]);
224
+ if (is_array($value))
225
+ {
226
+ $first = reset($value);
227
+ if ('*' === substr($first, 0, 1))
228
+ {
229
+ $data = array();
230
+ foreach ($value as $alias)
231
+ {
232
+ $data[] = $this->refs[substr($alias, 1)];
233
+ }
234
+ $value = $data;
235
+ }
236
+ }
237
+
238
+ if (isset($mbEncoding))
239
+ {
240
+ mb_internal_encoding($mbEncoding);
241
+ }
242
+
243
+ return $value;
244
+ }
245
+
246
+ switch (preg_last_error())
247
+ {
248
+ case PREG_INTERNAL_ERROR:
249
+ $error = 'Internal PCRE error on line';
250
+ break;
251
+ case PREG_BACKTRACK_LIMIT_ERROR:
252
+ $error = 'pcre.backtrack_limit reached on line';
253
+ break;
254
+ case PREG_RECURSION_LIMIT_ERROR:
255
+ $error = 'pcre.recursion_limit reached on line';
256
+ break;
257
+ case PREG_BAD_UTF8_ERROR:
258
+ $error = 'Malformed UTF-8 data on line';
259
+ break;
260
+ case PREG_BAD_UTF8_OFFSET_ERROR:
261
+ $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point on line';
262
+ break;
263
+ default:
264
+ $error = 'Unable to parse line';
265
+ }
266
+
267
+ throw new InvalidArgumentException(sprintf('%s %d (%s).', $error, $this->getRealCurrentLineNb() + 1, $this->currentLine));
268
+ }
269
+
270
+ if ($isRef)
271
+ {
272
+ $this->refs[$isRef] = end($data);
273
+ }
274
+ }
275
+
276
+ if (isset($mbEncoding))
277
+ {
278
+ mb_internal_encoding($mbEncoding);
279
+ }
280
+
281
+ return empty($data) ? null : $data;
282
+ }
283
+
284
+ /**
285
+ * Returns the current line number (takes the offset into account).
286
+ *
287
+ * @return integer The current line number
288
+ */
289
+ protected function getRealCurrentLineNb()
290
+ {
291
+ return $this->currentLineNb + $this->offset;
292
+ }
293
+
294
+ /**
295
+ * Returns the current line indentation.
296
+ *
297
+ * @return integer The current line indentation
298
+ */
299
+ protected function getCurrentLineIndentation()
300
+ {
301
+ return strlen($this->currentLine) - strlen(ltrim($this->currentLine, ' '));
302
+ }
303
+
304
+ /**
305
+ * Returns the next embed block of YAML.
306
+ *
307
+ * @param integer $indentation The indent level at which the block is to be read, or null for default
308
+ *
309
+ * @return string A YAML string
310
+ */
311
+ protected function getNextEmbedBlock($indentation = null)
312
+ {
313
+ $this->moveToNextLine();
314
+
315
+ if (null === $indentation)
316
+ {
317
+ $newIndent = $this->getCurrentLineIndentation();
318
+
319
+ if (!$this->isCurrentLineEmpty() && 0 == $newIndent)
320
+ {
321
+ throw new InvalidArgumentException(sprintf('Indentation problem at line %d (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine));
322
+ }
323
+ }
324
+ else
325
+ {
326
+ $newIndent = $indentation;
327
+ }
328
+
329
+ $data = array(substr($this->currentLine, $newIndent));
330
+
331
+ while ($this->moveToNextLine())
332
+ {
333
+ if ($this->isCurrentLineEmpty())
334
+ {
335
+ if ($this->isCurrentLineBlank())
336
+ {
337
+ $data[] = substr($this->currentLine, $newIndent);
338
+ }
339
+
340
+ continue;
341
+ }
342
+
343
+ $indent = $this->getCurrentLineIndentation();
344
+
345
+ if (preg_match('#^(?P<text> *)$#', $this->currentLine, $match))
346
+ {
347
+ // empty line
348
+ $data[] = $match['text'];
349
+ }
350
+ else if ($indent >= $newIndent)
351
+ {
352
+ $data[] = substr($this->currentLine, $newIndent);
353
+ }
354
+ else if (0 == $indent)
355
+ {
356
+ $this->moveToPreviousLine();
357
+
358
+ break;
359
+ }
360
+ else
361
+ {
362
+ throw new InvalidArgumentException(sprintf('Indentation problem at line %d (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine));
363
+ }
364
+ }
365
+
366
+ return implode("\n", $data);
367
+ }
368
+
369
+ /**
370
+ * Moves the parser to the next line.
371
+ */
372
+ protected function moveToNextLine()
373
+ {
374
+ if ($this->currentLineNb >= count($this->lines) - 1)
375
+ {
376
+ return false;
377
+ }
378
+
379
+ $this->currentLine = $this->lines[++$this->currentLineNb];
380
+
381
+ return true;
382
+ }
383
+
384
+ /**
385
+ * Moves the parser to the previous line.
386
+ */
387
+ protected function moveToPreviousLine()
388
+ {
389
+ $this->currentLine = $this->lines[--$this->currentLineNb];
390
+ }
391
+
392
+ /**
393
+ * Parses a YAML value.
394
+ *
395
+ * @param string $value A YAML value
396
+ *
397
+ * @return mixed A PHP value
398
+ */
399
+ protected function parseValue($value)
400
+ {
401
+ if ('*' === substr($value, 0, 1))
402
+ {
403
+ if (false !== $pos = strpos($value, '#'))
404
+ {
405
+ $value = substr($value, 1, $pos - 2);
406
+ }
407
+ else
408
+ {
409
+ $value = substr($value, 1);
410
+ }
411
+
412
+ if (!array_key_exists($value, $this->refs))
413
+ {
414
+ throw new InvalidArgumentException(sprintf('Reference "%s" does not exist (%s).', $value, $this->currentLine));
415
+ }
416
+ return $this->refs[$value];
417
+ }
418
+
419
+ if (preg_match('/^(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?$/', $value, $matches))
420
+ {
421
+ $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : '';
422
+
423
+ return $this->parseFoldedScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), intval(abs($modifiers)));
424
+ }
425
+ else
426
+ {
427
+ return sfYamlInline::load($value);
428
+ }
429
+ }
430
+
431
+ /**
432
+ * Parses a folded scalar.
433
+ *
434
+ * @param string $separator The separator that was used to begin this folded scalar (| or >)
435
+ * @param string $indicator The indicator that was used to begin this folded scalar (+ or -)
436
+ * @param integer $indentation The indentation that was used to begin this folded scalar
437
+ *
438
+ * @return string The text value
439
+ */
440
+ protected function parseFoldedScalar($separator, $indicator = '', $indentation = 0)
441
+ {
442
+ $separator = '|' == $separator ? "\n" : ' ';
443
+ $text = '';
444
+
445
+ $notEOF = $this->moveToNextLine();
446
+
447
+ while ($notEOF && $this->isCurrentLineBlank())
448
+ {
449
+ $text .= "\n";
450
+
451
+ $notEOF = $this->moveToNextLine();
452
+ }
453
+
454
+ if (!$notEOF)
455
+ {
456
+ return '';
457
+ }
458
+
459
+ if (!preg_match('#^(?P<indent>'.($indentation ? str_repeat(' ', $indentation) : ' +').')(?P<text>.*)$#', $this->currentLine, $matches))
460
+ {
461
+ $this->moveToPreviousLine();
462
+
463
+ return '';
464
+ }
465
+
466
+ $textIndent = $matches['indent'];
467
+ $previousIndent = 0;
468
+
469
+ $text .= $matches['text'].$separator;
470
+ while ($this->currentLineNb + 1 < count($this->lines))
471
+ {
472
+ $this->moveToNextLine();
473
+
474
+ if (preg_match('#^(?P<indent> {'.strlen($textIndent).',})(?P<text>.+)$#', $this->currentLine, $matches))
475
+ {
476
+ if (' ' == $separator && $previousIndent != $matches['indent'])
477
+ {
478
+ $text = substr($text, 0, -1)."\n";
479
+ }
480
+ $previousIndent = $matches['indent'];
481
+
482
+ $text .= str_repeat(' ', $diff = strlen($matches['indent']) - strlen($textIndent)).$matches['text'].($diff ? "\n" : $separator);
483
+ }
484
+ else if (preg_match('#^(?P<text> *)$#', $this->currentLine, $matches))
485
+ {
486
+ $text .= preg_replace('#^ {1,'.strlen($textIndent).'}#', '', $matches['text'])."\n";
487
+ }
488
+ else
489
+ {
490
+ $this->moveToPreviousLine();
491
+
492
+ break;
493
+ }
494
+ }
495
+
496
+ if (' ' == $separator)
497
+ {
498
+ // replace last separator by a newline
499
+ $text = preg_replace('/ (\n*)$/', "\n$1", $text);
500
+ }
501
+
502
+ switch ($indicator)
503
+ {
504
+ case '':
505
+ $text = preg_replace('#\n+$#s', "\n", $text);
506
+ break;
507
+ case '+':
508
+ break;
509
+ case '-':
510
+ $text = preg_replace('#\n+$#s', '', $text);
511
+ break;
512
+ }
513
+
514
+ return $text;
515
+ }
516
+
517
+ /**
518
+ * Returns true if the next line is indented.
519
+ *
520
+ * @return Boolean Returns true if the next line is indented, false otherwise
521
+ */
522
+ protected function isNextLineIndented()
523
+ {
524
+ $currentIndentation = $this->getCurrentLineIndentation();
525
+ $notEOF = $this->moveToNextLine();
526
+
527
+ while ($notEOF && $this->isCurrentLineEmpty())
528
+ {
529
+ $notEOF = $this->moveToNextLine();
530
+ }
531
+
532
+ if (false === $notEOF)
533
+ {
534
+ return false;
535
+ }
536
+
537
+ $ret = false;
538
+ if ($this->getCurrentLineIndentation() <= $currentIndentation)
539
+ {
540
+ $ret = true;
541
+ }
542
+
543
+ $this->moveToPreviousLine();
544
+
545
+ return $ret;
546
+ }
547
+
548
+ /**
549
+ * Returns true if the current line is blank or if it is a comment line.
550
+ *
551
+ * @return Boolean Returns true if the current line is empty or if it is a comment line, false otherwise
552
+ */
553
+ protected function isCurrentLineEmpty()
554
+ {
555
+ return $this->isCurrentLineBlank() || $this->isCurrentLineComment();
556
+ }
557
+
558
+ /**
559
+ * Returns true if the current line is blank.
560
+ *
561
+ * @return Boolean Returns true if the current line is blank, false otherwise
562
+ */
563
+ protected function isCurrentLineBlank()
564
+ {
565
+ return '' == trim($this->currentLine, ' ');
566
+ }
567
+
568
+ /**
569
+ * Returns true if the current line is a comment line.
570
+ *
571
+ * @return Boolean Returns true if the current line is a comment line, false otherwise
572
+ */
573
+ protected function isCurrentLineComment()
574
+ {
575
+ //checking explicitly the first char of the trim is faster than loops or strpos
576
+ $ltrimmedLine = ltrim($this->currentLine, ' ');
577
+ return $ltrimmedLine[0] === '#';
578
+ }
579
+
580
+ /**
581
+ * Cleanups a YAML string to be parsed.
582
+ *
583
+ * @param string $value The input YAML string
584
+ *
585
+ * @return string A cleaned up YAML string
586
+ */
587
+ protected function cleanup($value)
588
+ {
589
+ $value = str_replace(array("\r\n", "\r"), "\n", $value);
590
+
591
+ if (!preg_match("#\n$#", $value))
592
+ {
593
+ $value .= "\n";
594
+ }
595
+
596
+ // strip YAML header
597
+ $count = 0;
598
+ $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#s', '', $value, -1, $count);
599
+ $this->offset += $count;
600
+
601
+ // remove leading comments and/or ---
602
+ $trimmedValue = preg_replace('#^((\#.*?\n)|(\-\-\-.*?\n))*#s', '', $value, -1, $count);
603
+ if ($count == 1)
604
+ {
605
+ // items have been removed, update the offset
606
+ $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
607
+ $value = $trimmedValue;
608
+ }
609
+
610
+ return $value;
611
+ }
612
+ }
app/libs/aws/sdk.class.php CHANGED
@@ -1,1417 +1,1472 @@
1
- <?php
2
- /*
3
- * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
-
18
- /*%******************************************************************************************%*/
19
- // CORE DEPENDENCIES
20
-
21
- // Look for include file in the same directory (e.g. `./config.inc.php`).
22
- if (file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config.inc.php'))
23
- {
24
- include_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config.inc.php';
25
- }
26
- // Fallback to `~/.aws/sdk/config.inc.php`
27
- elseif (getenv('HOME') && file_exists(getenv('HOME') . DIRECTORY_SEPARATOR . '.aws' . DIRECTORY_SEPARATOR . 'sdk' . DIRECTORY_SEPARATOR . 'config.inc.php'))
28
- {
29
- include_once getenv('HOME') . DIRECTORY_SEPARATOR . '.aws' . DIRECTORY_SEPARATOR . 'sdk' . DIRECTORY_SEPARATOR . 'config.inc.php';
30
- }
31
-
32
-
33
- /*%******************************************************************************************%*/
34
- // EXCEPTIONS
35
-
36
- /**
37
- * Default CFRuntime Exception.
38
- */
39
- class CFRuntime_Exception extends Exception {}
40
-
41
-
42
- /*%******************************************************************************************%*/
43
- // DETERMINE WHAT ENVIRONMENT DATA TO ADD TO THE USERAGENT FOR METRIC TRACKING
44
-
45
- /*
46
- Define a temporary callback function for this calculation. Get the PHP version and any
47
- required/optional extensions that are leveraged.
48
-
49
- Tracking this data gives Amazon better metrics about what configurations are being used
50
- so that forward-looking plans for the code can be made with more certainty (e.g. What
51
- version of PHP are most people running? Do they tend to have the latest PCRE?).
52
- */
53
- function __aws_sdk_ua_callback()
54
- {
55
- $ua_append = '';
56
- $extensions = get_loaded_extensions();
57
- $sorted_extensions = array();
58
-
59
- if ($extensions)
60
- {
61
- foreach ($extensions as $extension)
62
- {
63
- if ($extension === 'curl' && function_exists('curl_version'))
64
- {
65
- $curl_version = curl_version();
66
- $sorted_extensions[strtolower($extension)] = $curl_version['version'];
67
- }
68
- elseif ($extension === 'pcre' && defined('PCRE_VERSION'))
69
- {
70
- $pcre_version = explode(' ', PCRE_VERSION);
71
- $sorted_extensions[strtolower($extension)] = $pcre_version[0];
72
- }
73
- elseif ($extension === 'openssl' && defined('OPENSSL_VERSION_TEXT'))
74
- {
75
- $openssl_version = explode(' ', OPENSSL_VERSION_TEXT);
76
- $sorted_extensions[strtolower($extension)] = $openssl_version[1];
77
- }
78
- else
79
- {
80
- $sorted_extensions[strtolower($extension)] = phpversion($extension);
81
- }
82
- }
83
- }
84
-
85
- foreach (array('simplexml', 'json', 'pcre', 'spl', 'curl', 'openssl', 'apc', 'xcache', 'memcache', 'memcached', 'pdo', 'pdo_sqlite', 'sqlite', 'sqlite3', 'zlib', 'xdebug') as $ua_ext)
86
- {
87
- if (isset($sorted_extensions[$ua_ext]) && $sorted_extensions[$ua_ext])
88
- {
89
- $ua_append .= ' ' . $ua_ext . '/' . $sorted_extensions[$ua_ext];
90
- }
91
- elseif (isset($sorted_extensions[$ua_ext]))
92
- {
93
- $ua_append .= ' ' . $ua_ext . '/0';
94
- }
95
- }
96
-
97
- return $ua_append;
98
- }
99
-
100
-
101
- /*%******************************************************************************************%*/
102
- // INTERMEDIARY CONSTANTS
103
-
104
- define('CFRUNTIME_NAME', 'aws-sdk-php');
105
- define('CFRUNTIME_VERSION', '1.3.1');
106
- // define('CFRUNTIME_BUILD', gmdate('YmdHis', filemtime(__FILE__))); // @todo: Hardcode for release.
107
- define('CFRUNTIME_BUILD', '20110325210828');
108
- define('CFRUNTIME_USERAGENT', CFRUNTIME_NAME . '/' . CFRUNTIME_VERSION . ' PHP/' . PHP_VERSION . ' ' . php_uname('s') . '/' . php_uname('r') . ' Arch/' . php_uname('m') . ' SAPI/' . php_sapi_name() . ' Integer/' . PHP_INT_MAX . ' Build/' . CFRUNTIME_BUILD . __aws_sdk_ua_callback());
109
-
110
-
111
- /*%******************************************************************************************%*/
112
- // CLASS
113
-
114
- /**
115
- * Core functionality and default settings shared across all SDK classes. All methods and properties in this
116
- * class are inherited by the service-specific classes.
117
- *
118
- * @version 2011.03.25
119
- * @license See the included NOTICE.md file for more information.
120
- * @copyright See the included NOTICE.md file for more information.
121
- * @link http://aws.amazon.com/php/ PHP Developer Center
122
- */
123
- class CFRuntime
124
- {
125
- /*%******************************************************************************************%*/
126
- // CONSTANTS
127
-
128
- /**
129
- * Name of the software.
130
- */
131
- const NAME = CFRUNTIME_NAME;
132
-
133
- /**
134
- * Version of the software.
135
- */
136
- const VERSION = CFRUNTIME_VERSION;
137
-
138
- /**
139
- * Build ID of the software.
140
- */
141
- const BUILD = CFRUNTIME_BUILD;
142
-
143
- /**
144
- * User agent string used to identify the software.
145
- */
146
- const USERAGENT = CFRUNTIME_USERAGENT;
147
-
148
-
149
- /*%******************************************************************************************%*/
150
- // PROPERTIES
151
-
152
- /**
153
- * The Amazon API Key.
154
- */
155
- public $key;
156
-
157
- /**
158
- * The Amazon API Secret Key.
159
- */
160
- public $secret_key;
161
-
162
- /**
163
- * The Amazon Authentication Token.
164
- */
165
- public $auth_token;
166
-
167
- /**
168
- * The Amazon Account ID, without hyphens.
169
- */
170
- public $account_id;
171
-
172
- /**
173
- * The Amazon Associates ID.
174
- */
175
- public $assoc_id;
176
-
177
- /**
178
- * Handle for the utility functions.
179
- */
180
- public $util;
181
-
182
- /**
183
- * An identifier for the current AWS service.
184
- */
185
- public $service = null;
186
-
187
- /**
188
- * The supported API version.
189
- */
190
- public $api_version = null;
191
-
192
- /**
193
- * The state of whether auth should be handled as AWS Query.
194
- */
195
- public $use_aws_query = true;
196
-
197
- /**
198
- * The default class to use for utilities (defaults to <CFUtilities>).
199
- */
200
- public $utilities_class = 'CFUtilities';
201
-
202
- /**
203
- * The default class to use for HTTP requests (defaults to <CFRequest>).
204
- */
205
- public $request_class = 'CFRequest';
206
-
207
- /**
208
- * The default class to use for HTTP responses (defaults to <CFResponse>).
209
- */
210
- public $response_class = 'CFResponse';
211
-
212
- /**
213
- * The default class to use for parsing XML (defaults to <CFSimpleXML>).
214
- */
215
- public $parser_class = 'CFSimpleXML';
216
-
217
- /**
218
- * The default class to use for handling batch requests (defaults to <CFBatchRequest>).
219
- */
220
- public $batch_class = 'CFBatchRequest';
221
-
222
- /**
223
- * The number of seconds to adjust the request timestamp by (defaults to 0).
224
- */
225
- public $adjust_offset = 0;
226
-
227
- /**
228
- * The state of SSL/HTTPS use.
229
- */
230
- public $use_ssl = true;
231
-
232
- /**
233
- * The proxy to use for connecting.
234
- */
235
- public $proxy = null;
236
-
237
- /**
238
- * The alternate hostname to use, if any.
239
- */
240
- public $hostname = null;
241
-
242
- /**
243
- * The state of the capability to override the hostname with <set_hostname()>.
244
- */
245
- public $override_hostname = true;
246
-
247
- /**
248
- * The alternate port number to use, if any.
249
- */
250
- public $port_number = null;
251
-
252
- /**
253
- * The alternate resource prefix to use, if any.
254
- */
255
- public $resource_prefix = null;
256
-
257
- /**
258
- * The state of cache flow usage.
259
- */
260
- public $use_cache_flow = false;
261
-
262
- /**
263
- * The caching class to use.
264
- */
265
- public $cache_class = null;
266
-
267
- /**
268
- * The caching location to use.
269
- */
270
- public $cache_location = null;
271
-
272
- /**
273
- * When the cache should be considered stale.
274
- */
275
- public $cache_expires = null;
276
-
277
- /**
278
- * The state of cache compression.
279
- */
280
- public $cache_compress = null;
281
-
282
- /**
283
- * The current instantiated cache object.
284
- */
285
- public $cache_object = null;
286
-
287
- /**
288
- * The current instantiated batch request object.
289
- */
290
- public $batch_object = null;
291
-
292
- /**
293
- * The internally instantiated batch request object.
294
- */
295
- public $internal_batch_object = null;
296
-
297
- /**
298
- * The state of batch flow usage.
299
- */
300
- public $use_batch_flow = false;
301
-
302
- /**
303
- * The state of the cache deletion setting.
304
- */
305
- public $delete_cache = false;
306
-
307
- /**
308
- * The state of the debug mode setting.
309
- */
310
- public $debug_mode = false;
311
-
312
- /**
313
- * The number of times to retry failed requests.
314
- */
315
- public $max_retries = 3;
316
-
317
- /**
318
- * The user-defined callback function to call when a stream is read from.
319
- */
320
- public $registered_streaming_read_callback = null;
321
-
322
- /**
323
- * The user-defined callback function to call when a stream is written to.
324
- */
325
- public $registered_streaming_write_callback = null;
326
-
327
-
328
- /*%******************************************************************************************%*/
329
- // CONSTRUCTOR
330
-
331
- /**
332
- * The constructor. You would not normally instantiate this class directly. Rather, you would instantiate
333
- * a service-specific class.
334
- *
335
- * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <AWS_KEY> constant.
336
- * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <AWS_SECRET_KEY> constant.
337
- * @param string $account_id (Optional) Your Amazon account ID without the hyphens. Required for EC2. If blank, it will look for the <AWS_ACCOUNT_ID> constant.
338
- * @param string $assoc_id (Optional) Your Amazon Associates ID. Required for PAS. If blank, it will look for the <AWS_ASSOC_ID> constant.
339
- * @return boolean A value of `false` if no valid values are set, otherwise `true`.
340
- */
341
- public function __construct($key = null, $secret_key = null, $account_id = null, $assoc_id = null)
342
- {
343
- // Instantiate the utilities class.
344
- $this->util = new $this->utilities_class();
345
-
346
- // Determine the current service.
347
- $this->service = get_class($this);
348
-
349
- // Set default values
350
- $this->key = null;
351
- $this->secret_key = null;
352
- $this->account_id = null;
353
- $this->assoc_id = null;
354
-
355
- // Set the Account ID
356
- if ($account_id)
357
- {
358
- $this->account_id = $account_id;
359
- }
360
- elseif (defined('AWS_ACCOUNT_ID'))
361
- {
362
- $this->account_id = AWS_ACCOUNT_ID;
363
- }
364
-
365
- // Set the Associates ID
366
- if ($assoc_id)
367
- {
368
- $this->assoc_id = $assoc_id;
369
- }
370
- elseif (defined('AWS_ASSOC_ID'))
371
- {
372
- $this->assoc_id = AWS_ASSOC_ID;
373
- }
374
-
375
- // If both a key and secret key are passed in, use those.
376
- if ($key && $secret_key)
377
- {
378
- $this->key = $key;
379
- $this->secret_key = $secret_key;
380
- return true;
381
- }
382
- // If neither are passed in, look for the constants instead.
383
- elseif (defined('AWS_KEY') && defined('AWS_SECRET_KEY'))
384
- {
385
- $this->key = AWS_KEY;
386
- $this->secret_key = AWS_SECRET_KEY;
387
- return true;
388
- }
389
-
390
- // Otherwise set the values to blank and return false.
391
- else
392
- {
393
- throw new CFRuntime_Exception('No valid credentials were used to authenticate with AWS.');
394
- }
395
- }
396
-
397
- /**
398
- * Alternate approach to constructing a new instance. Supports chaining.
399
- *
400
- * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <AWS_KEY> constant.
401
- * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <AWS_SECRET_KEY> constant.
402
- * @param string $account_id (Optional) Your Amazon account ID without the hyphens. Required for EC2. If blank, it will look for the <AWS_ACCOUNT_ID> constant.
403
- * @param string $assoc_id (Optional) Your Amazon Associates ID. Required for AAWS. If blank, it will look for the <AWS_ASSOC_ID> constant.
404
- * @return boolean A value of `false` if no valid values are set, otherwise `true`.
405
- */
406
- public static function init($key = null, $secret_key = null, $account_id = null, $assoc_id = null)
407
- {
408
- if (version_compare(PHP_VERSION, '5.3.0', '<'))
409
- {
410
- throw new Exception('PHP 5.3 or newer is required to instantiate a new class with CLASS::init().');
411
- }
412
-
413
- $self = get_called_class();
414
- return new $self($key, $secret_key, $account_id, $assoc_id);
415
- }
416
-
417
-
418
- /*%******************************************************************************************%*/
419
- // MAGIC METHODS
420
-
421
- /**
422
- * A magic method that allows `camelCase` method names to be translated into `snake_case` names.
423
- *
424
- * @param string $name (Required) The name of the method.
425
- * @param array $arguments (Required) The arguments passed to the method.
426
- * @return mixed The results of the intended method.
427
- */
428
- public function __call($name, $arguments)
429
- {
430
- // Convert camelCase method calls to snake_case.
431
- $method_name = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $name));
432
-
433
- if (method_exists($this, $method_name))
434
- {
435
- return call_user_func_array(array($this, $method_name), $arguments);
436
- }
437
-
438
- throw new CFRuntime_Exception('The method ' . $name . '() is undefined. Attempted to map to ' . $method_name . '() which is also undefined. Error occurred');
439
- }
440
-
441
-
442
- /*%******************************************************************************************%*/
443
- // SET CUSTOM SETTINGS
444
-
445
- /**
446
- * Adjusts the current time. Use this method for occasions when a server is out of sync with Amazon
447
- * servers.
448
- *
449
- * @param integer $seconds (Required) The number of seconds to adjust the sent timestamp by.
450
- * @return $this A reference to the current instance.
451
- */
452
- public function adjust_offset($seconds)
453
- {
454
- $this->adjust_offset = $seconds;
455
- return $this;
456
- }
457
-
458
- /**
459
- * Set the proxy settings to use.
460
- *
461
- * @param string $proxy (Required) Accepts proxy credentials in the following format: `proxy://user:pass@hostname:port`
462
- * @return $this A reference to the current instance.
463
- */
464
- public function set_proxy($proxy)
465
- {
466
- $this->proxy = $proxy;
467
- return $this;
468
- }
469
-
470
- /**
471
- * Set the hostname to connect to. This is useful for alternate services that are API-compatible with
472
- * AWS, but run from a different hostname.
473
- *
474
- * @param string $hostname (Required) The alternate hostname to use in place of the default one. Useful for mock or test applications living on different hostnames.
475
- * @param integer $port_number (Optional) The alternate port number to use in place of the default one. Useful for mock or test applications living on different port numbers.
476
- * @return $this A reference to the current instance.
477
- */
478
- public function set_hostname($hostname, $port_number = null)
479
- {
480
- if ($this->override_hostname)
481
- {
482
- $this->hostname = $hostname;
483
-
484
- if ($port_number)
485
- {
486
- $this->port_number = $port_number;
487
- $this->hostname .= ':' . (string) $this->port_number;
488
- }
489
- }
490
-
491
- return $this;
492
- }
493
-
494
- /**
495
- * Set the resource prefix to use. This method is useful for alternate services that are API-compatible
496
- * with AWS.
497
- *
498
- * @param string $prefix (Required) An alternate prefix to prepend to the resource path. Useful for mock or test applications.
499
- * @return $this A reference to the current instance.
500
- */
501
- public function set_resource_prefix($prefix)
502
- {
503
- $this->resource_prefix = $prefix;
504
- return $this;
505
- }
506
-
507
- /**
508
- * Disables any subsequent use of the <set_hostname()> method.
509
- *
510
- * @param boolean $override (Optional) Whether or not subsequent calls to <set_hostname()> should be obeyed. A `false` value disables the further effectiveness of <set_hostname()>. Defaults to `true`.
511
- * @return $this A reference to the current instance.
512
- */
513
- public function allow_hostname_override($override = true)
514
- {
515
- $this->override_hostname = $override;
516
- return $this;
517
- }
518
-
519
- /**
520
- * Disables SSL/HTTPS connections for hosts that don't support them. Some services, however, still
521
- * require SSL support.
522
- *
523
- * @return $this A reference to the current instance.
524
- */
525
- public function disable_ssl()
526
- {
527
- $this->use_ssl = false;
528
- return $this;
529
- }
530
-
531
- /**
532
- * Enables HTTP request/response header logging to `STDERR`.
533
- *
534
- * @param boolean $enabled (Optional) Whether or not to enable debug mode. Defaults to `true`.
535
- * @return $this A reference to the current instance.
536
- */
537
- public function enable_debug_mode($enabled = true)
538
- {
539
- $this->debug_mode = $enabled;
540
- return $this;
541
- }
542
-
543
- /**
544
- * Sets the maximum number of times to retry failed requests.
545
- *
546
- * @param integer $retries (Optional) The maximum number of times to retry failed requests. Defaults to `3`.
547
- * @return $this A reference to the current instance.
548
- */
549
- public function set_max_retries($retries = 3)
550
- {
551
- $this->max_retries = $retries;
552
- return $this;
553
- }
554
-
555
- /**
556
- * Set the caching configuration to use for response caching.
557
- *
558
- * @param string $location (Required) <p>The location to store the cache object in. This may vary by cache method.</p><ul><li>File - The local file system paths such as <code>./cache</code> (relative) or <code>/tmp/cache/</code> (absolute). The location must be server-writable.</li><li>APC - Pass in <code>apc</code> to use this lightweight cache. You must have the <a href="http://php.net/apc">APC extension</a> installed.</li><li>XCache - Pass in <code>xcache</code> to use this lightweight cache. You must have the <a href="http://xcache.lighttpd.net">XCache</a> extension installed.</li><li>Memcached - Pass in an indexed array of associative arrays. Each associative array should have a <code>host</code> and a <code>port</code> value representing a <a href="http://php.net/memcached">Memcached</a> server to connect to.</li><li>PDO - A URL-style string (e.g. <code>pdo.mysql://user:pass@localhost/cache</code>) or a standard DSN-style string (e.g. <code>pdo.sqlite:/sqlite/cache.db</code>). MUST be prefixed with <code>pdo.</code>. See <code>CachePDO</code> and <a href="http://php.net/pdo">PDO</a> for more details.</li></ul>
559
- * @param boolean $gzip (Optional) Whether or not data should be gzipped before being stored. A value of `true` will compress the contents before caching them. A value of `false` will leave the contents uncompressed. Defaults to `true`.
560
- * @return $this A reference to the current instance.
561
- */
562
- public function set_cache_config($location, $gzip = true)
563
- {
564
- // If we have an array, we're probably passing in Memcached servers and ports.
565
- if (is_array($location))
566
- {
567
- $this->cache_class = 'CacheMC';
568
- }
569
- else
570
- {
571
- // I would expect locations like `/tmp/cache`, `pdo.mysql://user:pass@hostname:port`, `pdo.sqlite:memory:`, and `apc`.
572
- $type = strtolower(substr($location, 0, 3));
573
- switch ($type)
574
- {
575
- case 'apc':
576
- $this->cache_class = 'CacheAPC';
577
- break;
578
-
579
- case 'xca': // First three letters of `xcache`
580
- $this->cache_class = 'CacheXCache';
581
- break;
582
-
583
- case 'pdo':
584
- $this->cache_class = 'CachePDO';
585
- $location = substr($location, 4);
586
- break;
587
-
588
- default:
589
- $this->cache_class = 'CacheFile';
590
- break;
591
- }
592
- }
593
-
594
- // Set the remaining cache information.
595
- $this->cache_location = $location;
596
- $this->cache_compress = $gzip;
597
-
598
- return $this;
599
- }
600
-
601
- /**
602
- * Register a callback function to execute whenever a data stream is read from using
603
- * <CFRequest::streaming_read_callback()>.
604
- *
605
- * The user-defined callback function should accept three arguments:
606
- *
607
- * <ul>
608
- * <li><code>$curl_handle</code> - <code>resource</code> - Required - The cURL handle resource that represents the in-progress transfer.</li>
609
- * <li><code>$file_handle</code> - <code>resource</code> - Required - The file handle resource that represents the file on the local file system.</li>
610
- * <li><code>$length</code> - <code>integer</code> - Required - The length in kilobytes of the data chunk that was transferred.</li>
611
- * </ul>
612
- *
613
- * @param string|array|function $callback (Required) The callback function is called by <php:call_user_func()>, so you can pass the following values: <ul>
614
- * <li>The name of a global function to execute, passed as a string.</li>
615
- * <li>A method to execute, passed as <code>array('ClassName', 'MethodName')</code>.</li>
616
- * <li>An anonymous function (PHP 5.3+).</li></ul>
617
- * @return $this A reference to the current instance.
618
- */
619
- public function register_streaming_read_callback($callback)
620
- {
621
- $this->registered_streaming_read_callback = $callback;
622
- return $this;
623
- }
624
-
625
- /**
626
- * Register a callback function to execute whenever a data stream is written to using
627
- * <CFRequest::streaming_write_callback()>.
628
- *
629
- * The user-defined callback function should accept two arguments:
630
- *
631
- * <ul>
632
- * <li><code>$curl_handle</code> - <code>resource</code> - Required - The cURL handle resource that represents the in-progress transfer.</li>
633
- * <li><code>$length</code> - <code>integer</code> - Required - The length in kilobytes of the data chunk that was transferred.</li>
634
- * </ul>
635
- *
636
- * @param string|array|function $callback (Required) The callback function is called by <php:call_user_func()>, so you can pass the following values: <ul>
637
- * <li>The name of a global function to execute, passed as a string.</li>
638
- * <li>A method to execute, passed as <code>array('ClassName', 'MethodName')</code>.</li>
639
- * <li>An anonymous function (PHP 5.3+).</li></ul>
640
- * @return $this A reference to the current instance.
641
- */
642
- public function register_streaming_write_callback($callback)
643
- {
644
- $this->registered_streaming_write_callback = $callback;
645
- return $this;
646
- }
647
-
648
-
649
- /*%******************************************************************************************%*/
650
- // SET CUSTOM CLASSES
651
-
652
- /**
653
- * Set a custom class for this functionality. Use this method when extending/overriding existing classes
654
- * with new functionality.
655
- *
656
- * The replacement class must extend from <CFUtilities>.
657
- *
658
- * @param string $class (Optional) The name of the new class to use for this functionality.
659
- * @return $this A reference to the current instance.
660
- */
661
- public function set_utilities_class($class = 'CFUtilities')
662
- {
663
- $this->utilities_class = $class;
664
- $this->util = new $this->utilities_class();
665
- return $this;
666
- }
667
-
668
- /**
669
- * Set a custom class for this functionality. Use this method when extending/overriding existing classes
670
- * with new functionality.
671
- *
672
- * The replacement class must extend from <CFRequest>.
673
- *
674
- * @param string $class (Optional) The name of the new class to use for this functionality.
675
- * @param $this A reference to the current instance.
676
- */
677
- public function set_request_class($class = 'CFRequest')
678
- {
679
- $this->request_class = $class;
680
- return $this;
681
- }
682
-
683
- /**
684
- * Set a custom class for this functionality. Use this method when extending/overriding existing classes
685
- * with new functionality.
686
- *
687
- * The replacement class must extend from <CFResponse>.
688
- *
689
- * @param string $class (Optional) The name of the new class to use for this functionality.
690
- * @return $this A reference to the current instance.
691
- */
692
- public function set_response_class($class = 'CFResponse')
693
- {
694
- $this->response_class = $class;
695
- return $this;
696
- }
697
-
698
- /**
699
- * Set a custom class for this functionality. Use this method when extending/overriding existing classes
700
- * with new functionality.
701
- *
702
- * The replacement class must extend from <CFSimpleXML>.
703
- *
704
- * @param string $class (Optional) The name of the new class to use for this functionality.
705
- * @return $this A reference to the current instance.
706
- */
707
- public function set_parser_class($class = 'CFSimpleXML')
708
- {
709
- $this->parser_class = $class;
710
- return $this;
711
- }
712
-
713
- /**
714
- * Set a custom class for this functionality. Use this method when extending/overriding existing classes
715
- * with new functionality.
716
- *
717
- * The replacement class must extend from <CFBatchRequest>.
718
- *
719
- * @param string $class (Optional) The name of the new class to use for this functionality.
720
- * @return $this A reference to the current instance.
721
- */
722
- public function set_batch_class($class = 'CFBatchRequest')
723
- {
724
- $this->batch_class = $class;
725
- return $this;
726
- }
727
-
728
-
729
- /*%******************************************************************************************%*/
730
- // AUTHENTICATION
731
-
732
- /**
733
- * Default, shared method for authenticating a connection to AWS. Overridden on a class-by-class basis
734
- * as necessary.
735
- *
736
- * @param string $action (Required) Indicates the action to perform.
737
- * @param array $opt (Optional) An associative array of parameters for authenticating. See the individual methods for allowed keys.
738
- * @param string $domain (Optional) The URL of the queue to perform the action on.
739
- * @param integer $signature_version (Optional) The signature version to use. Defaults to 2.
740
- * @param integer $redirects (Do Not Use) Used internally by this function on occasions when Amazon S3 returns a redirect code and it needs to call itself recursively.
741
- * @return CFResponse Object containing a parsed HTTP response.
742
- */
743
- public function authenticate($action, $opt = null, $domain = null, $signature_version = 2, $redirects = 0)
744
- {
745
- // Handle nulls
746
- if (is_null($signature_version))
747
- {
748
- $signature_version = 2;
749
- }
750
-
751
- $method_arguments = func_get_args();
752
- $headers = array();
753
- $signed_headers = array();
754
-
755
- // Use the caching flow to determine if we need to do a round-trip to the server.
756
- if ($this->use_cache_flow)
757
- {
758
- // Generate an identifier specific to this particular set of arguments.
759
- $cache_id = $this->key . '_' . get_class($this) . '_' . $action . '_' . sha1(serialize($method_arguments));
760
-
761
- // Instantiate the appropriate caching object.
762
- $this->cache_object = new $this->cache_class($cache_id, $this->cache_location, $this->cache_expires, $this->cache_compress);
763
-
764
- if ($this->delete_cache)
765
- {
766
- $this->use_cache_flow = false;
767
- $this->delete_cache = false;
768
- return $this->cache_object->delete();
769
- }
770
-
771
- // Invoke the cache callback function to determine whether to pull data from the cache or make a fresh request.
772
- $data = $this->cache_object->response_manager(array($this, 'cache_callback'), $method_arguments);
773
-
774
- // Parse the XML body
775
- $data = $this->parse_callback($data);
776
-
777
- // End!
778
- return $data;
779
- }
780
-
781
- $return_curl_handle = false;
782
- $x_amz_target = null;
783
-
784
- // Do we have a custom resource prefix?
785
- if ($this->resource_prefix)
786
- {
787
- $domain .= $this->resource_prefix;
788
- }
789
-
790
- // Determine signing values
791
- $current_time = time() + $this->adjust_offset;
792
- $date = gmdate(CFUtilities::DATE_FORMAT_RFC2616, $current_time);
793
- $timestamp = gmdate(CFUtilities::DATE_FORMAT_ISO8601, $current_time);
794
- $nonce = $this->util->generate_guid();
795
-
796
- // Manage the key-value pairs that are used in the query.
797
- if (stripos($action, 'x-amz-target') !== false)
798
- {
799
- $x_amz_target = trim(str_ireplace('x-amz-target:', '', $action));
800
- }
801
- else
802
- {
803
- $query['Action'] = $action;
804
- }
805
- $query['Version'] = $this->api_version;
806
-
807
- // Only Signature v2
808
- if ($signature_version === 2)
809
- {
810
- $query['AWSAccessKeyId'] = $this->key;
811
- $query['SignatureMethod'] = 'HmacSHA256';
812
- $query['SignatureVersion'] = 2;
813
- $query['Timestamp'] = $timestamp;
814
- }
815
-
816
- // Merge in any options that were passed in
817
- if (is_array($opt))
818
- {
819
- $query = array_merge($query, $opt);
820
- }
821
-
822
- $return_curl_handle = isset($query['returnCurlHandle']) ? $query['returnCurlHandle'] : false;
823
- unset($query['returnCurlHandle']);
824
-
825
- // Do a case-sensitive, natural order sort on the array keys.
826
- uksort($query, 'strcmp');
827
-
828
- // Normalize JSON input
829
- if (isset($query['body']) && $query['body'] === '[]')
830
- {
831
- $query['body'] = '{}';
832
- }
833
-
834
- if ($this->use_aws_query)
835
- {
836
- // Create the string that needs to be hashed.
837
- $canonical_query_string = $this->util->to_signable_string($query);
838
- }
839
- else
840
- {
841
- // Create the string that needs to be hashed.
842
- $canonical_query_string = $this->util->encode_signature2($query['body']);
843
- }
844
-
845
- // Remove the default scheme from the domain.
846
- $domain = str_replace(array('http://', 'https://'), '', $domain);
847
-
848
- // Parse our request.
849
- $parsed_url = parse_url('http://' . $domain);
850
-
851
- // Set the proper host header.
852
- if (isset($parsed_url['port']) && (integer) $parsed_url['port'] !== 80 && (integer) $parsed_url['port'] !== 443)
853
- {
854
- $host_header = strtolower($parsed_url['host']) . ':' . $parsed_url['port'];
855
- }
856
- else
857
- {
858
- $host_header = strtolower($parsed_url['host']);
859
- }
860
-
861
- // Set the proper request URI.
862
- $request_uri = isset($parsed_url['path']) ? $parsed_url['path'] : '/';
863
-
864
- if ($signature_version === 2)
865
- {
866
- // Prepare the string to sign
867
- $string_to_sign = "POST\n$host_header\n$request_uri\n$canonical_query_string";
868
-
869
- // Hash the AWS secret key and generate a signature for the request.
870
- $query['Signature'] = base64_encode(hash_hmac('sha256', $string_to_sign, $this->secret_key, true));
871
- }
872
-
873
- // Generate the querystring from $query
874
- $querystring = $this->util->to_query_string($query);
875
-
876
- // Gather information to pass along to other classes.
877
- $helpers = array(
878
- 'utilities' => $this->utilities_class,
879
- 'request' => $this->request_class,
880
- 'response' => $this->response_class,
881
- );
882
-
883
- // Compose the request.
884
- $request_url = ($this->use_ssl ? 'https://' : 'http://') . $domain;
885
- $request_url .= !isset($parsed_url['path']) ? '/' : '';
886
-
887
- // Instantiate the request class
888
- $request = new $this->request_class($request_url, $this->proxy, $helpers);
889
- $request->set_method('POST');
890
- $request->set_body($querystring);
891
- $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
892
-
893
- // Do we have an authentication token?
894
- if ($this->auth_token)
895
- {
896
- $headers['X-Amz-Security-Token'] = $this->auth_token;
897
- }
898
-
899
- // Signing using X-Amz-Target is handled differently.
900
- if ($signature_version === 3 && $x_amz_target)
901
- {
902
- $headers['X-Amz-Target'] = $x_amz_target;
903
- $headers['Content-Type'] = 'application/json; amzn-1.0';
904
- $headers['Content-Encoding'] = 'amz-1.0';
905
-
906
- $request->set_body($query['body']);
907
- $querystring = $query['body'];
908
- }
909
-
910
- // Pass along registered stream callbacks
911
- if ($this->registered_streaming_read_callback)
912
- {
913
- $request->register_streaming_read_callback($this->registered_streaming_read_callback);
914
- }
915
-
916
- if ($this->registered_streaming_write_callback)
917
- {
918
- $request->register_streaming_write_callback($this->registered_streaming_write_callback);
919
- }
920
-
921
- // Add authentication headers
922
- if ($signature_version === 3)
923
- {
924
- $headers['X-Amz-Nonce'] = $nonce;
925
- $headers['Date'] = $date;
926
- $headers['Content-Length'] = strlen($querystring);
927
- $headers['Content-MD5'] = $this->util->hex_to_base64(md5($querystring));
928
- $headers['Host'] = $host_header;
929
- }
930
-
931
- // Sort headers
932
- uksort($headers, 'strnatcasecmp');
933
-
934
- if ($signature_version === 3 && $this->use_ssl)
935
- {
936
- // Prepare the string to sign (HTTPS)
937
- $string_to_sign = $date . $nonce;
938
- }
939
- elseif ($signature_version === 3 && !$this->use_ssl)
940
- {
941
- // Prepare the string to sign (HTTP)
942
- $string_to_sign = "POST\n$request_uri\n\n";
943
- }
944
-
945
- // Add headers to request and compute the string to sign
946
- foreach ($headers as $header_key => $header_value)
947
- {
948
- // Strip linebreaks from header values as they're illegal and can allow for security issues
949
- $header_value = str_replace(array("\r", "\n"), '', $header_value);
950
-
951
- // Add the header if it has a value
952
- if ($header_value !== '')
953
- {
954
- $request->add_header($header_key, $header_value);
955
- }
956
-
957
- // Signature v3 over HTTP
958
- if ($signature_version === 3 && !$this->use_ssl)
959
- {
960
- // Generate the string to sign
961
- if (
962
- substr(strtolower($header_key), 0, 8) === 'content-' ||
963
- strtolower($header_key) === 'date' ||
964
- strtolower($header_key) === 'expires' ||
965
- strtolower($header_key) === 'host' ||
966
- substr(strtolower($header_key), 0, 6) === 'x-amz-'
967
- )
968
- {
969
- $string_to_sign .= strtolower($header_key) . ':' . $header_value . "\n";
970
- $signed_headers[] = $header_key;
971
- }
972
- }
973
- }
974
-
975
- if ($signature_version === 3)
976
- {
977
- if (!$this->use_ssl)
978
- {
979
- $string_to_sign .= "\n";
980
-
981
- if (isset($query['body']) && $query['body'] !== '')
982
- {
983
- $string_to_sign .= $query['body'];
984
- }
985
-
986
- // Convert from string-to-sign to bytes-to-sign
987
- $bytes_to_sign = hash('sha256', $string_to_sign, true);
988
-
989
- // Hash the AWS secret key and generate a signature for the request.
990
- $signature = base64_encode(hash_hmac('sha256', $bytes_to_sign, $this->secret_key, true));
991
- }
992
- else
993
- {
994
- // Hash the AWS secret key and generate a signature for the request.
995
- $signature = base64_encode(hash_hmac('sha256', $string_to_sign, $this->secret_key, true));
996
- }
997
-
998
- $headers['X-Amzn-Authorization'] = 'AWS3' . ($this->use_ssl ? '-HTTPS' : '')
999
- . ' AWSAccessKeyId=' . $this->key
1000
- . ',Algorithm=HmacSHA256'
1001
- . ',SignedHeaders=' . implode(';', $signed_headers)
1002
- . ',Signature=' . $signature;
1003
-
1004
- $request->add_header('X-Amzn-Authorization', $headers['X-Amzn-Authorization']);
1005
- }
1006
-
1007
- // Update RequestCore settings
1008
- $request->request_class = $this->request_class;
1009
- $request->response_class = $this->response_class;
1010
-
1011
- $curlopts = array();
1012
-
1013
- // Set custom CURLOPT settings
1014
- if (is_array($opt) && isset($opt['curlopts']))
1015
- {
1016
- $curlopts = $opt['curlopts'];
1017
- unset($opt['curlopts']);
1018
- }
1019
-
1020
- // Debug mode
1021
- if ($this->debug_mode)
1022
- {
1023
- $request->debug_mode = $this->debug_mode;
1024
- }
1025
-
1026
- if (count($curlopts))
1027
- {
1028
- $request->set_curlopts($curlopts);
1029
- }
1030
-
1031
- // Manage the (newer) batch request API or the (older) returnCurlHandle setting.
1032
- if ($this->use_batch_flow)
1033
- {
1034
- $handle = $request->prep_request();
1035
- $this->batch_object->add($handle);
1036
- $this->use_batch_flow = false;
1037
-
1038
- return $handle;
1039
- }
1040
- elseif ($return_curl_handle)
1041
- {
1042
- return $request->prep_request();
1043
- }
1044
-
1045
- // Send!
1046
- $request->send_request();
1047
-
1048
- $request_headers = $headers;
1049
-
1050
- // Prepare the response.
1051
- $headers = $request->get_response_header();
1052
- $headers['x-aws-stringtosign'] = $string_to_sign;
1053
- $headers['x-aws-request-headers'] = $request_headers;
1054
- $headers['x-aws-body'] = $querystring;
1055
-
1056
- $data = new $this->response_class($headers, $this->parse_callback($request->get_response_body(), $headers), $request->get_response_code());
1057
-
1058
- // Was it Amazon's fault the request failed? Retry the request until we reach $max_retries.
1059
- if ((integer) $request->get_response_code() === 500 || (integer) $request->get_response_code() === 503)
1060
- {
1061
- if ($redirects <= $this->max_retries)
1062
- {
1063
- // Exponential backoff
1064
- $delay = (integer) (pow(4, $redirects) * 100000);
1065
- usleep($delay);
1066
- $data = $this->authenticate($action, $opt, $domain, $signature_version, ++$redirects);
1067
- }
1068
- }
1069
-
1070
- return $data;
1071
- }
1072
-
1073
-
1074
- /*%******************************************************************************************%*/
1075
- // BATCH REQUEST LAYER
1076
-
1077
- /**
1078
- * Specifies that the intended request should be queued for a later batch request.
1079
- *
1080
- * @param CFBatchRequest $queue (Optional) The <CFBatchRequest> instance to use for managing batch requests. If not available, it generates a new instance of <CFBatchRequest>.
1081
- * @return $this A reference to the current instance.
1082
- */
1083
- public function batch(CFBatchRequest &$queue = null)
1084
- {
1085
- if ($queue)
1086
- {
1087
- $this->batch_object = $queue;
1088
- }
1089
- elseif ($this->internal_batch_object)
1090
- {
1091
- $this->batch_object = &$this->internal_batch_object;
1092
- }
1093
- else
1094
- {
1095
- $this->internal_batch_object = new $this->batch_class();
1096
- $this->batch_object = &$this->internal_batch_object;
1097
- }
1098
-
1099
- $this->use_batch_flow = true;
1100
-
1101
- return $this;
1102
- }
1103
-
1104
- /**
1105
- * Executes the batch request queue by sending all queued requests.
1106
- *
1107
- * @param boolean $clear_after_send (Optional) Whether or not to clear the batch queue after sending a request. Defaults to `true`. Set this to `false` if you are caching batch responses and want to retrieve results later.
1108
- * @return array An array of <CFResponse> objects.
1109
- */
1110
- public function send($clear_after_send = true)
1111
- {
1112
- if ($this->use_batch_flow)
1113
- {
1114
- // When we send the request, disable batch flow.
1115
- $this->use_batch_flow = false;
1116
-
1117
- // If we're not caching, simply send the request.
1118
- if (!$this->use_cache_flow)
1119
- {
1120
- $response = $this->batch_object->send();
1121
- $parsed_data = array_map(array($this, 'parse_callback'), $response);
1122
- $parsed_data = new CFArray($parsed_data);
1123
-
1124
- // Clear the queue
1125
- if ($clear_after_send)
1126
- {
1127
- $this->batch_object->queue = array();
1128
- }
1129
-
1130
- return $parsed_data;
1131
- }
1132
-
1133
- // Generate an identifier specific to this particular set of arguments.
1134
- $cache_id = $this->key . '_' . get_class($this) . '_' . sha1(serialize($this->batch_object));
1135
-
1136
- // Instantiate the appropriate caching object.
1137
- $this->cache_object = new $this->cache_class($cache_id, $this->cache_location, $this->cache_expires, $this->cache_compress);
1138
-
1139
- if ($this->delete_cache)
1140
- {
1141
- $this->use_cache_flow = false;
1142
- $this->delete_cache = false;
1143
- return $this->cache_object->delete();
1144
- }
1145
-
1146
- // Invoke the cache callback function to determine whether to pull data from the cache or make a fresh request.
1147
- $data_set = $this->cache_object->response_manager(array($this, 'cache_callback_batch'), array($this->batch_object));
1148
- $parsed_data = array_map(array($this, 'parse_callback'), $data_set);
1149
- $parsed_data = new CFArray($parsed_data);
1150
-
1151
- // Clear the queue
1152
- if ($clear_after_send)
1153
- {
1154
- $this->batch_object->queue = array();
1155
- }
1156
-
1157
- // End!
1158
- return $parsed_data;
1159
- }
1160
-
1161
- // Load the class
1162
- $null = new CFBatchRequest();
1163
- unset($null);
1164
-
1165
- throw new CFBatchRequest_Exception('You must use $object->batch()->send()');
1166
- }
1167
-
1168
- /**
1169
- * Parses a response body into a PHP object if appropriate.
1170
- *
1171
- * @param CFResponse|string $response (Required) The <CFResponse> object to parse, or an XML string that would otherwise be a response body.
1172
- * @param string $content_type (Optional) The content-type to use when determining how to parse the content.
1173
- * @return CFResponse|string A parsed <CFResponse> object, or parsed XML.
1174
- */
1175
- public function parse_callback($response, $headers = null)
1176
- {
1177
- // Shorten this so we have a (mostly) single code path
1178
- if (isset($response->body))
1179
- {
1180
- if (is_string($response->body))
1181
- {
1182
- $body = $response->body;
1183
- }
1184
- else
1185
- {
1186
- return $response;
1187
- }
1188
- }
1189
- elseif (is_string($response))
1190
- {
1191
- $body = $response;
1192
- }
1193
- else
1194
- {
1195
- return $response;
1196
- }
1197
-
1198
- // Decompress gzipped content
1199
- if (isset($headers['content-encoding']))
1200
- {
1201
- switch (strtolower(trim($headers['content-encoding'], "\x09\x0A\x0D\x20")))
1202
- {
1203
- case 'gzip':
1204
- case 'x-gzip':
1205
- $decoder = new CFGzipDecode($body);
1206
- if ($decoder->parse())
1207
- {
1208
- $body = $decoder->data;
1209
- }
1210
- break;
1211
-
1212
- case 'deflate':
1213
- if (($body = gzuncompress($body)) === false)
1214
- {
1215
- if (($body = gzinflate($body)) === false)
1216
- {
1217
- continue;
1218
- }
1219
- }
1220
- break;
1221
- }
1222
- }
1223
-
1224
- // Look for XML cues
1225
- if (
1226
- (isset($headers['content-type']) && ($headers['content-type'] === 'text/xml' || $headers['content-type'] === 'application/xml')) || // We know it's XML
1227
- (!isset($headers['content-type']) && (stripos($body, '<?xml') === 0 || strpos($body, '<Error>') === 0) || preg_match('/^<(\w*) xmlns="http(s?):\/\/(\w*).amazon(aws)?.com/im', $body)) // Sniff for XML
1228
- )
1229
- {
1230
- // Strip the default XML namespace to simplify XPath expressions
1231
- $body = str_replace("xmlns=", "ns=", $body);
1232
-
1233
- // Parse the XML body
1234
- $body = new $this->parser_class($body);
1235
- }
1236
- // Look for JSON cues
1237
- elseif (
1238
- (isset($headers['content-type']) && $headers['content-type'] === 'application/json') || // We know it's JSON
1239
- (!isset($headers['content-type']) && $this->util->is_json($body)) // Sniff for JSON
1240
- )
1241
- {
1242
- // Normalize JSON to a CFSimpleXML object
1243
- $body = CFJSON::to_xml($body);
1244
- }
1245
-
1246
- // Put the parsed data back where it goes
1247
- if (isset($response->body))
1248
- {
1249
- $response->body = $body;
1250
- }
1251
- else
1252
- {
1253
- $response = $body;
1254
- }
1255
-
1256
- return $response;
1257
- }
1258
-
1259
-
1260
- /*%******************************************************************************************%*/
1261
- // CACHING LAYER
1262
-
1263
- /**
1264
- * Specifies that the resulting <CFResponse> object should be cached according to the settings from
1265
- * <set_cache_config()>.
1266
- *
1267
- * @param string|integer $expires (Required) The time the cache is to expire. Accepts a number of seconds as an integer, or an amount of time, as a string, that is understood by <php:strtotime()> (e.g. "1 hour").
1268
- * @param $this A reference to the current instance.
1269
- * @return $this
1270
- */
1271
- public function cache($expires)
1272
- {
1273
- // Die if they haven't used set_cache_config().
1274
- if (!$this->cache_class)
1275
- {
1276
- throw new CFRuntime_Exception('Must call set_cache_config() before using cache()');
1277
- }
1278
-
1279
- if (is_string($expires))
1280
- {
1281
- $expires = strtotime($expires);
1282
- $this->cache_expires = $expires - time();
1283
- }
1284
- elseif (is_int($expires))
1285
- {
1286
- $this->cache_expires = $expires;
1287
- }
1288
-
1289
- $this->use_cache_flow = true;
1290
-
1291
- return $this;
1292
- }
1293
-
1294
- /**
1295
- * The callback function that is executed when the cache doesn't exist or has expired. The response of
1296
- * this method is cached. Accepts identical parameters as the <authenticate()> method. Never call this
1297
- * method directly -- it is used internally by the caching system.
1298
- *
1299
- * @param string $action (Required) Indicates the action to perform.
1300
- * @param array $opt (Optional) An associative array of parameters for authenticating. See the individual methods for allowed keys.
1301
- * @param string $domain (Optional) The URL of the queue to perform the action on.
1302
- * @param integer $signature_version (Optional) The signature version to use. Defaults to 2.
1303
- * @return CFResponse A parsed HTTP response.
1304
- */
1305
- public function cache_callback($action, $opt = null, $domain = null, $signature_version = 2)
1306
- {
1307
- // Disable the cache flow since it's already been handled.
1308
- $this->use_cache_flow = false;
1309
-
1310
- // Make the request
1311
- $response = $this->authenticate($action, $opt, $domain, $signature_version);
1312
-
1313
- // If this is an XML document, convert it back to a string.
1314
- if (isset($response->body) && ($response->body instanceof SimpleXMLElement))
1315
- {
1316
- $response->body = $response->body->asXML();
1317
- }
1318
-
1319
- return $response;
1320
- }
1321
-
1322
- /**
1323
- * Used for caching the results of a batch request. Never call this method directly; it is used
1324
- * internally by the caching system.
1325
- *
1326
- * @param CFBatchRequest $batch (Required) The batch request object to send.
1327
- * @return CFResponse A parsed HTTP response.
1328
- */
1329
- public function cache_callback_batch(CFBatchRequest $batch)
1330
- {
1331
- return $batch->send();
1332
- }
1333
-
1334
- /**
1335
- * Deletes a cached <CFResponse> object using the specified cache storage type.
1336
- *
1337
- * @return boolean A value of `true` if cached object exists and is successfully deleted, otherwise `false`.
1338
- */
1339
- public function delete_cache()
1340
- {
1341
- $this->use_cache_flow = true;
1342
- $this->delete_cache = true;
1343
-
1344
- return $this;
1345
- }
1346
- }
1347
-
1348
-
1349
- /**
1350
- * Contains the functionality for auto-loading service classes.
1351
- */
1352
- class CFLoader
1353
- {
1354
-
1355
- /*%******************************************************************************************%*/
1356
- // AUTO-LOADER
1357
-
1358
- /**
1359
- * Automatically load classes that aren't included.
1360
- *
1361
- * @param string $class (Required) The classname to load.
1362
- * @return void
1363
- */
1364
- public static function autoloader($class)
1365
- {
1366
- $path = dirname(__FILE__) . DIRECTORY_SEPARATOR;
1367
-
1368
- // Amazon SDK classes
1369
- if (strstr($class, 'Amazon'))
1370
- {
1371
- $path .= 'services' . DIRECTORY_SEPARATOR . str_ireplace('Amazon', '', strtolower($class)) . '.class.php';
1372
- }
1373
-
1374
- // Utility classes
1375
- elseif (strstr($class, 'CF'))
1376
- {
1377
- $path .= 'utilities' . DIRECTORY_SEPARATOR . str_ireplace('CF', '', strtolower($class)) . '.class.php';
1378
- }
1379
-
1380
- // Load CacheCore
1381
- elseif (strstr($class, 'Cache'))
1382
- {
1383
- if (file_exists($ipath = 'lib' . DIRECTORY_SEPARATOR . 'cachecore' . DIRECTORY_SEPARATOR . 'icachecore.interface.php'))
1384
- {
1385
- require_once($ipath);
1386
- }
1387
-
1388
- $path .= 'lib' . DIRECTORY_SEPARATOR . 'cachecore' . DIRECTORY_SEPARATOR . strtolower($class) . '.class.php';
1389
- }
1390
-
1391
- // Load RequestCore
1392
- elseif (strstr($class, 'RequestCore') || strstr($class, 'ResponseCore'))
1393
- {
1394
- $path .= 'lib' . DIRECTORY_SEPARATOR . 'requestcore' . DIRECTORY_SEPARATOR . 'requestcore.class.php';
1395
- }
1396
-
1397
- // Load Symfony YAML classes
1398
- elseif (strstr($class, 'sfYaml'))
1399
- {
1400
- $path .= 'lib' . DIRECTORY_SEPARATOR . 'yaml' . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'sfYaml.php';
1401
- }
1402
-
1403
- // Fall back to the 'extensions' directory.
1404
- elseif (defined('AWS_ENABLE_EXTENSIONS') && AWS_ENABLE_EXTENSIONS)
1405
- {
1406
- $path .= 'extensions' . DIRECTORY_SEPARATOR . strtolower($class) . '.class.php';
1407
- }
1408
-
1409
- if (file_exists($path) && !is_dir($path))
1410
- {
1411
- require_once($path);
1412
- }
1413
- }
1414
- }
1415
-
1416
- // Register the autoloader.
1417
- spl_autoload_register(array('CFLoader', 'autoloader'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+
18
+ /*%******************************************************************************************%*/
19
+ // CORE DEPENDENCIES
20
+
21
+ // Look for include file in the same directory (e.g. `./config.inc.php`).
22
+ if (file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config.inc.php'))
23
+ {
24
+ include_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config.inc.php';
25
+ }
26
+ // Fallback to `~/.aws/sdk/config.inc.php`
27
+ elseif (getenv('HOME') && file_exists(getenv('HOME') . DIRECTORY_SEPARATOR . '.aws' . DIRECTORY_SEPARATOR . 'sdk' . DIRECTORY_SEPARATOR . 'config.inc.php'))
28
+ {
29
+ include_once getenv('HOME') . DIRECTORY_SEPARATOR . '.aws' . DIRECTORY_SEPARATOR . 'sdk' . DIRECTORY_SEPARATOR . 'config.inc.php';
30
+ }
31
+
32
+
33
+ /*%******************************************************************************************%*/
34
+ // EXCEPTIONS
35
+
36
+ /**
37
+ * Default CFRuntime Exception.
38
+ */
39
+ class CFRuntime_Exception extends Exception {}
40
+
41
+
42
+ /*%******************************************************************************************%*/
43
+ // DETERMINE WHAT ENVIRONMENT DATA TO ADD TO THE USERAGENT FOR METRIC TRACKING
44
+
45
+ /*
46
+ Define a temporary callback function for this calculation. Get the PHP version and any
47
+ required/optional extensions that are leveraged.
48
+
49
+ Tracking this data gives Amazon better metrics about what configurations are being used
50
+ so that forward-looking plans for the code can be made with more certainty (e.g. What
51
+ version of PHP are most people running? Do they tend to have the latest PCRE?).
52
+ */
53
+ function __aws_sdk_ua_callback()
54
+ {
55
+ $ua_append = '';
56
+ $extensions = get_loaded_extensions();
57
+ $sorted_extensions = array();
58
+
59
+ if ($extensions)
60
+ {
61
+ foreach ($extensions as $extension)
62
+ {
63
+ if ($extension === 'curl' && function_exists('curl_version'))
64
+ {
65
+ $curl_version = curl_version();
66
+ $sorted_extensions[strtolower($extension)] = $curl_version['version'];
67
+ }
68
+ elseif ($extension === 'pcre' && defined('PCRE_VERSION'))
69
+ {
70
+ $pcre_version = explode(' ', PCRE_VERSION);
71
+ $sorted_extensions[strtolower($extension)] = $pcre_version[0];
72
+ }
73
+ elseif ($extension === 'openssl' && defined('OPENSSL_VERSION_TEXT'))
74
+ {
75
+ $openssl_version = explode(' ', OPENSSL_VERSION_TEXT);
76
+ $sorted_extensions[strtolower($extension)] = $openssl_version[1];
77
+ }
78
+ else
79
+ {
80
+ $sorted_extensions[strtolower($extension)] = phpversion($extension);
81
+ }
82
+ }
83
+ }
84
+
85
+ foreach (array('simplexml', 'json', 'pcre', 'spl', 'curl', 'openssl', 'apc', 'xcache', 'memcache', 'memcached', 'pdo', 'pdo_sqlite', 'sqlite', 'sqlite3', 'zlib', 'xdebug') as $ua_ext)
86
+ {
87
+ if (isset($sorted_extensions[$ua_ext]) && $sorted_extensions[$ua_ext])
88
+ {
89
+ $ua_append .= ' ' . $ua_ext . '/' . $sorted_extensions[$ua_ext];
90
+ }
91
+ elseif (isset($sorted_extensions[$ua_ext]))
92
+ {
93
+ $ua_append .= ' ' . $ua_ext . '/0';
94
+ }
95
+ }
96
+
97
+ return $ua_append;
98
+ }
99
+
100
+
101
+ /*%******************************************************************************************%*/
102
+ // INTERMEDIARY CONSTANTS
103
+
104
+ define('CFRUNTIME_NAME', 'aws-sdk-php');
105
+ define('CFRUNTIME_VERSION', '1.3.5');
106
+ // define('CFRUNTIME_BUILD', gmdate('YmdHis', filemtime(__FILE__))); // @todo: Hardcode for release.
107
+ define('CFRUNTIME_BUILD', '20110621180731');
108
+ define('CFRUNTIME_USERAGENT', CFRUNTIME_NAME . '/' . CFRUNTIME_VERSION . ' PHP/' . PHP_VERSION . ' ' . php_uname('s') . '/' . php_uname('r') . ' Arch/' . php_uname('m') . ' SAPI/' . php_sapi_name() . ' Integer/' . PHP_INT_MAX . ' Build/' . CFRUNTIME_BUILD . __aws_sdk_ua_callback());
109
+
110
+
111
+ /*%******************************************************************************************%*/
112
+ // CLASS
113
+
114
+ /**
115
+ * Core functionality and default settings shared across all SDK classes. All methods and properties in this
116
+ * class are inherited by the service-specific classes.
117
+ *
118
+ * @version 2011.06.07
119
+ * @license See the included NOTICE.md file for more information.
120
+ * @copyright See the included NOTICE.md file for more information.
121
+ * @link http://aws.amazon.com/php/ PHP Developer Center
122
+ */
123
+ class CFRuntime
124
+ {
125
+ /*%******************************************************************************************%*/
126
+ // CONSTANTS
127
+
128
+ /**
129
+ * Name of the software.
130
+ */
131
+ const NAME = CFRUNTIME_NAME;
132
+
133
+ /**
134
+ * Version of the software.
135
+ */
136
+ const VERSION = CFRUNTIME_VERSION;
137
+
138
+ /**
139
+ * Build ID of the software.
140
+ */
141
+ const BUILD = CFRUNTIME_BUILD;
142
+
143
+ /**
144
+ * User agent string used to identify the software.
145
+ */
146
+ const USERAGENT = CFRUNTIME_USERAGENT;
147
+
148
+
149
+ /*%******************************************************************************************%*/
150
+ // PROPERTIES
151
+
152
+ /**
153
+ * The Amazon API Key.
154
+ */
155
+ public $key;
156
+
157
+ /**
158
+ * The Amazon API Secret Key.
159
+ */
160
+ public $secret_key;
161
+
162
+ /**
163
+ * The Amazon Authentication Token.
164
+ */
165
+ public $auth_token;
166
+
167
+ /**
168
+ * The Amazon Account ID, without hyphens.
169
+ */
170
+ public $account_id;
171
+
172
+ /**
173
+ * The Amazon Associates ID.
174
+ */
175
+ public $assoc_id;
176
+
177
+ /**
178
+ * Handle for the utility functions.
179
+ */
180
+ public $util;
181
+
182
+ /**
183
+ * An identifier for the current AWS service.
184
+ */
185
+ public $service = null;
186
+
187
+ /**
188
+ * The supported API version.
189
+ */
190
+ public $api_version = null;
191
+
192
+ /**
193
+ * The state of whether auth should be handled as AWS Query.
194
+ */
195
+ public $use_aws_query = true;
196
+
197
+ /**
198
+ * The default class to use for utilities (defaults to <CFUtilities>).
199
+ */
200
+ public $utilities_class = 'CFUtilities';
201
+
202
+ /**
203
+ * The default class to use for HTTP requests (defaults to <CFRequest>).
204
+ */
205
+ public $request_class = 'CFRequest';
206
+
207
+ /**
208
+ * The default class to use for HTTP responses (defaults to <CFResponse>).
209
+ */
210
+ public $response_class = 'CFResponse';
211
+
212
+ /**
213
+ * The default class to use for parsing XML (defaults to <CFSimpleXML>).
214
+ */
215
+ public $parser_class = 'CFSimpleXML';
216
+
217
+ /**
218
+ * The default class to use for handling batch requests (defaults to <CFBatchRequest>).
219
+ */
220
+ public $batch_class = 'CFBatchRequest';
221
+
222
+ /**
223
+ * The number of seconds to adjust the request timestamp by (defaults to 0).
224
+ */
225
+ public $adjust_offset = 0;
226
+
227
+ /**
228
+ * The state of SSL/HTTPS use.
229
+ */
230
+ public $use_ssl = true;
231
+
232
+ /**
233
+ * The state of SSL certificate verification.
234
+ */
235
+ public $ssl_verification = true;
236
+
237
+ /**
238
+ * The proxy to use for connecting.
239
+ */
240
+ public $proxy = null;
241
+
242
+ /**
243
+ * The alternate hostname to use, if any.
244
+ */
245
+ public $hostname = null;
246
+
247
+ /**
248
+ * The state of the capability to override the hostname with <set_hostname()>.
249
+ */
250
+ public $override_hostname = true;
251
+
252
+ /**
253
+ * The alternate port number to use, if any.
254
+ */
255
+ public $port_number = null;
256
+
257
+ /**
258
+ * The alternate resource prefix to use, if any.
259
+ */
260
+ public $resource_prefix = null;
261
+
262
+ /**
263
+ * The state of cache flow usage.
264
+ */
265
+ public $use_cache_flow = false;
266
+
267
+ /**
268
+ * The caching class to use.
269
+ */
270
+ public $cache_class = null;
271
+
272
+ /**
273
+ * The caching location to use.
274
+ */
275
+ public $cache_location = null;
276
+
277
+ /**
278
+ * When the cache should be considered stale.
279
+ */
280
+ public $cache_expires = null;
281
+
282
+ /**
283
+ * The state of cache compression.
284
+ */
285
+ public $cache_compress = null;
286
+
287
+ /**
288
+ * The current instantiated cache object.
289
+ */
290
+ public $cache_object = null;
291
+
292
+ /**
293
+ * The current instantiated batch request object.
294
+ */
295
+ public $batch_object = null;
296
+
297
+ /**
298
+ * The internally instantiated batch request object.
299
+ */
300
+ public $internal_batch_object = null;
301
+
302
+ /**
303
+ * The state of batch flow usage.
304
+ */
305
+ public $use_batch_flow = false;
306
+
307
+ /**
308
+ * The state of the cache deletion setting.
309
+ */
310
+ public $delete_cache = false;
311
+
312
+ /**
313
+ * The state of the debug mode setting.
314
+ */
315
+ public $debug_mode = false;
316
+
317
+ /**
318
+ * The number of times to retry failed requests.
319
+ */
320
+ public $max_retries = 3;
321
+
322
+ /**
323
+ * The user-defined callback function to call when a stream is read from.
324
+ */
325
+ public $registered_streaming_read_callback = null;
326
+
327
+ /**
328
+ * The user-defined callback function to call when a stream is written to.
329
+ */
330
+ public $registered_streaming_write_callback = null;
331
+
332
+
333
+ /*%******************************************************************************************%*/
334
+ // CONSTRUCTOR
335
+
336
+ /**
337
+ * The constructor. You would not normally instantiate this class directly. Rather, you would instantiate
338
+ * a service-specific class.
339
+ *
340
+ * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <AWS_KEY> constant.
341
+ * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <AWS_SECRET_KEY> constant.
342
+ * @param string $account_id (Optional) Your Amazon account ID without the hyphens. Required for EC2. If blank, it will look for the <AWS_ACCOUNT_ID> constant.
343
+ * @param string $assoc_id (Optional) Your Amazon Associates ID. Required for PAS. If blank, it will look for the <AWS_ASSOC_ID> constant.
344
+ * @return boolean A value of `false` if no valid values are set, otherwise `true`.
345
+ */
346
+ public function __construct($key = null, $secret_key = null, $account_id = null, $assoc_id = null)
347
+ {
348
+ // Instantiate the utilities class.
349
+ $this->util = new $this->utilities_class();
350
+
351
+ // Determine the current service.
352
+ $this->service = get_class($this);
353
+
354
+ // Set default values
355
+ $this->key = null;
356
+ $this->secret_key = null;
357
+ $this->account_id = null;
358
+ $this->assoc_id = null;
359
+
360
+ // Set the Account ID
361
+ if ($account_id)
362
+ {
363
+ $this->account_id = $account_id;
364
+ }
365
+ elseif (defined('AWS_ACCOUNT_ID'))
366
+ {
367
+ $this->account_id = AWS_ACCOUNT_ID;
368
+ }
369
+
370
+ // Set the Associates ID
371
+ if ($assoc_id)
372
+ {
373
+ $this->assoc_id = $assoc_id;
374
+ }
375
+ elseif (defined('AWS_ASSOC_ID'))
376
+ {
377
+ $this->assoc_id = AWS_ASSOC_ID;
378
+ }
379
+
380
+ // If both a key and secret key are passed in, use those.
381
+ if ($key && $secret_key)
382
+ {
383
+ $this->key = $key;
384
+ $this->secret_key = $secret_key;
385
+ return true;
386
+ }
387
+ // If neither are passed in, look for the constants instead.
388
+ elseif (defined('AWS_KEY') && defined('AWS_SECRET_KEY'))
389
+ {
390
+ $this->key = AWS_KEY;
391
+ $this->secret_key = AWS_SECRET_KEY;
392
+ return true;
393
+ }
394
+
395
+ // Otherwise set the values to blank and return false.
396
+ else
397
+ {
398
+ throw new CFRuntime_Exception('No valid credentials were used to authenticate with AWS.');
399
+ }
400
+ }
401
+
402
+ /**
403
+ * Alternate approach to constructing a new instance. Supports chaining.
404
+ *
405
+ * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <AWS_KEY> constant.
406
+ * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <AWS_SECRET_KEY> constant.
407
+ * @param string $account_id (Optional) Your Amazon account ID without the hyphens. Required for EC2. If blank, it will look for the <AWS_ACCOUNT_ID> constant.
408
+ * @param string $assoc_id (Optional) Your Amazon Associates ID. Required for AAWS. If blank, it will look for the <AWS_ASSOC_ID> constant.
409
+ * @return boolean A value of `false` if no valid values are set, otherwise `true`.
410
+ */
411
+ public static function init($key = null, $secret_key = null, $account_id = null, $assoc_id = null)
412
+ {
413
+ if (version_compare(PHP_VERSION, '5.3.0', '<'))
414
+ {
415
+ throw new Exception('PHP 5.3 or newer is required to instantiate a new class with CLASS::init().');
416
+ }
417
+
418
+ $self = get_called_class();
419
+ return new $self($key, $secret_key, $account_id, $assoc_id);
420
+ }
421
+
422
+
423
+ /*%******************************************************************************************%*/
424
+ // MAGIC METHODS
425
+
426
+ /**
427
+ * A magic method that allows `camelCase` method names to be translated into `snake_case` names.
428
+ *
429
+ * @param string $name (Required) The name of the method.
430
+ * @param array $arguments (Required) The arguments passed to the method.
431
+ * @return mixed The results of the intended method.
432
+ */
433
+ public function __call($name, $arguments)
434
+ {
435
+ // Convert camelCase method calls to snake_case.
436
+ $method_name = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $name));
437
+
438
+ if (method_exists($this, $method_name))
439
+ {
440
+ return call_user_func_array(array($this, $method_name), $arguments);
441
+ }
442
+
443
+ throw new CFRuntime_Exception('The method ' . $name . '() is undefined. Attempted to map to ' . $method_name . '() which is also undefined. Error occurred');
444
+ }
445
+
446
+
447
+ /*%******************************************************************************************%*/
448
+ // SET CUSTOM SETTINGS
449
+
450
+ /**
451
+ * Adjusts the current time. Use this method for occasions when a server is out of sync with Amazon
452
+ * servers.
453
+ *
454
+ * @param integer $seconds (Required) The number of seconds to adjust the sent timestamp by.
455
+ * @return $this A reference to the current instance.
456
+ */
457
+ public function adjust_offset($seconds)
458
+ {
459
+ $this->adjust_offset = $seconds;
460
+ return $this;
461
+ }
462
+
463
+ /**
464
+ * Set the proxy settings to use.
465
+ *
466
+ * @param string $proxy (Required) Accepts proxy credentials in the following format: `proxy://user:pass@hostname:port`
467
+ * @return $this A reference to the current instance.
468
+ */
469
+ public function set_proxy($proxy)
470
+ {
471
+ $this->proxy = $proxy;
472
+ return $this;
473
+ }
474
+
475
+ /**
476
+ * Set the hostname to connect to. This is useful for alternate services that are API-compatible with
477
+ * AWS, but run from a different hostname.
478
+ *
479
+ * @param string $hostname (Required) The alternate hostname to use in place of the default one. Useful for mock or test applications living on different hostnames.
480
+ * @param integer $port_number (Optional) The alternate port number to use in place of the default one. Useful for mock or test applications living on different port numbers.
481
+ * @return $this A reference to the current instance.
482
+ */
483
+ public function set_hostname($hostname, $port_number = null)
484
+ {
485
+ if ($this->override_hostname)
486
+ {
487
+ $this->hostname = $hostname;
488
+
489
+ if ($port_number)
490
+ {
491
+ $this->port_number = $port_number;
492
+ $this->hostname .= ':' . (string) $this->port_number;
493
+ }
494
+ }
495
+
496
+ return $this;
497
+ }
498
+
499
+ /**
500
+ * Set the resource prefix to use. This method is useful for alternate services that are API-compatible
501
+ * with AWS.
502
+ *
503
+ * @param string $prefix (Required) An alternate prefix to prepend to the resource path. Useful for mock or test applications.
504
+ * @return $this A reference to the current instance.
505
+ */
506
+ public function set_resource_prefix($prefix)
507
+ {
508
+ $this->resource_prefix = $prefix;
509
+ return $this;
510
+ }
511
+
512
+ /**
513
+ * Disables any subsequent use of the <set_hostname()> method.
514
+ *
515
+ * @param boolean $override (Optional) Whether or not subsequent calls to <set_hostname()> should be obeyed. A `false` value disables the further effectiveness of <set_hostname()>. Defaults to `true`.
516
+ * @return $this A reference to the current instance.
517
+ */
518
+ public function allow_hostname_override($override = true)
519
+ {
520
+ $this->override_hostname = $override;
521
+ return $this;
522
+ }
523
+
524
+ /**
525
+ * Disables SSL/HTTPS connections for hosts that don't support them. Some services, however, still
526
+ * require SSL support.
527
+ *
528
+ * This method will throw a user warning when invoked, which can be hidden by changing your
529
+ * <php:error_reporting()> settings.
530
+ *
531
+ * @return $this A reference to the current instance.
532
+ */
533
+ public function disable_ssl()
534
+ {
535
+ trigger_error('Disabling SSL connections is potentially unsafe and highly discouraged.', E_USER_WARNING);
536
+ $this->use_ssl = false;
537
+ return $this;
538
+ }
539
+
540
+ /**
541
+ * Disables the verification of the SSL Certificate Authority. Doing so can enable an attacker to carry
542
+ * out a man-in-the-middle attack.
543
+ *
544
+ * https://secure.wikimedia.org/wikipedia/en/wiki/Man-in-the-middle_attack
545
+ *
546
+ * This method will throw a user warning when invoked, which can be hidden by changing your
547
+ * <php:error_reporting()> settings.
548
+ *
549
+ * @return $this A reference to the current instance.
550
+ */
551
+ public function disable_ssl_verification($ssl_verification = false)
552
+ {
553
+ trigger_error('Disabling the verification of SSL certificates can lead to man-in-the-middle attacks. It is potentially unsafe and highly discouraged.', E_USER_WARNING);
554
+ $this->ssl_verification = $ssl_verification;
555
+ return $this;
556
+ }
557
+
558
+ /**
559
+ * Enables HTTP request/response header logging to `STDERR`.
560
+ *
561
+ * @param boolean $enabled (Optional) Whether or not to enable debug mode. Defaults to `true`.
562
+ * @return $this A reference to the current instance.
563
+ */
564
+ public function enable_debug_mode($enabled = true)
565
+ {
566
+ $this->debug_mode = $enabled;
567
+ return $this;
568
+ }
569
+
570
+ /**
571
+ * Sets the maximum number of times to retry failed requests.
572
+ *
573
+ * @param integer $retries (Optional) The maximum number of times to retry failed requests. Defaults to `3`.
574
+ * @return $this A reference to the current instance.
575
+ */
576
+ public function set_max_retries($retries = 3)
577
+ {
578
+ $this->max_retries = $retries;
579
+ return $this;
580
+ }
581
+
582
+ /**
583
+ * Set the caching configuration to use for response caching.
584
+ *
585
+ * @param string $location (Required) <p>The location to store the cache object in. This may vary by cache method.</p><ul><li>File - The local file system paths such as <code>./cache</code> (relative) or <code>/tmp/cache/</code> (absolute). The location must be server-writable.</li><li>APC - Pass in <code>apc</code> to use this lightweight cache. You must have the <a href="http://php.net/apc">APC extension</a> installed.</li><li>XCache - Pass in <code>xcache</code> to use this lightweight cache. You must have the <a href="http://xcache.lighttpd.net">XCache</a> extension installed.</li><li>Memcached - Pass in an indexed array of associative arrays. Each associative array should have a <code>host</code> and a <code>port</code> value representing a <a href="http://php.net/memcached">Memcached</a> server to connect to.</li><li>PDO - A URL-style string (e.g. <code>pdo.mysql://user:pass@localhost/cache</code>) or a standard DSN-style string (e.g. <code>pdo.sqlite:/sqlite/cache.db</code>). MUST be prefixed with <code>pdo.</code>. See <code>CachePDO</code> and <a href="http://php.net/pdo">PDO</a> for more details.</li></ul>
586
+ * @param boolean $gzip (Optional) Whether or not data should be gzipped before being stored. A value of `true` will compress the contents before caching them. A value of `false` will leave the contents uncompressed. Defaults to `true`.
587
+ * @return $this A reference to the current instance.
588
+ */
589
+ public function set_cache_config($location, $gzip = true)
590
+ {
591
+ // If we have an array, we're probably passing in Memcached servers and ports.
592
+ if (is_array($location))
593
+ {
594
+ $this->cache_class = 'CacheMC';
595
+ }
596
+ else
597
+ {
598
+ // I would expect locations like `/tmp/cache`, `pdo.mysql://user:pass@hostname:port`, `pdo.sqlite:memory:`, and `apc`.
599
+ $type = strtolower(substr($location, 0, 3));
600
+ switch ($type)
601
+ {
602
+ case 'apc':
603
+ $this->cache_class = 'CacheAPC';
604
+ break;
605
+
606
+ case 'xca': // First three letters of `xcache`
607
+ $this->cache_class = 'CacheXCache';
608
+ break;
609
+
610
+ case 'pdo':
611
+ $this->cache_class = 'CachePDO';
612
+ $location = substr($location, 4);
613
+ break;
614
+
615
+ default:
616
+ $this->cache_class = 'CacheFile';
617
+ break;
618
+ }
619
+ }
620
+
621
+ // Set the remaining cache information.
622
+ $this->cache_location = $location;
623
+ $this->cache_compress = $gzip;
624
+
625
+ return $this;
626
+ }
627
+
628
+ /**
629
+ * Register a callback function to execute whenever a data stream is read from using
630
+ * <CFRequest::streaming_read_callback()>.
631
+ *
632
+ * The user-defined callback function should accept three arguments:
633
+ *
634
+ * <ul>
635
+ * <li><code>$curl_handle</code> - <code>resource</code> - Required - The cURL handle resource that represents the in-progress transfer.</li>
636
+ * <li><code>$file_handle</code> - <code>resource</code> - Required - The file handle resource that represents the file on the local file system.</li>
637
+ * <li><code>$length</code> - <code>integer</code> - Required - The length in kilobytes of the data chunk that was transferred.</li>
638
+ * </ul>
639
+ *
640
+ * @param string|array|function $callback (Required) The callback function is called by <php:call_user_func()>, so you can pass the following values: <ul>
641
+ * <li>The name of a global function to execute, passed as a string.</li>
642
+ * <li>A method to execute, passed as <code>array('ClassName', 'MethodName')</code>.</li>
643
+ * <li>An anonymous function (PHP 5.3+).</li></ul>
644
+ * @return $this A reference to the current instance.
645
+ */
646
+ public function register_streaming_read_callback($callback)
647
+ {
648
+ $this->registered_streaming_read_callback = $callback;
649
+ return $this;
650
+ }
651
+
652
+ /**
653
+ * Register a callback function to execute whenever a data stream is written to using
654
+ * <CFRequest::streaming_write_callback()>.
655
+ *
656
+ * The user-defined callback function should accept two arguments:
657
+ *
658
+ * <ul>
659
+ * <li><code>$curl_handle</code> - <code>resource</code> - Required - The cURL handle resource that represents the in-progress transfer.</li>
660
+ * <li><code>$length</code> - <code>integer</code> - Required - The length in kilobytes of the data chunk that was transferred.</li>
661
+ * </ul>
662
+ *
663
+ * @param string|array|function $callback (Required) The callback function is called by <php:call_user_func()>, so you can pass the following values: <ul>
664
+ * <li>The name of a global function to execute, passed as a string.</li>
665
+ * <li>A method to execute, passed as <code>array('ClassName', 'MethodName')</code>.</li>
666
+ * <li>An anonymous function (PHP 5.3+).</li></ul>
667
+ * @return $this A reference to the current instance.
668
+ */
669
+ public function register_streaming_write_callback($callback)
670
+ {
671
+ $this->registered_streaming_write_callback = $callback;
672
+ return $this;
673
+ }
674
+
675
+
676
+ /*%******************************************************************************************%*/
677
+ // SET CUSTOM CLASSES
678
+
679
+ /**
680
+ * Set a custom class for this functionality. Use this method when extending/overriding existing classes
681
+ * with new functionality.
682
+ *
683
+ * The replacement class must extend from <CFUtilities>.
684
+ *
685
+ * @param string $class (Optional) The name of the new class to use for this functionality.
686
+ * @return $this A reference to the current instance.
687
+ */
688
+ public function set_utilities_class($class = 'CFUtilities')
689
+ {
690
+ $this->utilities_class = $class;
691
+ $this->util = new $this->utilities_class();
692
+ return $this;
693
+ }
694
+
695
+ /**
696
+ * Set a custom class for this functionality. Use this method when extending/overriding existing classes
697
+ * with new functionality.
698
+ *
699
+ * The replacement class must extend from <CFRequest>.
700
+ *
701
+ * @param string $class (Optional) The name of the new class to use for this functionality.
702
+ * @param $this A reference to the current instance.
703
+ */
704
+ public function set_request_class($class = 'CFRequest')
705
+ {
706
+ $this->request_class = $class;
707
+ return $this;
708
+ }
709
+
710
+ /**
711
+ * Set a custom class for this functionality. Use this method when extending/overriding existing classes
712
+ * with new functionality.
713
+ *
714
+ * The replacement class must extend from <CFResponse>.
715
+ *
716
+ * @param string $class (Optional) The name of the new class to use for this functionality.
717
+ * @return $this A reference to the current instance.
718
+ */
719
+ public function set_response_class($class = 'CFResponse')
720
+ {
721
+ $this->response_class = $class;
722
+ return $this;
723
+ }
724
+
725
+ /**
726
+ * Set a custom class for this functionality. Use this method when extending/overriding existing classes
727
+ * with new functionality.
728
+ *
729
+ * The replacement class must extend from <CFSimpleXML>.
730
+ *
731
+ * @param string $class (Optional) The name of the new class to use for this functionality.
732
+ * @return $this A reference to the current instance.
733
+ */
734
+ public function set_parser_class($class = 'CFSimpleXML')
735
+ {
736
+ $this->parser_class = $class;
737
+ return $this;
738
+ }
739
+
740
+ /**
741
+ * Set a custom class for this functionality. Use this method when extending/overriding existing classes
742
+ * with new functionality.
743
+ *
744
+ * The replacement class must extend from <CFBatchRequest>.
745
+ *
746
+ * @param string $class (Optional) The name of the new class to use for this functionality.
747
+ * @return $this A reference to the current instance.
748
+ */
749
+ public function set_batch_class($class = 'CFBatchRequest')
750
+ {
751
+ $this->batch_class = $class;
752
+ return $this;
753
+ }
754
+
755
+
756
+ /*%******************************************************************************************%*/
757
+ // AUTHENTICATION
758
+
759
+ /**
760
+ * Default, shared method for authenticating a connection to AWS. Overridden on a class-by-class basis
761
+ * as necessary.
762
+ *
763
+ * @param string $action (Required) Indicates the action to perform.
764
+ * @param array $opt (Optional) An associative array of parameters for authenticating. See the individual methods for allowed keys.
765
+ * @param string $domain (Optional) The URL of the queue to perform the action on.
766
+ * @param integer $signature_version (Optional) The signature version to use. Defaults to 2.
767
+ * @param integer $redirects (Do Not Use) Used internally by this function on occasions when Amazon S3 returns a redirect code and it needs to call itself recursively.
768
+ * @return CFResponse Object containing a parsed HTTP response.
769
+ */
770
+ public function authenticate($action, $opt = null, $domain = null, $signature_version = 2, $redirects = 0)
771
+ {
772
+ // Handle nulls
773
+ if (is_null($signature_version))
774
+ {
775
+ $signature_version = 2;
776
+ }
777
+
778
+ $method_arguments = func_get_args();
779
+ $headers = array();
780
+ $signed_headers = array();
781
+
782
+ // Use the caching flow to determine if we need to do a round-trip to the server.
783
+ if ($this->use_cache_flow)
784
+ {
785
+ // Generate an identifier specific to this particular set of arguments.
786
+ $cache_id = $this->key . '_' . get_class($this) . '_' . $action . '_' . sha1(serialize($method_arguments));
787
+
788
+ // Instantiate the appropriate caching object.
789
+ $this->cache_object = new $this->cache_class($cache_id, $this->cache_location, $this->cache_expires, $this->cache_compress);
790
+
791
+ if ($this->delete_cache)
792
+ {
793
+ $this->use_cache_flow = false;
794
+ $this->delete_cache = false;
795
+ return $this->cache_object->delete();
796
+ }
797
+
798
+ // Invoke the cache callback function to determine whether to pull data from the cache or make a fresh request.
799
+ $data = $this->cache_object->response_manager(array($this, 'cache_callback'), $method_arguments);
800
+
801
+ // Parse the XML body
802
+ $data = $this->parse_callback($data);
803
+
804
+ // End!
805
+ return $data;
806
+ }
807
+
808
+ $return_curl_handle = false;
809
+ $x_amz_target = null;
810
+
811
+ // Do we have a custom resource prefix?
812
+ if ($this->resource_prefix)
813
+ {
814
+ $domain .= $this->resource_prefix;
815
+ }
816
+
817
+ // Determine signing values
818
+ $current_time = time() + $this->adjust_offset;
819
+ $date = gmdate(CFUtilities::DATE_FORMAT_RFC2616, $current_time);
820
+ $timestamp = gmdate(CFUtilities::DATE_FORMAT_ISO8601, $current_time);
821
+ $nonce = $this->util->generate_guid();
822
+
823
+ // Manage the key-value pairs that are used in the query.
824
+ if (stripos($action, 'x-amz-target') !== false)
825
+ {
826
+ $x_amz_target = trim(str_ireplace('x-amz-target:', '', $action));
827
+ }
828
+ else
829
+ {
830
+ $query['Action'] = $action;
831
+ }
832
+ $query['Version'] = $this->api_version;
833
+
834
+ // Only Signature v2
835
+ if ($signature_version === 2)
836
+ {
837
+ $query['AWSAccessKeyId'] = $this->key;
838
+ $query['SignatureMethod'] = 'HmacSHA256';
839
+ $query['SignatureVersion'] = 2;
840
+ $query['Timestamp'] = $timestamp;
841
+ }
842
+
843
+ // Merge in any options that were passed in
844
+ if (is_array($opt))
845
+ {
846
+ $query = array_merge($query, $opt);
847
+ }
848
+
849
+ $return_curl_handle = isset($query['returnCurlHandle']) ? $query['returnCurlHandle'] : false;
850
+ unset($query['returnCurlHandle']);
851
+
852
+ // Do a case-sensitive, natural order sort on the array keys.
853
+ uksort($query, 'strcmp');
854
+
855
+ // Normalize JSON input
856
+ if (isset($query['body']) && $query['body'] === '[]')
857
+ {
858
+ $query['body'] = '{}';
859
+ }
860
+
861
+ if ($this->use_aws_query)
862
+ {
863
+ // Create the string that needs to be hashed.
864
+ $canonical_query_string = $this->util->to_signable_string($query);
865
+ }
866
+ else
867
+ {
868
+ // Create the string that needs to be hashed.
869
+ $canonical_query_string = $this->util->encode_signature2($query['body']);
870
+ }
871
+
872
+ // Remove the default scheme from the domain.
873
+ $domain = str_replace(array('http://', 'https://'), '', $domain);
874
+
875
+ // Parse our request.
876
+ $parsed_url = parse_url('http://' . $domain);
877
+
878
+ // Set the proper host header.
879
+ if (isset($parsed_url['port']) && (integer) $parsed_url['port'] !== 80 && (integer) $parsed_url['port'] !== 443)
880
+ {
881
+ $host_header = strtolower($parsed_url['host']) . ':' . $parsed_url['port'];
882
+ }
883
+ else
884
+ {
885
+ $host_header = strtolower($parsed_url['host']);
886
+ }
887
+
888
+ // Set the proper request URI.
889
+ $request_uri = isset($parsed_url['path']) ? $parsed_url['path'] : '/';
890
+
891
+ if ($signature_version === 2)
892
+ {
893
+ // Prepare the string to sign
894
+ $string_to_sign = "POST\n$host_header\n$request_uri\n$canonical_query_string";
895
+
896
+ // Hash the AWS secret key and generate a signature for the request.
897
+ $query['Signature'] = base64_encode(hash_hmac('sha256', $string_to_sign, $this->secret_key, true));
898
+ }
899
+
900
+ // Generate the querystring from $query
901
+ $querystring = $this->util->to_query_string($query);
902
+
903
+ // Gather information to pass along to other classes.
904
+ $helpers = array(
905
+ 'utilities' => $this->utilities_class,
906
+ 'request' => $this->request_class,
907
+ 'response' => $this->response_class,
908
+ );
909
+
910
+ // Compose the request.
911
+ $request_url = ($this->use_ssl ? 'https://' : 'http://') . $domain;
912
+ $request_url .= !isset($parsed_url['path']) ? '/' : '';
913
+
914
+ // Instantiate the request class
915
+ $request = new $this->request_class($request_url, $this->proxy, $helpers);
916
+ $request->set_method('POST');
917
+ $request->set_body($querystring);
918
+ $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
919
+
920
+ // Do we have an authentication token?
921
+ if ($this->auth_token)
922
+ {
923
+ $headers['X-Amz-Security-Token'] = $this->auth_token;
924
+ }
925
+
926
+ // Signing using X-Amz-Target is handled differently.
927
+ if ($signature_version === 3 && $x_amz_target)
928
+ {
929
+ $headers['X-Amz-Target'] = $x_amz_target;
930
+ $headers['Content-Type'] = 'application/json; amzn-1.0';
931
+ $headers['Content-Encoding'] = 'amz-1.0';
932
+
933
+ $request->set_body($query['body']);
934
+ $querystring = $query['body'];
935
+ }
936
+
937
+ // Pass along registered stream callbacks
938
+ if ($this->registered_streaming_read_callback)
939
+ {
940
+ $request->register_streaming_read_callback($this->registered_streaming_read_callback);
941
+ }
942
+
943
+ if ($this->registered_streaming_write_callback)
944
+ {
945
+ $request->register_streaming_write_callback($this->registered_streaming_write_callback);
946
+ }
947
+
948
+ // Add authentication headers
949
+ if ($signature_version === 3)
950
+ {
951
+ $headers['X-Amz-Nonce'] = $nonce;
952
+ $headers['Date'] = $date;
953
+ $headers['Content-Length'] = strlen($querystring);
954
+ $headers['Content-MD5'] = $this->util->hex_to_base64(md5($querystring));
955
+ $headers['Host'] = $host_header;
956
+ }
957
+
958
+ // Sort headers
959
+ uksort($headers, 'strnatcasecmp');
960
+
961
+ if ($signature_version === 3 && $this->use_ssl)
962
+ {
963
+ // Prepare the string to sign (HTTPS)
964
+ $string_to_sign = $date . $nonce;
965
+ }
966
+ elseif ($signature_version === 3 && !$this->use_ssl)
967
+ {
968
+ // Prepare the string to sign (HTTP)
969
+ $string_to_sign = "POST\n$request_uri\n\n";
970
+ }
971
+
972
+ // Add headers to request and compute the string to sign
973
+ foreach ($headers as $header_key => $header_value)
974
+ {
975
+ // Strip linebreaks from header values as they're illegal and can allow for security issues
976
+ $header_value = str_replace(array("\r", "\n"), '', $header_value);
977
+
978
+ // Add the header if it has a value
979
+ if ($header_value !== '')
980
+ {
981
+ $request->add_header($header_key, $header_value);
982
+ }
983
+
984
+ // Signature v3 over HTTP
985
+ if ($signature_version === 3 && !$this->use_ssl)
986
+ {
987
+ // Generate the string to sign
988
+ if (
989
+ substr(strtolower($header_key), 0, 8) === 'content-' ||
990
+ strtolower($header_key) === 'date' ||
991
+ strtolower($header_key) === 'expires' ||
992
+ strtolower($header_key) === 'host' ||
993
+ substr(strtolower($header_key), 0, 6) === 'x-amz-'
994
+ )
995
+ {
996
+ $string_to_sign .= strtolower($header_key) . ':' . $header_value . "\n";
997
+ $signed_headers[] = $header_key;
998
+ }
999
+ }
1000
+ }
1001
+
1002
+ if ($signature_version === 3)
1003
+ {
1004
+ if (!$this->use_ssl)
1005
+ {
1006
+ $string_to_sign .= "\n";
1007
+
1008
+ if (isset($query['body']) && $query['body'] !== '')
1009
+ {
1010
+ $string_to_sign .= $query['body'];
1011
+ }
1012
+
1013
+ // Convert from string-to-sign to bytes-to-sign
1014
+ $bytes_to_sign = hash('sha256', $string_to_sign, true);
1015
+
1016
+ // Hash the AWS secret key and generate a signature for the request.
1017
+ $signature = base64_encode(hash_hmac('sha256', $bytes_to_sign, $this->secret_key, true));
1018
+ }
1019
+ else
1020
+ {
1021
+ // Hash the AWS secret key and generate a signature for the request.
1022
+ $signature = base64_encode(hash_hmac('sha256', $string_to_sign, $this->secret_key, true));
1023
+ }
1024
+
1025
+ $headers['X-Amzn-Authorization'] = 'AWS3' . ($this->use_ssl ? '-HTTPS' : '')
1026
+ . ' AWSAccessKeyId=' . $this->key
1027
+ . ',Algorithm=HmacSHA256'
1028
+ . ',SignedHeaders=' . implode(';', $signed_headers)
1029
+ . ',Signature=' . $signature;
1030
+
1031
+ $request->add_header('X-Amzn-Authorization', $headers['X-Amzn-Authorization']);
1032
+ }
1033
+
1034
+ // Update RequestCore settings
1035
+ $request->request_class = $this->request_class;
1036
+ $request->response_class = $this->response_class;
1037
+ $request->ssl_verification = $this->ssl_verification;
1038
+
1039
+ $curlopts = array();
1040
+
1041
+ // Set custom CURLOPT settings
1042
+ if (is_array($opt) && isset($opt['curlopts']))
1043
+ {
1044
+ $curlopts = $opt['curlopts'];
1045
+ unset($opt['curlopts']);
1046
+ }
1047
+
1048
+ // Debug mode
1049
+ if ($this->debug_mode)
1050
+ {
1051
+ $request->debug_mode = $this->debug_mode;
1052
+ }
1053
+
1054
+ if (count($curlopts))
1055
+ {
1056
+ $request->set_curlopts($curlopts);
1057
+ }
1058
+
1059
+ // Manage the (newer) batch request API or the (older) returnCurlHandle setting.
1060
+ if ($this->use_batch_flow)
1061
+ {
1062
+ $handle = $request->prep_request();
1063
+ $this->batch_object->add($handle);
1064
+ $this->use_batch_flow = false;
1065
+
1066
+ return $handle;
1067
+ }
1068
+ elseif ($return_curl_handle)
1069
+ {
1070
+ return $request->prep_request();
1071
+ }
1072
+
1073
+ // Send!
1074
+ $request->send_request();
1075
+
1076
+ $request_headers = $headers;
1077
+
1078
+ // Prepare the response.
1079
+ $headers = $request->get_response_header();
1080
+ $headers['x-aws-stringtosign'] = $string_to_sign;
1081
+ $headers['x-aws-request-headers'] = $request_headers;
1082
+ $headers['x-aws-body'] = $querystring;
1083
+
1084
+ $data = new $this->response_class($headers, $this->parse_callback($request->get_response_body(), $headers), $request->get_response_code());
1085
+
1086
+ // Was it Amazon's fault the request failed? Retry the request until we reach $max_retries.
1087
+ if ((integer) $request->get_response_code() === 500 || (integer) $request->get_response_code() === 503)
1088
+ {
1089
+ if ($redirects <= $this->max_retries)
1090
+ {
1091
+ // Exponential backoff
1092
+ $delay = (integer) (pow(4, $redirects) * 100000);
1093
+ usleep($delay);
1094
+ $data = $this->authenticate($action, $opt, $domain, $signature_version, ++$redirects);
1095
+ }
1096
+ }
1097
+
1098
+ return $data;
1099
+ }
1100
+
1101
+
1102
+ /*%******************************************************************************************%*/
1103
+ // BATCH REQUEST LAYER
1104
+
1105
+ /**
1106
+ * Specifies that the intended request should be queued for a later batch request.
1107
+ *
1108
+ * @param CFBatchRequest $queue (Optional) The <CFBatchRequest> instance to use for managing batch requests. If not available, it generates a new instance of <CFBatchRequest>.
1109
+ * @return $this A reference to the current instance.
1110
+ */
1111
+ public function batch(CFBatchRequest &$queue = null)
1112
+ {
1113
+ if ($queue)
1114
+ {
1115
+ $this->batch_object = $queue;
1116
+ }
1117
+ elseif ($this->internal_batch_object)
1118
+ {
1119
+ $this->batch_object = &$this->internal_batch_object;
1120
+ }
1121
+ else
1122
+ {
1123
+ $this->internal_batch_object = new $this->batch_class();
1124
+ $this->batch_object = &$this->internal_batch_object;
1125
+ }
1126
+
1127
+ $this->use_batch_flow = true;
1128
+
1129
+ return $this;
1130
+ }
1131
+
1132
+ /**
1133
+ * Executes the batch request queue by sending all queued requests.
1134
+ *
1135
+ * @param boolean $clear_after_send (Optional) Whether or not to clear the batch queue after sending a request. Defaults to `true`. Set this to `false` if you are caching batch responses and want to retrieve results later.
1136
+ * @return array An array of <CFResponse> objects.
1137
+ */
1138
+ public function send($clear_after_send = true)
1139
+ {
1140
+ if ($this->use_batch_flow)
1141
+ {
1142
+ // When we send the request, disable batch flow.
1143
+ $this->use_batch_flow = false;
1144
+
1145
+ // If we're not caching, simply send the request.
1146
+ if (!$this->use_cache_flow)
1147
+ {
1148
+ $response = $this->batch_object->send();
1149
+ $parsed_data = array_map(array($this, 'parse_callback'), $response);
1150
+ $parsed_data = new CFArray($parsed_data);
1151
+
1152
+ // Clear the queue
1153
+ if ($clear_after_send)
1154
+ {
1155
+ $this->batch_object->queue = array();
1156
+ }
1157
+
1158
+ return $parsed_data;
1159
+ }
1160
+
1161
+ // Generate an identifier specific to this particular set of arguments.
1162
+ $cache_id = $this->key . '_' . get_class($this) . '_' . sha1(serialize($this->batch_object));
1163
+
1164
+ // Instantiate the appropriate caching object.
1165
+ $this->cache_object = new $this->cache_class($cache_id, $this->cache_location, $this->cache_expires, $this->cache_compress);
1166
+
1167
+ if ($this->delete_cache)
1168
+ {
1169
+ $this->use_cache_flow = false;
1170
+ $this->delete_cache = false;
1171
+ return $this->cache_object->delete();
1172
+ }
1173
+
1174
+ // Invoke the cache callback function to determine whether to pull data from the cache or make a fresh request.
1175
+ $data_set = $this->cache_object->response_manager(array($this, 'cache_callback_batch'), array($this->batch_object));
1176
+ $parsed_data = array_map(array($this, 'parse_callback'), $data_set);
1177
+ $parsed_data = new CFArray($parsed_data);
1178
+
1179
+ // Clear the queue
1180
+ if ($clear_after_send)
1181
+ {
1182
+ $this->batch_object->queue = array();
1183
+ }
1184
+
1185
+ // End!
1186
+ return $parsed_data;
1187
+ }
1188
+
1189
+ // Load the class
1190
+ $null = new CFBatchRequest();
1191
+ unset($null);
1192
+
1193
+ throw new CFBatchRequest_Exception('You must use $object->batch()->send()');
1194
+ }
1195
+
1196
+ /**
1197
+ * Parses a response body into a PHP object if appropriate.
1198
+ *
1199
+ * @param CFResponse|string $response (Required) The <CFResponse> object to parse, or an XML string that would otherwise be a response body.
1200
+ * @param string $content_type (Optional) The content-type to use when determining how to parse the content.
1201
+ * @return CFResponse|string A parsed <CFResponse> object, or parsed XML.
1202
+ */
1203
+ public function parse_callback($response, $headers = null)
1204
+ {
1205
+ // Shorten this so we have a (mostly) single code path
1206
+ if (isset($response->body))
1207
+ {
1208
+ if (is_string($response->body))
1209
+ {
1210
+ $body = $response->body;
1211
+ }
1212
+ else
1213
+ {
1214
+ return $response;
1215
+ }
1216
+ }
1217
+ elseif (is_string($response))
1218
+ {
1219
+ $body = $response;
1220
+ }
1221
+ else
1222
+ {
1223
+ return $response;
1224
+ }
1225
+
1226
+ // Decompress gzipped content
1227
+ if (isset($headers['content-encoding']))
1228
+ {
1229
+ switch (strtolower(trim($headers['content-encoding'], "\x09\x0A\x0D\x20")))
1230
+ {
1231
+ case 'gzip':
1232
+ case 'x-gzip':
1233
+ if (strpos($headers['_info']['url'], 'monitoring.') !== false)
1234
+ {
1235
+ // CloudWatch incorrectly uses the deflate algorithm when they say gzip.
1236
+ if (($uncompressed = gzuncompress($body)) !== false)
1237
+ {
1238
+ $body = $uncompressed;
1239
+ }
1240
+ elseif (($uncompressed = gzinflate($body)) !== false)
1241
+ {
1242
+ $body = $uncompressed;
1243
+ }
1244
+ break;
1245
+ }
1246
+ else
1247
+ {
1248
+ // Everyone else uses gzip correctly.
1249
+ $decoder = new CFGzipDecode($body);
1250
+ if ($decoder->parse())
1251
+ {
1252
+ $body = $decoder->data;
1253
+ }
1254
+ break;
1255
+ }
1256
+
1257
+ case 'deflate':
1258
+ if (strpos($headers['_info']['url'], 'monitoring.') !== false)
1259
+ {
1260
+ // CloudWatch incorrectly does nothing when they say deflate.
1261
+ continue;
1262
+ }
1263
+ else
1264
+ {
1265
+ // Everyone else uses deflate correctly.
1266
+ if (($uncompressed = gzuncompress($body)) !== false)
1267
+ {
1268
+ $body = $uncompressed;
1269
+ }
1270
+ elseif (($uncompressed = gzinflate($body)) !== false)
1271
+ {
1272
+ $body = $uncompressed;
1273
+ }
1274
+ }
1275
+ break;
1276
+ }
1277
+ }
1278
+
1279
+ // Look for XML cues
1280
+ if (
1281
+ (isset($headers['content-type']) && ($headers['content-type'] === 'text/xml' || $headers['content-type'] === 'application/xml')) || // We know it's XML
1282
+ (!isset($headers['content-type']) && (stripos($body, '<?xml') === 0 || strpos($body, '<Error>') === 0) || preg_match('/^<(\w*) xmlns="http(s?):\/\/(\w*).amazon(aws)?.com/im', $body)) // Sniff for XML
1283
+ )
1284
+ {
1285
+ // Strip the default XML namespace to simplify XPath expressions
1286
+ $body = str_replace("xmlns=", "ns=", $body);
1287
+
1288
+ // Parse the XML body
1289
+ $body = new $this->parser_class($body);
1290
+ }
1291
+ // Look for JSON cues
1292
+ elseif (
1293
+ (isset($headers['content-type']) && $headers['content-type'] === 'application/json') || // We know it's JSON
1294
+ (!isset($headers['content-type']) && $this->util->is_json($body)) // Sniff for JSON
1295
+ )
1296
+ {
1297
+ // Normalize JSON to a CFSimpleXML object
1298
+ $body = CFJSON::to_xml($body);
1299
+ }
1300
+
1301
+ // Put the parsed data back where it goes
1302
+ if (isset($response->body))
1303
+ {
1304
+ $response->body = $body;
1305
+ }
1306
+ else
1307
+ {
1308
+ $response = $body;
1309
+ }
1310
+
1311
+ return $response;
1312
+ }
1313
+
1314
+
1315
+ /*%******************************************************************************************%*/
1316
+ // CACHING LAYER
1317
+
1318
+ /**
1319
+ * Specifies that the resulting <CFResponse> object should be cached according to the settings from
1320
+ * <set_cache_config()>.
1321
+ *
1322
+ * @param string|integer $expires (Required) The time the cache is to expire. Accepts a number of seconds as an integer, or an amount of time, as a string, that is understood by <php:strtotime()> (e.g. "1 hour").
1323
+ * @param $this A reference to the current instance.
1324
+ * @return $this
1325
+ */
1326
+ public function cache($expires)
1327
+ {
1328
+ // Die if they haven't used set_cache_config().
1329
+ if (!$this->cache_class)
1330
+ {
1331
+ throw new CFRuntime_Exception('Must call set_cache_config() before using cache()');
1332
+ }
1333
+
1334
+ if (is_string($expires))
1335
+ {
1336
+ $expires = strtotime($expires);
1337
+ $this->cache_expires = $expires - time();
1338
+ }
1339
+ elseif (is_int($expires))
1340
+ {
1341
+ $this->cache_expires = $expires;
1342
+ }
1343
+
1344
+ $this->use_cache_flow = true;
1345
+
1346
+ return $this;
1347
+ }
1348
+
1349
+ /**
1350
+ * The callback function that is executed when the cache doesn't exist or has expired. The response of
1351
+ * this method is cached. Accepts identical parameters as the <authenticate()> method. Never call this
1352
+ * method directly -- it is used internally by the caching system.
1353
+ *
1354
+ * @param string $action (Required) Indicates the action to perform.
1355
+ * @param array $opt (Optional) An associative array of parameters for authenticating. See the individual methods for allowed keys.
1356
+ * @param string $domain (Optional) The URL of the queue to perform the action on.
1357
+ * @param integer $signature_version (Optional) The signature version to use. Defaults to 2.
1358
+ * @return CFResponse A parsed HTTP response.
1359
+ */
1360
+ public function cache_callback($action, $opt = null, $domain = null, $signature_version = 2)
1361
+ {
1362
+ // Disable the cache flow since it's already been handled.
1363
+ $this->use_cache_flow = false;
1364
+
1365
+ // Make the request
1366
+ $response = $this->authenticate($action, $opt, $domain, $signature_version);
1367
+
1368
+ // If this is an XML document, convert it back to a string.
1369
+ if (isset($response->body) && ($response->body instanceof SimpleXMLElement))
1370
+ {
1371
+ $response->body = $response->body->asXML();
1372
+ }
1373
+
1374
+ return $response;
1375
+ }
1376
+
1377
+ /**
1378
+ * Used for caching the results of a batch request. Never call this method directly; it is used
1379
+ * internally by the caching system.
1380
+ *
1381
+ * @param CFBatchRequest $batch (Required) The batch request object to send.
1382
+ * @return CFResponse A parsed HTTP response.
1383
+ */
1384
+ public function cache_callback_batch(CFBatchRequest $batch)
1385
+ {
1386
+ return $batch->send();
1387
+ }
1388
+
1389
+ /**
1390
+ * Deletes a cached <CFResponse> object using the specified cache storage type.
1391
+ *
1392
+ * @return boolean A value of `true` if cached object exists and is successfully deleted, otherwise `false`.
1393
+ */
1394
+ public function delete_cache()
1395
+ {
1396
+ $this->use_cache_flow = true;
1397
+ $this->delete_cache = true;
1398
+
1399
+ return $this;
1400
+ }
1401
+ }
1402
+
1403
+
1404
+ /**
1405
+ * Contains the functionality for auto-loading service classes.
1406
+ */
1407
+ class CFLoader
1408
+ {
1409
+
1410
+ /*%******************************************************************************************%*/
1411
+ // AUTO-LOADER
1412
+
1413
+ /**
1414
+ * Automatically load classes that aren't included.
1415
+ *
1416
+ * @param string $class (Required) The classname to load.
1417
+ * @return void
1418
+ */
1419
+ public static function autoloader($class)
1420
+ {
1421
+ $path = dirname(__FILE__) . DIRECTORY_SEPARATOR;
1422
+
1423
+ // Amazon SDK classes
1424
+ if (strstr($class, 'Amazon'))
1425
+ {
1426
+ $path .= 'services' . DIRECTORY_SEPARATOR . str_ireplace('Amazon', '', strtolower($class)) . '.class.php';
1427
+ }
1428
+
1429
+ // Utility classes
1430
+ elseif (strstr($class, 'CF'))
1431
+ {
1432
+ $path .= 'utilities' . DIRECTORY_SEPARATOR . str_ireplace('CF', '', strtolower($class)) . '.class.php';
1433
+ }
1434
+
1435
+ // Load CacheCore
1436
+ elseif (strstr($class, 'Cache'))
1437
+ {
1438
+ if (file_exists($ipath = 'lib' . DIRECTORY_SEPARATOR . 'cachecore' . DIRECTORY_SEPARATOR . 'icachecore.interface.php'))
1439
+ {
1440
+ require_once($ipath);
1441
+ }
1442
+
1443
+ $path .= 'lib' . DIRECTORY_SEPARATOR . 'cachecore' . DIRECTORY_SEPARATOR . strtolower($class) . '.class.php';
1444
+ }
1445
+
1446
+ // Load RequestCore
1447
+ elseif (strstr($class, 'RequestCore') || strstr($class, 'ResponseCore'))
1448
+ {
1449
+ $path .= 'lib' . DIRECTORY_SEPARATOR . 'requestcore' . DIRECTORY_SEPARATOR . 'requestcore.class.php';
1450
+ }
1451
+
1452
+ // Load Symfony YAML classes
1453
+ elseif (strstr($class, 'sfYaml'))
1454
+ {
1455
+ $path .= 'lib' . DIRECTORY_SEPARATOR . 'yaml' . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'sfYaml.php';
1456
+ }
1457
+
1458
+ // Fall back to the 'extensions' directory.
1459
+ elseif (defined('AWS_ENABLE_EXTENSIONS') && AWS_ENABLE_EXTENSIONS)
1460
+ {
1461
+ $path .= 'extensions' . DIRECTORY_SEPARATOR . strtolower($class) . '.class.php';
1462
+ }
1463
+
1464
+ if (file_exists($path) && !is_dir($path))
1465
+ {
1466
+ require_once($path);
1467
+ }
1468
+ }
1469
+ }
1470
+
1471
+ // Register the autoloader.
1472
+ spl_autoload_register(array('CFLoader', 'autoloader'));
app/libs/aws/services/as.class.php CHANGED
@@ -1,932 +1,919 @@
1
- <?php
2
- /*
3
- * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- /**
18
- *
19
- *
20
- * Auto Scaling is a web service designed to automatically launch or terminate EC2 instances based on user-defined
21
- * policies, schedules, and health checks. Auto Scaling responds automatically to changing conditions. All you need to do
22
- * is specify how it should respond to those changes.
23
- *
24
- * Auto Scaling groups can work across multiple Availability Zones - distinct physical locations for the hosted Amazon EC2
25
- * instances - so that if an Availability Zone becomes unavailable, Auto Scaling will automatically redistribute
26
- * applications to a different Availability Zone.
27
- *
28
- * Every API call returns a response meta data object that contains a request identifier. Successful requests return an
29
- * HTTP 200 status code. Unsuccessful requests return an error object and an HTTP status code of 400 or 500.
30
- *
31
- * The current WSDL is available at:
32
- *
33
- * <a
34
- * ling.amazonaws.com/doc/2010-08-01/AutoScaling.wsdl">http://autoscaling.amazonaws.com/doc/2010-08-01/AutoScaling.wsdl</a>
35
- *
36
- * <b>Endpoints</b>
37
- *
38
- * Auto Scaling supports the following region-specific endpoints:
39
- *
40
- * <ul> <li>autoscaling.us-east-1.amazonaws.com</li>
41
- *
42
- * <li>autoscaling.us-west-1.amazonaws.com</li>
43
- *
44
- * <li>autoscaling.eu-west-1.amazonaws.com</li>
45
- *
46
- * <li>autoscaling.ap-southeast-1.amazonaws.com</li>
47
- *
48
- * </ul>
49
- *
50
- * @version Fri Mar 25 13:12:03 PDT 2011
51
- * @license See the included NOTICE.md file for complete information.
52
- * @copyright See the included NOTICE.md file for complete information.
53
- * @link http://aws.amazon.com/autoscaling/Amazon Auto-Scaling
54
- * @link http://aws.amazon.com/documentation/autoscaling/Amazon Auto-Scaling documentation
55
- */
56
- class AmazonAS extends CFRuntime
57
- {
58
-
59
- /*%******************************************************************************************%*/
60
- // CLASS CONSTANTS
61
-
62
- /**
63
- * Specify the default queue URL.
64
- */
65
- const DEFAULT_URL = 'autoscaling.us-east-1.amazonaws.com';
66
-
67
- /**
68
- * Specify the queue URL for the US-East (Northern Virginia) Region.
69
- */
70
- const REGION_US_E1 = self::DEFAULT_URL;
71
-
72
- /**
73
- * Specify the queue URL for the US-West (Northern California) Region.
74
- */
75
- const REGION_US_W1 = 'autoscaling.us-west-1.amazonaws.com';
76
-
77
- /**
78
- * Specify the queue URL for the EU (Ireland) Region.
79
- */
80
- const REGION_EU_W1 = 'autoscaling.eu-west-1.amazonaws.com';
81
-
82
- /**
83
- * Specify the queue URL for the Asia Pacific (Singapore) Region.
84
- */
85
- const REGION_APAC_SE1 = 'autoscaling.ap-southeast-1.amazonaws.com';
86
-
87
- /**
88
- * Specify the queue URL for the Asia Pacific (Japan) Region.
89
- */
90
- const REGION_APAC_NE1 = 'autoscaling.ap-northeast-1.amazonaws.com';
91
-
92
-
93
- /*%******************************************************************************************%*/
94
- // SETTERS
95
-
96
- /**
97
- * This allows you to explicitly sets the region for the service to use.
98
- *
99
- * @param string $region (Required) The region to explicitly set. Available options are <REGION_US_E1>, <REGION_US_W1>, <REGION_EU_W1>, or <REGION_APAC_SE1>.
100
- * @return $this A reference to the current instance.
101
- */
102
- public function set_region($region)
103
- {
104
- $this->set_hostname($region);
105
- return $this;
106
- }
107
-
108
-
109
- /*%******************************************************************************************%*/
110
- // CONSTRUCTOR
111
-
112
- /**
113
- * Constructs a new instance of <AmazonAS>.
114
- *
115
- * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <code>AWS_KEY</code> constant.
116
- * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant.
117
- * @return boolean false if no valid values are set, otherwise true.
118
- */
119
- public function __construct($key = null, $secret_key = null)
120
- {
121
- $this->api_version = '2010-08-01';
122
- $this->hostname = self::DEFAULT_URL;
123
-
124
- if (!$key && !defined('AWS_KEY'))
125
- {
126
- throw new AS_Exception('No account key was passed into the constructor, nor was it set in the AWS_KEY constant.');
127
- }
128
-
129
- if (!$secret_key && !defined('AWS_SECRET_KEY'))
130
- {
131
- throw new AS_Exception('No account secret was passed into the constructor, nor was it set in the AWS_SECRET_KEY constant.');
132
- }
133
-
134
- return parent::__construct($key, $secret_key);
135
- }
136
-
137
-
138
- /*%******************************************************************************************%*/
139
- // SERVICE METHODS
140
-
141
- /**
142
- *
143
- * Creates a scheduled scaling action for a Auto Scaling group. If you leave a parameter unspecified, the corresponding
144
- * value remains unchanged in the affected Auto Scaling group.
145
- *
146
- * @param string $auto_scaling_group_name (Required) The name or ARN of the Auto Scaling Group.
147
- * @param string $scheduled_action_name (Required) The name of this scaling action.
148
- * @param string $time (Required) The time for this action to start. Accepts any value that <php:strtotime()> understands.
149
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
150
- * <li><code>MinSize</code> - <code>integer</code> - Optional - The minimum size for the new Auto Scaling group. </li>
151
- * <li><code>MaxSize</code> - <code>integer</code> - Optional - The maximum size for the Auto Scaling group. </li>
152
- * <li><code>DesiredCapacity</code> - <code>integer</code> - Optional - The number of EC2 instances that should be running in the group. </li>
153
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
154
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
155
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
156
- */
157
- public function put_scheduled_update_group_action($auto_scaling_group_name, $scheduled_action_name, $time, $opt = null)
158
- {
159
- if (!$opt) $opt = array();
160
- $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
161
- $opt['ScheduledActionName'] = $scheduled_action_name;
162
- $opt['Time'] = $this->util->convert_date_to_iso8601($time);
163
-
164
- return $this->authenticate('PutScheduledUpdateGroupAction', $opt, $this->hostname);
165
- }
166
-
167
- /**
168
- *
169
- * Adjusts the desired size of the AutoScalingGroup by initiating scaling activities. When reducing the size of the group,
170
- * it is not possible to define which EC2 instances will be terminated. This applies to any auto-scaling decisions that
171
- * might result in terminating instances.
172
- *
173
- * There are two common use cases for <code>SetDesiredCapacity</code>: one for users of the Auto Scaling triggering
174
- * system, and another for developers who write their own triggering systems. Both use cases relate to the concept of
175
- * cooldown.
176
- *
177
- * In the first case, if you use the Auto Scaling triggering system, <code>SetDesiredCapacity</code> changes the size of
178
- * your Auto Scaling group without regard to the cooldown period. This could be useful, for example, if Auto Scaling did
179
- * something unexpected for some reason. If your cooldown period is 10 minutes, Auto Scaling would normally reject requests
180
- * to change the size of the group for that entire 10 minute period. The <code>SetDesiredCapacity</code> command allows you
181
- * to circumvent this restriction and change the size of the group before the end of the cooldown period.
182
- *
183
- * In the second case, if you write your own triggering system, you can use <code>SetDesiredCapacity</code> to control the
184
- * size of your Auto Scaling group. If you want the same cooldown functionality that Auto Scaling offers, you can configure
185
- * <code>SetDesiredCapacity</code> to honor cooldown by setting the <code>HonorCooldown</code> parameter to
186
- * <code>true</code>.
187
- *
188
- * @param string $auto_scaling_group_name (Required) The name of the AutoScalingGroup.
189
- * @param integer $desired_capacity (Required) The new capacity setting for the AutoScalingGroup.
190
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
191
- * <li><code>HonorCooldown</code> - <code>boolean</code> - Optional - By default, <code>SetDesiredCapacity</code> overrides any cooldown period. Set to True if you want Auto Scaling to reject this request if the Auto Scaling group is in cooldown. </li>
192
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
193
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
194
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
195
- */
196
- public function set_desired_capacity($auto_scaling_group_name, $desired_capacity, $opt = null)
197
- {
198
- if (!$opt) $opt = array();
199
- $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
200
- $opt['DesiredCapacity'] = $desired_capacity;
201
-
202
- return $this->authenticate('SetDesiredCapacity', $opt, $this->hostname);
203
- }
204
-
205
- /**
206
- *
207
- * Deletes a policy created by PutScalingPolicy
208
- *
209
- * @param string $policy_name (Required) The name or PolicyARN of the policy you want to delete
210
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
211
- * <li><code>AutoScalingGroupName</code> - <code>string</code> - Optional - The name of the Auto Scaling group. </li>
212
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
213
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
214
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
215
- */
216
- public function delete_policy($policy_name, $opt = null)
217
- {
218
- if (!$opt) $opt = array();
219
- $opt['PolicyName'] = $policy_name;
220
-
221
- return $this->authenticate('DeletePolicy', $opt, $this->hostname);
222
- }
223
-
224
- /**
225
- *
226
- * Deletes a scheduled action previously created using the PutScheduledUpdateGroupAction.
227
- *
228
- * @param string $scheduled_action_name (Required) The name of the action you want to delete.
229
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
230
- * <li><code>AutoScalingGroupName</code> - <code>string</code> - Optional - The name of the Auto Scaling group </li>
231
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
232
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
233
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
234
- */
235
- public function delete_scheduled_action($scheduled_action_name, $opt = null)
236
- {
237
- if (!$opt) $opt = array();
238
- $opt['ScheduledActionName'] = $scheduled_action_name;
239
-
240
- return $this->authenticate('DeleteScheduledAction', $opt, $this->hostname);
241
- }
242
-
243
- /**
244
- *
245
- * Returns a full description of the launch configurations given the specified names.
246
- *
247
- * If no names are specified, then the full details of all launch configurations are returned.
248
- *
249
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
250
- * <li><code>LaunchConfigurationNames</code> - <code>string|array</code> - Optional - A list of launch configuration names. Pass a string for a single value, or an indexed array for multiple values. </li>
251
- * <li><code>NextToken</code> - <code>string</code> - Optional - A string that marks the start of the next batch of returned results. </li>
252
- * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of launch configurations. </li>
253
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
254
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
255
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
256
- */
257
- public function describe_launch_configurations($opt = null)
258
- {
259
- if (!$opt) $opt = array();
260
-
261
- // Optional parameter
262
- if (isset($opt['LaunchConfigurationNames']))
263
- {
264
- $opt = array_merge($opt, CFComplexType::map(array(
265
- 'LaunchConfigurationNames' => (is_array($opt['LaunchConfigurationNames']) ? $opt['LaunchConfigurationNames'] : array($opt['LaunchConfigurationNames']))
266
- ), 'member'));
267
- unset($opt['LaunchConfigurationNames']);
268
- }
269
-
270
- return $this->authenticate('DescribeLaunchConfigurations', $opt, $this->hostname);
271
- }
272
-
273
- /**
274
- *
275
- * Returns scaling process types for use in the ResumeProcesses and SuspendProcesses actions.
276
- *
277
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
278
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
279
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
280
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
281
- */
282
- public function describe_scaling_process_types($opt = null)
283
- {
284
- if (!$opt) $opt = array();
285
-
286
- return $this->authenticate('DescribeScalingProcessTypes', $opt, $this->hostname);
287
- }
288
-
289
- /**
290
- *
291
- * Returns a full description of each Auto Scaling group in the given list. This includes all Amazon EC2 instances that
292
- * are members of the group. If a list of names is not provided, the service returns the full details of all Auto Scaling
293
- * groups.
294
- *
295
- * This action supports pagination by returning a token if there are more pages to retrieve. To get the next page, call
296
- * this action again with the returned token as the NextToken parameter.
297
- *
298
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
299
- * <li><code>AutoScalingGroupNames</code> - <code>string|array</code> - Optional - A list of Auto Scaling group names. Pass a string for a single value, or an indexed array for multiple values. </li>
300
- * <li><code>NextToken</code> - <code>string</code> - Optional - A string that marks the start of the next batch of returned results. </li>
301
- * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of records to return. </li>
302
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
303
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
304
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
305
- */
306
- public function describe_auto_scaling_groups($opt = null)
307
- {
308
- if (!$opt) $opt = array();
309
-
310
- // Optional parameter
311
- if (isset($opt['AutoScalingGroupNames']))
312
- {
313
- $opt = array_merge($opt, CFComplexType::map(array(
314
- 'AutoScalingGroupNames' => (is_array($opt['AutoScalingGroupNames']) ? $opt['AutoScalingGroupNames'] : array($opt['AutoScalingGroupNames']))
315
- ), 'member'));
316
- unset($opt['AutoScalingGroupNames']);
317
- }
318
-
319
- return $this->authenticate('DescribeAutoScalingGroups', $opt, $this->hostname);
320
- }
321
-
322
- /**
323
- *
324
- * Enables monitoring of group metrics for the Auto Scaling group specified in AutoScalingGroupName. You can specify the
325
- * list of enabled metrics with the Metrics parameter.
326
- *
327
- * Auto scaling metrics collection can be turned on only if the <code>InstanceMonitoring.Enabled</code> flag, in the Auto
328
- * Scaling group's launch configuration, is set to <code>true</code>.
329
- *
330
- * @param string $auto_scaling_group_name (Required) The name or ARN of the Auto Scaling Group.
331
- * @param string $granularity (Required) The granularity to associate with the metrics to collect. Currently, the only legal granularity is "1Minute".
332
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
333
- * <li><code>Metrics</code> - <code>string|array</code> - Optional - The list of metrics to collect. If no metrics are specified, all metrics are enabled. The following metrics are supported: <ul> <li>GroupMinSize</li><li>GroupMaxSize</li><li>GroupDesiredCapacity</li><li>GroupInServiceInstances</li><li>GroupPendingInstances</li><li>GroupTerminatingInstances</li><li>GroupTotalInstances</li> </ul> Pass a string for a single value, or an indexed array for multiple values. </li>
334
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
335
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
336
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
337
- */
338
- public function enable_metrics_collection($auto_scaling_group_name, $granularity, $opt = null)
339
- {
340
- if (!$opt) $opt = array();
341
- $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
342
-
343
- // Optional parameter
344
- if (isset($opt['Metrics']))
345
- {
346
- $opt = array_merge($opt, CFComplexType::map(array(
347
- 'Metrics' => (is_array($opt['Metrics']) ? $opt['Metrics'] : array($opt['Metrics']))
348
- ), 'member'));
349
- unset($opt['Metrics']);
350
- }
351
- $opt['Granularity'] = $granularity;
352
-
353
- return $this->authenticate('EnableMetricsCollection', $opt, $this->hostname);
354
- }
355
-
356
- /**
357
- *
358
- * Terminates the specified instance. Optionally, the desired group size can be adjusted.
359
- *
360
- * This call simply registers a termination request. The termination of the instance cannot happen immediately.
361
- *
362
- * @param string $instance_id (Required) The ID of the EC2 instance to be terminated.
363
- * @param boolean $should_decrement_desired_capacity (Required) Specifies whether (<i>true</i>) or not (<i>false</i>) terminating this instance should also decrement the size of the AutoScalingGroup.
364
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
365
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
366
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
367
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
368
- */
369
- public function terminate_instance_in_auto_scaling_group($instance_id, $should_decrement_desired_capacity, $opt = null)
370
- {
371
- if (!$opt) $opt = array();
372
- $opt['InstanceId'] = $instance_id;
373
- $opt['ShouldDecrementDesiredCapacity'] = $should_decrement_desired_capacity;
374
-
375
- return $this->authenticate('TerminateInstanceInAutoScalingGroup', $opt, $this->hostname);
376
- }
377
-
378
- /**
379
- *
380
- * Returns the scaling activities for the specified Auto Scaling group.
381
- *
382
- * If the specified <i>ActivityIds</i> list is empty, all the activities from the past six weeks are returned. Activities
383
- * are sorted by completion time. Activities still in progress appear first on the list.
384
- *
385
- * This action supports pagination. If the response includes a token, there are more records available. To get the
386
- * additional records, repeat the request with the response token as the NextToken parameter.
387
- *
388
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
389
- * <li><code>ActivityIds</code> - <code>string|array</code> - Optional - A list containing the activity IDs of the desired scaling activities. If this list is omitted, all activities are described. If an AutoScalingGroupName is provided, the results are limited to that group. The list of requested activities cannot contain more than 50 items. If unknown activities are requested, they are ignored with no error. Pass a string for a single value, or an indexed array for multiple values. </li>
390
- * <li><code>AutoScalingGroupName</code> - <code>string</code> - Optional - The name of the AutoScalingGroup. </li>
391
- * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of scaling activities to return. </li>
392
- * <li><code>NextToken</code> - <code>string</code> - Optional - A string that marks the start of the next batch of returned results for pagination. </li>
393
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
394
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
395
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
396
- */
397
- public function describe_scaling_activities($opt = null)
398
- {
399
- if (!$opt) $opt = array();
400
-
401
- // Optional parameter
402
- if (isset($opt['ActivityIds']))
403
- {
404
- $opt = array_merge($opt, CFComplexType::map(array(
405
- 'ActivityIds' => (is_array($opt['ActivityIds']) ? $opt['ActivityIds'] : array($opt['ActivityIds']))
406
- ), 'member'));
407
- unset($opt['ActivityIds']);
408
- }
409
-
410
- return $this->authenticate('DescribeScalingActivities', $opt, $this->hostname);
411
- }
412
-
413
- /**
414
- *
415
- * Runs the policy you create for your Auto Scaling group in PutScalingPolicy.
416
- *
417
- * @param string $policy_name (Required) The name or PolicyARN of the policy you want to run.
418
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
419
- * <li><code>AutoScalingGroupName</code> - <code>string</code> - Optional - The name or ARN of the Auto Scaling Group. </li>
420
- * <li><code>HonorCooldown</code> - <code>boolean</code> - Optional - Set to True if you want Auto Scaling to reject this request if the Auto Scaling group is in cooldown. </li>
421
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
422
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
423
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
424
- */
425
- public function execute_policy($policy_name, $opt = null)
426
- {
427
- if (!$opt) $opt = array();
428
- $opt['PolicyName'] = $policy_name;
429
-
430
- return $this->authenticate('ExecutePolicy', $opt, $this->hostname);
431
- }
432
-
433
- /**
434
- *
435
- * Returns a list of metrics and a corresponding list of granularities for each metric.
436
- *
437
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
438
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
439
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
440
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
441
- */
442
- public function describe_metric_collection_types($opt = null)
443
- {
444
- if (!$opt) $opt = array();
445
-
446
- return $this->authenticate('DescribeMetricCollectionTypes', $opt, $this->hostname);
447
- }
448
-
449
- /**
450
- *
451
- * Returns descriptions of what each policy does. This action supports pagination. If the response includes a token, there
452
- * are more records available. To get the additional records, repeat the request with the response token as the NextToken
453
- * parameter.
454
- *
455
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
456
- * <li><code>AutoScalingGroupName</code> - <code>string</code> - Optional - The name of the Auto Scaling group. </li>
457
- * <li><code>PolicyNames</code> - <code>string|array</code> - Optional - A list of policy names or policy ARNs to be described. If this list is omitted, all policy names are described. If an auto scaling group name is provided, the results are limited to that group.The list of requested policy names cannot contain more than 50 items. If unknown policy names are requested, they are ignored with no error. Pass a string for a single value, or an indexed array for multiple values. </li>
458
- * <li><code>NextToken</code> - <code>string</code> - Optional - A string that is used to mark the start of the next batch of returned results for pagination. </li>
459
- * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of policies that will be described with each call. </li>
460
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
461
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
462
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
463
- */
464
- public function describe_policies($opt = null)
465
- {
466
- if (!$opt) $opt = array();
467
-
468
- // Optional parameter
469
- if (isset($opt['PolicyNames']))
470
- {
471
- $opt = array_merge($opt, CFComplexType::map(array(
472
- 'PolicyNames' => (is_array($opt['PolicyNames']) ? $opt['PolicyNames'] : array($opt['PolicyNames']))
473
- ), 'member'));
474
- unset($opt['PolicyNames']);
475
- }
476
-
477
- return $this->authenticate('DescribePolicies', $opt, $this->hostname);
478
- }
479
-
480
- /**
481
- *
482
- * Returns policy adjustment types for use in the PutScalingPolicy action.
483
- *
484
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
485
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
486
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
487
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
488
- */
489
- public function describe_adjustment_types($opt = null)
490
- {
491
- if (!$opt) $opt = array();
492
-
493
- return $this->authenticate('DescribeAdjustmentTypes', $opt, $this->hostname);
494
- }
495
-
496
- /**
497
- *
498
- * Deletes the specified auto scaling group if the group has no instances and no scaling activities in progress.
499
- *
500
- * To remove all instances before calling DeleteAutoScalingGroup, you can call UpdateAutoScalingGroup to set the minimum
501
- * and maximum size of the AutoScalingGroup to zero.
502
- *
503
- * @param string $auto_scaling_group_name (Required) The name of the Auto Scaling group.
504
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
505
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
506
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
507
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
508
- */
509
- public function delete_auto_scaling_group($auto_scaling_group_name, $opt = null)
510
- {
511
- if (!$opt) $opt = array();
512
- $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
513
-
514
- return $this->authenticate('DeleteAutoScalingGroup', $opt, $this->hostname);
515
- }
516
-
517
- /**
518
- *
519
- * Creates a new Auto Scaling group with the specified name. Once the creation request is completed, the AutoScalingGroup
520
- * is ready to be used in other calls.
521
- *
522
- * The Auto Scaling group name must be unique within the scope of your AWS account, and under the quota of Auto Scaling
523
- * groups allowed for your account.
524
- *
525
- * @param string $auto_scaling_group_name (Required) The name of the Auto Scaling group.
526
- * @param string $launch_configuration_name (Required) The name of the launch configuration to use with the Auto Scaling group.
527
- * @param integer $min_size (Required) The minimum size of the Auto Scaling group.
528
- * @param integer $max_size (Required) The maximum size of the Auto Scaling group.
529
- * @param string|array $availability_zones (Required) A list of availability zones for the Auto Scaling group. Pass a string for a single value, or an indexed array for multiple values.
530
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
531
- * <li><code>DesiredCapacity</code> - <code>integer</code> - Optional - The number of EC2 instances that should be running in the group. </li>
532
- * <li><code>DefaultCooldown</code> - <code>integer</code> - Optional - The amount of time, in seconds, after a scaling activity completes before any further trigger-related scaling activities can start. </li>
533
- * <li><code>LoadBalancerNames</code> - <code>string|array</code> - Optional - A list of LoadBalancers to use. Pass a string for a single value, or an indexed array for multiple values. </li>
534
- * <li><code>HealthCheckType</code> - <code>string</code> - Optional - The service you want the health status from, Amazon EC2 or Elastic Load Balancer. </li>
535
- * <li><code>HealthCheckGracePeriod</code> - <code>integer</code> - Optional - Length of time in seconds after a new EC2 instance comes into service that Auto Scaling starts checking its health. </li>
536
- * <li><code>PlacementGroup</code> - <code>string</code> - Optional - Physical location of your cluster placement group created in Amazon EC2. </li>
537
- * <li><code>VPCZoneIdentifier</code> - <code>string</code> - Optional - The subnet identifier of the Virtual Private Cloud. </li>
538
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
539
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
540
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
541
- */
542
- public function create_auto_scaling_group($auto_scaling_group_name, $launch_configuration_name, $min_size, $max_size, $availability_zones, $opt = null)
543
- {
544
- if (!$opt) $opt = array();
545
- $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
546
- $opt['LaunchConfigurationName'] = $launch_configuration_name;
547
- $opt['MinSize'] = $min_size;
548
- $opt['MaxSize'] = $max_size;
549
-
550
- // Required parameter
551
- $opt = array_merge($opt, CFComplexType::map(array(
552
- 'AvailabilityZones' => (is_array($availability_zones) ? $availability_zones : array($availability_zones))
553
- ), 'member'));
554
-
555
- // Optional parameter
556
- if (isset($opt['LoadBalancerNames']))
557
- {
558
- $opt = array_merge($opt, CFComplexType::map(array(
559
- 'LoadBalancerNames' => (is_array($opt['LoadBalancerNames']) ? $opt['LoadBalancerNames'] : array($opt['LoadBalancerNames']))
560
- ), 'member'));
561
- unset($opt['LoadBalancerNames']);
562
- }
563
-
564
- return $this->authenticate('CreateAutoScalingGroup', $opt, $this->hostname);
565
- }
566
-
567
- /**
568
- *
569
- * Returns a description of each Auto Scaling instance in the InstanceIds list. If a list is not provided, the service
570
- * returns the full details of all instances up to a maximum of fifty.
571
- *
572
- * This action supports pagination by returning a token if there are more pages to retrieve. To get the next page, call
573
- * this action again with the returned token as the NextToken parameter.
574
- *
575
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
576
- * <li><code>InstanceIds</code> - <code>string|array</code> - Optional - The list of Auto Scaling instances to describe. If this list is omitted, all auto scaling instances are described. The list of requested instances cannot contain more than 50 items. If unknown instances are requested, they are ignored with no error. Pass a string for a single value, or an indexed array for multiple values. </li>
577
- * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of Auto Scaling instances to be described with each call. </li>
578
- * <li><code>NextToken</code> - <code>string</code> - Optional - The token returned by a previous call to indicate that there is more data available. </li>
579
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
580
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
581
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
582
- */
583
- public function describe_auto_scaling_instances($opt = null)
584
- {
585
- if (!$opt) $opt = array();
586
-
587
- // Optional parameter
588
- if (isset($opt['InstanceIds']))
589
- {
590
- $opt = array_merge($opt, CFComplexType::map(array(
591
- 'InstanceIds' => (is_array($opt['InstanceIds']) ? $opt['InstanceIds'] : array($opt['InstanceIds']))
592
- ), 'member'));
593
- unset($opt['InstanceIds']);
594
- }
595
-
596
- return $this->authenticate('DescribeAutoScalingInstances', $opt, $this->hostname);
597
- }
598
-
599
- /**
600
- *
601
- * Deletes the specified LaunchConfiguration.
602
- *
603
- * The specified launch configuration must not be attached to an Auto Scaling group. Once this call completes, the launch
604
- * configuration is no longer available for use.
605
- *
606
- * @param string $launch_configuration_name (Required) The name of the launch configuration.
607
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
608
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
609
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
610
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
611
- */
612
- public function delete_launch_configuration($launch_configuration_name, $opt = null)
613
- {
614
- if (!$opt) $opt = array();
615
- $opt['LaunchConfigurationName'] = $launch_configuration_name;
616
-
617
- return $this->authenticate('DeleteLaunchConfiguration', $opt, $this->hostname);
618
- }
619
-
620
- /**
621
- *
622
- * Creates or updates a policy for an Auto Scaling group. To update an existing policy, use the existing policy name and
623
- * set the parameter(s) you want to change. Any existing parameter not changed in an update to an existing policy is not
624
- * changed in this update request.
625
- *
626
- * @param string $auto_scaling_group_name (Required) The name or ARN of the Auto Scaling Group.
627
- * @param string $policy_name (Required) The name of the policy you want to create or update.
628
- * @param integer $scaling_adjustment (Required) The number of instances by which to scale. AdjustmentType determines the interpretation of this number (e.g., as an absolute number or as a percentage of the existing Auto Scaling group size). A positive increment adds to the current capacity and a negative value removes from the current capacity.
629
- * @param string $adjustment_type (Required) Specifies whether the <code>ScalingAdjustment</code> is an absolute number or a percentage of the current capacity. Valid values are <code>ChangeInCapacity</code>, <code>ExactCapacity</code>, and <code>PercentChangeInCapacity</code>.
630
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
631
- * <li><code>Cooldown</code> - <code>integer</code> - Optional - The amount of time, in seconds, after a scaling activity completes before any further trigger-related scaling activities can start. </li>
632
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
633
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
634
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
635
- */
636
- public function put_scaling_policy($auto_scaling_group_name, $policy_name, $scaling_adjustment, $adjustment_type, $opt = null)
637
- {
638
- if (!$opt) $opt = array();
639
- $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
640
- $opt['PolicyName'] = $policy_name;
641
- $opt['ScalingAdjustment'] = $scaling_adjustment;
642
- $opt['AdjustmentType'] = $adjustment_type;
643
-
644
- return $this->authenticate('PutScalingPolicy', $opt, $this->hostname);
645
- }
646
-
647
- /**
648
- *
649
- * Sets the health status of an instance.
650
- *
651
- * @param string $instance_id (Required) The identifier of the EC2 instance.
652
- * @param string $health_status (Required) The health status of the instance. "Healthy" means that the instance is healthy and should remain in service. "Unhealthy" means that the instance is unhealthy. Auto Scaling should terminate and replace it.
653
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
654
- * <li><code>ShouldRespectGracePeriod</code> - <code>boolean</code> - Optional - If True, this call should respect the grace period associated with the group. </li>
655
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
656
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
657
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
658
- */
659
- public function set_instance_health($instance_id, $health_status, $opt = null)
660
- {
661
- if (!$opt) $opt = array();
662
- $opt['InstanceId'] = $instance_id;
663
- $opt['HealthStatus'] = $health_status;
664
-
665
- return $this->authenticate('SetInstanceHealth', $opt, $this->hostname);
666
- }
667
-
668
- /**
669
- *
670
- * Updates the configuration for the specified AutoScalingGroup.
671
- *
672
- * To update an Auto Scaling group with a launch configuration that has the <code>InstanceMonitoring.enabled</code> flag
673
- * set to <code>false</code>, you must first ensure that collection of group metrics is disabled. Otherwise, calls to
674
- * UpdateAutoScalingGroup will fail. If you have previously enabled group metrics collection, you can disable collection of
675
- * all group metrics by calling DisableMetricsCollection.
676
- *
677
- *
678
- * The new settings are registered upon the completion of this call. Any launch configuration settings take effect on any
679
- * triggers after this call returns. Triggers that are currently in progress aren't affected.
680
- *
681
- * If the new values are specified for the <i>MinSize</i> or <i>MaxSize</i> parameters, then there will be an implicit
682
- * call to SetDesiredCapacity to set the group to the new <i>MaxSize</i>. All optional parameters are left unchanged if not
683
- * passed in the request.
684
- *
685
- * @param string $auto_scaling_group_name (Required) The name of the Auto Scaling group.
686
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
687
- * <li><code>LaunchConfigurationName</code> - <code>string</code> - Optional - The name of the launch configuration. </li>
688
- * <li><code>MinSize</code> - <code>integer</code> - Optional - The minimum size of the Auto Scaling group. </li>
689
- * <li><code>MaxSize</code> - <code>integer</code> - Optional - The maximum size of the Auto Scaling group. </li>
690
- * <li><code>DesiredCapacity</code> - <code>integer</code> - Optional - The desired capacity for the Auto Scaling group. </li>
691
- * <li><code>DefaultCooldown</code> - <code>integer</code> - Optional - The amount of time, in seconds, after a scaling activity completes before any further trigger-related scaling activities can start. </li>
692
- * <li><code>AvailabilityZones</code> - <code>string|array</code> - Optional - Availability zones for the group. Pass a string for a single value, or an indexed array for multiple values. </li>
693
- * <li><code>HealthCheckType</code> - <code>string</code> - Optional - The service of interest for the health status check, either "EC2" for Amazon EC2 or "ELB" for Elastic Load Balancing. </li>
694
- * <li><code>HealthCheckGracePeriod</code> - <code>integer</code> - Optional - The length of time that Auto Scaling waits before checking an instance's health status. The grace period begins when an instance comes into service. </li>
695
- * <li><code>PlacementGroup</code> - <code>string</code> - Optional - The name of the cluster placement group, if applicable. For more information, go to Using Cluster Instances in the Amazon EC2 User Guide. </li>
696
- * <li><code>VPCZoneIdentifier</code> - <code>string</code> - Optional - The identifier for the VPC connection, if applicable. </li>
697
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
698
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
699
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
700
- */
701
- public function update_auto_scaling_group($auto_scaling_group_name, $opt = null)
702
- {
703
- if (!$opt) $opt = array();
704
- $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
705
-
706
- // Optional parameter
707
- if (isset($opt['AvailabilityZones']))
708
- {
709
- $opt = array_merge($opt, CFComplexType::map(array(
710
- 'AvailabilityZones' => (is_array($opt['AvailabilityZones']) ? $opt['AvailabilityZones'] : array($opt['AvailabilityZones']))
711
- ), 'member'));
712
- unset($opt['AvailabilityZones']);
713
- }
714
-
715
- return $this->authenticate('UpdateAutoScalingGroup', $opt, $this->hostname);
716
- }
717
-
718
- /**
719
- *
720
- * Lists all the actions scheduled for your Auto Scaling group that haven't been executed. To see a list of action already
721
- * executed, see the activity record returned in DescribeScalingActivities.
722
- *
723
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
724
- * <li><code>AutoScalingGroupName</code> - <code>string</code> - Optional - The name of the Auto Scaling group. </li>
725
- * <li><code>ScheduledActionNames</code> - <code>string|array</code> - Optional - A list of scheduled actions to be described. If this list is omitted, all scheduled actions are described. The list of requested scheduled actions cannot contain more than 50 items. If an auto scaling group name is provided, the results are limited to that group. If unknown scheduled actions are requested, they are ignored with no error. Pass a string for a single value, or an indexed array for multiple values. </li>
726
- * <li><code>StartTime</code> - <code>string</code> - Optional - The earliest scheduled start time to return. If scheduled action names are provided, this field will be ignored. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
727
- * <li><code>EndTime</code> - <code>string</code> - Optional - The latest scheduled start time to return. If scheduled action names are provided, this field will be ignored. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
728
- * <li><code>NextToken</code> - <code>string</code> - Optional - A string that marks the start of the next batch of returned results. </li>
729
- * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of scheduled actions to return. </li>
730
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
731
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
732
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
733
- */
734
- public function describe_scheduled_actions($opt = null)
735
- {
736
- if (!$opt) $opt = array();
737
-
738
- // Optional parameter
739
- if (isset($opt['ScheduledActionNames']))
740
- {
741
- $opt = array_merge($opt, CFComplexType::map(array(
742
- 'ScheduledActionNames' => (is_array($opt['ScheduledActionNames']) ? $opt['ScheduledActionNames'] : array($opt['ScheduledActionNames']))
743
- ), 'member'));
744
- unset($opt['ScheduledActionNames']);
745
- }
746
-
747
- // Optional parameter
748
- if (isset($opt['StartTime']))
749
- {
750
- $opt['StartTime'] = $this->util->convert_date_to_iso8601($opt['StartTime']);
751
- }
752
-
753
- // Optional parameter
754
- if (isset($opt['EndTime']))
755
- {
756
- $opt['EndTime'] = $this->util->convert_date_to_iso8601($opt['EndTime']);
757
- }
758
-
759
- return $this->authenticate('DescribeScheduledActions', $opt, $this->hostname);
760
- }
761
-
762
- /**
763
- *
764
- * Suspends Auto Scaling processes for an Auto Scaling group. To suspend specific process types, specify them by name with
765
- * the <code>ScalingProcesses.member.N</code> parameter. To suspend all process types, omit the
766
- * <code>ScalingProcesses.member.N</code> parameter.
767
- *
768
- * Suspending either of the two primary process types, <code>Launch</code> or <code>Terminate</code>, can prevent other
769
- * process types from functioning properly. For more information about processes and their dependencies, see ProcessType.
770
- *
771
- *
772
- * To resume processes that have been suspended, use ResumeProcesses.
773
- *
774
- * @param string $auto_scaling_group_name (Required) The name or Amazon Resource Name (ARN) of the Auto Scaling group.
775
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
776
- * <li><code>ScalingProcesses</code> - <code>string|array</code> - Optional - The processes that you want to suspend or resume, which can include one or more of the following: <ul> <li>Launch</li><li>Terminate</li><li>HealthCheck</li><li>ReplaceUnhealthy</li><li>AZRebalance</li><li>AlarmNotifications</li><li>ScheduledActions</li> </ul> To suspend all process types, omit this parameter. Pass a string for a single value, or an indexed array for multiple values. </li>
777
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
778
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
779
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
780
- */
781
- public function suspend_processes($auto_scaling_group_name, $opt = null)
782
- {
783
- if (!$opt) $opt = array();
784
- $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
785
-
786
- // Optional parameter
787
- if (isset($opt['ScalingProcesses']))
788
- {
789
- $opt = array_merge($opt, CFComplexType::map(array(
790
- 'ScalingProcesses' => (is_array($opt['ScalingProcesses']) ? $opt['ScalingProcesses'] : array($opt['ScalingProcesses']))
791
- ), 'member'));
792
- unset($opt['ScalingProcesses']);
793
- }
794
-
795
- return $this->authenticate('SuspendProcesses', $opt, $this->hostname);
796
- }
797
-
798
- /**
799
- *
800
- * Resumes Auto Scaling processes for an Auto Scaling group. For more information, see SuspendProcesses and ProcessType.
801
- *
802
- * @param string $auto_scaling_group_name (Required) The name or Amazon Resource Name (ARN) of the Auto Scaling group.
803
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
804
- * <li><code>ScalingProcesses</code> - <code>string|array</code> - Optional - The processes that you want to suspend or resume, which can include one or more of the following: <ul> <li>Launch</li><li>Terminate</li><li>HealthCheck</li><li>ReplaceUnhealthy</li><li>AZRebalance</li><li>AlarmNotifications</li><li>ScheduledActions</li> </ul> To suspend all process types, omit this parameter. Pass a string for a single value, or an indexed array for multiple values. </li>
805
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
806
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
807
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
808
- */
809
- public function resume_processes($auto_scaling_group_name, $opt = null)
810
- {
811
- if (!$opt) $opt = array();
812
- $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
813
-
814
- // Optional parameter
815
- if (isset($opt['ScalingProcesses']))
816
- {
817
- $opt = array_merge($opt, CFComplexType::map(array(
818
- 'ScalingProcesses' => (is_array($opt['ScalingProcesses']) ? $opt['ScalingProcesses'] : array($opt['ScalingProcesses']))
819
- ), 'member'));
820
- unset($opt['ScalingProcesses']);
821
- }
822
-
823
- return $this->authenticate('ResumeProcesses', $opt, $this->hostname);
824
- }
825
-
826
- /**
827
- *
828
- * Creates a new launch configuration. Once created, the new launch configuration is available for immediate use.
829
- *
830
- * The launch configuration name used must be unique, within the scope of the client's AWS account, and the maximum limit
831
- * of launch configurations must not yet have been met, or else the call will fail.
832
- *
833
- * @param string $launch_configuration_name (Required) The name of the launch configuration to create.
834
- * @param string $image_id (Required) Unique ID of the <i>Amazon Machine Image</i> (AMI) which was assigned during registration. For more information about Amazon EC2 images, please see Amazon EC2 product documentation
835
- * @param string $instance_type (Required) The instance type of the EC2 instance. For more information about Amazon EC2 instance types, please see Amazon EC2 product documentation
836
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
837
- * <li><code>KeyName</code> - <code>string</code> - Optional - The name of the EC2 key pair. </li>
838
- * <li><code>SecurityGroups</code> - <code>string|array</code> - Optional - The names of the security groups with which to associate EC2 instances. For more information about Amazon EC2 security groups, go to the Amazon EC2 product documentation. Pass a string for a single value, or an indexed array for multiple values. </li>
839
- * <li><code>UserData</code> - <code>string</code> - Optional - The user data available to the launched EC2 instances. For more information about Amazon EC2 user data, please see Amazon EC2 product documentation. </li>
840
- * <li><code>KernelId</code> - <code>string</code> - Optional - The ID of the kernel associated with the EC2 AMI. </li>
841
- * <li><code>RamdiskId</code> - <code>string</code> - Optional - The ID of the RAM disk associated with the EC2 AMI. </li>
842
- * <li><code>BlockDeviceMappings</code> - <code>array</code> - Optional - A list of mappings that specify how block devices are exposed to the instance. Each mapping is made up of a <i>VirtualName</i>, a <i>DeviceName</i>, and an <i>ebs</i> data structure that contains information about the associated Elastic Block Storage volume. For more information about Amazon EC2 BlockDeviceMappings, please go to Block Device Mapping in the Amazon EC2 product documentation. <ul>
843
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
844
- * <li><code>VirtualName</code> - <code>string</code> - Optional - The virtual name associated with the device. </li>
845
- * <li><code>DeviceName</code> - <code>string</code> - Required - The name of the device within Amazon EC2. </li>
846
- * <li><code>Ebs</code> - <code>array</code> - Optional - The Elastic Block Storage volume information. Takes an associative array of parameters that can have the following keys: <ul>
847
- * <li><code>SnapshotId</code> - <code>string</code> - Optional - The Snapshot ID. </li>
848
- * <li><code>VolumeSize</code> - <code>integer</code> - Optional - The volume size, in GigaBytes. </li>
849
- * </ul></li>
850
- * </ul></li>
851
- * </ul></li>
852
- * <li><code>InstanceMonitoring</code> - <code>array</code> - Optional - Enables detailed monitoring. <ul>
853
- * <li><code>Enabled</code> - <code>boolean</code> - Optional - If true, instance monitoring is enabled. </li></ul></li>
854
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
855
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
856
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
857
- */
858
- public function create_launch_configuration($launch_configuration_name, $image_id, $instance_type, $opt = null)
859
- {
860
- if (!$opt) $opt = array();
861
- $opt['LaunchConfigurationName'] = $launch_configuration_name;
862
- $opt['ImageId'] = $image_id;
863
-
864
- // Optional parameter
865
- if (isset($opt['SecurityGroups']))
866
- {
867
- $opt = array_merge($opt, CFComplexType::map(array(
868
- 'SecurityGroups' => (is_array($opt['SecurityGroups']) ? $opt['SecurityGroups'] : array($opt['SecurityGroups']))
869
- ), 'member'));
870
- unset($opt['SecurityGroups']);
871
- }
872
- $opt['InstanceType'] = $instance_type;
873
-
874
- // Optional parameter
875
- if (isset($opt['BlockDeviceMappings']))
876
- {
877
- $opt = array_merge($opt, CFComplexType::map(array(
878
- 'BlockDeviceMappings' => $opt['BlockDeviceMappings']
879
- ), 'member'));
880
- unset($opt['BlockDeviceMappings']);
881
- }
882
-
883
- // Optional parameter
884
- if (isset($opt['InstanceMonitoring']))
885
- {
886
- $opt = array_merge($opt, CFComplexType::map(array(
887
- 'InstanceMonitoring' => $opt['InstanceMonitoring']
888
- ), 'member'));
889
- unset($opt['InstanceMonitoring']);
890
- }
891
-
892
- return $this->authenticate('CreateLaunchConfiguration', $opt, $this->hostname);
893
- }
894
-
895
- /**
896
- *
897
- * Disables monitoring of group metrics for the Auto Scaling group specified in AutoScalingGroupName. You can specify the
898
- * list of affected metrics with the Metrics parameter.
899
- *
900
- * @param string $auto_scaling_group_name (Required) The name or ARN of the Auto Scaling Group.
901
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
902
- * <li><code>Metrics</code> - <code>string|array</code> - Optional - The list of metrics to disable. If no metrics are specified, all metrics are disabled. The following metrics are supported: <ul> <li>GroupMinSize</li><li>GroupMaxSize</li><li>GroupDesiredCapacity</li><li>GroupInServiceInstances</li><li>GroupPendingInstances</li><li>GroupTerminatingInstances</li><li>GroupTotalInstances</li> </ul> Pass a string for a single value, or an indexed array for multiple values. </li>
903
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
904
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
905
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
906
- */
907
- public function disable_metrics_collection($auto_scaling_group_name, $opt = null)
908
- {
909
- if (!$opt) $opt = array();
910
- $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
911
-
912
- // Optional parameter
913
- if (isset($opt['Metrics']))
914
- {
915
- $opt = array_merge($opt, CFComplexType::map(array(
916
- 'Metrics' => (is_array($opt['Metrics']) ? $opt['Metrics'] : array($opt['Metrics']))
917
- ), 'member'));
918
- unset($opt['Metrics']);
919
- }
920
-
921
- return $this->authenticate('DisableMetricsCollection', $opt, $this->hostname);
922
- }
923
- }
924
-
925
-
926
- /*%******************************************************************************************%*/
927
- // EXCEPTIONS
928
-
929
- /**
930
- * Default AS Exception.
931
- */
932
  class AS_Exception extends Exception {}
1
+ <?php
2
+ /*
3
+ * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ /**
18
+ *
19
+ *
20
+ * Auto Scaling is a web service designed to automatically launch or terminate EC2 instances based on user-defined policies, schedules, and
21
+ * health checks. Auto Scaling responds automatically to changing conditions. All you need to do is specify how it should respond to those
22
+ * changes.
23
+ *
24
+ * Auto Scaling groups can work across multiple Availability Zones - distinct physical locations for the hosted Amazon EC2 instances - so that
25
+ * if an Availability Zone becomes unavailable, Auto Scaling will automatically redistribute applications to a different Availability Zone.
26
+ *
27
+ * Every API call returns a response meta data object that contains a request identifier. Successful requests return an HTTP 200 status code.
28
+ * Unsuccessful requests return an error object and an HTTP status code of 400 or 500.
29
+ *
30
+ * The current WSDL is available at:
31
+ *
32
+ * <a
33
+ * href="http://autoscaling.amazonaws.com/doc/2010-08-01/AutoScaling.wsdl">http://autoscaling.amazonaws.com/doc/2010-08-01/AutoScaling.wsdl</a>
34
+ *
35
+ * <b>Endpoints</b>
36
+ *
37
+ * For information about this product's regions and endpoints, go to <a
38
+ * href="http://docs.amazonwebservices.com/general/latest/gr/index.html?rande.html">Regions and Endpoints</a> in the Amazon Web Services
39
+ * General Reference.
40
+ *
41
+ * @version Tue Jun 07 16:11:09 PDT 2011
42
+ * @license See the included NOTICE.md file for complete information.
43
+ * @copyright See the included NOTICE.md file for complete information.
44
+ * @link http://aws.amazon.com/autoscaling/Amazon Auto-Scaling
45
+ * @link http://aws.amazon.com/documentation/autoscaling/Amazon Auto-Scaling documentation
46
+ */
47
+ class AmazonAS extends CFRuntime
48
+ {
49
+
50
+ /*%******************************************************************************************%*/
51
+ // CLASS CONSTANTS
52
+
53
+ /**
54
+ * Specify the default queue URL.
55
+ */
56
+ const DEFAULT_URL = 'autoscaling.us-east-1.amazonaws.com';
57
+
58
+ /**
59
+ * Specify the queue URL for the US-East (Northern Virginia) Region.
60
+ */
61
+ const REGION_US_E1 = self::DEFAULT_URL;
62
+
63
+ /**
64
+ * Specify the queue URL for the US-West (Northern California) Region.
65
+ */
66
+ const REGION_US_W1 = 'autoscaling.us-west-1.amazonaws.com';
67
+
68
+ /**
69
+ * Specify the queue URL for the EU (Ireland) Region.
70
+ */
71
+ const REGION_EU_W1 = 'autoscaling.eu-west-1.amazonaws.com';
72
+
73
+ /**
74
+ * Specify the queue URL for the Asia Pacific (Singapore) Region.
75
+ */
76
+ const REGION_APAC_SE1 = 'autoscaling.ap-southeast-1.amazonaws.com';
77
+
78
+ /**
79
+ * Specify the queue URL for the Asia Pacific (Japan) Region.
80
+ */
81
+ const REGION_APAC_NE1 = 'autoscaling.ap-northeast-1.amazonaws.com';
82
+
83
+
84
+ /*%******************************************************************************************%*/
85
+ // SETTERS
86
+
87
+ /**
88
+ * This allows you to explicitly sets the region for the service to use.
89
+ *
90
+ * @param string $region (Required) The region to explicitly set. Available options are <REGION_US_E1>, <REGION_US_W1>, <REGION_EU_W1>, or <REGION_APAC_SE1>.
91
+ * @return $this A reference to the current instance.
92
+ */
93
+ public function set_region($region)
94
+ {
95
+ $this->set_hostname($region);
96
+ return $this;
97
+ }
98
+
99
+
100
+ /*%******************************************************************************************%*/
101
+ // CONSTRUCTOR
102
+
103
+ /**
104
+ * Constructs a new instance of <AmazonAS>.
105
+ *
106
+ * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <code>AWS_KEY</code> constant.
107
+ * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant.
108
+ * @return boolean false if no valid values are set, otherwise true.
109
+ */
110
+ public function __construct($key = null, $secret_key = null)
111
+ {
112
+ $this->api_version = '2010-08-01';
113
+ $this->hostname = self::DEFAULT_URL;
114
+
115
+ if (!$key && !defined('AWS_KEY'))
116
+ {
117
+ // @codeCoverageIgnoreStart
118
+ throw new AS_Exception('No account key was passed into the constructor, nor was it set in the AWS_KEY constant.');
119
+ // @codeCoverageIgnoreEnd
120
+ }
121
+
122
+ if (!$secret_key && !defined('AWS_SECRET_KEY'))
123
+ {
124
+ // @codeCoverageIgnoreStart
125
+ throw new AS_Exception('No account secret was passed into the constructor, nor was it set in the AWS_SECRET_KEY constant.');
126
+ // @codeCoverageIgnoreEnd
127
+ }
128
+
129
+ return parent::__construct($key, $secret_key);
130
+ }
131
+
132
+
133
+ /*%******************************************************************************************%*/
134
+ // SERVICE METHODS
135
+
136
+ /**
137
+ *
138
+ * Creates a scheduled scaling action for a Auto Scaling group. If you leave a parameter unspecified, the corresponding value remains
139
+ * unchanged in the affected Auto Scaling group.
140
+ *
141
+ * @param string $auto_scaling_group_name (Required) The name or ARN of the Auto Scaling Group.
142
+ * @param string $scheduled_action_name (Required) The name of this scaling action.
143
+ * @param string $time (Required) The time for this action to start. Accepts any value that <php:strtotime()> understands.
144
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
145
+ * <li><code>MinSize</code> - <code>integer</code> - Optional - The minimum size for the new Auto Scaling group. </li>
146
+ * <li><code>MaxSize</code> - <code>integer</code> - Optional - The maximum size for the Auto Scaling group. </li>
147
+ * <li><code>DesiredCapacity</code> - <code>integer</code> - Optional - The number of EC2 instances that should be running in the group. </li>
148
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
149
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
150
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
151
+ */
152
+ public function put_scheduled_update_group_action($auto_scaling_group_name, $scheduled_action_name, $time, $opt = null)
153
+ {
154
+ if (!$opt) $opt = array();
155
+ $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
156
+ $opt['ScheduledActionName'] = $scheduled_action_name;
157
+ $opt['Time'] = $this->util->convert_date_to_iso8601($time);
158
+
159
+ return $this->authenticate('PutScheduledUpdateGroupAction', $opt, $this->hostname);
160
+ }
161
+
162
+ /**
163
+ *
164
+ * Adjusts the desired size of the AutoScalingGroup by initiating scaling activities. When reducing the size of the group, it is not possible
165
+ * to define which EC2 instances will be terminated. This applies to any auto-scaling decisions that might result in terminating instances.
166
+ *
167
+ * There are two common use cases for <code>SetDesiredCapacity</code>: one for users of the Auto Scaling triggering system, and another for
168
+ * developers who write their own triggering systems. Both use cases relate to the concept of cooldown.
169
+ *
170
+ * In the first case, if you use the Auto Scaling triggering system, <code>SetDesiredCapacity</code> changes the size of your Auto Scaling
171
+ * group without regard to the cooldown period. This could be useful, for example, if Auto Scaling did something unexpected for some reason. If
172
+ * your cooldown period is 10 minutes, Auto Scaling would normally reject requests to change the size of the group for that entire 10 minute
173
+ * period. The <code>SetDesiredCapacity</code> command allows you to circumvent this restriction and change the size of the group before the
174
+ * end of the cooldown period.
175
+ *
176
+ * In the second case, if you write your own triggering system, you can use <code>SetDesiredCapacity</code> to control the size of your Auto
177
+ * Scaling group. If you want the same cooldown functionality that Auto Scaling offers, you can configure <code>SetDesiredCapacity</code> to
178
+ * honor cooldown by setting the <code>HonorCooldown</code> parameter to <code>true</code>.
179
+ *
180
+ * @param string $auto_scaling_group_name (Required) The name of the AutoScalingGroup.
181
+ * @param integer $desired_capacity (Required) The new capacity setting for the AutoScalingGroup.
182
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
183
+ * <li><code>HonorCooldown</code> - <code>boolean</code> - Optional - By default, <code>SetDesiredCapacity</code> overrides any cooldown period. Set to True if you want Auto Scaling to reject this request if the Auto Scaling group is in cooldown. </li>
184
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
185
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
186
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
187
+ */
188
+ public function set_desired_capacity($auto_scaling_group_name, $desired_capacity, $opt = null)
189
+ {
190
+ if (!$opt) $opt = array();
191
+ $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
192
+ $opt['DesiredCapacity'] = $desired_capacity;
193
+
194
+ return $this->authenticate('SetDesiredCapacity', $opt, $this->hostname);
195
+ }
196
+
197
+ /**
198
+ *
199
+ * Deletes a policy created by PutScalingPolicy
200
+ *
201
+ * @param string $policy_name (Required) The name or PolicyARN of the policy you want to delete
202
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
203
+ * <li><code>AutoScalingGroupName</code> - <code>string</code> - Optional - The name of the Auto Scaling group. </li>
204
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
205
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
206
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
207
+ */
208
+ public function delete_policy($policy_name, $opt = null)
209
+ {
210
+ if (!$opt) $opt = array();
211
+ $opt['PolicyName'] = $policy_name;
212
+
213
+ return $this->authenticate('DeletePolicy', $opt, $this->hostname);
214
+ }
215
+
216
+ /**
217
+ *
218
+ * Deletes a scheduled action previously created using the PutScheduledUpdateGroupAction.
219
+ *
220
+ * @param string $scheduled_action_name (Required) The name of the action you want to delete.
221
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
222
+ * <li><code>AutoScalingGroupName</code> - <code>string</code> - Optional - The name of the Auto Scaling group </li>
223
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
224
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
225
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
226
+ */
227
+ public function delete_scheduled_action($scheduled_action_name, $opt = null)
228
+ {
229
+ if (!$opt) $opt = array();
230
+ $opt['ScheduledActionName'] = $scheduled_action_name;
231
+
232
+ return $this->authenticate('DeleteScheduledAction', $opt, $this->hostname);
233
+ }
234
+
235
+ /**
236
+ *
237
+ * Returns a full description of the launch configurations given the specified names.
238
+ *
239
+ * If no names are specified, then the full details of all launch configurations are returned.
240
+ *
241
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
242
+ * <li><code>LaunchConfigurationNames</code> - <code>string|array</code> - Optional - A list of launch configuration names. Pass a string for a single value, or an indexed array for multiple values. </li>
243
+ * <li><code>NextToken</code> - <code>string</code> - Optional - A string that marks the start of the next batch of returned results. </li>
244
+ * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of launch configurations. </li>
245
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
246
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
247
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
248
+ */
249
+ public function describe_launch_configurations($opt = null)
250
+ {
251
+ if (!$opt) $opt = array();
252
+
253
+ // Optional parameter
254
+ if (isset($opt['LaunchConfigurationNames']))
255
+ {
256
+ $opt = array_merge($opt, CFComplexType::map(array(
257
+ 'LaunchConfigurationNames' => (is_array($opt['LaunchConfigurationNames']) ? $opt['LaunchConfigurationNames'] : array($opt['LaunchConfigurationNames']))
258
+ ), 'member'));
259
+ unset($opt['LaunchConfigurationNames']);
260
+ }
261
+
262
+ return $this->authenticate('DescribeLaunchConfigurations', $opt, $this->hostname);
263
+ }
264
+
265
+ /**
266
+ *
267
+ * Returns scaling process types for use in the ResumeProcesses and SuspendProcesses actions.
268
+ *
269
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
270
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
271
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
272
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
273
+ */
274
+ public function describe_scaling_process_types($opt = null)
275
+ {
276
+ if (!$opt) $opt = array();
277
+
278
+ return $this->authenticate('DescribeScalingProcessTypes', $opt, $this->hostname);
279
+ }
280
+
281
+ /**
282
+ *
283
+ * Returns a full description of each Auto Scaling group in the given list. This includes all Amazon EC2 instances that are members of the
284
+ * group. If a list of names is not provided, the service returns the full details of all Auto Scaling groups.
285
+ *
286
+ * This action supports pagination by returning a token if there are more pages to retrieve. To get the next page, call this action again with
287
+ * the returned token as the NextToken parameter.
288
+ *
289
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
290
+ * <li><code>AutoScalingGroupNames</code> - <code>string|array</code> - Optional - A list of Auto Scaling group names. Pass a string for a single value, or an indexed array for multiple values. </li>
291
+ * <li><code>NextToken</code> - <code>string</code> - Optional - A string that marks the start of the next batch of returned results. </li>
292
+ * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of records to return. </li>
293
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
294
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
295
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
296
+ */
297
+ public function describe_auto_scaling_groups($opt = null)
298
+ {
299
+ if (!$opt) $opt = array();
300
+
301
+ // Optional parameter
302
+ if (isset($opt['AutoScalingGroupNames']))
303
+ {
304
+ $opt = array_merge($opt, CFComplexType::map(array(
305
+ 'AutoScalingGroupNames' => (is_array($opt['AutoScalingGroupNames']) ? $opt['AutoScalingGroupNames'] : array($opt['AutoScalingGroupNames']))
306
+ ), 'member'));
307
+ unset($opt['AutoScalingGroupNames']);
308
+ }
309
+
310
+ return $this->authenticate('DescribeAutoScalingGroups', $opt, $this->hostname);
311
+ }
312
+
313
+ /**
314
+ *
315
+ * Enables monitoring of group metrics for the Auto Scaling group specified in AutoScalingGroupName. You can specify the list of enabled
316
+ * metrics with the Metrics parameter.
317
+ *
318
+ * Auto scaling metrics collection can be turned on only if the <code>InstanceMonitoring.Enabled</code> flag, in the Auto Scaling group's
319
+ * launch configuration, is set to <code>true</code>.
320
+ *
321
+ * @param string $auto_scaling_group_name (Required) The name or ARN of the Auto Scaling Group.
322
+ * @param string $granularity (Required) The granularity to associate with the metrics to collect. Currently, the only legal granularity is "1Minute".
323
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
324
+ * <li><code>Metrics</code> - <code>string|array</code> - Optional - The list of metrics to collect. If no metrics are specified, all metrics are enabled. The following metrics are supported: <ul> <li>GroupMinSize</li><li>GroupMaxSize</li><li>GroupDesiredCapacity</li><li>GroupInServiceInstances</li><li>GroupPendingInstances</li><li>GroupTerminatingInstances</li><li>GroupTotalInstances</li> </ul> Pass a string for a single value, or an indexed array for multiple values. </li>
325
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
326
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
327
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
328
+ */
329
+ public function enable_metrics_collection($auto_scaling_group_name, $granularity, $opt = null)
330
+ {
331
+ if (!$opt) $opt = array();
332
+ $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
333
+
334
+ // Optional parameter
335
+ if (isset($opt['Metrics']))
336
+ {
337
+ $opt = array_merge($opt, CFComplexType::map(array(
338
+ 'Metrics' => (is_array($opt['Metrics']) ? $opt['Metrics'] : array($opt['Metrics']))
339
+ ), 'member'));
340
+ unset($opt['Metrics']);
341
+ }
342
+ $opt['Granularity'] = $granularity;
343
+
344
+ return $this->authenticate('EnableMetricsCollection', $opt, $this->hostname);
345
+ }
346
+
347
+ /**
348
+ *
349
+ * Terminates the specified instance. Optionally, the desired group size can be adjusted.
350
+ *
351
+ * This call simply registers a termination request. The termination of the instance cannot happen immediately.
352
+ *
353
+ * @param string $instance_id (Required) The ID of the EC2 instance to be terminated.
354
+ * @param boolean $should_decrement_desired_capacity (Required) Specifies whether (<i>true</i>) or not (<i>false</i>) terminating this instance should also decrement the size of the AutoScalingGroup.
355
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
356
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
357
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
358
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
359
+ */
360
+ public function terminate_instance_in_auto_scaling_group($instance_id, $should_decrement_desired_capacity, $opt = null)
361
+ {
362
+ if (!$opt) $opt = array();
363
+ $opt['InstanceId'] = $instance_id;
364
+ $opt['ShouldDecrementDesiredCapacity'] = $should_decrement_desired_capacity;
365
+
366
+ return $this->authenticate('TerminateInstanceInAutoScalingGroup', $opt, $this->hostname);
367
+ }
368
+
369
+ /**
370
+ *
371
+ * Returns the scaling activities for the specified Auto Scaling group.
372
+ *
373
+ * If the specified <i>ActivityIds</i> list is empty, all the activities from the past six weeks are returned. Activities are sorted by
374
+ * completion time. Activities still in progress appear first on the list.
375
+ *
376
+ * This action supports pagination. If the response includes a token, there are more records available. To get the additional records, repeat
377
+ * the request with the response token as the NextToken parameter.
378
+ *
379
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
380
+ * <li><code>ActivityIds</code> - <code>string|array</code> - Optional - A list containing the activity IDs of the desired scaling activities. If this list is omitted, all activities are described. If an AutoScalingGroupName is provided, the results are limited to that group. The list of requested activities cannot contain more than 50 items. If unknown activities are requested, they are ignored with no error. Pass a string for a single value, or an indexed array for multiple values. </li>
381
+ * <li><code>AutoScalingGroupName</code> - <code>string</code> - Optional - The name of the AutoScalingGroup. </li>
382
+ * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of scaling activities to return. </li>
383
+ * <li><code>NextToken</code> - <code>string</code> - Optional - A string that marks the start of the next batch of returned results for pagination. </li>
384
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
385
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
386
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
387
+ */
388
+ public function describe_scaling_activities($opt = null)
389
+ {
390
+ if (!$opt) $opt = array();
391
+
392
+ // Optional parameter
393
+ if (isset($opt['ActivityIds']))
394
+ {
395
+ $opt = array_merge($opt, CFComplexType::map(array(
396
+ 'ActivityIds' => (is_array($opt['ActivityIds']) ? $opt['ActivityIds'] : array($opt['ActivityIds']))
397
+ ), 'member'));
398
+ unset($opt['ActivityIds']);
399
+ }
400
+
401
+ return $this->authenticate('DescribeScalingActivities', $opt, $this->hostname);
402
+ }
403
+
404
+ /**
405
+ *
406
+ * Runs the policy you create for your Auto Scaling group in PutScalingPolicy.
407
+ *
408
+ * @param string $policy_name (Required) The name or PolicyARN of the policy you want to run.
409
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
410
+ * <li><code>AutoScalingGroupName</code> - <code>string</code> - Optional - The name or ARN of the Auto Scaling Group. </li>
411
+ * <li><code>HonorCooldown</code> - <code>boolean</code> - Optional - Set to True if you want Auto Scaling to reject this request if the Auto Scaling group is in cooldown. </li>
412
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
413
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
414
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
415
+ */
416
+ public function execute_policy($policy_name, $opt = null)
417
+ {
418
+ if (!$opt) $opt = array();
419
+ $opt['PolicyName'] = $policy_name;
420
+
421
+ return $this->authenticate('ExecutePolicy', $opt, $this->hostname);
422
+ }
423
+
424
+ /**
425
+ *
426
+ * Returns a list of metrics and a corresponding list of granularities for each metric.
427
+ *
428
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
429
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
430
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
431
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
432
+ */
433
+ public function describe_metric_collection_types($opt = null)
434
+ {
435
+ if (!$opt) $opt = array();
436
+
437
+ return $this->authenticate('DescribeMetricCollectionTypes', $opt, $this->hostname);
438
+ }
439
+
440
+ /**
441
+ *
442
+ * Returns descriptions of what each policy does. This action supports pagination. If the response includes a token, there are more records
443
+ * available. To get the additional records, repeat the request with the response token as the NextToken parameter.
444
+ *
445
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
446
+ * <li><code>AutoScalingGroupName</code> - <code>string</code> - Optional - The name of the Auto Scaling group. </li>
447
+ * <li><code>PolicyNames</code> - <code>string|array</code> - Optional - A list of policy names or policy ARNs to be described. If this list is omitted, all policy names are described. If an auto scaling group name is provided, the results are limited to that group.The list of requested policy names cannot contain more than 50 items. If unknown policy names are requested, they are ignored with no error. Pass a string for a single value, or an indexed array for multiple values. </li>
448
+ * <li><code>NextToken</code> - <code>string</code> - Optional - A string that is used to mark the start of the next batch of returned results for pagination. </li>
449
+ * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of policies that will be described with each call. </li>
450
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
451
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
452
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
453
+ */
454
+ public function describe_policies($opt = null)
455
+ {
456
+ if (!$opt) $opt = array();
457
+
458
+ // Optional parameter
459
+ if (isset($opt['PolicyNames']))
460
+ {
461
+ $opt = array_merge($opt, CFComplexType::map(array(
462
+ 'PolicyNames' => (is_array($opt['PolicyNames']) ? $opt['PolicyNames'] : array($opt['PolicyNames']))
463
+ ), 'member'));
464
+ unset($opt['PolicyNames']);
465
+ }
466
+
467
+ return $this->authenticate('DescribePolicies', $opt, $this->hostname);
468
+ }
469
+
470
+ /**
471
+ *
472
+ * Returns policy adjustment types for use in the PutScalingPolicy action.
473
+ *
474
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
475
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
476
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
477
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
478
+ */
479
+ public function describe_adjustment_types($opt = null)
480
+ {
481
+ if (!$opt) $opt = array();
482
+
483
+ return $this->authenticate('DescribeAdjustmentTypes', $opt, $this->hostname);
484
+ }
485
+
486
+ /**
487
+ *
488
+ * Deletes the specified auto scaling group if the group has no instances and no scaling activities in progress.
489
+ *
490
+ * To remove all instances before calling DeleteAutoScalingGroup, you can call UpdateAutoScalingGroup to set the minimum and maximum size of
491
+ * the AutoScalingGroup to zero.
492
+ *
493
+ * @param string $auto_scaling_group_name (Required) The name of the Auto Scaling group.
494
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
495
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
496
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
497
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
498
+ */
499
+ public function delete_auto_scaling_group($auto_scaling_group_name, $opt = null)
500
+ {
501
+ if (!$opt) $opt = array();
502
+ $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
503
+
504
+ return $this->authenticate('DeleteAutoScalingGroup', $opt, $this->hostname);
505
+ }
506
+
507
+ /**
508
+ *
509
+ * Creates a new Auto Scaling group with the specified name. Once the creation request is completed, the AutoScalingGroup is ready to be used
510
+ * in other calls.
511
+ *
512
+ * The Auto Scaling group name must be unique within the scope of your AWS account, and under the quota of Auto Scaling groups allowed for
513
+ * your account.
514
+ *
515
+ * @param string $auto_scaling_group_name (Required) The name of the Auto Scaling group.
516
+ * @param string $launch_configuration_name (Required) The name of the launch configuration to use with the Auto Scaling group.
517
+ * @param integer $min_size (Required) The minimum size of the Auto Scaling group.
518
+ * @param integer $max_size (Required) The maximum size of the Auto Scaling group.
519
+ * @param string|array $availability_zones (Required) A list of availability zones for the Auto Scaling group. Pass a string for a single value, or an indexed array for multiple values.
520
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
521
+ * <li><code>DesiredCapacity</code> - <code>integer</code> - Optional - The number of EC2 instances that should be running in the group. For more information, see SetDesiredCapacity. </li>
522
+ * <li><code>DefaultCooldown</code> - <code>integer</code> - Optional - The amount of time, in seconds, after a scaling activity completes before any further trigger-related scaling activities can start. </li>
523
+ * <li><code>LoadBalancerNames</code> - <code>string|array</code> - Optional - A list of LoadBalancers to use. Pass a string for a single value, or an indexed array for multiple values. </li>
524
+ * <li><code>HealthCheckType</code> - <code>string</code> - Optional - The service you want the health status from, Amazon EC2 or Elastic Load Balancer. Valid values are "EC2" or "ELB." </li>
525
+ * <li><code>HealthCheckGracePeriod</code> - <code>integer</code> - Optional - Length of time in seconds after a new EC2 instance comes into service that Auto Scaling starts checking its health. </li>
526
+ * <li><code>PlacementGroup</code> - <code>string</code> - Optional - Physical location of your cluster placement group created in Amazon EC2. </li>
527
+ * <li><code>VPCZoneIdentifier</code> - <code>string</code> - Optional - The subnet identifier of the Virtual Private Cloud. </li>
528
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
529
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
530
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
531
+ */
532
+ public function create_auto_scaling_group($auto_scaling_group_name, $launch_configuration_name, $min_size, $max_size, $availability_zones, $opt = null)
533
+ {
534
+ if (!$opt) $opt = array();
535
+ $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
536
+ $opt['LaunchConfigurationName'] = $launch_configuration_name;
537
+ $opt['MinSize'] = $min_size;
538
+ $opt['MaxSize'] = $max_size;
539
+
540
+ // Required parameter
541
+ $opt = array_merge($opt, CFComplexType::map(array(
542
+ 'AvailabilityZones' => (is_array($availability_zones) ? $availability_zones : array($availability_zones))
543
+ ), 'member'));
544
+
545
+ // Optional parameter
546
+ if (isset($opt['LoadBalancerNames']))
547
+ {
548
+ $opt = array_merge($opt, CFComplexType::map(array(
549
+ 'LoadBalancerNames' => (is_array($opt['LoadBalancerNames']) ? $opt['LoadBalancerNames'] : array($opt['LoadBalancerNames']))
550
+ ), 'member'));
551
+ unset($opt['LoadBalancerNames']);
552
+ }
553
+
554
+ return $this->authenticate('CreateAutoScalingGroup', $opt, $this->hostname);
555
+ }
556
+
557
+ /**
558
+ *
559
+ * Returns a description of each Auto Scaling instance in the InstanceIds list. If a list is not provided, the service returns the full
560
+ * details of all instances up to a maximum of fifty.
561
+ *
562
+ * This action supports pagination by returning a token if there are more pages to retrieve. To get the next page, call this action again with
563
+ * the returned token as the NextToken parameter.
564
+ *
565
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
566
+ * <li><code>InstanceIds</code> - <code>string|array</code> - Optional - The list of Auto Scaling instances to describe. If this list is omitted, all auto scaling instances are described. The list of requested instances cannot contain more than 50 items. If unknown instances are requested, they are ignored with no error. Pass a string for a single value, or an indexed array for multiple values. </li>
567
+ * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of Auto Scaling instances to be described with each call. </li>
568
+ * <li><code>NextToken</code> - <code>string</code> - Optional - The token returned by a previous call to indicate that there is more data available. </li>
569
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
570
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
571
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
572
+ */
573
+ public function describe_auto_scaling_instances($opt = null)
574
+ {
575
+ if (!$opt) $opt = array();
576
+
577
+ // Optional parameter
578
+ if (isset($opt['InstanceIds']))
579
+ {
580
+ $opt = array_merge($opt, CFComplexType::map(array(
581
+ 'InstanceIds' => (is_array($opt['InstanceIds']) ? $opt['InstanceIds'] : array($opt['InstanceIds']))
582
+ ), 'member'));
583
+ unset($opt['InstanceIds']);
584
+ }
585
+
586
+ return $this->authenticate('DescribeAutoScalingInstances', $opt, $this->hostname);
587
+ }
588
+
589
+ /**
590
+ *
591
+ * Deletes the specified LaunchConfiguration.
592
+ *
593
+ * The specified launch configuration must not be attached to an Auto Scaling group. Once this call completes, the launch configuration is no
594
+ * longer available for use.
595
+ *
596
+ * @param string $launch_configuration_name (Required) The name of the launch configuration.
597
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
598
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
599
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
600
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
601
+ */
602
+ public function delete_launch_configuration($launch_configuration_name, $opt = null)
603
+ {
604
+ if (!$opt) $opt = array();
605
+ $opt['LaunchConfigurationName'] = $launch_configuration_name;
606
+
607
+ return $this->authenticate('DeleteLaunchConfiguration', $opt, $this->hostname);
608
+ }
609
+
610
+ /**
611
+ *
612
+ * Creates or updates a policy for an Auto Scaling group. To update an existing policy, use the existing policy name and set the parameter(s)
613
+ * you want to change. Any existing parameter not changed in an update to an existing policy is not changed in this update request.
614
+ *
615
+ * @param string $auto_scaling_group_name (Required) The name or ARN of the Auto Scaling Group.
616
+ * @param string $policy_name (Required) The name of the policy you want to create or update.
617
+ * @param integer $scaling_adjustment (Required) The number of instances by which to scale. AdjustmentType determines the interpretation of this number (e.g., as an absolute number or as a percentage of the existing Auto Scaling group size). A positive increment adds to the current capacity and a negative value removes from the current capacity.
618
+ * @param string $adjustment_type (Required) Specifies whether the <code>ScalingAdjustment</code> is an absolute number or a percentage of the current capacity. Valid values are <code>ChangeInCapacity</code>, <code>ExactCapacity</code>, and <code>PercentChangeInCapacity</code>.
619
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
620
+ * <li><code>Cooldown</code> - <code>integer</code> - Optional - The amount of time, in seconds, after a scaling activity completes before any further trigger-related scaling activities can start. </li>
621
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
622
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
623
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
624
+ */
625
+ public function put_scaling_policy($auto_scaling_group_name, $policy_name, $scaling_adjustment, $adjustment_type, $opt = null)
626
+ {
627
+ if (!$opt) $opt = array();
628
+ $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
629
+ $opt['PolicyName'] = $policy_name;
630
+ $opt['ScalingAdjustment'] = $scaling_adjustment;
631
+ $opt['AdjustmentType'] = $adjustment_type;
632
+
633
+ return $this->authenticate('PutScalingPolicy', $opt, $this->hostname);
634
+ }
635
+
636
+ /**
637
+ *
638
+ * Sets the health status of an instance.
639
+ *
640
+ * @param string $instance_id (Required) The identifier of the EC2 instance.
641
+ * @param string $health_status (Required) The health status of the instance. "Healthy" means that the instance is healthy and should remain in service. "Unhealthy" means that the instance is unhealthy. Auto Scaling should terminate and replace it.
642
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
643
+ * <li><code>ShouldRespectGracePeriod</code> - <code>boolean</code> - Optional - If True, this call should respect the grace period associated with the group. </li>
644
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
645
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
646
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
647
+ */
648
+ public function set_instance_health($instance_id, $health_status, $opt = null)
649
+ {
650
+ if (!$opt) $opt = array();
651
+ $opt['InstanceId'] = $instance_id;
652
+ $opt['HealthStatus'] = $health_status;
653
+
654
+ return $this->authenticate('SetInstanceHealth', $opt, $this->hostname);
655
+ }
656
+
657
+ /**
658
+ *
659
+ * Updates the configuration for the specified AutoScalingGroup.
660
+ *
661
+ * To update an Auto Scaling group with a launch configuration that has the <code>InstanceMonitoring.enabled</code> flag set to
662
+ * <code>false</code>, you must first ensure that collection of group metrics is disabled. Otherwise, calls to UpdateAutoScalingGroup will
663
+ * fail. If you have previously enabled group metrics collection, you can disable collection of all group metrics by calling
664
+ * DisableMetricsCollection.
665
+ *
666
+ *
667
+ * The new settings are registered upon the completion of this call. Any launch configuration settings take effect on any triggers after this
668
+ * call returns. Triggers that are currently in progress aren't affected.
669
+ *
670
+ * If the new values are specified for the <i>MinSize</i> or <i>MaxSize</i> parameters, then there will be an implicit call to
671
+ * SetDesiredCapacity to set the group to the new <i>MaxSize</i>. All optional parameters are left unchanged if not passed in the request.
672
+ *
673
+ * @param string $auto_scaling_group_name (Required) The name of the Auto Scaling group.
674
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
675
+ * <li><code>LaunchConfigurationName</code> - <code>string</code> - Optional - The name of the launch configuration. </li>
676
+ * <li><code>MinSize</code> - <code>integer</code> - Optional - The minimum size of the Auto Scaling group. </li>
677
+ * <li><code>MaxSize</code> - <code>integer</code> - Optional - The maximum size of the Auto Scaling group. </li>
678
+ * <li><code>DesiredCapacity</code> - <code>integer</code> - Optional - The desired capacity for the Auto Scaling group. </li>
679
+ * <li><code>DefaultCooldown</code> - <code>integer</code> - Optional - The amount of time, in seconds, after a scaling activity completes before any further trigger-related scaling activities can start. </li>
680
+ * <li><code>AvailabilityZones</code> - <code>string|array</code> - Optional - Availability zones for the group. Pass a string for a single value, or an indexed array for multiple values. </li>
681
+ * <li><code>HealthCheckType</code> - <code>string</code> - Optional - The service of interest for the health status check, either "EC2" for Amazon EC2 or "ELB" for Elastic Load Balancing. </li>
682
+ * <li><code>HealthCheckGracePeriod</code> - <code>integer</code> - Optional - The length of time that Auto Scaling waits before checking an instance's health status. The grace period begins when an instance comes into service. </li>
683
+ * <li><code>PlacementGroup</code> - <code>string</code> - Optional - The name of the cluster placement group, if applicable. For more information, go to Using Cluster Instances in the <i>Amazon EC2 User Guide</i>. </li>
684
+ * <li><code>VPCZoneIdentifier</code> - <code>string</code> - Optional - The identifier for the VPC connection, if applicable. </li>
685
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
686
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
687
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
688
+ */
689
+ public function update_auto_scaling_group($auto_scaling_group_name, $opt = null)
690
+ {
691
+ if (!$opt) $opt = array();
692
+ $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
693
+
694
+ // Optional parameter
695
+ if (isset($opt['AvailabilityZones']))
696
+ {
697
+ $opt = array_merge($opt, CFComplexType::map(array(
698
+ 'AvailabilityZones' => (is_array($opt['AvailabilityZones']) ? $opt['AvailabilityZones'] : array($opt['AvailabilityZones']))
699
+ ), 'member'));
700
+ unset($opt['AvailabilityZones']);
701
+ }
702
+
703
+ return $this->authenticate('UpdateAutoScalingGroup', $opt, $this->hostname);
704
+ }
705
+
706
+ /**
707
+ *
708
+ * Lists all the actions scheduled for your Auto Scaling group that haven't been executed. To see a list of action already executed, see the
709
+ * activity record returned in DescribeScalingActivities.
710
+ *
711
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
712
+ * <li><code>AutoScalingGroupName</code> - <code>string</code> - Optional - The name of the Auto Scaling group. </li>
713
+ * <li><code>ScheduledActionNames</code> - <code>string|array</code> - Optional - A list of scheduled actions to be described. If this list is omitted, all scheduled actions are described. The list of requested scheduled actions cannot contain more than 50 items. If an auto scaling group name is provided, the results are limited to that group. If unknown scheduled actions are requested, they are ignored with no error. Pass a string for a single value, or an indexed array for multiple values. </li>
714
+ * <li><code>StartTime</code> - <code>string</code> - Optional - The earliest scheduled start time to return. If scheduled action names are provided, this field will be ignored. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
715
+ * <li><code>EndTime</code> - <code>string</code> - Optional - The latest scheduled start time to return. If scheduled action names are provided, this field will be ignored. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
716
+ * <li><code>NextToken</code> - <code>string</code> - Optional - A string that marks the start of the next batch of returned results. </li>
717
+ * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of scheduled actions to return. </li>
718
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
719
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
720
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
721
+ */
722
+ public function describe_scheduled_actions($opt = null)
723
+ {
724
+ if (!$opt) $opt = array();
725
+
726
+ // Optional parameter
727
+ if (isset($opt['ScheduledActionNames']))
728
+ {
729
+ $opt = array_merge($opt, CFComplexType::map(array(
730
+ 'ScheduledActionNames' => (is_array($opt['ScheduledActionNames']) ? $opt['ScheduledActionNames'] : array($opt['ScheduledActionNames']))
731
+ ), 'member'));
732
+ unset($opt['ScheduledActionNames']);
733
+ }
734
+
735
+ // Optional parameter
736
+ if (isset($opt['StartTime']))
737
+ {
738
+ $opt['StartTime'] = $this->util->convert_date_to_iso8601($opt['StartTime']);
739
+ }
740
+
741
+ // Optional parameter
742
+ if (isset($opt['EndTime']))
743
+ {
744
+ $opt['EndTime'] = $this->util->convert_date_to_iso8601($opt['EndTime']);
745
+ }
746
+
747
+ return $this->authenticate('DescribeScheduledActions', $opt, $this->hostname);
748
+ }
749
+
750
+ /**
751
+ *
752
+ * Suspends Auto Scaling processes for an Auto Scaling group. To suspend specific process types, specify them by name with the
753
+ * <code>ScalingProcesses.member.N</code> parameter. To suspend all process types, omit the <code>ScalingProcesses.member.N</code> parameter.
754
+ *
755
+ * Suspending either of the two primary process types, <code>Launch</code> or <code>Terminate</code>, can prevent other process types from
756
+ * functioning properly. For more information about processes and their dependencies, see ProcessType.
757
+ *
758
+ *
759
+ * To resume processes that have been suspended, use ResumeProcesses.
760
+ *
761
+ * @param string $auto_scaling_group_name (Required) The name or Amazon Resource Name (ARN) of the Auto Scaling group.
762
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
763
+ * <li><code>ScalingProcesses</code> - <code>string|array</code> - Optional - The processes that you want to suspend or resume, which can include one or more of the following: <ul> <li>Launch</li><li>Terminate</li><li>HealthCheck</li><li>ReplaceUnhealthy</li><li>AZRebalance</li><li>AlarmNotifications</li><li>ScheduledActions</li> </ul> To suspend all process types, omit this parameter. Pass a string for a single value, or an indexed array for multiple values. </li>
764
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
765
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
766
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
767
+ */
768
+ public function suspend_processes($auto_scaling_group_name, $opt = null)
769
+ {
770
+ if (!$opt) $opt = array();
771
+ $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
772
+
773
+ // Optional parameter
774
+ if (isset($opt['ScalingProcesses']))
775
+ {
776
+ $opt = array_merge($opt, CFComplexType::map(array(
777
+ 'ScalingProcesses' => (is_array($opt['ScalingProcesses']) ? $opt['ScalingProcesses'] : array($opt['ScalingProcesses']))
778
+ ), 'member'));
779
+ unset($opt['ScalingProcesses']);
780
+ }
781
+
782
+ return $this->authenticate('SuspendProcesses', $opt, $this->hostname);
783
+ }
784
+
785
+ /**
786
+ *
787
+ * Resumes Auto Scaling processes for an Auto Scaling group. For more information, see SuspendProcesses and ProcessType.
788
+ *
789
+ * @param string $auto_scaling_group_name (Required) The name or Amazon Resource Name (ARN) of the Auto Scaling group.
790
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
791
+ * <li><code>ScalingProcesses</code> - <code>string|array</code> - Optional - The processes that you want to suspend or resume, which can include one or more of the following: <ul> <li>Launch</li><li>Terminate</li><li>HealthCheck</li><li>ReplaceUnhealthy</li><li>AZRebalance</li><li>AlarmNotifications</li><li>ScheduledActions</li> </ul> To suspend all process types, omit this parameter. Pass a string for a single value, or an indexed array for multiple values. </li>
792
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
793
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
794
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
795
+ */
796
+ public function resume_processes($auto_scaling_group_name, $opt = null)
797
+ {
798
+ if (!$opt) $opt = array();
799
+ $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
800
+
801
+ // Optional parameter
802
+ if (isset($opt['ScalingProcesses']))
803
+ {
804
+ $opt = array_merge($opt, CFComplexType::map(array(
805
+ 'ScalingProcesses' => (is_array($opt['ScalingProcesses']) ? $opt['ScalingProcesses'] : array($opt['ScalingProcesses']))
806
+ ), 'member'));
807
+ unset($opt['ScalingProcesses']);
808
+ }
809
+
810
+ return $this->authenticate('ResumeProcesses', $opt, $this->hostname);
811
+ }
812
+
813
+ /**
814
+ *
815
+ * Creates a new launch configuration. Once created, the new launch configuration is available for immediate use.
816
+ *
817
+ * The launch configuration name used must be unique, within the scope of the client's AWS account, and the maximum limit of launch
818
+ * configurations must not yet have been met, or else the call will fail.
819
+ *
820
+ * @param string $launch_configuration_name (Required) The name of the launch configuration to create.
821
+ * @param string $image_id (Required) Unique ID of the <i>Amazon Machine Image</i> (AMI) which was assigned during registration. For more information about Amazon EC2 images, please go to Using AMIs in the <i>Amazon EC2 User Guide</i>
822
+ * @param string $instance_type (Required) The instance type of the EC2 instance. For more information about Amazon EC2 instance types, please go to Using Instances in the <i>Amazon EC2 User Guide</i>.
823
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
824
+ * <li><code>KeyName</code> - <code>string</code> - Optional - The name of the EC2 key pair. </li>
825
+ * <li><code>SecurityGroups</code> - <code>string|array</code> - Optional - The names of the security groups with which to associate EC2 instances. For more information about Amazon EC2 security groups, go to Using Security Groups in the <i>Amazon EC2 User Guide</i>. Pass a string for a single value, or an indexed array for multiple values. </li>
826
+ * <li><code>UserData</code> - <code>string</code> - Optional - The user data available to the launched EC2 instances. For more information about Amazon EC2 user data, please go to Using Instances in the <i>Amazon EC2 User Guide</i>. </li>
827
+ * <li><code>KernelId</code> - <code>string</code> - Optional - The ID of the kernel associated with the EC2 AMI. </li>
828
+ * <li><code>RamdiskId</code> - <code>string</code> - Optional - The ID of the RAM disk associated with the EC2 AMI. </li>
829
+ * <li><code>BlockDeviceMappings</code> - <code>array</code> - Optional - A list of mappings that specify how block devices are exposed to the instance. Each mapping is made up of a <i>VirtualName</i>, a <i>DeviceName</i>, and an <i>ebs</i> data structure that contains information about the associated Elastic Block Storage volume. For more information about Amazon EC2 BlockDeviceMappings, please go to Block Device Mapping in the <i>Amazon EC2 User Guide</i>. <ul>
830
+ * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
831
+ * <li><code>VirtualName</code> - <code>string</code> - Optional - The virtual name associated with the device. </li>
832
+ * <li><code>DeviceName</code> - <code>string</code> - Required - The name of the device within Amazon EC2. </li>
833
+ * <li><code>Ebs</code> - <code>array</code> - Optional - The Elastic Block Storage volume information. Takes an associative array of parameters that can have the following keys: <ul>
834
+ * <li><code>SnapshotId</code> - <code>string</code> - Optional - The Snapshot ID. </li>
835
+ * <li><code>VolumeSize</code> - <code>integer</code> - Optional - The volume size, in GigaBytes. </li>
836
+ * </ul></li>
837
+ * </ul></li>
838
+ * </ul></li>
839
+ * <li><code>InstanceMonitoring</code> - <code>array</code> - Optional - Enables detailed monitoring. <ul>
840
+ * <li><code>Enabled</code> - <code>boolean</code> - Optional - If true, instance monitoring is enabled. </li></ul></li>
841
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
842
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
843
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
844
+ */
845
+ public function create_launch_configuration($launch_configuration_name, $image_id, $instance_type, $opt = null)
846
+ {
847
+ if (!$opt) $opt = array();
848
+ $opt['LaunchConfigurationName'] = $launch_configuration_name;
849
+ $opt['ImageId'] = $image_id;
850
+
851
+ // Optional parameter
852
+ if (isset($opt['SecurityGroups']))
853
+ {
854
+ $opt = array_merge($opt, CFComplexType::map(array(
855
+ 'SecurityGroups' => (is_array($opt['SecurityGroups']) ? $opt['SecurityGroups'] : array($opt['SecurityGroups']))
856
+ ), 'member'));
857
+ unset($opt['SecurityGroups']);
858
+ }
859
+ $opt['InstanceType'] = $instance_type;
860
+
861
+ // Optional parameter
862
+ if (isset($opt['BlockDeviceMappings']))
863
+ {
864
+ $opt = array_merge($opt, CFComplexType::map(array(
865
+ 'BlockDeviceMappings' => $opt['BlockDeviceMappings']
866
+ ), 'member'));
867
+ unset($opt['BlockDeviceMappings']);
868
+ }
869
+
870
+ // Optional parameter
871
+ if (isset($opt['InstanceMonitoring']))
872
+ {
873
+ $opt = array_merge($opt, CFComplexType::map(array(
874
+ 'InstanceMonitoring' => $opt['InstanceMonitoring']
875
+ ), 'member'));
876
+ unset($opt['InstanceMonitoring']);
877
+ }
878
+
879
+ return $this->authenticate('CreateLaunchConfiguration', $opt, $this->hostname);
880
+ }
881
+
882
+ /**
883
+ *
884
+ * Disables monitoring of group metrics for the Auto Scaling group specified in AutoScalingGroupName. You can specify the list of affected
885
+ * metrics with the Metrics parameter.
886
+ *
887
+ * @param string $auto_scaling_group_name (Required) The name or ARN of the Auto Scaling Group.
888
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
889
+ * <li><code>Metrics</code> - <code>string|array</code> - Optional - The list of metrics to disable. If no metrics are specified, all metrics are disabled. The following metrics are supported: <ul> <li>GroupMinSize</li><li>GroupMaxSize</li><li>GroupDesiredCapacity</li><li>GroupInServiceInstances</li><li>GroupPendingInstances</li><li>GroupTerminatingInstances</li><li>GroupTotalInstances</li> </ul> Pass a string for a single value, or an indexed array for multiple values. </li>
890
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
891
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
892
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
893
+ */
894
+ public function disable_metrics_collection($auto_scaling_group_name, $opt = null)
895
+ {
896
+ if (!$opt) $opt = array();
897
+ $opt['AutoScalingGroupName'] = $auto_scaling_group_name;
898
+
899
+ // Optional parameter
900
+ if (isset($opt['Metrics']))
901
+ {
902
+ $opt = array_merge($opt, CFComplexType::map(array(
903
+ 'Metrics' => (is_array($opt['Metrics']) ? $opt['Metrics'] : array($opt['Metrics']))
904
+ ), 'member'));
905
+ unset($opt['Metrics']);
906
+ }
907
+
908
+ return $this->authenticate('DisableMetricsCollection', $opt, $this->hostname);
909
+ }
910
+ }
911
+
912
+
913
+ /*%******************************************************************************************%*/
914
+ // EXCEPTIONS
915
+
916
+ /**
917
+ * Default AS Exception.
918
+ */
 
 
 
 
 
 
 
 
 
 
 
 
 
919
  class AS_Exception extends Exception {}
app/libs/aws/services/cloudformation.class.php CHANGED
@@ -1,317 +1,329 @@
1
- <?php
2
- /*
3
- * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- /**
18
- *
19
- * This is the AWS CloudFormation API Reference.
20
- *
21
- * This guide is for programmers who need detailed information about the CloudFormation APIs. You use AWS CloudFormation to
22
- * create and manage AWS infrastructure deployments predictably and repeatedly. CloudFormation helps you leverage AWS
23
- * products such as Amazon EC2, EBS, Amazon SNS, ELB, and Auto Scaling to build highly-reliable, highly scalable, cost
24
- * effective applications without worrying about creating and configuring the underlying the AWS infrastructure.
25
- *
26
- * Through the use of a template file you write, and a few AWS CloudFormation commands or API actions, AWS CloudFormation
27
- * enables you to manage a collection of resources together as a single unit called a stack. AWS CloudFormation creates and
28
- * deletes all member resources of the stack together and manages all dependencies between the resources for you.
29
- *
30
- * For more information about this product, go to the <a
31
- * href="http://aws.amazon.com/documentation/cloudformation">CloudFormation Product Page</a>.
32
- *
33
- * Amazon CloudFormation makes use of other AWS products. If you need additional technical information about a specific AWS
34
- * product, you can find the product's technical documentation at http://aws.amazon.com/documentation/.
35
- *
36
- * @version Fri Mar 25 13:12:48 PDT 2011
37
- * @license See the included NOTICE.md file for complete information.
38
- * @copyright See the included NOTICE.md file for complete information.
39
- * @link http://aws.amazon.com/cloudformation/Amazon CloudFormation
40
- * @link http://aws.amazon.com/documentation/cloudformation/Amazon CloudFormation documentation
41
- */
42
- class AmazonCloudFormation extends CFRuntime
43
- {
44
-
45
- /*%******************************************************************************************%*/
46
- // CLASS CONSTANTS
47
-
48
- /**
49
- * Specify the default queue URL.
50
- */
51
- const DEFAULT_URL = 'cloudformation.us-east-1.amazonaws.com';
52
-
53
- /**
54
- * Specify the queue URL for the US-East (Northern Virginia) Region.
55
- */
56
- const REGION_US_E1 = self::DEFAULT_URL;
57
-
58
- /**
59
- * Specify the queue URL for the US-West (Northern California) Region.
60
- */
61
- const REGION_US_W1 = 'cloudformation.us-west-1.amazonaws.com';
62
-
63
- /**
64
- * Specify the queue URL for the EU (Ireland) Region.
65
- */
66
- const REGION_EU_W1 = 'cloudformation.eu-west-1.amazonaws.com';
67
-
68
- /**
69
- * Specify the queue URL for the Asia Pacific (Singapore) Region.
70
- */
71
- const REGION_APAC_SE1 = 'cloudformation.ap-southeast-1.amazonaws.com';
72
-
73
- /**
74
- * Specify the queue URL for the Asia Pacific (Japan) Region.
75
- */
76
- const REGION_APAC_NE1 = 'cloudformation.ap-northeast-1.amazonaws.com';
77
-
78
-
79
- /*%******************************************************************************************%*/
80
- // SETTERS
81
-
82
- /**
83
- * This allows you to explicitly sets the region for the service to use.
84
- *
85
- * @param string $region (Required) The region to explicitly set. Available options are <REGION_US_E1>, <REGION_US_W1>, <REGION_EU_W1>, or <REGION_APAC_SE1>.
86
- * @return $this A reference to the current instance.
87
- */
88
- public function set_region($region)
89
- {
90
- $this->set_hostname($region);
91
- return $this;
92
- }
93
-
94
-
95
- /*%******************************************************************************************%*/
96
- // CONSTRUCTOR
97
-
98
- /**
99
- * Constructs a new instance of <AmazonCloudFormation>.
100
- *
101
- * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <code>AWS_KEY</code> constant.
102
- * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant.
103
- * @return boolean false if no valid values are set, otherwise true.
104
- */
105
- public function __construct($key = null, $secret_key = null)
106
- {
107
- $this->api_version = '2010-05-15';
108
- $this->hostname = self::DEFAULT_URL;
109
-
110
- if (!$key && !defined('AWS_KEY'))
111
- {
112
- throw new CloudFormation_Exception('No account key was passed into the constructor, nor was it set in the AWS_KEY constant.');
113
- }
114
-
115
- if (!$secret_key && !defined('AWS_SECRET_KEY'))
116
- {
117
- throw new CloudFormation_Exception('No account secret was passed into the constructor, nor was it set in the AWS_SECRET_KEY constant.');
118
- }
119
-
120
- return parent::__construct($key, $secret_key);
121
- }
122
-
123
-
124
- /*%******************************************************************************************%*/
125
- // SERVICE METHODS
126
-
127
- /**
128
- *
129
- * Creates a stack as specified in the template. Once the call completes successfully, the stack creation starts. You can
130
- * check the status of the stack via the DescribeStacks API.
131
- *
132
- * AWS CloudFormation allows you to create and delete related AWS resources together as a unit called a stack. You define
133
- * the characteristics of a stack using a template, which is a JSON-compliant text file. For more information, go to the <a
134
- * href="http://docs.amazonwebservices.com/AWSCloudFormation/latest/CFNGuide">AWS CloudFormation User Guide</a>.
135
- *
136
- * Currently, the quota for stacks is 20 per region.
137
- *
138
- * @param string $stack_name (Required) The name associated with the Stack. The name must be unique within your AWS account. Must contain only alphanumeric characters (case sensitive) and start with an alpha character. Maximum length of the name is 255 characters.
139
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
140
- * <li><code>TemplateBody</code> - <code>string</code> - Optional - Structure containing the template body. (For more information, go to the AWS CloudFormation User Guide.) You must pass <code>TemplateBody</code> or <code>TemplateURL</code>. If both are passed, only <code>TemplateBody</code> is used. </li>
141
- * <li><code>TemplateURL</code> - <code>string</code> - Optional - Location of file containing the template body. (For more information, go to the AWS CloudFormation User Guide.) You must pass <code>TemplateURL</code> or <code>TemplateBody</code>. If both are passed, only <code>TemplateBody</code> is used. </li>
142
- * <li><code>Parameters</code> - <code>array</code> - Optional - A list of <code>Parameter</code> structures. <ul>
143
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
144
- * <li><code>ParameterKey</code> - <code>string</code> - Optional - The key associated with the parameter. </li>
145
- * <li><code>ParameterValue</code> - <code>string</code> - Optional - The value associated with the parameter. </li>
146
- * </ul></li>
147
- * </ul></li>
148
- * <li><code>DisableRollback</code> - <code>boolean</code> - Optional - Boolean to enable or disable rollback on stack creation failures. Default: <code>false</code> </li>
149
- * <li><code>TimeoutInMinutes</code> - <code>integer</code> - Optional - If the time limit is exceeded, the stack is marked CREATE_FAILED; if <code>RollbackOnFailure</code> is set, the stack will be rolled back. </li>
150
- * <li><code>NotificationARNs</code> - <code>string|array</code> - Optional - The Simple Notification Service (SNS) topic ARNs to publish stack related events. You can find your SNS topic ARNs using the SNS console or your Command Line Interface (CLI). Pass a string for a single value, or an indexed array for multiple values. </li>
151
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
152
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
153
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
154
- */
155
- public function create_stack($stack_name, $opt = null)
156
- {
157
- if (!$opt) $opt = array();
158
- $opt['StackName'] = $stack_name;
159
-
160
- // Optional parameter
161
- if (isset($opt['Parameters']))
162
- {
163
- $opt = array_merge($opt, CFComplexType::map(array(
164
- 'Parameters' => $opt['Parameters']
165
- ), 'member'));
166
- unset($opt['Parameters']);
167
- }
168
-
169
- // Optional parameter
170
- if (isset($opt['NotificationARNs']))
171
- {
172
- $opt = array_merge($opt, CFComplexType::map(array(
173
- 'NotificationARNs' => (is_array($opt['NotificationARNs']) ? $opt['NotificationARNs'] : array($opt['NotificationARNs']))
174
- ), 'member'));
175
- unset($opt['NotificationARNs']);
176
- }
177
-
178
- return $this->authenticate('CreateStack', $opt, $this->hostname);
179
- }
180
-
181
- /**
182
- *
183
- * Validates a specified template.
184
- *
185
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
186
- * <li><code>TemplateBody</code> - <code>string</code> - Optional - Structure containing the template body. (For more information, go to the AWS CloudFormation User Guide.) </li>
187
- * <li><code>TemplateURL</code> - <code>string</code> - Optional - Location of file containing the template body. (For more information, go to the AWS CloudFormation User Guide.) </li>
188
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
189
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
190
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
191
- */
192
- public function validate_template($opt = null)
193
- {
194
- if (!$opt) $opt = array();
195
-
196
- return $this->authenticate('ValidateTemplate', $opt, $this->hostname);
197
- }
198
-
199
- /**
200
- *
201
- * Returns the description for the specified stack; if no stack name was specified, then it returns the description for
202
- * all the stacks created.
203
- *
204
- * If a specified stack does not exist or has been successfully deleted, a <code>ValidationError</code> is returned.
205
- *
206
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
207
- * <li><code>StackName</code> - <code>string</code> - Optional - The name or the unique identifier associated with the stack. Default: <code>null</code> </li>
208
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
209
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
210
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
211
- */
212
- public function describe_stacks($opt = null)
213
- {
214
- if (!$opt) $opt = array();
215
-
216
- return $this->authenticate('DescribeStacks', $opt, $this->hostname);
217
- }
218
-
219
- /**
220
- *
221
- * Returns all the stack related events for the AWS account. If <code>StackName</code> is specified, returns events
222
- * related to all the stacks with the given name. If <code>StackName</code> is not specified, returns all the events for
223
- * the account. For more information about a stack's event history, go to the <a
224
- * href="http://docs.amazonwebservices.com/AWSCloudFormation/latest/CFNGuide">AWS CloudFormation User Guide</a>.
225
- *
226
- * Events are returned, even if the stack has been successfully deleted. If the stack never existed, a
227
- * <code>ValidationError</code> is returned.
228
- *
229
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
230
- * <li><code>StackName</code> - <code>string</code> - Optional - The name or the unique identifier associated with the stack. Default: <code>null</code> </li>
231
- * <li><code>NextToken</code> - <code>string</code> - Optional - String that identifies the start of the next list of events, if there is one. Default: <code>null</code> </li>
232
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
233
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
234
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
235
- */
236
- public function describe_stack_events($opt = null)
237
- {
238
- if (!$opt) $opt = array();
239
-
240
- return $this->authenticate('DescribeStackEvents', $opt, $this->hostname);
241
- }
242
-
243
- /**
244
- *
245
- * Returns the template body for a specified stack name.
246
- *
247
- * If the stack does not exist or the stack has been successfully deleted, a <code>ValidationError</code> is returned.
248
- *
249
- * @param string $stack_name (Required) The name or the unique identifier associated with the stack.
250
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
251
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
252
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
253
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
254
- */
255
- public function get_template($stack_name, $opt = null)
256
- {
257
- if (!$opt) $opt = array();
258
- $opt['StackName'] = $stack_name;
259
-
260
- return $this->authenticate('GetTemplate', $opt, $this->hostname);
261
- }
262
-
263
- /**
264
- *
265
- * Deletes a specified stack. Once the call completes successfully, stack deletion starts. Deleted stacks do not show up
266
- * in the DescribeStacks API if the deletion has been completed successfully.
267
- *
268
- * @param string $stack_name (Required) The name or the unique identifier associated with the stack.
269
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
270
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
271
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
272
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
273
- */
274
- public function delete_stack($stack_name, $opt = null)
275
- {
276
- if (!$opt) $opt = array();
277
- $opt['StackName'] = $stack_name;
278
-
279
- return $this->authenticate('DeleteStack', $opt, $this->hostname);
280
- }
281
-
282
- /**
283
- *
284
- * Returns AWS resource descriptions. If <code>StackName</code> is specified, all the associated resources that are part
285
- * of the stack are returned. If <code>PhysicalResourceId</code> is specified, all the associated resources of the stack
286
- * the resource belongs to are returned.
287
- *
288
- * You can use <code>LogicalResourceId</code> to filter the returned result. For more information about resources, the
289
- * <code>LogicalResourceId</code> and <code>PhysicalResourceId</code>, go to the <a
290
- * href="http://docs.amazonwebservices.com/AWSCloudFormation/latest/CFNGuide">AWS CloudFormation User Guide</a>.
291
- *
292
- * If the stack does not exist or the stack has been successfully deleted, a <code>ValidationError</code> is returned.
293
- *
294
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
295
- * <li><code>StackName</code> - <code>string</code> - Optional - The name or the unique identifier associated with the stack. Default: <code>null</code> </li>
296
- * <li><code>LogicalResourceId</code> - <code>string</code> - Optional - The logical name of the resource specified in the template. Default: <code>null</code> </li>
297
- * <li><code>PhysicalResourceId</code> - <code>string</code> - Optional - The name or unique identifier that corresponds to a physical instance ID of a resource supported by AWS CloudFormation. For example, for an Amazon Elastic Compute Cloud (EC2) instance, <code>PhysicalResourceId</code> corresponds to the <code>InstanceId</code>. You can pass the EC2 <code>InstanceId</code> to <code>DescribeStackResources</code> to find what stack the instance belongs to and what other resources are part of the stack. Default: <code>null</code> </li>
298
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
299
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
300
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
301
- */
302
- public function describe_stack_resources($opt = null)
303
- {
304
- if (!$opt) $opt = array();
305
-
306
- return $this->authenticate('DescribeStackResources', $opt, $this->hostname);
307
- }
308
- }
309
-
310
-
311
- /*%******************************************************************************************%*/
312
- // EXCEPTIONS
313
-
314
- /**
315
- * Default CloudFormation Exception.
316
- */
 
 
 
 
 
 
 
 
 
 
 
 
317
  class CloudFormation_Exception extends Exception {}
1
+ <?php
2
+ /*
3
+ * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ /**
18
+ *
19
+ *
20
+ * This is the AWS CloudFormation API Reference. The major sections of this guide are described in the following table.
21
+ *
22
+ * <ul> <li> <a href="http://docs.amazonwebservices.com/AWSCloudFormation/latest/APIReference/API_Operations.html">Actions</a>: Alphabetical
23
+ * list of CloudFormation actions</li>
24
+ *
25
+ * <li> <a href="http://docs.amazonwebservices.com/AWSCloudFormation/latest/APIReference/API_Types.html">Data Types</a>: Alphabetical list of
26
+ * CloudFormation data types</li>
27
+ *
28
+ * <li> <a href="http://docs.amazonwebservices.com/AWSCloudFormation/latest/APIReference/CommonParameters.html">Common Parameters</a>:
29
+ * Parameters that all Query actions can use</li>
30
+ *
31
+ * <li> <a href="http://docs.amazonwebservices.com/AWSCloudFormation/latest/APIReference/CommonErrors.html">Common Errors</a>: Client and
32
+ * server errors that all actions can return</li>
33
+ *
34
+ * </ul>
35
+ *
36
+ * This guide is for programmers who need detailed information about the CloudFormation APIs. You use AWS CloudFormation to create and manage
37
+ * AWS infrastructure deployments predictably and repeatedly. CloudFormation helps you leverage AWS products such as Amazon EC2, EBS, Amazon
38
+ * SNS, ELB, and Auto Scaling to build highly-reliable, highly scalable, cost effective applications without worrying about creating and
39
+ * configuring the underlying the AWS infrastructure.
40
+ *
41
+ * Through the use of a template file you write, and a few AWS CloudFormation commands or API actions, AWS CloudFormation enables you to manage
42
+ * a collection of resources together as a single unit called a stack. AWS CloudFormation creates and deletes all member resources of the stack
43
+ * together and manages all dependencies between the resources for you.
44
+ *
45
+ * For more information about this product, go to the <a href="http://aws.amazon.com/documentation/cloudformation">CloudFormation Product
46
+ * Page</a>.
47
+ *
48
+ * Amazon CloudFormation makes use of other AWS products. If you need additional technical information about a specific AWS product, you can
49
+ * find the product's technical documentation at <a href="http://aws.amazon.com/documentation/">http://aws.amazon.com/documentation/</a>.
50
+ *
51
+ * @version Tue May 10 18:24:21 PDT 2011
52
+ * @license See the included NOTICE.md file for complete information.
53
+ * @copyright See the included NOTICE.md file for complete information.
54
+ * @link http://aws.amazon.com/cloudformation/Amazon CloudFormation
55
+ * @link http://aws.amazon.com/documentation/cloudformation/Amazon CloudFormation documentation
56
+ */
57
+ class AmazonCloudFormation extends CFRuntime
58
+ {
59
+
60
+ /*%******************************************************************************************%*/
61
+ // CLASS CONSTANTS
62
+
63
+ /**
64
+ * Specify the default queue URL.
65
+ */
66
+ const DEFAULT_URL = 'cloudformation.us-east-1.amazonaws.com';
67
+
68
+ /**
69
+ * Specify the queue URL for the US-East (Northern Virginia) Region.
70
+ */
71
+ const REGION_US_E1 = self::DEFAULT_URL;
72
+
73
+ /**
74
+ * Specify the queue URL for the US-West (Northern California) Region.
75
+ */
76
+ const REGION_US_W1 = 'cloudformation.us-west-1.amazonaws.com';
77
+
78
+ /**
79
+ * Specify the queue URL for the EU (Ireland) Region.
80
+ */
81
+ const REGION_EU_W1 = 'cloudformation.eu-west-1.amazonaws.com';
82
+
83
+ /**
84
+ * Specify the queue URL for the Asia Pacific (Singapore) Region.
85
+ */
86
+ const REGION_APAC_SE1 = 'cloudformation.ap-southeast-1.amazonaws.com';
87
+
88
+ /**
89
+ * Specify the queue URL for the Asia Pacific (Japan) Region.
90
+ */
91
+ const REGION_APAC_NE1 = 'cloudformation.ap-northeast-1.amazonaws.com';
92
+
93
+
94
+ /*%******************************************************************************************%*/
95
+ // SETTERS
96
+
97
+ /**
98
+ * This allows you to explicitly sets the region for the service to use.
99
+ *
100
+ * @param string $region (Required) The region to explicitly set. Available options are <REGION_US_E1>, <REGION_US_W1>, <REGION_EU_W1>, or <REGION_APAC_SE1>.
101
+ * @return $this A reference to the current instance.
102
+ */
103
+ public function set_region($region)
104
+ {
105
+ $this->set_hostname($region);
106
+ return $this;
107
+ }
108
+
109
+
110
+ /*%******************************************************************************************%*/
111
+ // CONSTRUCTOR
112
+
113
+ /**
114
+ * Constructs a new instance of <AmazonCloudFormation>.
115
+ *
116
+ * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <code>AWS_KEY</code> constant.
117
+ * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant.
118
+ * @return boolean false if no valid values are set, otherwise true.
119
+ */
120
+ public function __construct($key = null, $secret_key = null)
121
+ {
122
+ $this->api_version = '2010-05-15';
123
+ $this->hostname = self::DEFAULT_URL;
124
+
125
+ if (!$key && !defined('AWS_KEY'))
126
+ {
127
+ // @codeCoverageIgnoreStart
128
+ throw new CloudFormation_Exception('No account key was passed into the constructor, nor was it set in the AWS_KEY constant.');
129
+ // @codeCoverageIgnoreEnd
130
+ }
131
+
132
+ if (!$secret_key && !defined('AWS_SECRET_KEY'))
133
+ {
134
+ // @codeCoverageIgnoreStart
135
+ throw new CloudFormation_Exception('No account secret was passed into the constructor, nor was it set in the AWS_SECRET_KEY constant.');
136
+ // @codeCoverageIgnoreEnd
137
+ }
138
+
139
+ return parent::__construct($key, $secret_key);
140
+ }
141
+
142
+
143
+ /*%******************************************************************************************%*/
144
+ // SERVICE METHODS
145
+
146
+ /**
147
+ *
148
+ * Creates a stack as specified in the template. Once the call completes successfully, the stack creation starts. You can check the status of
149
+ * the stack via the DescribeStacks API.
150
+ *
151
+ * Currently, the limit for stacks is 20 stacks per account per region.
152
+ *
153
+ * @param string $stack_name (Required) The name associated with the stack. The name must be unique within your AWS account. Must contain only alphanumeric characters (case sensitive) and start with an alpha character. Maximum length of the name is 255 characters.
154
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
155
+ * <li><code>TemplateBody</code> - <code>string</code> - Optional - Structure containing the template body. (For more information, go to the AWS CloudFormation User Guide.) Condition: You must pass <code>TemplateBody</code> or <code>TemplateURL</code>. If both are passed, only <code>TemplateBody</code> is used. </li>
156
+ * <li><code>TemplateURL</code> - <code>string</code> - Optional - Location of file containing the template body. The URL must point to a template located in an S3 bucket in the same region as the stack. For more information, go to the AWS CloudFormation User Guide. Conditional: You must pass <code>TemplateURL</code> or <code>TemplateBody</code>. If both are passed, only <code>TemplateBody</code> is used. </li>
157
+ * <li><code>Parameters</code> - <code>array</code> - Optional - A list of <code>Parameter</code> structures. <ul>
158
+ * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
159
+ * <li><code>ParameterKey</code> - <code>string</code> - Optional - The key associated with the parameter. </li>
160
+ * <li><code>ParameterValue</code> - <code>string</code> - Optional - The value associated with the parameter. </li>
161
+ * </ul></li>
162
+ * </ul></li>
163
+ * <li><code>DisableRollback</code> - <code>boolean</code> - Optional - Boolean to enable or disable rollback on stack creation failures.<br></br> Default: <code>false</code> </li>
164
+ * <li><code>TimeoutInMinutes</code> - <code>integer</code> - Optional - The amount of time that can pass before the stack status becomes CREATE_FAILED; if <code>DisableRollback</code> is not set or is set to <code>false</code>, the stack will be rolled back. </li>
165
+ * <li><code>NotificationARNs</code> - <code>string|array</code> - Optional - The Simple Notification Service (SNS) topic ARNs to publish stack related events. You can find your SNS topic ARNs using the SNS console or your Command Line Interface (CLI). Pass a string for a single value, or an indexed array for multiple values. </li>
166
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
167
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
168
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
169
+ */
170
+ public function create_stack($stack_name, $opt = null)
171
+ {
172
+ if (!$opt) $opt = array();
173
+ $opt['StackName'] = $stack_name;
174
+
175
+ // Optional parameter
176
+ if (isset($opt['Parameters']))
177
+ {
178
+ $opt = array_merge($opt, CFComplexType::map(array(
179
+ 'Parameters' => $opt['Parameters']
180
+ ), 'member'));
181
+ unset($opt['Parameters']);
182
+ }
183
+
184
+ // Optional parameter
185
+ if (isset($opt['NotificationARNs']))
186
+ {
187
+ $opt = array_merge($opt, CFComplexType::map(array(
188
+ 'NotificationARNs' => (is_array($opt['NotificationARNs']) ? $opt['NotificationARNs'] : array($opt['NotificationARNs']))
189
+ ), 'member'));
190
+ unset($opt['NotificationARNs']);
191
+ }
192
+
193
+ return $this->authenticate('CreateStack', $opt, $this->hostname);
194
+ }
195
+
196
+ /**
197
+ *
198
+ * Validates a specified template.
199
+ *
200
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
201
+ * <li><code>TemplateBody</code> - <code>string</code> - Optional - String containing the template body. (For more information, go to the AWS CloudFormation User Guide.) Conditional: You must pass <code>TemplateURL</code> or <code>TemplateBody</code>. If both are passed, only <code>TemplateBody</code> is used. </li>
202
+ * <li><code>TemplateURL</code> - <code>string</code> - Optional - Location of file containing the template body. The URL must point to a template located in an S3 bucket in the same region as the stack. For more information, go to the AWS CloudFormation User Guide. Conditional: You must pass <code>TemplateURL</code> or <code>TemplateBody</code>. If both are passed, only <code>TemplateBody</code> is used. </li>
203
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
204
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
205
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
206
+ */
207
+ public function validate_template($opt = null)
208
+ {
209
+ if (!$opt) $opt = array();
210
+
211
+ return $this->authenticate('ValidateTemplate', $opt, $this->hostname);
212
+ }
213
+
214
+ /**
215
+ *
216
+ * Returns the description for the specified stack; if no stack name was specified, then it returns the description for all the stacks
217
+ * created.
218
+ *
219
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
220
+ * <li><code>StackName</code> - <code>string</code> - Optional - The name or the unique identifier associated with the stack. Default: There is no default value. </li>
221
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
222
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
223
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
224
+ */
225
+ public function describe_stacks($opt = null)
226
+ {
227
+ if (!$opt) $opt = array();
228
+
229
+ return $this->authenticate('DescribeStacks', $opt, $this->hostname);
230
+ }
231
+
232
+ /**
233
+ *
234
+ * Returns all the stack related events for the AWS account. If <code>StackName</code> is specified, returns events related to all the stacks
235
+ * with the given name. If <code>StackName</code> is not specified, returns all the events for the account. For more information about a
236
+ * stack's event history, go to the <a href="http://docs.amazonwebservices.com/AWSCloudFormation/latest/CFNGuide">AWS CloudFormation User
237
+ * Guide</a>.
238
+ *
239
+ * Events are returned, even if the stack never existed or has been successfully deleted.
240
+ *
241
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
242
+ * <li><code>StackName</code> - <code>string</code> - Optional - The name or the unique identifier associated with the stack.<br></br> Default: There is no default value. </li>
243
+ * <li><code>NextToken</code> - <code>string</code> - Optional - String that identifies the start of the next list of events, if there is one.<br></br> Default: There is no default value. </li>
244
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
245
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
246
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
247
+ */
248
+ public function describe_stack_events($opt = null)
249
+ {
250
+ if (!$opt) $opt = array();
251
+
252
+ return $this->authenticate('DescribeStackEvents', $opt, $this->hostname);
253
+ }
254
+
255
+ /**
256
+ *
257
+ * Returns the template body for a specified stack name.
258
+ *
259
+ * If the template does not exist, a <code>ValidationError</code> is returned.
260
+ *
261
+ * @param string $stack_name (Required) The name or the unique identifier associated with the stack.
262
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
263
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
264
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
265
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
266
+ */
267
+ public function get_template($stack_name, $opt = null)
268
+ {
269
+ if (!$opt) $opt = array();
270
+ $opt['StackName'] = $stack_name;
271
+
272
+ return $this->authenticate('GetTemplate', $opt, $this->hostname);
273
+ }
274
+
275
+ /**
276
+ *
277
+ * Deletes a specified stack. Once the call completes successfully, stack deletion starts. Deleted stacks do not show up in the DescribeStacks
278
+ * API if the deletion has been completed successfully.
279
+ *
280
+ * @param string $stack_name (Required) The name or the unique identifier associated with the stack.
281
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
282
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
283
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
284
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
285
+ */
286
+ public function delete_stack($stack_name, $opt = null)
287
+ {
288
+ if (!$opt) $opt = array();
289
+ $opt['StackName'] = $stack_name;
290
+
291
+ return $this->authenticate('DeleteStack', $opt, $this->hostname);
292
+ }
293
+
294
+ /**
295
+ *
296
+ * Returns AWS resource descriptions. If <code>StackName</code> is specified, all the associated resources that are part of the stack are
297
+ * returned. If <code>PhysicalResourceId</code> is specified, all the associated resources of the stack the resource belongs to are returned.
298
+ *
299
+ * You must specify <code>StackName</code> or <code>PhysicalResourceId.</code> In addition, you can specify <code>LogicalResourceId</code> to
300
+ * filter the returned result. For more information about resources, the <code>LogicalResourceId</code> and <code>PhysicalResourceId</code>, go
301
+ * to the <a href="http://docs.amazonwebservices.com/AWSCloudFormation/latest/CFNGuide">AWS CloudFormation User Guide</a>.
302
+ *
303
+ * A <code>ValidationError</code> is returned if you specify both <code>StackName</code> and <code>PhysicalResourceId</code> in the same
304
+ * request.
305
+ *
306
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
307
+ * <li><code>StackName</code> - <code>string</code> - Optional - The name or the unique identifier associated with the stack. Default: There is no default value. </li>
308
+ * <li><code>LogicalResourceId</code> - <code>string</code> - Optional - The logical name of the resource as specified in the template.<br></br> Default: There is on default value. </li>
309
+ * <li><code>PhysicalResourceId</code> - <code>string</code> - Optional - The name or unique identifier that corresponds to a physical instance ID of a resource supported by AWS CloudFormation. For example, for an Amazon Elastic Compute Cloud (EC2) instance, <code>PhysicalResourceId</code> corresponds to the <code>InstanceId</code>. You can pass the EC2 <code>InstanceId</code> to <code>DescribeStackResources</code> to find which stack the instance belongs to and what other resources are part of the stack. Default: There is no default value. </li>
310
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
311
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
312
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
313
+ */
314
+ public function describe_stack_resources($opt = null)
315
+ {
316
+ if (!$opt) $opt = array();
317
+
318
+ return $this->authenticate('DescribeStackResources', $opt, $this->hostname);
319
+ }
320
+ }
321
+
322
+
323
+ /*%******************************************************************************************%*/
324
+ // EXCEPTIONS
325
+
326
+ /**
327
+ * Default CloudFormation Exception.
328
+ */
329
  class CloudFormation_Exception extends Exception {}
app/libs/aws/services/cloudfront.class.php CHANGED
@@ -1,1417 +1,1420 @@
1
- <?php
2
- /*
3
- * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
-
18
- /*%******************************************************************************************%*/
19
- // EXCEPTIONS
20
-
21
- /**
22
- * Default CloudFront Exception.
23
- */
24
- class CloudFront_Exception extends Exception {}
25
-
26
-
27
- /*%******************************************************************************************%*/
28
- // MAIN CLASS
29
-
30
- /**
31
- * Amazon CloudFront is a web service for content delivery. It makes it easier for you to distribute content
32
- * to end users quickly, with low latency and high data transfer speeds.
33
- *
34
- * CloudFront delivers your content through a worldwide network of edge locations. End users are routed to
35
- * the nearest edge location, so content is delivered with the best possible performance. CloudFront works
36
- * seamlessly with the Amazon Simple Storage Service, which durably stores the original, definitive versions
37
- * of your files.
38
- *
39
- * @version 2011.03.11
40
- * @license See the included NOTICE.md file for more information.
41
- * @copyright See the included NOTICE.md file for more information.
42
- * @link http://aws.amazon.com/cloudfront/ Amazon CloudFront
43
- * @link http://aws.amazon.com/documentation/cloudfront/ Amazon CloudFront documentation
44
- */
45
- class AmazonCloudFront extends CFRuntime
46
- {
47
- /**
48
- * Specify the default queue URL.
49
- */
50
- const DEFAULT_URL = 'cloudfront.amazonaws.com';
51
-
52
- /**
53
- * The InProgress state.
54
- */
55
- const STATE_INPROGRESS = 'InProgress';
56
-
57
- /**
58
- * The Deployed state.
59
- */
60
- const STATE_DEPLOYED = 'Deployed';
61
-
62
- /**
63
- * The base content to use for generating the DistributionConfig XML.
64
- */
65
- var $base_xml;
66
-
67
- /**
68
- * The CloudFront distribution domain to use.
69
- */
70
- var $domain;
71
-
72
- /**
73
- * The RSA key pair ID to use.
74
- */
75
- var $key_pair_id;
76
-
77
- /**
78
- * The RSA private key resource locator.
79
- */
80
- var $private_key;
81
-
82
-
83
- /*%******************************************************************************************%*/
84
- // CONSTRUCTOR
85
-
86
- /**
87
- * Constructs a new instance of this class.
88
- *
89
- * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <AWS_KEY> constant.
90
- * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <AWS_SECRET_KEY> constant.
91
- * @return boolean A value of <code>false</code> if no valid values are set, otherwise <code>true</code>.
92
- */
93
- public function __construct($key = null, $secret_key = null)
94
- {
95
- $this->api_version = '2010-11-01';
96
- $this->hostname = self::DEFAULT_URL;
97
-
98
- $this->base_xml = '<?xml version="1.0" encoding="UTF-8"?><%s xmlns="http://cloudfront.amazonaws.com/doc/' . $this->api_version . '/"></%1$s>';
99
-
100
- if (!$key && !defined('AWS_KEY'))
101
- {
102
- throw new CloudFront_Exception('No account key was passed into the constructor, nor was it set in the AWS_KEY constant.');
103
- }
104
-
105
- if (!$secret_key && !defined('AWS_SECRET_KEY'))
106
- {
107
- throw new CloudFront_Exception('No account secret was passed into the constructor, nor was it set in the AWS_SECRET_KEY constant.');
108
- }
109
-
110
- // Set a default key pair ID
111
- if (defined('AWS_CLOUDFRONT_KEYPAIR_ID'))
112
- {
113
- $this->key_pair_id = AWS_CLOUDFRONT_KEYPAIR_ID;
114
- }
115
-
116
- // Set a default private key
117
- if (defined('AWS_CLOUDFRONT_PRIVATE_KEY_PEM'))
118
- {
119
- $this->private_key = AWS_CLOUDFRONT_PRIVATE_KEY_PEM;
120
- }
121
-
122
- return parent::__construct($key, $secret_key);
123
- }
124
-
125
-
126
- /*%******************************************************************************************%*/
127
- // AUTHENTICATION
128
-
129
- /**
130
- * Authenticates a connection to Amazon CloudFront. This method should not be used directly unless
131
- * you're writing custom methods for this class.
132
- *
133
- * @param string $method (Required) The HTTP method to use to connect. Accepts <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>DELETE</code>, and <code>HEAD</code>.
134
- * @param string $path (Optional) The endpoint path to make requests to.
135
- * @param array $opt (Optional) An associative array of parameters for authenticating. See the individual methods for allowed keys.
136
- * @param string $xml (Optional) The XML body content to send along in the request.
137
- * @param string $etag (Optional) The ETag value to pass along with the If-Match HTTP header.
138
- * @param integer $redirects (Do Not Use) Used internally by this function on occasions when Amazon S3 returns a redirect code and it needs to call itself recursively.
139
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
140
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/RESTAuthentication.html Authentication
141
- */
142
- public function authenticate($method = 'GET', $path = null, $opt = null, $xml = null, $etag = null, $redirects = 0)
143
- {
144
- if (!$opt) $opt = array();
145
- $querystring = null;
146
-
147
- $method_arguments = func_get_args();
148
-
149
- // Use the caching flow to determine if we need to do a round-trip to the server.
150
- if ($this->use_cache_flow)
151
- {
152
- // Generate an identifier specific to this particular set of arguments.
153
- $cache_id = $this->key . '_' . get_class($this) . '_' . $method . sha1($path) . '_' . sha1(serialize($method_arguments));
154
-
155
- // Instantiate the appropriate caching object.
156
- $this->cache_object = new $this->cache_class($cache_id, $this->cache_location, $this->cache_expires, $this->cache_compress);
157
-
158
- if ($this->delete_cache)
159
- {
160
- $this->use_cache_flow = false;
161
- $this->delete_cache = false;
162
- return $this->cache_object->delete();
163
- }
164
-
165
- // Invoke the cache callback function to determine whether to pull data from the cache or make a fresh request.
166
- $data = $this->cache_object->response_manager(array($this, 'cache_callback'), $method_arguments);
167
-
168
- // Parse the XML body
169
- $data = $this->parse_callback($data);
170
-
171
- // End!
172
- return $data;
173
- }
174
-
175
- // Generate query string
176
- if (isset($opt['query_string']) && count($opt['query_string']))
177
- {
178
- $querystring = '?' . $this->util->to_query_string($opt['query_string']);
179
- }
180
-
181
- // Gather information to pass along to other classes.
182
- $helpers = array(
183
- 'utilities' => $this->utilities_class,
184
- 'request' => $this->request_class,
185
- 'response' => $this->response_class,
186
- );
187
-
188
- // Compose the endpoint URL.
189
- $request_url = 'https://' . $this->hostname . '/' . $this->api_version;
190
- $request_url .= ($path) ? $path : '';
191
- $request_url .= ($querystring) ? $querystring : '';
192
-
193
- // Compose the request.
194
- $request = new $this->request_class($request_url, $this->proxy, $helpers);
195
-
196
- // Update RequestCore settings
197
- $request->request_class = $this->request_class;
198
- $request->response_class = $this->response_class;
199
-
200
- // Pass along registered stream callbacks
201
- if ($this->registered_streaming_read_callback)
202
- {
203
- $request->register_streaming_read_callback($this->registered_streaming_read_callback);
204
- }
205
-
206
- if ($this->registered_streaming_write_callback)
207
- {
208
- $request->register_streaming_write_callback($this->registered_streaming_write_callback);
209
- }
210
-
211
- // Generate required headers.
212
- $request->set_method($method);
213
- $canonical_date = gmdate($this->util->konst($this->util, 'DATE_FORMAT_RFC2616'));
214
- $request->add_header('x-amz-date', $canonical_date);
215
- $signature = base64_encode(hash_hmac('sha1', $canonical_date, $this->secret_key, true));
216
- $request->add_header('Authorization', 'AWS ' . $this->key . ':' . $signature);
217
-
218
- // Add configuration XML if we have it.
219
- if ($xml)
220
- {
221
- $request->add_header('Content-Length', strlen($xml));
222
- $request->add_header('Content-Type', 'application/xml');
223
- $request->set_body($xml);
224
- }
225
-
226
- // Set If-Match: ETag header if we have one.
227
- if ($etag)
228
- {
229
- $request->add_header('If-Match', $etag);
230
- }
231
-
232
- $curlopts = array();
233
-
234
- // Set custom CURLOPT settings
235
- if (isset($opt['curlopts']))
236
- {
237
- $curlopts = $opt['curlopts'];
238
- unset($opt['curlopts']);
239
- }
240
-
241
- // Debug mode
242
- if ($this->debug_mode)
243
- {
244
- $curlopts[CURLOPT_VERBOSE] = true;
245
- }
246
-
247
- if (count($curlopts))
248
- {
249
- $request->set_curlopts($curlopts);
250
- }
251
-
252
- // Manage the (newer) batch request API or the (older) returnCurlHandle setting.
253
- if ($this->use_batch_flow)
254
- {
255
- $handle = $request->prep_request();
256
- $this->batch_object->add($handle);
257
- $this->use_batch_flow = false;
258
-
259
- return $handle;
260
- }
261
- elseif (isset($opt['returnCurlHandle']) && $opt['returnCurlHandle'] == (bool) true)
262
- {
263
- return $request->prep_request();
264
- }
265
-
266
- // Send!
267
- $request->send_request();
268
-
269
- // Prepare the response.
270
- $headers = $request->get_response_header();
271
- if ($xml) $headers['x-aws-body'] = $xml;
272
-
273
- $data = new $this->response_class($headers, $this->parse_callback($request->get_response_body()), $request->get_response_code());
274
-
275
- // Was it Amazon's fault the request failed? Retry the request until we reach $max_retries.
276
- if ((integer) $request->get_response_code() === 500 || (integer) $request->get_response_code() === 503)
277
- {
278
- if ($redirects <= $this->max_retries)
279
- {
280
- // Exponential backoff
281
- $delay = (integer) (pow(4, $redirects) * 100000);
282
- usleep($delay);
283
- $data = $this->authenticate($method, $path, $opt, $xml, $etag, ++$redirects);
284
- }
285
- }
286
-
287
- return $data;
288
- }
289
-
290
- /**
291
- * When caching is enabled, this method fires the request to the server, and the response is cached.
292
- * Accepts identical parameters as <authenticate()>. You should never call this method directly—it is
293
- * used internally by the caching system.
294
- *
295
- * @param string $method (Required) The HTTP method to use to connect. Accepts <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>DELETE</code>, and <code>HEAD</code>.
296
- * @param string $path (Optional) The endpoint path to make requests to.
297
- * @param array $opt (Optional) An associative array of parameters for authenticating. See the individual methods for allowed keys.
298
- * @param string $xml (Optional) The XML body content to send along in the request.
299
- * @param string $etag (Optional) The ETag value to pass along with the If-Match HTTP header.
300
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
301
- */
302
- public function cache_callback($method = 'GET', $path = null, $opt = null, $xml = null, $etag = null)
303
- {
304
- // Disable the cache flow since it's already been handled.
305
- $this->use_cache_flow = false;
306
-
307
- // Make the request
308
- $response = $this->authenticate($method, $path, $opt, $xml, $etag);
309
-
310
- if (isset($response->body) && ($response->body instanceof SimpleXMLElement))
311
- {
312
- $response->body = $response->body->asXML();
313
- }
314
-
315
- return $response;
316
- }
317
-
318
-
319
- /*%******************************************************************************************%*/
320
- // SETTERS
321
-
322
- /**
323
- * Set the key ID of the RSA key pair being used.
324
- *
325
- * @param string $key_pair_id (Required) The ID of the RSA key pair being used.
326
- * @return $this A reference to the current instance.
327
- */
328
- public function set_keypair_id($key_pair_id)
329
- {
330
- $this->key_pair_id = $key_pair_id;
331
- return $this;
332
- }
333
-
334
- /**
335
- * Set the private key resource locator being used.
336
- *
337
- * @param string $private_key (Optional) The contents of the RSA private key used to sign requests.
338
- * @return $this A reference to the current instance.
339
- */
340
- public function set_private_key($private_key)
341
- {
342
- $this->private_key = $private_key;
343
- return $this;
344
- }
345
-
346
- /**
347
- * Overrides the <CFRuntime::disable_ssl()> method from the base class. SSL is required for CloudFront.
348
- *
349
- * @return void
350
- */
351
- public function disable_ssl()
352
- {
353
- throw new CloudFront_Exception('SSL/HTTPS is REQUIRED for Amazon CloudFront and cannot be disabled.');
354
- }
355
-
356
-
357
- /*%******************************************************************************************%*/
358
- // GENERATE CONFIG XML
359
-
360
- /**
361
- * Generates the distribution configuration XML used with <create_distribution()> and
362
- * <set_distribution_config()>.
363
- *
364
- * @param string $origin (Required) The source to use for the Amazon CloudFront distribution. Use an Amazon S3 bucket name, or a fully-qualified non-S3 domain name prefixed with <code>http://</code> or <code>https://</code>.
365
- * @param string $caller_reference (Required) A unique identifier for the request. A timestamp-appended string is recommended.
366
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
367
- * <li><code>CNAME</code> - <code>string|array</code> - Optional - A DNS CNAME to use to map to the Amazon CloudFront distribution. If setting more than one, use an indexed array. Supports 1-10 CNAMEs.</li>
368
- * <li><code>Comment</code> - <code>string</code> - Optional - A comment to apply to the distribution. Cannot exceed 128 characters.</li>
369
- * <li><code>DefaultRootObject</code> - <code>string</code> - Optional - The file to load when someone accesses the root of your Amazon CloudFront domain (e.g., <code>index.html</code>).</li>
370
- * <li><code>Enabled</code> - <code>string</code> - Optional - A value of <code>true</code> enables the distribution. A value of <code>false</code> disables it. The default value is <code>true</code>.</li>
371
- * <li><code>Logging</code> - <code>array</code> - Optional - An array that contains two keys: <code>Bucket</code>, specifying where logs are written to, and <code>Prefix</code>, specifying a prefix to append to log file names.</li>
372
- * <li><code>OriginAccessIdentity</code> - <code>string</code> - Optional - The origin access identity (OAI) associated with this distribution. Use the Identity ID from the OAI, not the <code>CanonicalId</code>. Requires an S3 origin.</li>
373
- * <li><code>OriginProtocolPolicy</code> - <code>string</code> - Optional - The origin protocol policy to apply to your origin. If you specify <code>http-only</code>, CloudFront will use HTTP only to access the origin. If you specify <code>match-viewer</code>, CloudFront will fetch from your origin using HTTP or HTTPS, based on the protocol of the viewer request. It has a default value of <code>match-viewer</code>. [Allowed values: <code>http-only</code>, <code>match-viewer</code>]</li>
374
- * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> will create a streaming distribution. A value of <code>false</code> will create a standard distribution. The default value is <code>false</code>.</li>
375
- * <li><code>TrustedSigners</code> - <code>array</code> - Optional - An array of AWS account numbers for users who are trusted signers. Explicity add the value <code>Self</code> to the array to add your own account as a trusted signer.</li></ul>
376
- * @return string An XML document to be used as the distribution configuration.
377
- */
378
- public function generate_config_xml($origin, $caller_reference, $opt = null)
379
- {
380
- // Default, empty XML
381
- $xml = simplexml_load_string(sprintf($this->base_xml, (
382
- (isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'StreamingDistributionConfig' : 'DistributionConfig')
383
- ));
384
-
385
- if (substr($origin, 0, 7) === 'http://' || substr($origin, 0, 8) === 'https://')
386
- {
387
- // Custom Origin
388
- $custom_origin = $xml->addChild('CustomOrigin');
389
- $custom_origin->addChild('DNSName', str_replace(array('http://', 'https://'), '', $origin));
390
-
391
- if (isset($opt['OriginProtocolPolicy']))
392
- {
393
- $custom_origin->addChild('OriginProtocolPolicy', $opt['OriginProtocolPolicy']);
394
- }
395
- else
396
- {
397
- $custom_origin->addChild('OriginProtocolPolicy', 'match-viewer');
398
- }
399
- }
400
- else
401
- {
402
- // S3 Origin
403
- $s3_origin = $xml->addChild('S3Origin');
404
- $s3_origin->addChild('DNSName', $origin . ((stripos($origin, '.s3.amazonaws.com') === false) ? '.s3.amazonaws.com' : ''));
405
-
406
- // Origin Access Identity
407
- if (isset($opt['OriginAccessIdentity']))
408
- {
409
- $s3_origin->addChild('OriginAccessIdentity', 'origin-access-identity/cloudfront/' . $opt['OriginAccessIdentity']);
410
- }
411
- }
412
-
413
- // CallerReference
414
- $xml->addChild('CallerReference', $caller_reference);
415
-
416
- // CNAME
417
- if (isset($opt['CNAME']))
418
- {
419
- if (is_array($opt['CNAME']))
420
- {
421
- foreach ($opt['CNAME'] as $cname)
422
- {
423
- $xml->addChild('CNAME', $cname);
424
- }
425
- }
426
- else
427
- {
428
- $xml->addChild('CNAME', $opt['CNAME']);
429
- }
430
- }
431
-
432
- // Comment
433
- if (isset($opt['Comment']))
434
- {
435
- $xml->addChild('Comment', $opt['Comment']);
436
- }
437
-
438
- // Enabled
439
- if (isset($opt['Enabled']))
440
- {
441
- $xml->addChild('Enabled', $opt['Enabled'] ? 'true' : 'false');
442
- }
443
- else
444
- {
445
- $xml->addChild('Enabled', 'true');
446
- }
447
-
448
- // Logging
449
- if (isset($opt['Logging']))
450
- {
451
- if (is_array($opt['Logging']))
452
- {
453
- $logging = $xml->addChild('Logging');
454
- $bucket_name = $opt['Logging']['Bucket'];
455
-
456
- // Origin
457
- $logging->addChild('Bucket', $bucket_name . (
458
- (stripos($bucket_name, '.s3.amazonaws.com') === false) ? '.s3.amazonaws.com' : ''
459
- ));
460
-
461
- $logging->addChild('Prefix', $opt['Logging']['Prefix']);
462
- }
463
- }
464
-
465
- // Required Protocols
466
- if (isset($opt['RequiredProtocols']))
467
- {
468
- $required_protocols = $xml->addChild('RequiredProtocols');
469
- $required_protocols->addChild('Protocol', $opt['RequiredProtocols']);
470
- }
471
-
472
- // Trusted Signers
473
- if (isset($opt['TrustedSigners']))
474
- {
475
- $trusted_signers = $xml->addChild('TrustedSigners');
476
-
477
- // Not an array? Convert to one.
478
- if (!is_array($opt['TrustedSigners']))
479
- {
480
- $opt['TrustedSigners'] = array($opt['TrustedSigners']);
481
- }
482
-
483
- // Handle 'Self' vs. everything else
484
- foreach ($opt['TrustedSigners'] as $signer)
485
- {
486
- if (strtolower($signer) === 'self')
487
- {
488
- $trusted_signers->addChild('Self');
489
- }
490
- else
491
- {
492
- $trusted_signers->addChild('AwsAccountNumber', $signer);
493
- }
494
- }
495
- }
496
-
497
- // DefaultRootObject
498
- if (isset($opt['DefaultRootObject']))
499
- {
500
- $xml->addChild('DefaultRootObject', $opt['DefaultRootObject']);
501
- }
502
-
503
- return $xml->asXML();
504
- }
505
-
506
- /**
507
- * Updates an existing configuration XML document.
508
- *
509
- * @param CFSimpleXML|CFResponse|string $xml (Required) The source configuration XML to make updates to. Can be the <CFSimpleXML> body of a <get_distribution_config()> response, the entire <CFResponse> of a <get_distribution_config()> response, or a string of XML generated by <generate_config_xml()> or <update_config_xml()>.
510
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
511
- * <li><code>CNAME</code> - <code>string|array</code> - Optional - The value or values to add to the existing list of CNAME values. If setting more than one, use an indexed array. Supports up to 10 CNAMEs.</li>
512
- * <li><code>Comment</code> - <code>string</code> - Optional - A comment to apply to the distribution. Cannot exceed 128 characters.</li>
513
- * <li><code>DefaultRootObject</code> - <code>string</code> - Optional - The file to load when someone accesses the root of your Amazon CloudFront domain (e.g., <code>index.html</code>).</li>
514
- * <li><code>Enabled</code> - <code>string</code> - Optional - A value of <code>true</code> enables the distribution. A value of <code>false</code> disables it. The default value is <code>true</code>.</li>
515
- * <li><code>Logging</code> - <code>array</code> - Optional - An array that contains two keys: <code>Bucket</code>, specifying where logs are written to, and <code>Prefix</code>, specifying a prefix to append to log file names.</li>
516
- * <li><code>OriginAccessIdentity</code> - <code>string</code> - Optional - The origin access identity (OAI) associated with this distribution. Use the Identity ID from the OAI, not the <code>CanonicalId</code>.</li>
517
- * <li><code>TrustedSigners</code> - <code>array</code> - Optional - An array of AWS account numbers for users who are trusted signers. Explicity add the value <code>Self</code> to the array to add your own account as a trusted signer.</li></ul>
518
- * @return string XML document.
519
- */
520
- public function update_config_xml($xml, $opt = null)
521
- {
522
- // If we receive a full CFResponse object, only use the body.
523
- if ($xml instanceof CFResponse)
524
- {
525
- $xml = $xml->body;
526
- }
527
-
528
- // If we received a string of XML, convert it into a CFSimpleXML object.
529
- if (is_string($xml))
530
- {
531
- $xml = simplexml_load_string($xml, $this->parser_class);
532
- }
533
-
534
- // Default, empty XML
535
- $update = simplexml_load_string(sprintf($this->base_xml, (
536
- (isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'StreamingDistributionConfig' : 'DistributionConfig')
537
- ), $this->parser_class);
538
-
539
- // These can't change.
540
- if (isset($xml->S3Origin))
541
- {
542
- $origin = $update->addChild('S3Origin');
543
- $origin->addChild('DNSName', $xml->S3Origin->DNSName);
544
-
545
- // origin access identity
546
- if (isset($opt['OriginAccessIdentity']))
547
- {
548
- $update->addChild('OriginAccessIdentity', 'origin-access-identity/cloudfront/' . $opt['OriginAccessIdentity']);
549
- }
550
- elseif (isset($xml->OriginAccessIdentity))
551
- {
552
- $update->addChild('OriginAccessIdentity', $xml->OriginAccessIdentity);
553
- }
554
- }
555
- elseif (isset($xml->CustomOrigin))
556
- {
557
- $origin = $update->addChild('CustomOrigin');
558
- $origin->addChild('DNSName', $xml->CustomOrigin->DNSName);
559
- }
560
- $update->addChild('CallerReference', $xml->CallerReference);
561
-
562
- // Add existing CNAME values
563
- if ($xml->CNAME)
564
- {
565
- $update->addChild('CNAME', $xml->CNAME);
566
- }
567
-
568
- // Add new CNAME values
569
- if (isset($opt['CNAME']))
570
- {
571
- if (is_array($opt['CNAME']))
572
- {
573
- foreach ($opt['CNAME'] as $cname)
574
- {
575
- $update->addChild('CNAME', $cname);
576
- }
577
- }
578
- else
579
- {
580
- $update->addChild('CNAME', $opt['CNAME']);
581
- }
582
- }
583
-
584
- // Comment
585
- if (isset($opt['Comment']))
586
- {
587
- $update->addChild('Comment', $opt['Comment']);
588
- }
589
- elseif (isset($xml->Comment))
590
- {
591
- $update->addChild('Comment', $xml->Comment);
592
- }
593
-
594
- // DefaultRootObject
595
- if (isset($opt['DefaultRootObject']))
596
- {
597
- $update->addChild('DefaultRootObject', $opt['DefaultRootObject']);
598
- }
599
- elseif (isset($xml->DefaultRootObject))
600
- {
601
- $update->addChild('DefaultRootObject', $xml->DefaultRootObject);
602
- }
603
-
604
- // Enabled
605
- if (isset($opt['Enabled']))
606
- {
607
- $update->addChild('Enabled', $opt['Enabled'] ? 'true' : 'false');
608
- }
609
- elseif (isset($xml->Enabled))
610
- {
611
- $update->addChild('Enabled', $xml->Enabled);
612
- }
613
-
614
- // Logging
615
- if (isset($opt['Logging']))
616
- {
617
- if (is_array($opt['Logging']))
618
- {
619
- $logging = $update->addChild('Logging');
620
- $bucket_name = $opt['Logging']['Bucket'];
621
-
622
- // Origin
623
- $logging->addChild('Bucket', $bucket_name . ((stripos($bucket_name, '.s3.amazonaws.com') === false) ? '.s3.amazonaws.com' : ''));
624
-
625
- $logging->addChild('Prefix', $opt['Logging']['Prefix']);
626
- }
627
- }
628
- elseif (isset($xml->Logging))
629
- {
630
- $logging = $update->addChild('Logging');
631
- $logging->addChild('Bucket', $xml->Logging->Bucket);
632
- $logging->addChild('Prefix', $xml->Logging->Prefix);
633
- }
634
-
635
- // Trusted Signers
636
- if (isset($opt['TrustedSigners']))
637
- {
638
- $trusted_signers = $update->addChild('TrustedSigners');
639
-
640
- // Not an array? Convert to one.
641
- if (!is_array($opt['TrustedSigners']))
642
- {
643
- $opt['TrustedSigners'] = array($opt['TrustedSigners']);
644
- }
645
-
646
- // Handle 'Self' vs. everything else
647
- foreach ($opt['TrustedSigners'] as $signer)
648
- {
649
- if (strtolower($signer) === 'self')
650
- {
651
- $trusted_signers->addChild('Self');
652
- }
653
- else
654
- {
655
- $trusted_signers->addChild('AwsAccountNumber', $signer);
656
- }
657
- }
658
- }
659
- elseif (isset($xml->TrustedSigners) && $xml->TrustedSigners->count())
660
- {
661
- $trusted_signers = $update->addChild('TrustedSigners');
662
-
663
- // Handle 'Self' vs. everything else
664
- foreach ($xml->TrustedSigners->children() as $signer_key => $signer_value)
665
- {
666
- if (strtolower((string) $signer_key) === 'self')
667
- {
668
- $trusted_signers->addChild('Self');
669
- }
670
- else
671
- {
672
- $trusted_signers->addChild('AwsAccountNumber', (string) $signer_value);
673
- }
674
- }
675
- }
676
-
677
- // Output
678
- return $update->asXML();
679
- }
680
-
681
- /**
682
- * Removes one or more CNAMEs from a <code>DistibutionConfig</code> XML document.
683
- *
684
- * @param CFSimpleXML|CFResponse|string $xml (Required) The source DistributionConfig XML to make updates to. Can be the <CFSimpleXML> body of a <get_distribution_config()> response, the entire <CFResponse> of a <get_distribution_config()> response, or a string of XML generated by <generate_config_xml()> or <update_config_xml()>.
685
- * @param string|array $cname (Optional) The value or values to remove from the existing list of CNAME values. To add a CNAME value, see <update_config_xml()>.
686
- * @return string XML document.
687
- */
688
- public function remove_cname($xml, $cname)
689
- {
690
- // If we receive a full CFResponse object, only use the body.
691
- if ($xml instanceof CFResponse)
692
- {
693
- $xml = $xml->body;
694
- }
695
-
696
- // If we received a string of XML, convert it into a CFSimpleXML object.
697
- if (is_string($xml))
698
- {
699
- $xml = simplexml_load_string($xml);
700
- }
701
-
702
- // Let's make sure that we have CNAMEs to remove in the first place.
703
- if (isset($xml->CNAME))
704
- {
705
- // If we have an array of CNAME values...
706
- if (is_array($cname))
707
- {
708
- foreach ($cname as $cn)
709
- {
710
- for ($i = 0, $length = sizeof($xml->CNAME); $i < $length; $i++)
711
- {
712
- if ((string) $xml->CNAME[$i] == $cn)
713
- {
714
- unset($xml->CNAME[$i]);
715
- break;
716
- }
717
- }
718
- }
719
- }
720
-
721
- // If we only have one CNAME value...
722
- else
723
- {
724
- for ($i = 0, $length = sizeof($xml->CNAME); $i < $length; $i++)
725
- {
726
- if ((string) $xml->CNAME[$i] == $cname)
727
- {
728
- unset($xml->CNAME[$i]);
729
- break;
730
- }
731
- }
732
- }
733
- }
734
-
735
- return $xml->asXML();
736
- }
737
-
738
- /**
739
- * Used to generate the origin access identity (OAI) Config XML used in <create_oai()>.
740
- *
741
- * @param string $caller_reference (Required) A unique identifier for the request. A timestamp-appended string is recommended.
742
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
743
- * <li><code>Comment</code> - <code>string</code> - Optional - Replaces the existing value for "Comment". Cannot exceed 128 characters.</li></ul>
744
- * @return string An XML document to be used as the OAI configuration.
745
- */
746
- public function generate_oai_xml($caller_reference, $opt = null)
747
- {
748
- // Default, empty XML
749
- $xml = simplexml_load_string(sprintf($this->base_xml, 'CloudFrontOriginAccessIdentityConfig'));
750
-
751
- // CallerReference
752
- $xml->addChild('CallerReference', $caller_reference);
753
-
754
- // Comment
755
- if (isset($opt['Comment']))
756
- {
757
- $xml->addChild('Comment', $opt['Comment']);
758
- }
759
-
760
- return $xml->asXML();
761
- }
762
-
763
- /**
764
- * Updates the origin access identity (OAI) configureation XML used in <create_oai()>.
765
- *
766
- * @param CFSimpleXML|CFResponse|string $xml (Required) The source configuration XML to make updates to. Can be the <CFSimpleXML> body of a <get_oai_config()> response, the entire <CFResponse> of a <get_oai_config()> response, or a string of XML generated by <generate_oai_xml()> or <update_oai_xml()>.
767
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
768
- * <li><code>Comment</code> - <code>string</code> - Optional - Replaces the existing value for "Comment". Cannot exceed 128 characters.</li></ul>
769
- * @return string XML document.
770
- */
771
- public function update_oai_xml($xml, $opt = null)
772
- {
773
- // If we receive a full CFResponse object, only use the body.
774
- if ($xml instanceof CFResponse)
775
- {
776
- $xml = $xml->body;
777
- }
778
-
779
- // If we received a string of XML, convert it into a CFSimpleXML object.
780
- if (is_string($xml))
781
- {
782
- $xml = simplexml_load_string($xml, $this->parser_class);
783
- }
784
-
785
- // Update the comment, if we have one.
786
- if (isset($opt['Comment']) && isset($xml->Comment))
787
- {
788
- $xml->Comment = $opt['Comment'];
789
- }
790
- elseif (isset($opt['Comment']))
791
- {
792
- $xml->addChild('Comment', $opt['Comment']);
793
- }
794
-
795
- return $xml->asXML();
796
- }
797
-
798
- /**
799
- * Generates the Invalidation Config XML used in <create_invalidation()>.
800
- *
801
- * @param string $caller_reference (Required) A unique identifier for the request. A timestamp-appended string is recommended.
802
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
803
- * <li><code>Paths</code> - <code>string|array</code> - Optional - One or more paths to set for invalidation. Pass a string for a single value, or an indexed array for multiple values.</li></ul>
804
- * @return string An XML document to be used as the Invalidation configuration.
805
- */
806
- public function generate_invalidation_xml($caller_reference, $opt = null)
807
- {
808
- // Default, empty XML
809
- $xml = simplexml_load_string(sprintf($this->base_xml, 'InvalidationBatch'));
810
-
811
- // CallerReference
812
- $xml->addChild('CallerReference', $caller_reference);
813
-
814
- // Paths
815
- if (isset($opt['Paths']))
816
- {
817
- $paths = is_array($opt['Paths']) ? $opt['Paths'] : array($opt['Paths']);
818
-
819
- foreach ($paths as $path)
820
- {
821
- $path = str_replace('%2F', '/', rawurlencode($path));
822
- $path = (substr($path, 0, 1) === '/') ? $path : ('/' . $path);
823
- $xml->addChild('Path', $path);
824
- }
825
- }
826
-
827
- return $xml->asXML();
828
- }
829
-
830
-
831
- /*%******************************************************************************************%*/
832
- // DISTRIBUTIONS
833
-
834
- /**
835
- * Creates an Amazon CloudFront distribution. You can have up to 100 distributions in the Amazon
836
- * CloudFront system.
837
- *
838
- * For an Adobe Real-Time Messaging Protocol (RTMP) streaming distribution, set the <code>Streaming</code> option
839
- * to true.
840
- *
841
- * @param string $origin (Required) The source to use for the Amazon CloudFront distribution. Use an Amazon S3 bucket name, or a fully-qualified non-S3 domain name prefixed with <code>http://</code> or <code>https://</code>.
842
- * @param string $caller_reference (Required) A unique identifier for the request. A timestamp-appended string is recommended.
843
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
844
- * <li><code>CNAME</code> - <code>string|array</code> - Optional - A DNS CNAME to use to map to the Amazon CloudFront distribution. If setting more than one, use an indexed array. Supports 1-10 CNAMEs.</li>
845
- * <li><code>Comment</code> - <code>string</code> - Optional - A comment to apply to the distribution. Cannot exceed 128 characters.</li>
846
- * <li><code>DefaultRootObject</code> - <code>string</code> - Optional - The file to load when someone accesses the root of the Amazon CloudFront domain (e.g., <code>index.html</code>).</li>
847
- * <li><code>Enabled</code> - <code>string</code> - Optional - A value of <code>true</code> will enable the distribution. A value of <code>false</code> will disable it. The default value is <code>true</code>.</li>
848
- * <li><code>OriginAccessIdentity</code> - <code>string</code> - Optional - The origin access identity (OAI) associated with this distribution. Use the Identity ID from the OAI, not the <code>CanonicalId</code>. Requires an S3 origin.</li>
849
- * <li><code>OriginProtocolPolicy</code> - <code>string</code> - Optional - The origin protocol policy to apply to your origin. If you specify <code>http-only</code>, CloudFront will use HTTP only to access the origin. If you specify <code>match-viewer</code>, CloudFront will fetch from your origin using HTTP or HTTPS, based on the protocol of the viewer request. [Allowed values: <code>http-only</code>, <code>match-viewer</code>]. The default value is <code>match-viewer</code>. Requires a non-S3 origin.</li>
850
- * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> creates a streaming distribution. A value of <code>false</code> creates a standard distribution. The default value is <code>false</code>.</li>
851
- * <li><code>TrustedSigners</code> - <code>array</code> - Optional - An array of AWS account numbers for users who are trusted signers. Explicity add the value <code>Self</code> to the array to add your own account as a trusted signer.</li>
852
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
853
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
854
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
855
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/CreateDistribution.html POST Distribution
856
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/CreateStreamingDistribution.html POST Streaming Distribution
857
- */
858
- public function create_distribution($origin, $caller_reference, $opt = null)
859
- {
860
- if (!$opt) $opt = array();
861
-
862
- $xml = $this->generate_config_xml($origin, $caller_reference, $opt);
863
- $path = '/' . ((isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'streaming-distribution' : 'distribution');
864
-
865
- return $this->authenticate('POST', $path, $opt, $xml, null);
866
- }
867
-
868
- /**
869
- * Gets a list of distributions. By default, the list is returned as one result. If needed, paginate the
870
- * list by specifying values for the <code>MaxItems</code> and <code>Marker</code> parameters.
871
- *
872
- * Standard distributions are listed separately from streaming distributions. For streaming distributions,
873
- * set the <code>Streaming</code> option to true.
874
- *
875
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
876
- * <li><code>Marker</code> - <code>string</code> - Optional - Use this setting when paginating results to indicate where in your list of distributions to begin. The results include distributions in the list that occur after the marker. To get the next page of results, set the <code>Marker</code> to the value of the <code>NextMarker</code> from the current page's response (which is also the ID of the last distribution on that page).</li>
877
- * <li><code>MaxItems</code> - <code>integer</code> - Optional - The maximum number of distributions you want in the response body. Maximum of 100.</li>
878
- * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> will create a streaming distribution. A value of <code>false</code> will create a standard distribution. The default value is <code>false</code>.</li>
879
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
880
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
881
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
882
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/ListDistributions.html GET Distribution List
883
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/ListStreamingDistributions.html GET Streaming Distribution List
884
- */
885
- public function list_distributions($opt = null)
886
- {
887
- if (!$opt) $opt = array();
888
- $opt['query_string'] = array();
889
-
890
- // Pass these to the query string
891
- foreach (array('Marker', 'MaxItems') as $option)
892
- {
893
- if (isset($opt[$option]))
894
- {
895
- $opt['query_string'][$option] = $opt[$option];
896
- }
897
- }
898
-
899
- $path = '/' . ((isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'streaming-distribution' : 'distribution');
900
-
901
- return $this->authenticate('GET', $path, $opt, null, null);
902
- }
903
-
904
- /**
905
- * Gets distribution information for the specified distribution ID.
906
- *
907
- * Standard distributions are handled separately from streaming distributions. For streaming
908
- * distributions, set the <code>Streaming</code> option to true.
909
- *
910
- * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
911
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
912
- * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> will create a streaming distribution. A value of <code>false</code> will create a standard distribution. The default value is <code>false</code>.</li>
913
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
914
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
915
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
916
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetDistribution.html GET Distribution
917
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetStreamingDistribution.html GET Streaming Distribution
918
- */
919
- public function get_distribution_info($distribution_id, $opt = null)
920
- {
921
- if (!$opt) $opt = array();
922
-
923
- $path = '/' . ((isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'streaming-distribution' : 'distribution');
924
- $path .= '/' . $distribution_id;
925
-
926
- return $this->authenticate('GET', $path, $opt, null, null);
927
- }
928
-
929
- /**
930
- * Deletes a disabled distribution. If distribution hasn't been disabled, Amazon CloudFront returns a
931
- * <code>DistributionNotDisabled</code> error. Use <set_distribution_config()> to disable a distribution before
932
- * attempting to delete.
933
- *
934
- * For an Adobe Real-Time Messaging Protocol (RTMP) streaming distribution, set the <code>Streaming</code> option
935
- * to be <code>true</code>.
936
- *
937
- * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
938
- * @param string $etag (Required) The <code>ETag</code> header value retrieved from <get_distribution_config()>.
939
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
940
- * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> will create a streaming distribution. A value of <code>false</code> will create a standard distribution. The default value is <code>false</code>.</li>
941
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
942
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
943
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
944
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/DeleteDistribution.html DELETE Distribution
945
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/DeleteStreamingDistribution.html DELETE Streaming Distribution
946
- */
947
- public function delete_distribution($distribution_id, $etag, $opt = null)
948
- {
949
- if (!$opt) $opt = array();
950
-
951
- $path = '/' . ((isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'streaming-distribution' : 'distribution');
952
- $path .= '/' . $distribution_id;
953
-
954
- return $this->authenticate('DELETE', $path, $opt, null, $etag);
955
- }
956
-
957
- /**
958
- * Gets the current distribution configuration for the specified distribution ID.
959
- *
960
- * Standard distributions are handled separately from streaming distributions. For streaming
961
- * distributions, set the <code>Streaming</code> option to true.
962
- *
963
- * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
964
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
965
- * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> will create a streaming distribution. A value of <code>false</code> will create a standard distribution. The default value is <code>false</code>.</li>
966
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
967
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
968
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
969
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetConfig.html GET Distribution Config
970
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetStreamingDistConfig.html GET Streaming Distribution Config
971
- */
972
- public function get_distribution_config($distribution_id, $opt = null)
973
- {
974
- if (!$opt) $opt = array();
975
-
976
- $path = '/' . ((isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'streaming-distribution' : 'distribution');
977
- $path .= '/' . $distribution_id . '/config';
978
-
979
- return $this->authenticate('GET', $path, $opt, null, null);
980
- }
981
-
982
- /**
983
- * Sets a new distribution configuration for the specified distribution ID.
984
- *
985
- * Standard distributions are handled separately from streaming distributions. For streaming
986
- * distributions, set the <code>Streaming</code> option to true.
987
- *
988
- * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
989
- * @param string $xml (Required) The DistributionConfig XML generated by <generate_config_xml()> or <update_config_xml()>.
990
- * @param string $etag (Required) The ETag header value retrieved from <get_distribution_config()>.
991
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
992
- * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> will create a streaming distribution. A value of <code>false</code> will create a standard distribution. The default value is <code>false</code>.</li>
993
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
994
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
995
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
996
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/PutConfig.html PUT Distribution Config
997
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/PutStreamingDistConfig.html PUT Streaming Distribution Config
998
- */
999
- public function set_distribution_config($distribution_id, $xml, $etag, $opt = null)
1000
- {
1001
- if (!$opt) $opt = array();
1002
-
1003
- $path = '/' . ((isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'streaming-distribution' : 'distribution');
1004
- $path .= '/' . $distribution_id . '/config';
1005
-
1006
- return $this->authenticate('PUT', $path, $opt, $xml, $etag);
1007
- }
1008
-
1009
-
1010
- /*%******************************************************************************************%*/
1011
- // Origin Access Identity
1012
-
1013
- /**
1014
- * Creates a new Amazon CloudFront origin access identity (OAI). You can create up to 100 OAIs per AWS
1015
- * account. For more information, see the Amazon CloudFront Developer Guide.
1016
- *
1017
- * @param string $caller_reference (Required) A unique identifier for the request. A timestamp-appended string is recommended.
1018
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1019
- * <li><code>Comment</code> - <code>string</code> - Optional - A comment about the OAI.</li>
1020
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1021
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1022
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1023
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/CreateOAI.html POST Origin Access Identity
1024
- */
1025
- public function create_oai($caller_reference, $opt = null)
1026
- {
1027
- if (!$opt) $opt = array();
1028
-
1029
- $path = '/origin-access-identity/cloudfront';
1030
- $xml = $this->generate_oai_xml($caller_reference, $opt);
1031
-
1032
- return $this->authenticate('POST', $path, $opt, $xml, null);
1033
- }
1034
-
1035
- /**
1036
- * Gets a list of origin access identity (OAI) summaries. By default, the list is returned as one result.
1037
- * If needed, paginate the list by specifying values for the <code>MaxItems</code> and <code>Marker</code>
1038
- * parameters.
1039
- *
1040
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1041
- * <li><code>Marker</code> - <code>string</code> - Optional - Use this when paginating results to indicate where in your list of distributions to begin. The results include distributions in the list that occur after the marker. To get the next page of results, set the Marker to the value of the NextMarker from the current page's response (which is also the ID of the last distribution on that page).</li>
1042
- * <li><code>MaxItems</code> - <code>integer</code> - Optional - The maximum number of distributions you want in the response body. Maximum of 100.</li>
1043
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1044
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1045
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1046
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/ListOAIs.html GET Origin Access Identity List
1047
- */
1048
- public function list_oais($opt = null)
1049
- {
1050
- if (!$opt) $opt = array();
1051
- $opt['query_string'] = array();
1052
-
1053
- // Pass these to the query string
1054
- foreach (array('Marker', 'MaxItems') as $option)
1055
- {
1056
- if (isset($opt[$option]))
1057
- {
1058
- $opt['query_string'][$option] = $opt[$option];
1059
- }
1060
- }
1061
-
1062
- $path = '/origin-access-identity/cloudfront';
1063
-
1064
- return $this->authenticate('GET', $path, $opt, null, null);
1065
- }
1066
-
1067
- /**
1068
- * Gets information about an origin access identity (OAI).
1069
- *
1070
- * @param string $identity_id (Required) The Identity ID for an existing OAI.
1071
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1072
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1073
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1074
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1075
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetOAI.html GET Origin Access Identity
1076
- */
1077
- public function get_oai($identity_id, $opt = null)
1078
- {
1079
- if (!$opt) $opt = array();
1080
-
1081
- $path = '/origin-access-identity/cloudfront/' . $identity_id;
1082
-
1083
- return $this->authenticate('GET', $path, $opt, null, null);
1084
- }
1085
-
1086
- /**
1087
- * Deletes an Amazon CloudFront origin access identity (OAI). To delete an OAI, the identity must first
1088
- * be disassociated from all distributions (by updating each distribution's configuration to omit the
1089
- * <code>OriginAccessIdentity</code> element). Wait until each distribution's state is <code>Deployed</code>
1090
- * before deleting the OAI.
1091
- *
1092
- * @param string $identity_id (Required) An Identity ID for an existing OAI.
1093
- * @param string $etag (Required) The <code>ETag</code> header value retrieved from a call to <get_oai()>.
1094
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1095
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1096
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1097
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1098
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/DeleteOAI.html DELETE Origin Access Identity
1099
- */
1100
- public function delete_oai($identity_id, $etag, $opt = null)
1101
- {
1102
- if (!$opt) $opt = array();
1103
-
1104
- $path = '/origin-access-identity/cloudfront/' . $identity_id;
1105
-
1106
- return $this->authenticate('DELETE', $path, $opt, null, $etag);
1107
- }
1108
-
1109
- /**
1110
- * Gets the configuration of the origin access identity (OAI) for the specified identity ID.
1111
- *
1112
- * @param string $identity_id (Required) An Identity ID for an existing OAI.
1113
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1114
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1115
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1116
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1117
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetOAIConfig.html GET Origin Access Identity Config
1118
- */
1119
- public function get_oai_config($identity_id, $opt = null)
1120
- {
1121
- if (!$opt) $opt = array();
1122
-
1123
- $path = '/origin-access-identity/cloudfront/' . $identity_id . '/config';
1124
-
1125
- return $this->authenticate('GET', $path, $opt, null, null);
1126
- }
1127
-
1128
- /**
1129
- * Sets the configuration for an Amazon CloudFront origin access identity (OAI). Use this when updating
1130
- * the configuration. Currently, only comments may be updated. Follow the same process as when updating
1131
- * an identity's configuration as you do when updating a distribution's configuration. For more
1132
- * information, go to Updating a Distribution's Configuration in the Amazon CloudFront Developer Guide.
1133
- *
1134
- * When attempting to change configuration items that are not allowed to be updated, Amazon CloudFront
1135
- * returns an <code>IllegalUpdate</code> error.
1136
- *
1137
- * @param string $identity_id (Required) An Identity ID for an existing OAI.
1138
- * @param string $xml (Required) The configuration XML generated by <generate_oai_xml()>.
1139
- * @param string $etag (Required) The ETag header value retrieved from a call to <get_distribution_config()>.
1140
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1141
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1142
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1143
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1144
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/PutOAIConfig.html PUT Origin Access Identity Config
1145
- */
1146
- public function set_oai_config($identity_id, $xml, $etag, $opt = null)
1147
- {
1148
- if (!$opt) $opt = array();
1149
-
1150
- $path = '/origin-access-identity/cloudfront/' . $identity_id . '/config';
1151
-
1152
- return $this->authenticate('PUT', $path, $opt, $xml, $etag);
1153
- }
1154
-
1155
-
1156
- /*%******************************************************************************************%*/
1157
- // INVALIDATION
1158
-
1159
- /**
1160
- * Creates a new invalidation request.
1161
- *
1162
- * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
1163
- * @param string $caller_reference (Required) A unique identifier for the request. A timestamp-appended string is recommended.
1164
- * @param string|array $paths (Required) One or more paths to set for invalidation. Pass a string for a single value, or an indexed array for multiple values. values.
1165
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1166
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1167
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1168
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1169
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/CreateInvalidation.html POST Invalidation
1170
- */
1171
- public function create_invalidation($distribution_id, $caller_reference, $paths, $opt = null)
1172
- {
1173
- if (!$opt) $opt = array();
1174
- $opt['Paths'] = $paths;
1175
-
1176
- $path = '/distribution/' . $distribution_id . '/invalidation';
1177
- $xml = $this->generate_invalidation_xml($caller_reference, $opt);
1178
-
1179
- return $this->authenticate('POST', $path, $opt, $xml, null);
1180
- }
1181
-
1182
- /**
1183
- * Gets a list of invalidations. By default, the list is returned as one result. If needed, paginate the
1184
- * list by specifying values for the <code>MaxItems</code> and <code>Marker</code> parameters.
1185
- *
1186
- * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
1187
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1188
- * <li><code>Marker</code> - <code>string</code> - Optional - Use this when paginating results to indicate where in the list of invalidations to begin. The results include invalidations in the list that occur after the marker. To get the next page of results, set the <code>Marker</code> parameter to the value of the <code>NextMarker</code> parameter from the current page's response, which is also the ID of the last invalidation on that page.</li>
1189
- * <li><code>MaxItems</code> - <code>integer</code> - Optional - The maximum number of invalidations you want in the response body. A maximum value of 100 can be used.</li>
1190
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1191
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1192
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1193
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/ListInvalidation.html GET Invalidation List
1194
- */
1195
- public function list_invalidations($distribution_id, $opt = null)
1196
- {
1197
- if (!$opt) $opt = array();
1198
- $opt['query_string'] = array();
1199
-
1200
- // Pass these to the query string
1201
- foreach (array('Marker', 'MaxItems') as $option)
1202
- {
1203
- if (isset($opt[$option]))
1204
- {
1205
- $opt['query_string'][$option] = $opt[$option];
1206
- }
1207
- }
1208
-
1209
- $path = '/distribution/' . $distribution_id . '/invalidation';
1210
-
1211
- return $this->authenticate('GET', $path, $opt, null, null);
1212
- }
1213
-
1214
- /**
1215
- * Gets information about an invalidation.
1216
- *
1217
- * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
1218
- * @param string $invalidation_id (Required) The invalidation ID returned from <create_invalidation()> or <list_invalidations()>.
1219
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1220
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1221
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1222
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1223
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetInvalidation.html GET Invalidation
1224
- */
1225
- public function get_invalidation($distribution_id, $invalidation_id, $opt = null)
1226
- {
1227
- if (!$opt) $opt = array();
1228
-
1229
- $path = '/distribution/' . $distribution_id . '/invalidation/' . $invalidation_id;
1230
-
1231
- return $this->authenticate('GET', $path, $opt, null, null);
1232
- }
1233
-
1234
-
1235
- /*%******************************************************************************************%*/
1236
- // CONVENIENCE METHODS
1237
-
1238
- /**
1239
- * Gets a simplified list of standard distribution IDs.
1240
- *
1241
- * @param string $pcre (Optional) A Perl-Compatible Regular Expression (PCRE) to filter the distribution caller references against.
1242
- * @return array A list of standard distribution IDs.
1243
- */
1244
- public function get_distribution_list($pcre = null)
1245
- {
1246
- if ($this->use_batch_flow)
1247
- {
1248
- throw new CloudFront_Exception(__FUNCTION__ . '() cannot be batch requested');
1249
- }
1250
-
1251
- $list = $this->list_distributions();
1252
- if ($list = $list->body->Id())
1253
- {
1254
- $list = $list->map_string($pcre);
1255
- return $list;
1256
- }
1257
-
1258
- return array();
1259
- }
1260
-
1261
- /**
1262
- * Gets a simplified list of streaming distribution IDs.
1263
- *
1264
- * @param string $pcre (Optional) A Perl-Compatible Regular Expression (PCRE) to filter the distribution caller references against.
1265
- * @return array A list of streaming distribution IDs.
1266
- */
1267
- public function get_streaming_distribution_list($pcre = null)
1268
- {
1269
- if ($this->use_batch_flow)
1270
- {
1271
- throw new CloudFront_Exception(__FUNCTION__ . '() cannot be batch requested');
1272
- }
1273
-
1274
- $list = $this->list_distributions(array(
1275
- 'Streaming' => true
1276
- ));
1277
- if ($list = $list->body->Id())
1278
- {
1279
- $list = $list->map_string($pcre);
1280
- return $list;
1281
- }
1282
-
1283
- return array();
1284
- }
1285
-
1286
- /**
1287
- * Gets a simplified list of origin access identity (OAI) IDs.
1288
- *
1289
- * @param string $pcre (Optional) A Perl-Compatible Regular Expression (PCRE) to filter the OAI caller references against.
1290
- * @return array A list of OAI IDs.
1291
- */
1292
- public function get_oai_list($pcre = null)
1293
- {
1294
- if ($this->use_batch_flow)
1295
- {
1296
- throw new CloudFront_Exception(__FUNCTION__ . '() cannot be batch requested');
1297
- }
1298
-
1299
- $list = $this->list_oais();
1300
- if ($list = $list->body->Id())
1301
- {
1302
- $list = $list->map_string($pcre);
1303
- return $list;
1304
- }
1305
-
1306
- return array();
1307
- }
1308
-
1309
-
1310
- /*%******************************************************************************************%*/
1311
- // URLS
1312
-
1313
- /**
1314
- * Generates a time-limited and/or query signed request for a private file with additional optional
1315
- * restrictions.
1316
- *
1317
- * @param string $distribution_hostname (Required) The hostname of the distribution. Obtained from <create_distribution()> or <get_distribution_info()>.
1318
- * @param string $filename (Required) The file name of the object. Query parameters can be included. You can use multicharacter match wild cards () or a single-character match wild card (?) anywhere in the string.
1319
- * @param integer|string $expires (Required) The expiration time expressed either as a number of seconds since UNIX Epoch, or any string that <php:strtotime()> can understand.
1320
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1321
- * <li><code>BecomeAvailable</code> - <code>integer|string</code> - Optional - The time when the private URL becomes active. Can be expressed either as a number of seconds since UNIX Epoch, or any string that <code>strtotime()</code> can understand.</li>
1322
- * <li><code>IPAddress</code> - <code>string</code> - Optional - A single IP address to restrict the access to.</li>
1323
- * <li><code>Secure</code> - <code>boolean</code> - Optional - Whether or not to use HTTPS as the protocol scheme. A value of <code>true</code> uses <code>https</code>. A value of <code>false</code> uses <code>http</code>. The default value is <code>false</code>.</li></ul>
1324
- * @return string The file URL with authentication parameters.
1325
- * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html Serving Private Content
1326
- */
1327
- public function get_private_object_url($distribution_hostname, $filename, $expires, $opt = null)
1328
- {
1329
- if (!$this->key_pair_id || !$this->private_key)
1330
- {
1331
- throw new CloudFront_Exception('You must set both a Amazon CloudFront keypair ID and an RSA private key for that keypair before using ' . __FUNCTION__ . '()');
1332
- }
1333
- if (!function_exists('openssl_sign'))
1334
- {
1335
- throw new CloudFront_Exception(__FUNCTION__ . '() uses functions from the OpenSSL PHP Extension <http://php.net/openssl>, which is not installed in this PHP installation');
1336
- }
1337
-
1338
- if (!$opt) $opt = array();
1339
-
1340
- $resource = '';
1341
- $expiration_key = 'Expires';
1342
- $expires = strtotime($expires);
1343
- $conjunction = (strpos($filename, '?') === false ? '?' : '&');
1344
-
1345
- // Determine the protocol scheme
1346
- switch (substr($distribution_hostname, 0, 1) === 's')
1347
- {
1348
- // Streaming
1349
- case 's':
1350
- $scheme = 'rtmp';
1351
- $resource = str_replace(array('%3F', '%3D', '%26', '%2F'), array('?', '=', '&', '/'), rawurlencode($filename));
1352
- break;
1353
-
1354
- // Default
1355
- case 'd':
1356
- default:
1357
- $scheme = 'http';
1358
- $scheme .= (isset($opt['Secure']) && $opt['Secure'] === true ? 's' : '');
1359
- $resource = $scheme . '://' . $distribution_hostname . '/' . str_replace(array('%3F', '%3D', '%26', '%2F'), array('?', '=', '&', '/'), rawurlencode($filename));
1360
- break;
1361
- }
1362
-
1363
- // Generate default policy
1364
- $raw_policy = array(
1365
- 'Statement' => array(
1366
- array(
1367
- 'Resource' => $resource,
1368
- 'Condition' => array(
1369
- 'DateLessThan' => array(
1370
- 'AWS:EpochTime' => $expires
1371
- )
1372
- )
1373
- )
1374
- )
1375
- );
1376
-
1377
- // Become Available
1378
- if (isset($opt['BecomeAvailable']))
1379
- {
1380
- // Switch to 'Policy' instead
1381
- $expiration_key = 'Policy';
1382
-
1383
- // Update the policy
1384
- $raw_policy['Statement'][0]['Condition']['DateGreaterThan'] = array(
1385
- 'AWS:EpochTime' => strtotime($opt['BecomeAvailable'])
1386
- );
1387
- }
1388
-
1389
- // IP Address
1390
- if (isset($opt['IPAddress']))
1391
- {
1392
- // Switch to 'Policy' instead
1393
- $expiration_key = 'Policy';
1394
-
1395
- // Update the policy
1396
- $raw_policy['Statement'][0]['Condition']['IpAddress'] = array(
1397
- 'AWS:SourceIp' => $opt['IPAddress']
1398
- );
1399
- }
1400
-
1401
- // Munge the policy
1402
- $json_policy = str_replace('\/', '/', json_encode($raw_policy));
1403
- $json_policy = $this->util->decode_uhex($json_policy);
1404
- $encoded_policy = strtr(base64_encode($json_policy), '+=/', '-_~');
1405
-
1406
- // Generate the signature
1407
- openssl_sign($json_policy, $signature, $this->private_key);
1408
- $signature = strtr(base64_encode($signature), '+=/', '-_~');
1409
-
1410
- return $scheme . '://' . $distribution_hostname . '/'
1411
- . str_replace(array('%3F', '%3D', '%26', '%2F'), array('?', '=', '&', '/'), rawurlencode($filename))
1412
- . $conjunction
1413
- . ($expiration_key === 'Expires' ? ($expiration_key . '=' . $expires) : ($expiration_key . '=' . $encoded_policy))
1414
- . '&Key-Pair-Id=' . $this->key_pair_id
1415
- . '&Signature=' . $signature;
1416
- }
1417
- }
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+
18
+ /*%******************************************************************************************%*/
19
+ // EXCEPTIONS
20
+
21
+ /**
22
+ * Default CloudFront Exception.
23
+ */
24
+ class CloudFront_Exception extends Exception {}
25
+
26
+
27
+ /*%******************************************************************************************%*/
28
+ // MAIN CLASS
29
+
30
+ /**
31
+ * Amazon CloudFront is a web service for content delivery. It makes it easier for you to distribute content
32
+ * to end users quickly, with low latency and high data transfer speeds.
33
+ *
34
+ * CloudFront delivers your content through a worldwide network of edge locations. End users are routed to
35
+ * the nearest edge location, so content is delivered with the best possible performance. CloudFront works
36
+ * seamlessly with the Amazon Simple Storage Service, which durably stores the original, definitive versions
37
+ * of your files.
38
+ *
39
+ * @version 2011.03.11
40
+ * @license See the included NOTICE.md file for more information.
41
+ * @copyright See the included NOTICE.md file for more information.
42
+ * @link http://aws.amazon.com/cloudfront/ Amazon CloudFront
43
+ * @link http://aws.amazon.com/documentation/cloudfront/ Amazon CloudFront documentation
44
+ */
45
+ class AmazonCloudFront extends CFRuntime
46
+ {
47
+ /**
48
+ * Specify the default queue URL.
49
+ */
50
+ const DEFAULT_URL = 'cloudfront.amazonaws.com';
51
+
52
+ /**
53
+ * The InProgress state.
54
+ */
55
+ const STATE_INPROGRESS = 'InProgress';
56
+
57
+ /**
58
+ * The Deployed state.
59
+ */
60
+ const STATE_DEPLOYED = 'Deployed';
61
+
62
+ /**
63
+ * The base content to use for generating the DistributionConfig XML.
64
+ */
65
+ var $base_xml;
66
+
67
+ /**
68
+ * The CloudFront distribution domain to use.
69
+ */
70
+ var $domain;
71
+
72
+ /**
73
+ * The RSA key pair ID to use.
74
+ */
75
+ var $key_pair_id;
76
+
77
+ /**
78
+ * The RSA private key resource locator.
79
+ */
80
+ var $private_key;
81
+
82
+
83
+ /*%******************************************************************************************%*/
84
+ // CONSTRUCTOR
85
+
86
+ /**
87
+ * Constructs a new instance of this class.
88
+ *
89
+ * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <AWS_KEY> constant.
90
+ * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <AWS_SECRET_KEY> constant.
91
+ * @return boolean A value of <code>false</code> if no valid values are set, otherwise <code>true</code>.
92
+ */
93
+ public function __construct($key = null, $secret_key = null)
94
+ {
95
+ $this->api_version = '2010-11-01';
96
+ $this->hostname = self::DEFAULT_URL;
97
+
98
+ $this->base_xml = '<?xml version="1.0" encoding="UTF-8"?><%s xmlns="http://cloudfront.amazonaws.com/doc/' . $this->api_version . '/"></%1$s>';
99
+
100
+ if (!$key && !defined('AWS_KEY'))
101
+ {
102
+ throw new CloudFront_Exception('No account key was passed into the constructor, nor was it set in the AWS_KEY constant.');
103
+ }
104
+
105
+ if (!$secret_key && !defined('AWS_SECRET_KEY'))
106
+ {
107
+ throw new CloudFront_Exception('No account secret was passed into the constructor, nor was it set in the AWS_SECRET_KEY constant.');
108
+ }
109
+
110
+ // Set a default key pair ID
111
+ if (defined('AWS_CLOUDFRONT_KEYPAIR_ID'))
112
+ {
113
+ $this->key_pair_id = AWS_CLOUDFRONT_KEYPAIR_ID;
114
+ }
115
+
116
+ // Set a default private key
117
+ if (defined('AWS_CLOUDFRONT_PRIVATE_KEY_PEM'))
118
+ {
119
+ $this->private_key = AWS_CLOUDFRONT_PRIVATE_KEY_PEM;
120
+ }
121
+
122
+ return parent::__construct($key, $secret_key);
123
+ }
124
+
125
+
126
+ /*%******************************************************************************************%*/
127
+ // AUTHENTICATION
128
+
129
+ /**
130
+ * Authenticates a connection to Amazon CloudFront. This method should not be used directly unless
131
+ * you're writing custom methods for this class.
132
+ *
133
+ * @param string $method (Required) The HTTP method to use to connect. Accepts <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>DELETE</code>, and <code>HEAD</code>.
134
+ * @param string $path (Optional) The endpoint path to make requests to.
135
+ * @param array $opt (Optional) An associative array of parameters for authenticating. See the individual methods for allowed keys.
136
+ * @param string $xml (Optional) The XML body content to send along in the request.
137
+ * @param string $etag (Optional) The ETag value to pass along with the If-Match HTTP header.
138
+ * @param integer $redirects (Do Not Use) Used internally by this function on occasions when Amazon S3 returns a redirect code and it needs to call itself recursively.
139
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
140
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/RESTAuthentication.html Authentication
141
+ */
142
+ public function authenticate($method = 'GET', $path = null, $opt = null, $xml = null, $etag = null, $redirects = 0)
143
+ {
144
+ if (!$opt) $opt = array();
145
+ $querystring = null;
146
+
147
+ $method_arguments = func_get_args();
148
+
149
+ // Use the caching flow to determine if we need to do a round-trip to the server.
150
+ if ($this->use_cache_flow)
151
+ {
152
+ // Generate an identifier specific to this particular set of arguments.
153
+ $cache_id = $this->key . '_' . get_class($this) . '_' . $method . sha1($path) . '_' . sha1(serialize($method_arguments));
154
+
155
+ // Instantiate the appropriate caching object.
156
+ $this->cache_object = new $this->cache_class($cache_id, $this->cache_location, $this->cache_expires, $this->cache_compress);
157
+
158
+ if ($this->delete_cache)
159
+ {
160
+ $this->use_cache_flow = false;
161
+ $this->delete_cache = false;
162
+ return $this->cache_object->delete();
163
+ }
164
+
165
+ // Invoke the cache callback function to determine whether to pull data from the cache or make a fresh request.
166
+ $data = $this->cache_object->response_manager(array($this, 'cache_callback'), $method_arguments);
167
+
168
+ // Parse the XML body
169
+ $data = $this->parse_callback($data);
170
+
171
+ // End!
172
+ return $data;
173
+ }
174
+
175
+ // Generate query string
176
+ if (isset($opt['query_string']) && count($opt['query_string']))
177
+ {
178
+ $querystring = '?' . $this->util->to_query_string($opt['query_string']);
179
+ }
180
+
181
+ // Gather information to pass along to other classes.
182
+ $helpers = array(
183
+ 'utilities' => $this->utilities_class,
184
+ 'request' => $this->request_class,
185
+ 'response' => $this->response_class,
186
+ );
187
+
188
+ // Compose the endpoint URL.
189
+ $request_url = 'https://' . $this->hostname . '/' . $this->api_version;
190
+ $request_url .= ($path) ? $path : '';
191
+ $request_url .= ($querystring) ? $querystring : '';
192
+
193
+ // Compose the request.
194
+ $request = new $this->request_class($request_url, $this->proxy, $helpers);
195
+
196
+ // Update RequestCore settings
197
+ $request->request_class = $this->request_class;
198
+ $request->response_class = $this->response_class;
199
+
200
+ // Pass along registered stream callbacks
201
+ if ($this->registered_streaming_read_callback)
202
+ {
203
+ $request->register_streaming_read_callback($this->registered_streaming_read_callback);
204
+ }
205
+
206
+ if ($this->registered_streaming_write_callback)
207
+ {
208
+ $request->register_streaming_write_callback($this->registered_streaming_write_callback);
209
+ }
210
+
211
+ // Generate required headers.
212
+ $request->set_method($method);
213
+ $canonical_date = gmdate($this->util->konst($this->util, 'DATE_FORMAT_RFC2616'));
214
+ $request->add_header('x-amz-date', $canonical_date);
215
+ $signature = base64_encode(hash_hmac('sha1', $canonical_date, $this->secret_key, true));
216
+ $request->add_header('Authorization', 'AWS ' . $this->key . ':' . $signature);
217
+
218
+ // Add configuration XML if we have it.
219
+ if ($xml)
220
+ {
221
+ $request->add_header('Content-Length', strlen($xml));
222
+ $request->add_header('Content-Type', 'application/xml');
223
+ $request->set_body($xml);
224
+ }
225
+
226
+ // Set If-Match: ETag header if we have one.
227
+ if ($etag)
228
+ {
229
+ $request->add_header('If-Match', $etag);
230
+ }
231
+
232
+ $curlopts = array();
233
+
234
+ // Set custom CURLOPT settings
235
+ if (isset($opt['curlopts']))
236
+ {
237
+ $curlopts = $opt['curlopts'];
238
+ unset($opt['curlopts']);
239
+ }
240
+
241
+ // Debug mode
242
+ if ($this->debug_mode)
243
+ {
244
+ $curlopts[CURLOPT_VERBOSE] = true;
245
+ }
246
+
247
+ if (count($curlopts))
248
+ {
249
+ $request->set_curlopts($curlopts);
250
+ }
251
+
252
+ // Manage the (newer) batch request API or the (older) returnCurlHandle setting.
253
+ if ($this->use_batch_flow)
254
+ {
255
+ $handle = $request->prep_request();
256
+ $this->batch_object->add($handle);
257
+ $this->use_batch_flow = false;
258
+
259
+ return $handle;
260
+ }
261
+ elseif (isset($opt['returnCurlHandle']) && $opt['returnCurlHandle'] == (bool) true)
262
+ {
263
+ return $request->prep_request();
264
+ }
265
+
266
+ // Send!
267
+ $request->send_request();
268
+
269
+ // Prepare the response.
270
+ $headers = $request->get_response_header();
271
+ if ($xml) $headers['x-aws-body'] = $xml;
272
+
273
+ $data = new $this->response_class($headers, $this->parse_callback($request->get_response_body()), $request->get_response_code());
274
+
275
+ // Was it Amazon's fault the request failed? Retry the request until we reach $max_retries.
276
+ if ((integer) $request->get_response_code() === 500 || (integer) $request->get_response_code() === 503)
277
+ {
278
+ if ($redirects <= $this->max_retries)
279
+ {
280
+ // Exponential backoff
281
+ $delay = (integer) (pow(4, $redirects) * 100000);
282
+ usleep($delay);
283
+ $data = $this->authenticate($method, $path, $opt, $xml, $etag, ++$redirects);
284
+ }
285
+ }
286
+
287
+ return $data;
288
+ }
289
+
290
+ /**
291
+ * When caching is enabled, this method fires the request to the server, and the response is cached.
292
+ * Accepts identical parameters as <authenticate()>. You should never call this method directly—it is
293
+ * used internally by the caching system.
294
+ *
295
+ * @param string $method (Required) The HTTP method to use to connect. Accepts <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>DELETE</code>, and <code>HEAD</code>.
296
+ * @param string $path (Optional) The endpoint path to make requests to.
297
+ * @param array $opt (Optional) An associative array of parameters for authenticating. See the individual methods for allowed keys.
298
+ * @param string $xml (Optional) The XML body content to send along in the request.
299
+ * @param string $etag (Optional) The ETag value to pass along with the If-Match HTTP header.
300
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
301
+ */
302
+ public function cache_callback($method = 'GET', $path = null, $opt = null, $xml = null, $etag = null)
303
+ {
304
+ // Disable the cache flow since it's already been handled.
305
+ $this->use_cache_flow = false;
306
+
307
+ // Make the request
308
+ $response = $this->authenticate($method, $path, $opt, $xml, $etag);
309
+
310
+ if (isset($response->body) && ($response->body instanceof SimpleXMLElement))
311
+ {
312
+ $response->body = $response->body->asXML();
313
+ }
314
+
315
+ return $response;
316
+ }
317
+
318
+
319
+ /*%******************************************************************************************%*/
320
+ // SETTERS
321
+
322
+ /**
323
+ * Set the key ID of the RSA key pair being used.
324
+ *
325
+ * @param string $key_pair_id (Required) The ID of the RSA key pair being used.
326
+ * @return $this A reference to the current instance.
327
+ */
328
+ public function set_keypair_id($key_pair_id)
329
+ {
330
+ $this->key_pair_id = $key_pair_id;
331
+ return $this;
332
+ }
333
+
334
+ /**
335
+ * Set the private key resource locator being used.
336
+ *
337
+ * @param string $private_key (Optional) The contents of the RSA private key used to sign requests.
338
+ * @return $this A reference to the current instance.
339
+ */
340
+ public function set_private_key($private_key)
341
+ {
342
+ $this->private_key = $private_key;
343
+ return $this;
344
+ }
345
+
346
+ /**
347
+ * Overrides the <CFRuntime::disable_ssl()> method from the base class. SSL is required for CloudFront.
348
+ *
349
+ * @return void
350
+ */
351
+ public function disable_ssl()
352
+ {
353
+ throw new CloudFront_Exception('SSL/HTTPS is REQUIRED for Amazon CloudFront and cannot be disabled.');
354
+ }
355
+
356
+
357
+ /*%******************************************************************************************%*/
358
+ // GENERATE CONFIG XML
359
+
360
+ /**
361
+ * Generates the distribution configuration XML used with <create_distribution()> and
362
+ * <set_distribution_config()>.
363
+ *
364
+ * @param string $origin (Required) The source to use for the Amazon CloudFront distribution. Use an Amazon S3 bucket name, or a fully-qualified non-S3 domain name prefixed with <code>http://</code> or <code>https://</code>.
365
+ * @param string $caller_reference (Required) A unique identifier for the request. A timestamp-appended string is recommended.
366
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
367
+ * <li><code>CNAME</code> - <code>string|array</code> - Optional - A DNS CNAME to use to map to the Amazon CloudFront distribution. If setting more than one, use an indexed array. Supports 1-10 CNAMEs.</li>
368
+ * <li><code>Comment</code> - <code>string</code> - Optional - A comment to apply to the distribution. Cannot exceed 128 characters.</li>
369
+ * <li><code>DefaultRootObject</code> - <code>string</code> - Optional - The file to load when someone accesses the root of your Amazon CloudFront domain (e.g., <code>index.html</code>).</li>
370
+ * <li><code>Enabled</code> - <code>string</code> - Optional - A value of <code>true</code> enables the distribution. A value of <code>false</code> disables it. The default value is <code>true</code>.</li>
371
+ * <li><code>Logging</code> - <code>array</code> - Optional - An array that contains two keys: <code>Bucket</code>, specifying where logs are written to, and <code>Prefix</code>, specifying a prefix to append to log file names.</li>
372
+ * <li><code>OriginAccessIdentity</code> - <code>string</code> - Optional - The origin access identity (OAI) associated with this distribution. Use the Identity ID from the OAI, not the <code>CanonicalId</code>. Requires an S3 origin.</li>
373
+ * <li><code>OriginProtocolPolicy</code> - <code>string</code> - Optional - The origin protocol policy to apply to your origin. If you specify <code>http-only</code>, CloudFront will use HTTP only to access the origin. If you specify <code>match-viewer</code>, CloudFront will fetch from your origin using HTTP or HTTPS, based on the protocol of the viewer request. It has a default value of <code>match-viewer</code>. [Allowed values: <code>http-only</code>, <code>match-viewer</code>]</li>
374
+ * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> will create a streaming distribution. A value of <code>false</code> will create a standard distribution. The default value is <code>false</code>.</li>
375
+ * <li><code>TrustedSigners</code> - <code>array</code> - Optional - An array of AWS account numbers for users who are trusted signers. Explicity add the value <code>Self</code> to the array to add your own account as a trusted signer.</li></ul>
376
+ * @return string An XML document to be used as the distribution configuration.
377
+ */
378
+ public function generate_config_xml($origin, $caller_reference, $opt = null)
379
+ {
380
+ // Default, empty XML
381
+ $xml = simplexml_load_string(sprintf($this->base_xml, (
382
+ (isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'StreamingDistributionConfig' : 'DistributionConfig')
383
+ ));
384
+
385
+ if (substr($origin, 0, 7) === 'http://' || substr($origin, 0, 8) === 'https://')
386
+ {
387
+ // Custom Origin
388
+ $custom_origin = $xml->addChild('CustomOrigin');
389
+ $custom_origin->addChild('DNSName', str_replace(array('http://', 'https://'), '', $origin));
390
+
391
+ if (isset($opt['OriginProtocolPolicy']))
392
+ {
393
+ $custom_origin->addChild('OriginProtocolPolicy', $opt['OriginProtocolPolicy']);
394
+ }
395
+ else
396
+ {
397
+ $custom_origin->addChild('OriginProtocolPolicy', 'match-viewer');
398
+ }
399
+ }
400
+ else
401
+ {
402
+ // S3 Origin
403
+ $s3_origin = $xml->addChild('S3Origin');
404
+ $s3_origin->addChild('DNSName', $origin . ((stripos($origin, '.s3.amazonaws.com') === false) ? '.s3.amazonaws.com' : ''));
405
+
406
+ // Origin Access Identity
407
+ if (isset($opt['OriginAccessIdentity']))
408
+ {
409
+ $s3_origin->addChild('OriginAccessIdentity', 'origin-access-identity/cloudfront/' . $opt['OriginAccessIdentity']);
410
+ }
411
+ }
412
+
413
+ // CallerReference
414
+ $xml->addChild('CallerReference', $caller_reference);
415
+
416
+ // CNAME
417
+ if (isset($opt['CNAME']))
418
+ {
419
+ if (is_array($opt['CNAME']))
420
+ {
421
+ foreach ($opt['CNAME'] as $cname)
422
+ {
423
+ $xml->addChild('CNAME', $cname);
424
+ }
425
+ }
426
+ else
427
+ {
428
+ $xml->addChild('CNAME', $opt['CNAME']);
429
+ }
430
+ }
431
+
432
+ // Comment
433
+ if (isset($opt['Comment']))
434
+ {
435
+ $xml->addChild('Comment', $opt['Comment']);
436
+ }
437
+
438
+ // Enabled
439
+ if (isset($opt['Enabled']))
440
+ {
441
+ $xml->addChild('Enabled', $opt['Enabled'] ? 'true' : 'false');
442
+ }
443
+ else
444
+ {
445
+ $xml->addChild('Enabled', 'true');
446
+ }
447
+
448
+ // Logging
449
+ if (isset($opt['Logging']))
450
+ {
451
+ if (is_array($opt['Logging']))
452
+ {
453
+ $logging = $xml->addChild('Logging');
454
+ $bucket_name = $opt['Logging']['Bucket'];
455
+
456
+ // Origin
457
+ $logging->addChild('Bucket', $bucket_name . (
458
+ (stripos($bucket_name, '.s3.amazonaws.com') === false) ? '.s3.amazonaws.com' : ''
459
+ ));
460
+
461
+ $logging->addChild('Prefix', $opt['Logging']['Prefix']);
462
+ }
463
+ }
464
+
465
+ // Required Protocols
466
+ if (isset($opt['RequiredProtocols']))
467
+ {
468
+ $required_protocols = $xml->addChild('RequiredProtocols');
469
+ $required_protocols->addChild('Protocol', $opt['RequiredProtocols']);
470
+ }
471
+
472
+ // Trusted Signers
473
+ if (isset($opt['TrustedSigners']))
474
+ {
475
+ $trusted_signers = $xml->addChild('TrustedSigners');
476
+
477
+ // Not an array? Convert to one.
478
+ if (!is_array($opt['TrustedSigners']))
479
+ {
480
+ $opt['TrustedSigners'] = array($opt['TrustedSigners']);
481
+ }
482
+
483
+ // Handle 'Self' vs. everything else
484
+ foreach ($opt['TrustedSigners'] as $signer)
485
+ {
486
+ if (strtolower($signer) === 'self')
487
+ {
488
+ $trusted_signers->addChild('Self');
489
+ }
490
+ else
491
+ {
492
+ $trusted_signers->addChild('AwsAccountNumber', $signer);
493
+ }
494
+ }
495
+ }
496
+
497
+ // DefaultRootObject
498
+ if (isset($opt['DefaultRootObject']))
499
+ {
500
+ $xml->addChild('DefaultRootObject', $opt['DefaultRootObject']);
501
+ }
502
+
503
+ return $xml->asXML();
504
+ }
505
+
506
+ /**
507
+ * Updates an existing configuration XML document.
508
+ *
509
+ * @param CFSimpleXML|CFResponse|string $xml (Required) The source configuration XML to make updates to. Can be the <CFSimpleXML> body of a <get_distribution_config()> response, the entire <CFResponse> of a <get_distribution_config()> response, or a string of XML generated by <generate_config_xml()> or <update_config_xml()>.
510
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
511
+ * <li><code>CNAME</code> - <code>string|array</code> - Optional - The value or values to add to the existing list of CNAME values. If setting more than one, use an indexed array. Supports up to 10 CNAMEs.</li>
512
+ * <li><code>Comment</code> - <code>string</code> - Optional - A comment to apply to the distribution. Cannot exceed 128 characters.</li>
513
+ * <li><code>DefaultRootObject</code> - <code>string</code> - Optional - The file to load when someone accesses the root of your Amazon CloudFront domain (e.g., <code>index.html</code>).</li>
514
+ * <li><code>Enabled</code> - <code>string</code> - Optional - A value of <code>true</code> enables the distribution. A value of <code>false</code> disables it. The default value is <code>true</code>.</li>
515
+ * <li><code>Logging</code> - <code>array</code> - Optional - An array that contains two keys: <code>Bucket</code>, specifying where logs are written to, and <code>Prefix</code>, specifying a prefix to append to log file names.</li>
516
+ * <li><code>OriginAccessIdentity</code> - <code>string</code> - Optional - The origin access identity (OAI) associated with this distribution. Use the Identity ID from the OAI, not the <code>CanonicalId</code>.</li>
517
+ * <li><code>TrustedSigners</code> - <code>array</code> - Optional - An array of AWS account numbers for users who are trusted signers. Explicity add the value <code>Self</code> to the array to add your own account as a trusted signer.</li></ul>
518
+ * @return string XML document.
519
+ */
520
+ public function update_config_xml($xml, $opt = null)
521
+ {
522
+ // If we receive a full CFResponse object, only use the body.
523
+ if ($xml instanceof CFResponse)
524
+ {
525
+ $xml = $xml->body;
526
+ }
527
+
528
+ // If we received a string of XML, convert it into a CFSimpleXML object.
529
+ if (is_string($xml))
530
+ {
531
+ $xml = simplexml_load_string($xml, $this->parser_class);
532
+ }
533
+
534
+ // Default, empty XML
535
+ $update = simplexml_load_string(sprintf($this->base_xml, (
536
+ (isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'StreamingDistributionConfig' : 'DistributionConfig')
537
+ ), $this->parser_class);
538
+
539
+ // These can't change.
540
+ if (isset($xml->S3Origin))
541
+ {
542
+ $origin = $update->addChild('S3Origin');
543
+ $origin->addChild('DNSName', $xml->S3Origin->DNSName);
544
+
545
+ // origin access identity
546
+ if (isset($opt['OriginAccessIdentity']))
547
+ {
548
+ $update->addChild('OriginAccessIdentity', 'origin-access-identity/cloudfront/' . $opt['OriginAccessIdentity']);
549
+ }
550
+ elseif (isset($xml->OriginAccessIdentity))
551
+ {
552
+ $update->addChild('OriginAccessIdentity', $xml->OriginAccessIdentity);
553
+ }
554
+ }
555
+ elseif (isset($xml->CustomOrigin))
556
+ {
557
+ $origin = $update->addChild('CustomOrigin');
558
+ $origin->addChild('DNSName', $xml->CustomOrigin->DNSName);
559
+ }
560
+ $update->addChild('CallerReference', $xml->CallerReference);
561
+
562
+ // Add existing CNAME values
563
+ if ($xml->CNAME)
564
+ {
565
+ $update->addChild('CNAME', $xml->CNAME);
566
+ }
567
+
568
+ // Add new CNAME values
569
+ if (isset($opt['CNAME']))
570
+ {
571
+ if (is_array($opt['CNAME']))
572
+ {
573
+ foreach ($opt['CNAME'] as $cname)
574
+ {
575
+ $update->addChild('CNAME', $cname);
576
+ }
577
+ }
578
+ else
579
+ {
580
+ $update->addChild('CNAME', $opt['CNAME']);
581
+ }
582
+ }
583
+
584
+ // Comment
585
+ if (isset($opt['Comment']))
586
+ {
587
+ $update->addChild('Comment', $opt['Comment']);
588
+ }
589
+ elseif (isset($xml->Comment))
590
+ {
591
+ $update->addChild('Comment', $xml->Comment);
592
+ }
593
+
594
+ // DefaultRootObject
595
+ if (isset($opt['DefaultRootObject']))
596
+ {
597
+ $update->addChild('DefaultRootObject', $opt['DefaultRootObject']);
598
+ }
599
+ elseif (isset($xml->DefaultRootObject))
600
+ {
601
+ $update->addChild('DefaultRootObject', $xml->DefaultRootObject);
602
+ }
603
+
604
+ // Enabled
605
+ if (isset($opt['Enabled']))
606
+ {
607
+ $update->addChild('Enabled', $opt['Enabled'] ? 'true' : 'false');
608
+ }
609
+ elseif (isset($xml->Enabled))
610
+ {
611
+ $update->addChild('Enabled', $xml->Enabled);
612
+ }
613
+
614
+ // Logging
615
+ if (isset($opt['Logging']))
616
+ {
617
+ if (is_array($opt['Logging']))
618
+ {
619
+ $logging = $update->addChild('Logging');
620
+ $bucket_name = $opt['Logging']['Bucket'];
621
+
622
+ // Origin
623
+ $logging->addChild('Bucket', $bucket_name . ((stripos($bucket_name, '.s3.amazonaws.com') === false) ? '.s3.amazonaws.com' : ''));
624
+
625
+ $logging->addChild('Prefix', $opt['Logging']['Prefix']);
626
+ }
627
+ }
628
+ elseif (isset($xml->Logging))
629
+ {
630
+ $logging = $update->addChild('Logging');
631
+ $logging->addChild('Bucket', $xml->Logging->Bucket);
632
+ $logging->addChild('Prefix', $xml->Logging->Prefix);
633
+ }
634
+
635
+ // Trusted Signers
636
+ if (isset($opt['TrustedSigners']))
637
+ {
638
+ $trusted_signers = $update->addChild('TrustedSigners');
639
+
640
+ // Not an array? Convert to one.
641
+ if (!is_array($opt['TrustedSigners']))
642
+ {
643
+ $opt['TrustedSigners'] = array($opt['TrustedSigners']);
644
+ }
645
+
646
+ // Handle 'Self' vs. everything else
647
+ foreach ($opt['TrustedSigners'] as $signer)
648
+ {
649
+ if (strtolower($signer) === 'self')
650
+ {
651
+ $trusted_signers->addChild('Self');
652
+ }
653
+ else
654
+ {
655
+ $trusted_signers->addChild('AwsAccountNumber', $signer);
656
+ }
657
+ }
658
+ }
659
+ elseif (isset($xml->TrustedSigners) && $xml->TrustedSigners->count())
660
+ {
661
+ $trusted_signers = $update->addChild('TrustedSigners');
662
+
663
+ // Handle 'Self' vs. everything else
664
+ foreach ($xml->TrustedSigners->children() as $signer_key => $signer_value)
665
+ {
666
+ if (strtolower((string) $signer_key) === 'self')
667
+ {
668
+ $trusted_signers->addChild('Self');
669
+ }
670
+ else
671
+ {
672
+ $trusted_signers->addChild('AwsAccountNumber', (string) $signer_value);
673
+ }
674
+ }
675
+ }
676
+
677
+ // Output
678
+ return $update->asXML();
679
+ }
680
+
681
+ /**
682
+ * Removes one or more CNAMEs from a <code>DistibutionConfig</code> XML document.
683
+ *
684
+ * @param CFSimpleXML|CFResponse|string $xml (Required) The source DistributionConfig XML to make updates to. Can be the <CFSimpleXML> body of a <get_distribution_config()> response, the entire <CFResponse> of a <get_distribution_config()> response, or a string of XML generated by <generate_config_xml()> or <update_config_xml()>.
685
+ * @param string|array $cname (Optional) The value or values to remove from the existing list of CNAME values. To add a CNAME value, see <update_config_xml()>.
686
+ * @return string XML document.
687
+ */
688
+ public function remove_cname($xml, $cname)
689
+ {
690
+ // If we receive a full CFResponse object, only use the body.
691
+ if ($xml instanceof CFResponse)
692
+ {
693
+ $xml = $xml->body;
694
+ }
695
+
696
+ // If we received a string of XML, convert it into a CFSimpleXML object.
697
+ if (is_string($xml))
698
+ {
699
+ $xml = simplexml_load_string($xml);
700
+ }
701
+
702
+ // Let's make sure that we have CNAMEs to remove in the first place.
703
+ if (isset($xml->CNAME))
704
+ {
705
+ // If we have an array of CNAME values...
706
+ if (is_array($cname))
707
+ {
708
+ foreach ($cname as $cn)
709
+ {
710
+ for ($i = 0, $length = sizeof($xml->CNAME); $i < $length; $i++)
711
+ {
712
+ if ((string) $xml->CNAME[$i] == $cn)
713
+ {
714
+ unset($xml->CNAME[$i]);
715
+ break;
716
+ }
717
+ }
718
+ }
719
+ }
720
+
721
+ // If we only have one CNAME value...
722
+ else
723
+ {
724
+ for ($i = 0, $length = sizeof($xml->CNAME); $i < $length; $i++)
725
+ {
726
+ if ((string) $xml->CNAME[$i] == $cname)
727
+ {
728
+ unset($xml->CNAME[$i]);
729
+ break;
730
+ }
731
+ }
732
+ }
733
+ }
734
+
735
+ return $xml->asXML();
736
+ }
737
+
738
+ /**
739
+ * Used to generate the origin access identity (OAI) Config XML used in <create_oai()>.
740
+ *
741
+ * @param string $caller_reference (Required) A unique identifier for the request. A timestamp-appended string is recommended.
742
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
743
+ * <li><code>Comment</code> - <code>string</code> - Optional - Replaces the existing value for "Comment". Cannot exceed 128 characters.</li></ul>
744
+ * @return string An XML document to be used as the OAI configuration.
745
+ */
746
+ public function generate_oai_xml($caller_reference, $opt = null)
747
+ {
748
+ // Default, empty XML
749
+ $xml = simplexml_load_string(sprintf($this->base_xml, 'CloudFrontOriginAccessIdentityConfig'));
750
+
751
+ // CallerReference
752
+ $xml->addChild('CallerReference', $caller_reference);
753
+
754
+ // Comment
755
+ if (isset($opt['Comment']))
756
+ {
757
+ $xml->addChild('Comment', $opt['Comment']);
758
+ }
759
+
760
+ return $xml->asXML();
761
+ }
762
+
763
+ /**
764
+ * Updates the origin access identity (OAI) configureation XML used in <create_oai()>.
765
+ *
766
+ * @param CFSimpleXML|CFResponse|string $xml (Required) The source configuration XML to make updates to. Can be the <CFSimpleXML> body of a <get_oai_config()> response, the entire <CFResponse> of a <get_oai_config()> response, or a string of XML generated by <generate_oai_xml()> or <update_oai_xml()>.
767
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
768
+ * <li><code>Comment</code> - <code>string</code> - Optional - Replaces the existing value for "Comment". Cannot exceed 128 characters.</li></ul>
769
+ * @return string XML document.
770
+ */
771
+ public function update_oai_xml($xml, $opt = null)
772
+ {
773
+ // If we receive a full CFResponse object, only use the body.
774
+ if ($xml instanceof CFResponse)
775
+ {
776
+ $xml = $xml->body;
777
+ }
778
+
779
+ // If we received a string of XML, convert it into a CFSimpleXML object.
780
+ if (is_string($xml))
781
+ {
782
+ $xml = simplexml_load_string($xml, $this->parser_class);
783
+ }
784
+
785
+ // Update the comment, if we have one.
786
+ if (isset($opt['Comment']) && isset($xml->Comment))
787
+ {
788
+ $xml->Comment = $opt['Comment'];
789
+ }
790
+ elseif (isset($opt['Comment']))
791
+ {
792
+ $xml->addChild('Comment', $opt['Comment']);
793
+ }
794
+
795
+ return $xml->asXML();
796
+ }
797
+
798
+ /**
799
+ * Generates the Invalidation Config XML used in <create_invalidation()>.
800
+ *
801
+ * @param string $caller_reference (Required) A unique identifier for the request. A timestamp-appended string is recommended.
802
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
803
+ * <li><code>Paths</code> - <code>string|array</code> - Optional - One or more paths to set for invalidation. Pass a string for a single value, or an indexed array for multiple values.</li></ul>
804
+ * @return string An XML document to be used as the Invalidation configuration.
805
+ */
806
+ public function generate_invalidation_xml($caller_reference, $opt = null)
807
+ {
808
+ // Default, empty XML
809
+ $xml = simplexml_load_string(sprintf($this->base_xml, 'InvalidationBatch'));
810
+
811
+ // CallerReference
812
+ $xml->addChild('CallerReference', $caller_reference);
813
+
814
+ // Paths
815
+ if (isset($opt['Paths']))
816
+ {
817
+ $paths = is_array($opt['Paths']) ? $opt['Paths'] : array($opt['Paths']);
818
+
819
+ foreach ($paths as $path)
820
+ {
821
+ $path = str_replace('%2F', '/', rawurlencode($path));
822
+ $path = (substr($path, 0, 1) === '/') ? $path : ('/' . $path);
823
+ $xml->addChild('Path', $path);
824
+ }
825
+ }
826
+
827
+ return $xml->asXML();
828
+ }
829
+
830
+
831
+ /*%******************************************************************************************%*/
832
+ // DISTRIBUTIONS
833
+
834
+ /**
835
+ * Creates an Amazon CloudFront distribution. You can have up to 100 distributions in the Amazon
836
+ * CloudFront system.
837
+ *
838
+ * For an Adobe Real-Time Messaging Protocol (RTMP) streaming distribution, set the <code>Streaming</code> option
839
+ * to true.
840
+ *
841
+ * @param string $origin (Required) The source to use for the Amazon CloudFront distribution. Use an Amazon S3 bucket name, or a fully-qualified non-S3 domain name prefixed with <code>http://</code> or <code>https://</code>.
842
+ * @param string $caller_reference (Required) A unique identifier for the request. A timestamp-appended string is recommended.
843
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
844
+ * <li><code>CNAME</code> - <code>string|array</code> - Optional - A DNS CNAME to use to map to the Amazon CloudFront distribution. If setting more than one, use an indexed array. Supports 1-10 CNAMEs.</li>
845
+ * <li><code>Comment</code> - <code>string</code> - Optional - A comment to apply to the distribution. Cannot exceed 128 characters.</li>
846
+ * <li><code>DefaultRootObject</code> - <code>string</code> - Optional - The file to load when someone accesses the root of the Amazon CloudFront domain (e.g., <code>index.html</code>).</li>
847
+ * <li><code>Enabled</code> - <code>string</code> - Optional - A value of <code>true</code> will enable the distribution. A value of <code>false</code> will disable it. The default value is <code>true</code>.</li>
848
+ * <li><code>OriginAccessIdentity</code> - <code>string</code> - Optional - The origin access identity (OAI) associated with this distribution. Use the Identity ID from the OAI, not the <code>CanonicalId</code>. Requires an S3 origin.</li>
849
+ * <li><code>OriginProtocolPolicy</code> - <code>string</code> - Optional - The origin protocol policy to apply to your origin. If you specify <code>http-only</code>, CloudFront will use HTTP only to access the origin. If you specify <code>match-viewer</code>, CloudFront will fetch from your origin using HTTP or HTTPS, based on the protocol of the viewer request. [Allowed values: <code>http-only</code>, <code>match-viewer</code>]. The default value is <code>match-viewer</code>. Requires a non-S3 origin.</li>
850
+ * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> creates a streaming distribution. A value of <code>false</code> creates a standard distribution. The default value is <code>false</code>.</li>
851
+ * <li><code>TrustedSigners</code> - <code>array</code> - Optional - An array of AWS account numbers for users who are trusted signers. Explicity add the value <code>Self</code> to the array to add your own account as a trusted signer.</li>
852
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
853
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
854
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
855
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/CreateDistribution.html POST Distribution
856
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/CreateStreamingDistribution.html POST Streaming Distribution
857
+ */
858
+ public function create_distribution($origin, $caller_reference, $opt = null)
859
+ {
860
+ if (!$opt) $opt = array();
861
+
862
+ $xml = $this->generate_config_xml($origin, $caller_reference, $opt);
863
+ $path = '/' . ((isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'streaming-distribution' : 'distribution');
864
+
865
+ return $this->authenticate('POST', $path, $opt, $xml, null);
866
+ }
867
+
868
+ /**
869
+ * Gets a list of distributions. By default, the list is returned as one result. If needed, paginate the
870
+ * list by specifying values for the <code>MaxItems</code> and <code>Marker</code> parameters.
871
+ *
872
+ * Standard distributions are listed separately from streaming distributions. For streaming distributions,
873
+ * set the <code>Streaming</code> option to true.
874
+ *
875
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
876
+ * <li><code>Marker</code> - <code>string</code> - Optional - Use this setting when paginating results to indicate where in your list of distributions to begin. The results include distributions in the list that occur after the marker. To get the next page of results, set the <code>Marker</code> to the value of the <code>NextMarker</code> from the current page's response (which is also the ID of the last distribution on that page).</li>
877
+ * <li><code>MaxItems</code> - <code>integer</code> - Optional - The maximum number of distributions you want in the response body. Maximum of 100.</li>
878
+ * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> will create a streaming distribution. A value of <code>false</code> will create a standard distribution. The default value is <code>false</code>.</li>
879
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
880
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
881
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
882
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/ListDistributions.html GET Distribution List
883
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/ListStreamingDistributions.html GET Streaming Distribution List
884
+ */
885
+ public function list_distributions($opt = null)
886
+ {
887
+ if (!$opt) $opt = array();
888
+ $opt['query_string'] = array();
889
+
890
+ // Pass these to the query string
891
+ foreach (array('Marker', 'MaxItems') as $option)
892
+ {
893
+ if (isset($opt[$option]))
894
+ {
895
+ $opt['query_string'][$option] = $opt[$option];
896
+ }
897
+ }
898
+
899
+ $path = '/' . ((isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'streaming-distribution' : 'distribution');
900
+
901
+ return $this->authenticate('GET', $path, $opt, null, null);
902
+ }
903
+
904
+ /**
905
+ * Gets distribution information for the specified distribution ID.
906
+ *
907
+ * Standard distributions are handled separately from streaming distributions. For streaming
908
+ * distributions, set the <code>Streaming</code> option to true.
909
+ *
910
+ * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
911
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
912
+ * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> will create a streaming distribution. A value of <code>false</code> will create a standard distribution. The default value is <code>false</code>.</li>
913
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
914
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
915
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
916
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetDistribution.html GET Distribution
917
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetStreamingDistribution.html GET Streaming Distribution
918
+ */
919
+ public function get_distribution_info($distribution_id, $opt = null)
920
+ {
921
+ if (!$opt) $opt = array();
922
+
923
+ $path = '/' . ((isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'streaming-distribution' : 'distribution');
924
+ $path .= '/' . $distribution_id;
925
+
926
+ return $this->authenticate('GET', $path, $opt, null, null);
927
+ }
928
+
929
+ /**
930
+ * Deletes a disabled distribution. If distribution hasn't been disabled, Amazon CloudFront returns a
931
+ * <code>DistributionNotDisabled</code> error. Use <set_distribution_config()> to disable a distribution before
932
+ * attempting to delete.
933
+ *
934
+ * For an Adobe Real-Time Messaging Protocol (RTMP) streaming distribution, set the <code>Streaming</code> option
935
+ * to be <code>true</code>.
936
+ *
937
+ * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
938
+ * @param string $etag (Required) The <code>ETag</code> header value retrieved from <get_distribution_config()>.
939
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
940
+ * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> will create a streaming distribution. A value of <code>false</code> will create a standard distribution. The default value is <code>false</code>.</li>
941
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
942
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
943
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
944
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/DeleteDistribution.html DELETE Distribution
945
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/DeleteStreamingDistribution.html DELETE Streaming Distribution
946
+ */
947
+ public function delete_distribution($distribution_id, $etag, $opt = null)
948
+ {
949
+ if (!$opt) $opt = array();
950
+
951
+ $path = '/' . ((isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'streaming-distribution' : 'distribution');
952
+ $path .= '/' . $distribution_id;
953
+
954
+ return $this->authenticate('DELETE', $path, $opt, null, $etag);
955
+ }
956
+
957
+ /**
958
+ * Gets the current distribution configuration for the specified distribution ID.
959
+ *
960
+ * Standard distributions are handled separately from streaming distributions. For streaming
961
+ * distributions, set the <code>Streaming</code> option to true.
962
+ *
963
+ * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
964
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
965
+ * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> will create a streaming distribution. A value of <code>false</code> will create a standard distribution. The default value is <code>false</code>.</li>
966
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
967
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
968
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
969
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetConfig.html GET Distribution Config
970
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetStreamingDistConfig.html GET Streaming Distribution Config
971
+ */
972
+ public function get_distribution_config($distribution_id, $opt = null)
973
+ {
974
+ if (!$opt) $opt = array();
975
+
976
+ $path = '/' . ((isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'streaming-distribution' : 'distribution');
977
+ $path .= '/' . $distribution_id . '/config';
978
+
979
+ return $this->authenticate('GET', $path, $opt, null, null);
980
+ }
981
+
982
+ /**
983
+ * Sets a new distribution configuration for the specified distribution ID.
984
+ *
985
+ * Standard distributions are handled separately from streaming distributions. For streaming
986
+ * distributions, set the <code>Streaming</code> option to true.
987
+ *
988
+ * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
989
+ * @param string $xml (Required) The DistributionConfig XML generated by <generate_config_xml()> or <update_config_xml()>.
990
+ * @param string $etag (Required) The ETag header value retrieved from <get_distribution_config()>.
991
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
992
+ * <li><code>Streaming</code> - <code>boolean</code> - Optional - Whether or not this should be for a streaming distribution. A value of <code>true</code> will create a streaming distribution. A value of <code>false</code> will create a standard distribution. The default value is <code>false</code>.</li>
993
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
994
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
995
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
996
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/PutConfig.html PUT Distribution Config
997
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/PutStreamingDistConfig.html PUT Streaming Distribution Config
998
+ */
999
+ public function set_distribution_config($distribution_id, $xml, $etag, $opt = null)
1000
+ {
1001
+ if (!$opt) $opt = array();
1002
+
1003
+ $path = '/' . ((isset($opt['Streaming']) && $opt['Streaming'] == (bool) true) ? 'streaming-distribution' : 'distribution');
1004
+ $path .= '/' . $distribution_id . '/config';
1005
+
1006
+ return $this->authenticate('PUT', $path, $opt, $xml, $etag);
1007
+ }
1008
+
1009
+
1010
+ /*%******************************************************************************************%*/
1011
+ // Origin Access Identity
1012
+
1013
+ /**
1014
+ * Creates a new Amazon CloudFront origin access identity (OAI). You can create up to 100 OAIs per AWS
1015
+ * account. For more information, see the Amazon CloudFront Developer Guide.
1016
+ *
1017
+ * @param string $caller_reference (Required) A unique identifier for the request. A timestamp-appended string is recommended.
1018
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1019
+ * <li><code>Comment</code> - <code>string</code> - Optional - A comment about the OAI.</li>
1020
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1021
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1022
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1023
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/CreateOAI.html POST Origin Access Identity
1024
+ */
1025
+ public function create_oai($caller_reference, $opt = null)
1026
+ {
1027
+ if (!$opt) $opt = array();
1028
+
1029
+ $path = '/origin-access-identity/cloudfront';
1030
+ $xml = $this->generate_oai_xml($caller_reference, $opt);
1031
+
1032
+ return $this->authenticate('POST', $path, $opt, $xml, null);
1033
+ }
1034
+
1035
+ /**
1036
+ * Gets a list of origin access identity (OAI) summaries. By default, the list is returned as one result.
1037
+ * If needed, paginate the list by specifying values for the <code>MaxItems</code> and <code>Marker</code>
1038
+ * parameters.
1039
+ *
1040
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1041
+ * <li><code>Marker</code> - <code>string</code> - Optional - Use this when paginating results to indicate where in your list of distributions to begin. The results include distributions in the list that occur after the marker. To get the next page of results, set the Marker to the value of the NextMarker from the current page's response (which is also the ID of the last distribution on that page).</li>
1042
+ * <li><code>MaxItems</code> - <code>integer</code> - Optional - The maximum number of distributions you want in the response body. Maximum of 100.</li>
1043
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1044
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1045
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1046
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/ListOAIs.html GET Origin Access Identity List
1047
+ */
1048
+ public function list_oais($opt = null)
1049
+ {
1050
+ if (!$opt) $opt = array();
1051
+ $opt['query_string'] = array();
1052
+
1053
+ // Pass these to the query string
1054
+ foreach (array('Marker', 'MaxItems') as $option)
1055
+ {
1056
+ if (isset($opt[$option]))
1057
+ {
1058
+ $opt['query_string'][$option] = $opt[$option];
1059
+ }
1060
+ }
1061
+
1062
+ $path = '/origin-access-identity/cloudfront';
1063
+
1064
+ return $this->authenticate('GET', $path, $opt, null, null);
1065
+ }
1066
+
1067
+ /**
1068
+ * Gets information about an origin access identity (OAI).
1069
+ *
1070
+ * @param string $identity_id (Required) The Identity ID for an existing OAI.
1071
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1072
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1073
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1074
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1075
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetOAI.html GET Origin Access Identity
1076
+ */
1077
+ public function get_oai($identity_id, $opt = null)
1078
+ {
1079
+ if (!$opt) $opt = array();
1080
+
1081
+ $path = '/origin-access-identity/cloudfront/' . $identity_id;
1082
+
1083
+ return $this->authenticate('GET', $path, $opt, null, null);
1084
+ }
1085
+
1086
+ /**
1087
+ * Deletes an Amazon CloudFront origin access identity (OAI). To delete an OAI, the identity must first
1088
+ * be disassociated from all distributions (by updating each distribution's configuration to omit the
1089
+ * <code>OriginAccessIdentity</code> element). Wait until each distribution's state is <code>Deployed</code>
1090
+ * before deleting the OAI.
1091
+ *
1092
+ * @param string $identity_id (Required) An Identity ID for an existing OAI.
1093
+ * @param string $etag (Required) The <code>ETag</code> header value retrieved from a call to <get_oai()>.
1094
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1095
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1096
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1097
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1098
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/DeleteOAI.html DELETE Origin Access Identity
1099
+ */
1100
+ public function delete_oai($identity_id, $etag, $opt = null)
1101
+ {
1102
+ if (!$opt) $opt = array();
1103
+
1104
+ $path = '/origin-access-identity/cloudfront/' . $identity_id;
1105
+
1106
+ return $this->authenticate('DELETE', $path, $opt, null, $etag);
1107
+ }
1108
+
1109
+ /**
1110
+ * Gets the configuration of the origin access identity (OAI) for the specified identity ID.
1111
+ *
1112
+ * @param string $identity_id (Required) An Identity ID for an existing OAI.
1113
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1114
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1115
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1116
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1117
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetOAIConfig.html GET Origin Access Identity Config
1118
+ */
1119
+ public function get_oai_config($identity_id, $opt = null)
1120
+ {
1121
+ if (!$opt) $opt = array();
1122
+
1123
+ $path = '/origin-access-identity/cloudfront/' . $identity_id . '/config';
1124
+
1125
+ return $this->authenticate('GET', $path, $opt, null, null);
1126
+ }
1127
+
1128
+ /**
1129
+ * Sets the configuration for an Amazon CloudFront origin access identity (OAI). Use this when updating
1130
+ * the configuration. Currently, only comments may be updated. Follow the same process as when updating
1131
+ * an identity's configuration as you do when updating a distribution's configuration. For more
1132
+ * information, go to Updating a Distribution's Configuration in the Amazon CloudFront Developer Guide.
1133
+ *
1134
+ * When attempting to change configuration items that are not allowed to be updated, Amazon CloudFront
1135
+ * returns an <code>IllegalUpdate</code> error.
1136
+ *
1137
+ * @param string $identity_id (Required) An Identity ID for an existing OAI.
1138
+ * @param string $xml (Required) The configuration XML generated by <generate_oai_xml()>.
1139
+ * @param string $etag (Required) The ETag header value retrieved from a call to <get_distribution_config()>.
1140
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1141
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1142
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1143
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1144
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/PutOAIConfig.html PUT Origin Access Identity Config
1145
+ */
1146
+ public function set_oai_config($identity_id, $xml, $etag, $opt = null)
1147
+ {
1148
+ if (!$opt) $opt = array();
1149
+
1150
+ $path = '/origin-access-identity/cloudfront/' . $identity_id . '/config';
1151
+
1152
+ return $this->authenticate('PUT', $path, $opt, $xml, $etag);
1153
+ }
1154
+
1155
+
1156
+ /*%******************************************************************************************%*/
1157
+ // INVALIDATION
1158
+
1159
+ /**
1160
+ * Creates a new invalidation request.
1161
+ *
1162
+ * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
1163
+ * @param string $caller_reference (Required) A unique identifier for the request. A timestamp-appended string is recommended.
1164
+ * @param string|array $paths (Required) One or more paths to set for invalidation. Pass a string for a single value, or an indexed array for multiple values. values.
1165
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1166
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1167
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1168
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1169
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/CreateInvalidation.html POST Invalidation
1170
+ */
1171
+ public function create_invalidation($distribution_id, $caller_reference, $paths, $opt = null)
1172
+ {
1173
+ if (!$opt) $opt = array();
1174
+ $opt['Paths'] = $paths;
1175
+
1176
+ $path = '/distribution/' . $distribution_id . '/invalidation';
1177
+ $xml = $this->generate_invalidation_xml($caller_reference, $opt);
1178
+
1179
+ return $this->authenticate('POST', $path, $opt, $xml, null);
1180
+ }
1181
+
1182
+ /**
1183
+ * Gets a list of invalidations. By default, the list is returned as one result. If needed, paginate the
1184
+ * list by specifying values for the <code>MaxItems</code> and <code>Marker</code> parameters.
1185
+ *
1186
+ * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
1187
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1188
+ * <li><code>Marker</code> - <code>string</code> - Optional - Use this when paginating results to indicate where in the list of invalidations to begin. The results include invalidations in the list that occur after the marker. To get the next page of results, set the <code>Marker</code> parameter to the value of the <code>NextMarker</code> parameter from the current page's response, which is also the ID of the last invalidation on that page.</li>
1189
+ * <li><code>MaxItems</code> - <code>integer</code> - Optional - The maximum number of invalidations you want in the response body. A maximum value of 100 can be used.</li>
1190
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1191
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1192
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1193
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/ListInvalidation.html GET Invalidation List
1194
+ */
1195
+ public function list_invalidations($distribution_id, $opt = null)
1196
+ {
1197
+ if (!$opt) $opt = array();
1198
+ $opt['query_string'] = array();
1199
+
1200
+ // Pass these to the query string
1201
+ foreach (array('Marker', 'MaxItems') as $option)
1202
+ {
1203
+ if (isset($opt[$option]))
1204
+ {
1205
+ $opt['query_string'][$option] = $opt[$option];
1206
+ }
1207
+ }
1208
+
1209
+ $path = '/distribution/' . $distribution_id . '/invalidation';
1210
+
1211
+ return $this->authenticate('GET', $path, $opt, null, null);
1212
+ }
1213
+
1214
+ /**
1215
+ * Gets information about an invalidation.
1216
+ *
1217
+ * @param string $distribution_id (Required) The distribution ID returned from <create_distribution()> or <list_distributions()>.
1218
+ * @param string $invalidation_id (Required) The invalidation ID returned from <create_invalidation()> or <list_invalidations()>.
1219
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1220
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1221
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1222
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1223
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/GetInvalidation.html GET Invalidation
1224
+ */
1225
+ public function get_invalidation($distribution_id, $invalidation_id, $opt = null)
1226
+ {
1227
+ if (!$opt) $opt = array();
1228
+
1229
+ $path = '/distribution/' . $distribution_id . '/invalidation/' . $invalidation_id;
1230
+
1231
+ return $this->authenticate('GET', $path, $opt, null, null);
1232
+ }
1233
+
1234
+
1235
+ /*%******************************************************************************************%*/
1236
+ // CONVENIENCE METHODS
1237
+
1238
+ /**
1239
+ * Gets a simplified list of standard distribution IDs.
1240
+ *
1241
+ * @param string $pcre (Optional) A Perl-Compatible Regular Expression (PCRE) to filter the distribution caller references against.
1242
+ * @return array A list of standard distribution IDs.
1243
+ */
1244
+ public function get_distribution_list($pcre = null)
1245
+ {
1246
+ if ($this->use_batch_flow)
1247
+ {
1248
+ throw new CloudFront_Exception(__FUNCTION__ . '() cannot be batch requested');
1249
+ }
1250
+
1251
+ $list = $this->list_distributions();
1252
+ if ($list = $list->body->Id())
1253
+ {
1254
+ $list = $list->map_string($pcre);
1255
+ return $list;
1256
+ }
1257
+
1258
+ return array();
1259
+ }
1260
+
1261
+ /**
1262
+ * Gets a simplified list of streaming distribution IDs.
1263
+ *
1264
+ * @param string $pcre (Optional) A Perl-Compatible Regular Expression (PCRE) to filter the distribution caller references against.
1265
+ * @return array A list of streaming distribution IDs.
1266
+ */
1267
+ public function get_streaming_distribution_list($pcre = null)
1268
+ {
1269
+ if ($this->use_batch_flow)
1270
+ {
1271
+ throw new CloudFront_Exception(__FUNCTION__ . '() cannot be batch requested');
1272
+ }
1273
+
1274
+ $list = $this->list_distributions(array(
1275
+ 'Streaming' => true
1276
+ ));
1277
+ if ($list = $list->body->Id())
1278
+ {
1279
+ $list = $list->map_string($pcre);
1280
+ return $list;
1281
+ }
1282
+
1283
+ return array();
1284
+ }
1285
+
1286
+ /**
1287
+ * Gets a simplified list of origin access identity (OAI) IDs.
1288
+ *
1289
+ * @param string $pcre (Optional) A Perl-Compatible Regular Expression (PCRE) to filter the OAI caller references against.
1290
+ * @return array A list of OAI IDs.
1291
+ */
1292
+ public function get_oai_list($pcre = null)
1293
+ {
1294
+ if ($this->use_batch_flow)
1295
+ {
1296
+ throw new CloudFront_Exception(__FUNCTION__ . '() cannot be batch requested');
1297
+ }
1298
+
1299
+ $list = $this->list_oais();
1300
+ if ($list = $list->body->Id())
1301
+ {
1302
+ $list = $list->map_string($pcre);
1303
+ return $list;
1304
+ }
1305
+
1306
+ return array();
1307
+ }
1308
+
1309
+
1310
+ /*%******************************************************************************************%*/
1311
+ // URLS
1312
+
1313
+ /**
1314
+ * Generates a time-limited and/or query signed request for a private file with additional optional
1315
+ * restrictions.
1316
+ *
1317
+ * @param string $distribution_hostname (Required) The hostname of the distribution. Obtained from <create_distribution()> or <get_distribution_info()>.
1318
+ * @param string $filename (Required) The file name of the object. Query parameters can be included. You can use multicharacter match wild cards () or a single-character match wild card (?) anywhere in the string.
1319
+ * @param integer|string $expires (Required) The expiration time expressed either as a number of seconds since UNIX Epoch, or any string that <php:strtotime()> can understand.
1320
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1321
+ * <li><code>BecomeAvailable</code> - <code>integer|string</code> - Optional - The time when the private URL becomes active. Can be expressed either as a number of seconds since UNIX Epoch, or any string that <code>strtotime()</code> can understand.</li>
1322
+ * <li><code>IPAddress</code> - <code>string</code> - Optional - A single IP address to restrict the access to.</li>
1323
+ * <li><code>Secure</code> - <code>boolean</code> - Optional - Whether or not to use HTTPS as the protocol scheme. A value of <code>true</code> uses <code>https</code>. A value of <code>false</code> uses <code>http</code>. The default value is <code>false</code>.</li></ul>
1324
+ * @return string The file URL with authentication parameters.
1325
+ * @link http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html Serving Private Content
1326
+ */
1327
+ public function get_private_object_url($distribution_hostname, $filename, $expires, $opt = null)
1328
+ {
1329
+ if (!$this->key_pair_id || !$this->private_key)
1330
+ {
1331
+ throw new CloudFront_Exception('You must set both a Amazon CloudFront keypair ID and an RSA private key for that keypair before using ' . __FUNCTION__ . '()');
1332
+ }
1333
+ if (!function_exists('openssl_sign'))
1334
+ {
1335
+ throw new CloudFront_Exception(__FUNCTION__ . '() uses functions from the OpenSSL PHP Extension <http://php.net/openssl>, which is not installed in this PHP installation');
1336
+ }
1337
+
1338
+ if (!$opt) $opt = array();
1339
+
1340
+ $resource = '';
1341
+ $expiration_key = 'Expires';
1342
+ if (is_string($expires))
1343
+ {
1344
+ $expires = strtotime($expires);
1345
+ }
1346
+ $conjunction = (strpos($filename, '?') === false ? '?' : '&');
1347
+
1348
+ // Determine the protocol scheme
1349
+ switch (substr($distribution_hostname, 0, 1) === 's')
1350
+ {
1351
+ // Streaming
1352
+ case 's':
1353
+ $scheme = 'rtmp';
1354
+ $resource = str_replace(array('%3F', '%3D', '%26', '%2F'), array('?', '=', '&', '/'), rawurlencode($filename));
1355
+ break;
1356
+
1357
+ // Default
1358
+ case 'd':
1359
+ default:
1360
+ $scheme = 'http';
1361
+ $scheme .= (isset($opt['Secure']) && $opt['Secure'] === true ? 's' : '');
1362
+ $resource = $scheme . '://' . $distribution_hostname . '/' . str_replace(array('%3F', '%3D', '%26', '%2F'), array('?', '=', '&', '/'), rawurlencode($filename));
1363
+ break;
1364
+ }
1365
+
1366
+ // Generate default policy
1367
+ $raw_policy = array(
1368
+ 'Statement' => array(
1369
+ array(
1370
+ 'Resource' => $resource,
1371
+ 'Condition' => array(
1372
+ 'DateLessThan' => array(
1373
+ 'AWS:EpochTime' => $expires
1374
+ )
1375
+ )
1376
+ )
1377
+ )
1378
+ );
1379
+
1380
+ // Become Available
1381
+ if (isset($opt['BecomeAvailable']))
1382
+ {
1383
+ // Switch to 'Policy' instead
1384
+ $expiration_key = 'Policy';
1385
+
1386
+ // Update the policy
1387
+ $raw_policy['Statement'][0]['Condition']['DateGreaterThan'] = array(
1388
+ 'AWS:EpochTime' => strtotime($opt['BecomeAvailable'])
1389
+ );
1390
+ }
1391
+
1392
+ // IP Address
1393
+ if (isset($opt['IPAddress']))
1394
+ {
1395
+ // Switch to 'Policy' instead
1396
+ $expiration_key = 'Policy';
1397
+
1398
+ // Update the policy
1399
+ $raw_policy['Statement'][0]['Condition']['IpAddress'] = array(
1400
+ 'AWS:SourceIp' => $opt['IPAddress']
1401
+ );
1402
+ }
1403
+
1404
+ // Munge the policy
1405
+ $json_policy = str_replace('\/', '/', json_encode($raw_policy));
1406
+ $json_policy = $this->util->decode_uhex($json_policy);
1407
+ $encoded_policy = strtr(base64_encode($json_policy), '+=/', '-_~');
1408
+
1409
+ // Generate the signature
1410
+ openssl_sign($json_policy, $signature, $this->private_key);
1411
+ $signature = strtr(base64_encode($signature), '+=/', '-_~');
1412
+
1413
+ return $scheme . '://' . $distribution_hostname . '/'
1414
+ . str_replace(array('%3F', '%3D', '%26', '%2F'), array('?', '=', '&', '/'), rawurlencode($filename))
1415
+ . $conjunction
1416
+ . ($expiration_key === 'Expires' ? ($expiration_key . '=' . $expires) : ($expiration_key . '=' . $encoded_policy))
1417
+ . '&Key-Pair-Id=' . $this->key_pair_id
1418
+ . '&Signature=' . $signature;
1419
+ }
1420
+ }
app/libs/aws/services/cloudwatch.class.php CHANGED
@@ -1,512 +1,607 @@
1
- <?php
2
- /*
3
- * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- /**
18
- *
19
- *
20
- * Amazon CloudWatch is a web service that enables you to monitor and manage various metrics, as well as configure alarm
21
- * actions based on data from metrics.
22
- *
23
- * Amazon CloudWatch monitoring enables you to collect, analyze, and view system and application metrics so that you can
24
- * make operational and business decisions more quickly and with greater confidence. You can use Amazon CloudWatch to
25
- * collect metrics about your AWS resources, such as the performance of your Amazon EC2 instances.
26
- *
27
- * If you are registered for an AWS product that supports Amazon CloudWatch, the service automatically pushes basic metrics
28
- * to CloudWatch for you. Once Amazon CloudWatch contains metrics, you can calculate statistics based on that data.
29
- *
30
- * Amazon CloudWatch alarms help you implement decisions more easily by enabling you do things like send notifications or
31
- * automatically make changes to the resources you are monitoring, based on rules that you define. For example, you can
32
- * create alarms that initiate Auto Scaling and Simple Notification Service actions on your behalf.
33
- *
34
- * @version Fri Mar 25 13:13:27 PDT 2011
35
- * @license See the included NOTICE.md file for complete information.
36
- * @copyright See the included NOTICE.md file for complete information.
37
- * @link http://aws.amazon.com/cloudwatch/Amazon CloudWatch
38
- * @link http://aws.amazon.com/documentation/cloudwatch/Amazon CloudWatch documentation
39
- */
40
- class AmazonCloudWatch extends CFRuntime
41
- {
42
-
43
- /*%******************************************************************************************%*/
44
- // CLASS CONSTANTS
45
-
46
- /**
47
- * Specify the default queue URL.
48
- */
49
- const DEFAULT_URL = 'monitoring.amazonaws.com';
50
-
51
- /**
52
- * Specify the queue URL for the US-East (Northern Virginia) Region.
53
- */
54
- const REGION_US_E1 = 'us-east-1';
55
-
56
- /**
57
- * Specify the queue URL for the US-West (Northern California) Region.
58
- */
59
- const REGION_US_W1 = 'us-west-1';
60
-
61
- /**
62
- * Specify the queue URL for the EU (Ireland) Region.
63
- */
64
- const REGION_EU_W1 = 'eu-west-1';
65
-
66
- /**
67
- * Specify the queue URL for the Asia Pacific (Singapore) Region.
68
- */
69
- const REGION_APAC_SE1 = 'ap-southeast-1';
70
-
71
- /**
72
- * Specify the queue URL for the Asia Pacific (Japan) Region.
73
- */
74
- const REGION_APAC_NE1 = 'ap-northeast-1';
75
-
76
-
77
- /*%******************************************************************************************%*/
78
- // SETTERS
79
-
80
- /**
81
- * This allows you to explicitly sets the region for the service to use.
82
- *
83
- * @param string $region (Required) The region to explicitly set. Available options are <REGION_US_E1>, <REGION_US_W1>, <REGION_EU_W1>, or <REGION_APAC_SE1>.
84
- * @return $this A reference to the current instance.
85
- */
86
- public function set_region($region)
87
- {
88
- $this->set_hostname('http://monitoring.'. $region .'.amazonaws.com');
89
- return $this;
90
- }
91
-
92
-
93
- /*%******************************************************************************************%*/
94
- // CONSTRUCTOR
95
-
96
- /**
97
- * Constructs a new instance of <AmazonCloudWatch>.
98
- *
99
- * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <code>AWS_KEY</code> constant.
100
- * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant.
101
- * @return boolean false if no valid values are set, otherwise true.
102
- */
103
- public function __construct($key = null, $secret_key = null)
104
- {
105
- $this->api_version = '2010-08-01';
106
- $this->hostname = self::DEFAULT_URL;
107
-
108
- if (!$key && !defined('AWS_KEY'))
109
- {
110
- throw new CW_Exception('No account key was passed into the constructor, nor was it set in the AWS_KEY constant.');
111
- }
112
-
113
- if (!$secret_key && !defined('AWS_SECRET_KEY'))
114
- {
115
- throw new CW_Exception('No account secret was passed into the constructor, nor was it set in the AWS_SECRET_KEY constant.');
116
- }
117
-
118
- return parent::__construct($key, $secret_key);
119
- }
120
-
121
-
122
- /*%******************************************************************************************%*/
123
- // SERVICE METHODS
124
-
125
- /**
126
- *
127
- * Creates or updates an alarm and associates it with the specified Amazon CloudWatch metric. Optionally, this operation
128
- * can associate one or more Amazon Simple Notification Service resources with the alarm.
129
- *
130
- * When this operation creates an alarm, the alarm state is immediately set to <code>UNKNOWN</code>. The alarm is
131
- * evaluated and its <code>StateValue</code> is set appropriately. Any actions associated with the <code>StateValue</code>
132
- * is then executed.
133
- *
134
- * When updating an existing alarm, its <code>StateValue</code> is left unchanged.
135
- *
136
- * @param string $alarm_name (Required) The descriptive name for the alarm. This name must be unique within the user's AWS account
137
- * @param string $metric_name (Required) The name for the alarm's associated metric.
138
- * @param string $namespace (Required) The namespace for the alarm's associated metric.
139
- * @param string $statistic (Required) The statistic to apply to the alarm's associated metric. [Allowed values: <code>SampleCount</code>, <code>Average</code>, <code>Sum</code>, <code>Minimum</code>, <code>Maximum</code>]
140
- * @param integer $period (Required) The period in seconds over which the specified statistic is applied.
141
- * @param integer $evaluation_periods (Required) The number of periods over which data is compared to the specified threshold.
142
- * @param double $threshold (Required) The value against which the specified statistic is compared.
143
- * @param string $comparison_operator (Required) The arithmetic operation to use when comparing the specified <code>Statistic</code> and <code>Threshold</code>. The specified <code>Statistic</code> value is used as the first operand. [Allowed values: <code>GreaterThanOrEqualToThreshold</code>, <code>GreaterThanThreshold</code>, <code>LessThanThreshold</code>, <code>LessThanOrEqualToThreshold</code>]
144
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
145
- * <li><code>AlarmDescription</code> - <code>string</code> - Optional - The description for the alarm. </li>
146
- * <li><code>ActionsEnabled</code> - <code>boolean</code> - Optional - Indicates whether or not actions should be executed during any changes to the alarm's state. </li>
147
- * <li><code>OKActions</code> - <code>string|array</code> - Optional - The list of actions to execute when this alarm transitions into an <code>OK</code> state from any other state. Each action is specified as an Amazon Resource Number (ARN). Currently the only action supported is publishing to an Amazon SNS topic or an Amazon Auto Scaling policy. Pass a string for a single value, or an indexed array for multiple values. </li>
148
- * <li><code>AlarmActions</code> - <code>string|array</code> - Optional - The list of actions to execute when this alarm transitions into an <code>ALARM</code> state from any other state. Each action is specified as an Amazon Resource Number (ARN). Currently the only action supported is publishing to an Amazon SNS topic or an Amazon Auto Scaling policy. Pass a string for a single value, or an indexed array for multiple values. </li>
149
- * <li><code>InsufficientDataActions</code> - <code>string|array</code> - Optional - The list of actions to execute when this alarm transitions into an <code>UNKNOWN</code> state from any other state. Each action is specified as an Amazon Resource Number (ARN). Currently the only action supported is publishing to an Amazon SNS topic or an Amazon Auto Scaling policy. Pass a string for a single value, or an indexed array for multiple values. </li>
150
- * <li><code>Dimensions</code> - <code>array</code> - Optional - The dimensions for the alarm's associated metric. <ul>
151
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
152
- * <li><code>Name</code> - <code>string</code> - Required - The name of the dimension. </li>
153
- * <li><code>Value</code> - <code>string</code> - Required - The value representing the dimension measurement </li>
154
- * </ul></li>
155
- * </ul></li>
156
- * <li><code>Unit</code> - <code>string</code> - Optional - The unit for the alarm's associated metric. [Allowed values: <code>Seconds</code>, <code>Microseconds</code>, <code>Milliseconds</code>, <code>Bytes</code>, <code>Kilobytes</code>, <code>Megabytes</code>, <code>Gigabytes</code>, <code>Terabytes</code>, <code>Bits</code>, <code>Kilobits</code>, <code>Megabits</code>, <code>Gigabits</code>, <code>Terabits</code>, <code>Percent</code>, <code>Count</code>, <code>Bytes/Second</code>, <code>Kilobytes/Second</code>, <code>Megabytes/Second</code>, <code>Gigabytes/Second</code>, <code>Terabytes/Second</code>, <code>Bits/Second</code>, <code>Kilobits/Second</code>, <code>Megabits/Second</code>, <code>Gigabits/Second</code>, <code>Terabits/Second</code>, <code>Count/Second</code>, <code>None</code>]</li>
157
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
158
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
159
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
160
- */
161
- public function put_metric_alarm($alarm_name, $metric_name, $namespace, $statistic, $period, $evaluation_periods, $threshold, $comparison_operator, $opt = null)
162
- {
163
- if (!$opt) $opt = array();
164
- $opt['AlarmName'] = $alarm_name;
165
-
166
- // Optional parameter
167
- if (isset($opt['OKActions']))
168
- {
169
- $opt = array_merge($opt, CFComplexType::map(array(
170
- 'OKActions' => (is_array($opt['OKActions']) ? $opt['OKActions'] : array($opt['OKActions']))
171
- ), 'member'));
172
- unset($opt['OKActions']);
173
- }
174
-
175
- // Optional parameter
176
- if (isset($opt['AlarmActions']))
177
- {
178
- $opt = array_merge($opt, CFComplexType::map(array(
179
- 'AlarmActions' => (is_array($opt['AlarmActions']) ? $opt['AlarmActions'] : array($opt['AlarmActions']))
180
- ), 'member'));
181
- unset($opt['AlarmActions']);
182
- }
183
-
184
- // Optional parameter
185
- if (isset($opt['InsufficientDataActions']))
186
- {
187
- $opt = array_merge($opt, CFComplexType::map(array(
188
- 'InsufficientDataActions' => (is_array($opt['InsufficientDataActions']) ? $opt['InsufficientDataActions'] : array($opt['InsufficientDataActions']))
189
- ), 'member'));
190
- unset($opt['InsufficientDataActions']);
191
- }
192
- $opt['MetricName'] = $metric_name;
193
- $opt['Namespace'] = $namespace;
194
- $opt['Statistic'] = $statistic;
195
-
196
- // Optional parameter
197
- if (isset($opt['Dimensions']))
198
- {
199
- $opt = array_merge($opt, CFComplexType::map(array(
200
- 'Dimensions' => $opt['Dimensions']
201
- ), 'member'));
202
- unset($opt['Dimensions']);
203
- }
204
- $opt['Period'] = $period;
205
- $opt['EvaluationPeriods'] = $evaluation_periods;
206
- $opt['Threshold'] = $threshold;
207
- $opt['ComparisonOperator'] = $comparison_operator;
208
-
209
- return $this->authenticate('PutMetricAlarm', $opt, $this->hostname);
210
- }
211
-
212
- /**
213
- *
214
- * Returns a list of valid metrics stored for the AWS account owner. Returned metrics can be used with
215
- * <code>GetMetricStatistics</code> to obtain statistical data for a given metric.
216
- *
217
- * Up to 500 results are returned for any one call. To retrieve further results, use returned <code>NextToken</code>
218
- * values with subsequent <code>ListMetrics</code> operations.
219
- *
220
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
221
- * <li><code>Namespace</code> - <code>string</code> - Optional - The namespace to filter against. </li>
222
- * <li><code>MetricName</code> - <code>string</code> - Optional - The name of the metric to filter against. </li>
223
- * <li><code>Dimensions</code> - <code>array</code> - Optional - A list of dimensions to filter against. <ul>
224
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
225
- * <li><code>Name</code> - <code>string</code> - Required - The dimension name to be matched. </li>
226
- * <li><code>Value</code> - <code>string</code> - Optional - The value of the dimension to be matched. Specifying a <code>Name</code> without specifying a <code>Value</code> is equivalent to "wildcarding" the <code>Name</code> for all values. </li>
227
- * </ul></li>
228
- * </ul></li>
229
- * <li><code>NextToken</code> - <code>string</code> - Optional - The token returned by a previous call to indicate that there is more data available. </li>
230
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
231
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
232
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
233
- */
234
- public function list_metrics($opt = null)
235
- {
236
- if (!$opt) $opt = array();
237
-
238
- // Optional parameter
239
- if (isset($opt['Dimensions']))
240
- {
241
- $opt = array_merge($opt, CFComplexType::map(array(
242
- 'Dimensions' => $opt['Dimensions']
243
- ), 'member'));
244
- unset($opt['Dimensions']);
245
- }
246
-
247
- return $this->authenticate('ListMetrics', $opt, $this->hostname);
248
- }
249
-
250
- /**
251
- *
252
- * Gets statistics for the specified metric.
253
- *
254
- * The maximum number of datapoints returned from a single <code>GetMetricStatistics</code> request is 1,440. If a request
255
- * is made that generates more than 1,440 datapoints, Amazon CloudWatch returns an error. In such a case, alter the request
256
- * by narrowing the specified time range or increasing the specified period. Alternatively, make multiple requests across
257
- * adjacent time ranges.
258
- *
259
- * @param string $namespace (Required) The namespace of the metric.
260
- * @param string $metric_name (Required) The name of the metric.
261
- * @param string $start_time (Required) The timestamp to use for determining the first datapoint to return. The value specified is inclusive; results include datapoints with the timestamp specified. The specified start time is rounded down to the nearest value. Datapoints are returned for start times up to two weeks in the past. Specified start times that are more than two weeks in the past will not return datapoints for metrics that are older than two weeks. Accepts any value that <php:strtotime()> understands.
262
- * @param string $end_time (Required) The time stamp to use for determining the last datapoint to return. The value specified is exclusive; results will include datapoints up to the time stamp specified. Accepts any value that <php:strtotime()> understands.
263
- * @param integer $period (Required) The granularity, in seconds, of the returned datapoints. <code>Period</code> must be at least 60 seconds and must be a multiple of 60. The default value is 60.
264
- * @param string|array $statistics (Required) The metric statistics to return. Pass a string for a single value, or an indexed array for multiple values.
265
- * @param string $unit (Required) The unit for the metric. [Allowed values: <code>Seconds</code>, <code>Microseconds</code>, <code>Milliseconds</code>, <code>Bytes</code>, <code>Kilobytes</code>, <code>Megabytes</code>, <code>Gigabytes</code>, <code>Terabytes</code>, <code>Bits</code>, <code>Kilobits</code>, <code>Megabits</code>, <code>Gigabits</code>, <code>Terabits</code>, <code>Percent</code>, <code>Count</code>, <code>Bytes/Second</code>, <code>Kilobytes/Second</code>, <code>Megabytes/Second</code>, <code>Gigabytes/Second</code>, <code>Terabytes/Second</code>, <code>Bits/Second</code>, <code>Kilobits/Second</code>, <code>Megabits/Second</code>, <code>Gigabits/Second</code>, <code>Terabits/Second</code>, <code>Count/Second</code>, <code>None</code>]
266
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
267
- * <li><code>Dimensions</code> - <code>array</code> - Optional - A list of dimensions describing qualities of the metric. <ul>
268
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
269
- * <li><code>Name</code> - <code>string</code> - Required - The name of the dimension. </li>
270
- * <li><code>Value</code> - <code>string</code> - Required - The value representing the dimension measurement </li>
271
- * </ul></li>
272
- * </ul></li>
273
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
274
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
275
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
276
- */
277
- public function get_metric_statistics($namespace, $metric_name, $start_time, $end_time, $period, $statistics, $unit, $opt = null)
278
- {
279
- if (!$opt) $opt = array();
280
- $opt['Namespace'] = $namespace;
281
- $opt['MetricName'] = $metric_name;
282
-
283
- // Optional parameter
284
- if (isset($opt['Dimensions']))
285
- {
286
- $opt = array_merge($opt, CFComplexType::map(array(
287
- 'Dimensions' => $opt['Dimensions']
288
- ), 'member'));
289
- unset($opt['Dimensions']);
290
- }
291
- $opt['StartTime'] = $this->util->convert_date_to_iso8601($start_time);
292
- $opt['EndTime'] = $this->util->convert_date_to_iso8601($end_time);
293
- $opt['Period'] = $period;
294
-
295
- // Required parameter
296
- $opt = array_merge($opt, CFComplexType::map(array(
297
- 'Statistics' => (is_array($statistics) ? $statistics : array($statistics))
298
- ), 'member'));
299
- $opt['Unit'] = $unit;
300
-
301
- return $this->authenticate('GetMetricStatistics', $opt, $this->hostname);
302
- }
303
-
304
- /**
305
- *
306
- * Disables actions for the specified alarms. When an alarm's actions are disabled the alarm's state may change, but none
307
- * of the alarm's actions will execute.
308
- *
309
- * @param string|array $alarm_names (Required) The names of the alarms to disable actions for. Pass a string for a single value, or an indexed array for multiple values.
310
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
311
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
312
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
313
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
314
- */
315
- public function disable_alarm_actions($alarm_names, $opt = null)
316
- {
317
- if (!$opt) $opt = array();
318
-
319
- // Required parameter
320
- $opt = array_merge($opt, CFComplexType::map(array(
321
- 'AlarmNames' => (is_array($alarm_names) ? $alarm_names : array($alarm_names))
322
- ), 'member'));
323
-
324
- return $this->authenticate('DisableAlarmActions', $opt, $this->hostname);
325
- }
326
-
327
- /**
328
- *
329
- * Retrieves alarms with the specified names. If no name is specified, all alarms for the user are returned. Alarms can be
330
- * retrieved by using only a prefix for the alarm name, the alarm state, or a prefix for any action.
331
- *
332
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
333
- * <li><code>AlarmNames</code> - <code>string|array</code> - Optional - A list of alarm names to retrieve information for. Pass a string for a single value, or an indexed array for multiple values. </li>
334
- * <li><code>AlarmNamePrefix</code> - <code>string</code> - Optional - The alarm name prefix. <code>AlarmNames</code> cannot be specified if this parameter is specified. </li>
335
- * <li><code>StateValue</code> - <code>string</code> - Optional - The state value to be used in matching alarms. [Allowed values: <code>OK</code>, <code>ALARM</code>, <code>INSUFFICIENT_DATA</code>]</li>
336
- * <li><code>ActionPrefix</code> - <code>string</code> - Optional - The action name prefix. </li>
337
- * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of alarm descriptions to retrieve. </li>
338
- * <li><code>NextToken</code> - <code>string</code> - Optional - The token returned by a previous call to indicate that there is more data available. </li>
339
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
340
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
341
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
342
- */
343
- public function describe_alarms($opt = null)
344
- {
345
- if (!$opt) $opt = array();
346
-
347
- // Optional parameter
348
- if (isset($opt['AlarmNames']))
349
- {
350
- $opt = array_merge($opt, CFComplexType::map(array(
351
- 'AlarmNames' => (is_array($opt['AlarmNames']) ? $opt['AlarmNames'] : array($opt['AlarmNames']))
352
- ), 'member'));
353
- unset($opt['AlarmNames']);
354
- }
355
-
356
- return $this->authenticate('DescribeAlarms', $opt, $this->hostname);
357
- }
358
-
359
- /**
360
- *
361
- * Retrieves all alarms for a single metric. Specify a statistic, period, or unit to filter the set of alarms further.
362
- *
363
- * @param string $metric_name (Required) The name of the metric.
364
- * @param string $namespace (Required) The namespace of the metric.
365
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
366
- * <li><code>Statistic</code> - <code>string</code> - Optional - The statistic for the metric. [Allowed values: <code>SampleCount</code>, <code>Average</code>, <code>Sum</code>, <code>Minimum</code>, <code>Maximum</code>]</li>
367
- * <li><code>Dimensions</code> - <code>array</code> - Optional - The list of dimensions associated with the metric. <ul>
368
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
369
- * <li><code>Name</code> - <code>string</code> - Required - The name of the dimension. </li>
370
- * <li><code>Value</code> - <code>string</code> - Required - The value representing the dimension measurement </li>
371
- * </ul></li>
372
- * </ul></li>
373
- * <li><code>Period</code> - <code>integer</code> - Optional - The period in seconds over which the statistic is applied. </li>
374
- * <li><code>Unit</code> - <code>string</code> - Optional - The unit for the metric. [Allowed values: <code>Seconds</code>, <code>Microseconds</code>, <code>Milliseconds</code>, <code>Bytes</code>, <code>Kilobytes</code>, <code>Megabytes</code>, <code>Gigabytes</code>, <code>Terabytes</code>, <code>Bits</code>, <code>Kilobits</code>, <code>Megabits</code>, <code>Gigabits</code>, <code>Terabits</code>, <code>Percent</code>, <code>Count</code>, <code>Bytes/Second</code>, <code>Kilobytes/Second</code>, <code>Megabytes/Second</code>, <code>Gigabytes/Second</code>, <code>Terabytes/Second</code>, <code>Bits/Second</code>, <code>Kilobits/Second</code>, <code>Megabits/Second</code>, <code>Gigabits/Second</code>, <code>Terabits/Second</code>, <code>Count/Second</code>, <code>None</code>]</li>
375
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
376
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
377
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
378
- */
379
- public function describe_alarms_for_metric($metric_name, $namespace, $opt = null)
380
- {
381
- if (!$opt) $opt = array();
382
- $opt['MetricName'] = $metric_name;
383
- $opt['Namespace'] = $namespace;
384
-
385
- // Optional parameter
386
- if (isset($opt['Dimensions']))
387
- {
388
- $opt = array_merge($opt, CFComplexType::map(array(
389
- 'Dimensions' => $opt['Dimensions']
390
- ), 'member'));
391
- unset($opt['Dimensions']);
392
- }
393
-
394
- return $this->authenticate('DescribeAlarmsForMetric', $opt, $this->hostname);
395
- }
396
-
397
- /**
398
- *
399
- * Retrieves history for the specified alarm. Filter alarms by date range or item type. If an alarm name is not specified,
400
- * Amazon CloudWatch returns histories for all of the owner's alarms.
401
- *
402
- * Amazon CloudWatch retains the history of deleted alarms for a period of six weeks. If an alarm has been deleted, its
403
- * history can still be queried.
404
- *
405
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
406
- * <li><code>AlarmName</code> - <code>string</code> - Optional - The name of the alarm. </li>
407
- * <li><code>HistoryItemType</code> - <code>string</code> - Optional - The type of alarm histories to retrieve. [Allowed values: <code>ConfigurationUpdate</code>, <code>StateUpdate</code>, <code>Action</code>]</li>
408
- * <li><code>StartDate</code> - <code>string</code> - Optional - The starting date to retrieve alarm history. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
409
- * <li><code>EndDate</code> - <code>string</code> - Optional - The ending date to retrieve alarm history. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
410
- * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of alarm history records to retrieve. </li>
411
- * <li><code>NextToken</code> - <code>string</code> - Optional - The token returned by a previous call to indicate that there is more data available. </li>
412
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
413
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
414
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
415
- */
416
- public function describe_alarm_history($opt = null)
417
- {
418
- if (!$opt) $opt = array();
419
-
420
- // Optional parameter
421
- if (isset($opt['StartDate']))
422
- {
423
- $opt['StartDate'] = $this->util->convert_date_to_iso8601($opt['StartDate']);
424
- }
425
-
426
- // Optional parameter
427
- if (isset($opt['EndDate']))
428
- {
429
- $opt['EndDate'] = $this->util->convert_date_to_iso8601($opt['EndDate']);
430
- }
431
-
432
- return $this->authenticate('DescribeAlarmHistory', $opt, $this->hostname);
433
- }
434
-
435
- /**
436
- *
437
- * Enables actions for the specified alarms.
438
- *
439
- * @param string|array $alarm_names (Required) The names of the alarms to enable actions for. Pass a string for a single value, or an indexed array for multiple values.
440
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
441
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
442
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
443
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
444
- */
445
- public function enable_alarm_actions($alarm_names, $opt = null)
446
- {
447
- if (!$opt) $opt = array();
448
-
449
- // Required parameter
450
- $opt = array_merge($opt, CFComplexType::map(array(
451
- 'AlarmNames' => (is_array($alarm_names) ? $alarm_names : array($alarm_names))
452
- ), 'member'));
453
-
454
- return $this->authenticate('EnableAlarmActions', $opt, $this->hostname);
455
- }
456
-
457
- /**
458
- *
459
- * Deletes all specified alarms. In the event of an error, no alarms are deleted.
460
- *
461
- * @param string|array $alarm_names (Required) A list of alarms to be deleted. Pass a string for a single value, or an indexed array for multiple values.
462
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
463
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
464
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
465
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
466
- */
467
- public function delete_alarms($alarm_names, $opt = null)
468
- {
469
- if (!$opt) $opt = array();
470
-
471
- // Required parameter
472
- $opt = array_merge($opt, CFComplexType::map(array(
473
- 'AlarmNames' => (is_array($alarm_names) ? $alarm_names : array($alarm_names))
474
- ), 'member'));
475
-
476
- return $this->authenticate('DeleteAlarms', $opt, $this->hostname);
477
- }
478
-
479
- /**
480
- *
481
- * Temporarily sets the state of an alarm. When the updated <code>StateValue</code> differs from the previous value, the
482
- * action configured for the appropriate state is invoked. This is not a permanent change. The next periodic alarm check
483
- * (in about a minute) will set the alarm to its actual state.
484
- *
485
- * @param string $alarm_name (Required) The descriptive name for the alarm. This name must be unique within the user's AWS account
486
- * @param string $state_value (Required) The value of the state. [Allowed values: <code>OK</code>, <code>ALARM</code>, <code>INSUFFICIENT_DATA</code>]
487
- * @param string $state_reason (Required) The reason that this alarm is set to this specific state (in human-readable text format)
488
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
489
- * <li><code>StateReasonData</code> - <code>string</code> - Optional - The reason that this alarm is set to this specific state (in machine-readable JSON format) </li>
490
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
491
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
492
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
493
- */
494
- public function set_alarm_state($alarm_name, $state_value, $state_reason, $opt = null)
495
- {
496
- if (!$opt) $opt = array();
497
- $opt['AlarmName'] = $alarm_name;
498
- $opt['StateValue'] = $state_value;
499
- $opt['StateReason'] = $state_reason;
500
-
501
- return $this->authenticate('SetAlarmState', $opt, $this->hostname);
502
- }
503
- }
504
-
505
-
506
- /*%******************************************************************************************%*/
507
- // EXCEPTIONS
508
-
509
- /**
510
- * Default CloudWatch Exception.
511
- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
512
  class CloudWatch_Exception extends Exception {}
1
+ <?php
2
+ /*
3
+ * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ /**
18
+ *
19
+ *
20
+ * This is the <i>Amazon CloudWatch API Reference</i>. This guide provides detailed information about Amazon CloudWatch actions, data types,
21
+ * parameters, and errors. For detailed information about Amazon CloudWatch features and their associated API calls, go to the <a
22
+ * href="http://docs.amazonwebservices.com/AmazonCloudWatch/latest/DeveloperGuide">Amazon CloudWatch Developer Guide</a>.
23
+ *
24
+ * Amazon CloudWatch is a web service that enables you to publish, monitor, and manage various metrics, as well as configure alarm actions
25
+ * based on data from metrics. For more information about this product go to <a
26
+ * href="http://aws.amazon.com/cloudwatch">http://aws.amazon.com/cloudwatch</a>.
27
+ *
28
+ * Use the following links to get started using the <i>Amazon CloudWatch API Reference</i>:
29
+ *
30
+ * <ul> <li> <a href="http://docs.amazonwebservices.com/AmazonCloudWatch/latest/APIReference/API_Operations.html">Actions</a>: An alphabetical
31
+ * list of all Amazon CloudWatch actions.</li>
32
+ *
33
+ * <li> <a href="http://docs.amazonwebservices.com/AmazonCloudWatch/latest/APIReference/API_Types.html">Data Types</a>: An alphabetical list
34
+ * of all Amazon CloudWatch data types.</li>
35
+ *
36
+ * <li> <a href="http://docs.amazonwebservices.com/AmazonCloudWatch/latest/APIReference/CommonParameters.html">Common Parameters</a>:
37
+ * Parameters that all Query actions can use.</li>
38
+ *
39
+ * <li> <a href="http://docs.amazonwebservices.com/AmazonCloudWatch/latest/APIReference/CommonErrors.html">Common Errors</a>: Client and
40
+ * server errors that all actions can return.</li>
41
+ *
42
+ * <li> <a href="http://docs.amazonwebservices.com/general/latest/gr/index.html?rande.html">Regions and Endpoints</a>: Itemized regions and
43
+ * endpoints for all AWS products.</li>
44
+ *
45
+ * <li> <a href="http://monitoring.amazonaws.com/doc/2010-08-01/CloudWatch.wsdl">WSDL Location</a>:
46
+ * http://monitoring.amazonaws.com/doc/2010-08-01/CloudWatch.wsdl</li>
47
+ *
48
+ * </ul>
49
+ *
50
+ * @version Tue May 10 18:24:54 PDT 2011
51
+ * @license See the included NOTICE.md file for complete information.
52
+ * @copyright See the included NOTICE.md file for complete information.
53
+ * @link http://aws.amazon.com/cloudwatch/Amazon CloudWatch
54
+ * @link http://aws.amazon.com/documentation/cloudwatch/Amazon CloudWatch documentation
55
+ */
56
+ class AmazonCloudWatch extends CFRuntime
57
+ {
58
+
59
+ /*%******************************************************************************************%*/
60
+ // CLASS CONSTANTS
61
+
62
+ /**
63
+ * Specify the default queue URL.
64
+ */
65
+ const DEFAULT_URL = 'monitoring.amazonaws.com';
66
+
67
+ /**
68
+ * Specify the queue URL for the US-East (Northern Virginia) Region.
69
+ */
70
+ const REGION_US_E1 = 'us-east-1';
71
+
72
+ /**
73
+ * Specify the queue URL for the US-West (Northern California) Region.
74
+ */
75
+ const REGION_US_W1 = 'us-west-1';
76
+
77
+ /**
78
+ * Specify the queue URL for the EU (Ireland) Region.
79
+ */
80
+ const REGION_EU_W1 = 'eu-west-1';
81
+
82
+ /**
83
+ * Specify the queue URL for the Asia Pacific (Singapore) Region.
84
+ */
85
+ const REGION_APAC_SE1 = 'ap-southeast-1';
86
+
87
+ /**
88
+ * Specify the queue URL for the Asia Pacific (Japan) Region.
89
+ */
90
+ const REGION_APAC_NE1 = 'ap-northeast-1';
91
+
92
+
93
+ /*%******************************************************************************************%*/
94
+ // SETTERS
95
+
96
+ /**
97
+ * This allows you to explicitly sets the region for the service to use.
98
+ *
99
+ * @param string $region (Required) The region to explicitly set. Available options are <REGION_US_E1>, <REGION_US_W1>, <REGION_EU_W1>, or <REGION_APAC_SE1>.
100
+ * @return $this A reference to the current instance.
101
+ */
102
+ public function set_region($region)
103
+ {
104
+ $this->set_hostname('http://monitoring.'. $region .'.amazonaws.com');
105
+ return $this;
106
+ }
107
+
108
+
109
+ /*%******************************************************************************************%*/
110
+ // CONSTRUCTOR
111
+
112
+ /**
113
+ * Constructs a new instance of <AmazonCloudWatch>.
114
+ *
115
+ * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <code>AWS_KEY</code> constant.
116
+ * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant.
117
+ * @return boolean false if no valid values are set, otherwise true.
118
+ */
119
+ public function __construct($key = null, $secret_key = null)
120
+ {
121
+ $this->api_version = '2010-08-01';
122
+ $this->hostname = self::DEFAULT_URL;
123
+
124
+ if (!$key && !defined('AWS_KEY'))
125
+ {
126
+ // @codeCoverageIgnoreStart
127
+ throw new CW_Exception('No account key was passed into the constructor, nor was it set in the AWS_KEY constant.');
128
+ // @codeCoverageIgnoreEnd
129
+ }
130
+
131
+ if (!$secret_key && !defined('AWS_SECRET_KEY'))
132
+ {
133
+ // @codeCoverageIgnoreStart
134
+ throw new CW_Exception('No account secret was passed into the constructor, nor was it set in the AWS_SECRET_KEY constant.');
135
+ // @codeCoverageIgnoreEnd
136
+ }
137
+
138
+ return parent::__construct($key, $secret_key);
139
+ }
140
+
141
+
142
+ /*%******************************************************************************************%*/
143
+ // SERVICE METHODS
144
+
145
+ /**
146
+ *
147
+ * Creates or updates an alarm and associates it with the specified Amazon CloudWatch metric. Optionally, this operation can associate one or
148
+ * more Amazon Simple Notification Service resources with the alarm.
149
+ *
150
+ * When this operation creates an alarm, the alarm state is immediately set to <code>INSUFFICIENT_DATA</code>. The alarm is evaluated and its
151
+ * <code>StateValue</code> is set appropriately. Any actions associated with the <code>StateValue</code> is then executed.
152
+ *
153
+ * When updating an existing alarm, its <code>StateValue</code> is left unchanged.
154
+ *
155
+ * @param string $alarm_name (Required) The descriptive name for the alarm. This name must be unique within the user's AWS account
156
+ * @param string $metric_name (Required) The name for the alarm's associated metric.
157
+ * @param string $namespace (Required) The namespace for the alarm's associated metric.
158
+ * @param string $statistic (Required) The statistic to apply to the alarm's associated metric. [Allowed values: <code>SampleCount</code>, <code>Average</code>, <code>Sum</code>, <code>Minimum</code>, <code>Maximum</code>]
159
+ * @param integer $period (Required) The period in seconds over which the specified statistic is applied.
160
+ * @param integer $evaluation_periods (Required) The number of periods over which data is compared to the specified threshold.
161
+ * @param double $threshold (Required) The value against which the specified statistic is compared.
162
+ * @param string $comparison_operator (Required) The arithmetic operation to use when comparing the specified <code>Statistic</code> and <code>Threshold</code>. The specified <code>Statistic</code> value is used as the first operand. [Allowed values: <code>GreaterThanOrEqualToThreshold</code>, <code>GreaterThanThreshold</code>, <code>LessThanThreshold</code>, <code>LessThanOrEqualToThreshold</code>]
163
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
164
+ * <li><code>AlarmDescription</code> - <code>string</code> - Optional - The description for the alarm. </li>
165
+ * <li><code>ActionsEnabled</code> - <code>boolean</code> - Optional - Indicates whether or not actions should be executed during any changes to the alarm's state. </li>
166
+ * <li><code>OKActions</code> - <code>string|array</code> - Optional - The list of actions to execute when this alarm transitions into an <code>OK</code> state from any other state. Each action is specified as an Amazon Resource Number (ARN). Currently the only action supported is publishing to an Amazon SNS topic or an Amazon Auto Scaling policy. Pass a string for a single value, or an indexed array for multiple values. </li>
167
+ * <li><code>AlarmActions</code> - <code>string|array</code> - Optional - The list of actions to execute when this alarm transitions into an <code>ALARM</code> state from any other state. Each action is specified as an Amazon Resource Number (ARN). Currently the only action supported is publishing to an Amazon SNS topic or an Amazon Auto Scaling policy. Pass a string for a single value, or an indexed array for multiple values. </li>
168
+ * <li><code>InsufficientDataActions</code> - <code>string|array</code> - Optional - The list of actions to execute when this alarm transitions into an <code>INSUFFICIENT_DATA</code> state from any other state. Each action is specified as an Amazon Resource Number (ARN). Currently the only action supported is publishing to an Amazon SNS topic or an Amazon Auto Scaling policy. Pass a string for a single value, or an indexed array for multiple values. </li>
169
+ * <li><code>Dimensions</code> - <code>array</code> - Optional - The dimensions for the alarm's associated metric. <ul>
170
+ * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
171
+ * <li><code>Name</code> - <code>string</code> - Required - The name of the dimension. </li>
172
+ * <li><code>Value</code> - <code>string</code> - Required - The value representing the dimension measurement </li>
173
+ * </ul></li>
174
+ * </ul></li>
175
+ * <li><code>Unit</code> - <code>string</code> - Optional - The unit for the alarm's associated metric. [Allowed values: <code>Seconds</code>, <code>Microseconds</code>, <code>Milliseconds</code>, <code>Bytes</code>, <code>Kilobytes</code>, <code>Megabytes</code>, <code>Gigabytes</code>, <code>Terabytes</code>, <code>Bits</code>, <code>Kilobits</code>, <code>Megabits</code>, <code>Gigabits</code>, <code>Terabits</code>, <code>Percent</code>, <code>Count</code>, <code>Bytes/Second</code>, <code>Kilobytes/Second</code>, <code>Megabytes/Second</code>, <code>Gigabytes/Second</code>, <code>Terabytes/Second</code>, <code>Bits/Second</code>, <code>Kilobits/Second</code>, <code>Megabits/Second</code>, <code>Gigabits/Second</code>, <code>Terabits/Second</code>, <code>Count/Second</code>, <code>None</code>]</li>
176
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
177
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
178
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
179
+ */
180
+ public function put_metric_alarm($alarm_name, $metric_name, $namespace, $statistic, $period, $evaluation_periods, $threshold, $comparison_operator, $opt = null)
181
+ {
182
+ if (!$opt) $opt = array();
183
+ $opt['AlarmName'] = $alarm_name;
184
+
185
+ // Optional parameter
186
+ if (isset($opt['OKActions']))
187
+ {
188
+ $opt = array_merge($opt, CFComplexType::map(array(
189
+ 'OKActions' => (is_array($opt['OKActions']) ? $opt['OKActions'] : array($opt['OKActions']))
190
+ ), 'member'));
191
+ unset($opt['OKActions']);
192
+ }
193
+
194
+ // Optional parameter
195
+ if (isset($opt['AlarmActions']))
196
+ {
197
+ $opt = array_merge($opt, CFComplexType::map(array(
198
+ 'AlarmActions' => (is_array($opt['AlarmActions']) ? $opt['AlarmActions'] : array($opt['AlarmActions']))
199
+ ), 'member'));
200
+ unset($opt['AlarmActions']);
201
+ }
202
+
203
+ // Optional parameter
204
+ if (isset($opt['InsufficientDataActions']))
205
+ {
206
+ $opt = array_merge($opt, CFComplexType::map(array(
207
+ 'InsufficientDataActions' => (is_array($opt['InsufficientDataActions']) ? $opt['InsufficientDataActions'] : array($opt['InsufficientDataActions']))
208
+ ), 'member'));
209
+ unset($opt['InsufficientDataActions']);
210
+ }
211
+ $opt['MetricName'] = $metric_name;
212
+ $opt['Namespace'] = $namespace;
213
+ $opt['Statistic'] = $statistic;
214
+
215
+ // Optional parameter
216
+ if (isset($opt['Dimensions']))
217
+ {
218
+ $opt = array_merge($opt, CFComplexType::map(array(
219
+ 'Dimensions' => $opt['Dimensions']
220
+ ), 'member'));
221
+ unset($opt['Dimensions']);
222
+ }
223
+ $opt['Period'] = $period;
224
+ $opt['EvaluationPeriods'] = $evaluation_periods;
225
+ $opt['Threshold'] = $threshold;
226
+ $opt['ComparisonOperator'] = $comparison_operator;
227
+
228
+ return $this->authenticate('PutMetricAlarm', $opt, $this->hostname);
229
+ }
230
+
231
+ /**
232
+ * Publishes metric data points to Amazon CloudWatch. Amazon Cloudwatch associates the data points with the specified metric. If the specified
233
+ * metric does not exist, Amazon CloudWatch creates the metric. If you create a metric with the <code>PutMetricData</code> action, allow up to
234
+ * fifteen minutes for the metric to appear in calls to the ListMetrics action.
235
+ *
236
+ * The size of a <code>PutMetricData</code> request is limited to 8 KB for HTTP GET requests and 40 KB for HTTP POST requests.
237
+ *
238
+ * Amazon CloudWatch truncates values with very large exponents. Values with base-10 exponents greater than 126 (1 x 10^126) are truncated.
239
+ * Likewise, values with base-10 exponents less than -130 (1 x 10^-130) are also truncated.
240
+ *
241
+ * @param string $namespace (Required) The namespace for the metric data. You cannot specify a namespace that begins with <code>AWS/</code>. Namespaces that begin with <code>AWS/</code> are reserved for other Amazon Web Services products that send metrics to Amazon CloudWatch.
242
+ * @param array $metric_data (Required) A list of data describing the metric. <ul>
243
+ * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
244
+ * <li><code>MetricName</code> - <code>string</code> - Required - The name of the metric. </li>
245
+ * <li><code>Dimensions</code> - <code>array</code> - Optional - A list of dimensions associated with the metric. <ul>
246
+ * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
247
+ * <li><code>Name</code> - <code>string</code> - Required - The name of the dimension. </li>
248
+ * <li><code>Value</code> - <code>string</code> - Required - The value representing the dimension measurement </li>
249
+ * </ul></li>
250
+ * </ul></li>
251
+ * <li><code>Timestamp</code> - <code>string</code> - Optional - The time stamp used for the metric. If not specified, the default value is set to the time the metric data was received. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
252
+ * <li><code>Value</code> - <code>integer</code> - Optional - The value for the metric. <important>Amazon CloudWatch truncates values with very large exponents. Values with base-10 exponents greater than 126 (1 x 10^126) are truncated. Likewise, values with base-10 exponents less than -130 (1 x 10^-130) are also truncated. </important> </li>
253
+ * <li><code>StatisticValues</code> - <code>array</code> - Optional - A set of statistical values describing the metric. Takes an associative array of parameters that can have the following keys: <ul>
254
+ * <li><code>SampleCount</code> - <code>double</code> - Required - The number of samples used for the statistic set. </li>
255
+ * <li><code>Sum</code> - <code>double</code> - Required - The sum of values for the sample set. </li>
256
+ * <li><code>Minimum</code> - <code>double</code> - Required - The minimum value of the sample set. </li>
257
+ * <li><code>Maximum</code> - <code>double</code> - Required - The maximum value of the sample set. </li>
258
+ * </ul></li>
259
+ * <li><code>Unit</code> - <code>string</code> - Optional - The unit of the metric. [Allowed values: <code>Seconds</code>, <code>Microseconds</code>, <code>Milliseconds</code>, <code>Bytes</code>, <code>Kilobytes</code>, <code>Megabytes</code>, <code>Gigabytes</code>, <code>Terabytes</code>, <code>Bits</code>, <code>Kilobits</code>, <code>Megabits</code>, <code>Gigabits</code>, <code>Terabits</code>, <code>Percent</code>, <code>Count</code>, <code>Bytes/Second</code>, <code>Kilobytes/Second</code>, <code>Megabytes/Second</code>, <code>Gigabytes/Second</code>, <code>Terabytes/Second</code>, <code>Bits/Second</code>, <code>Kilobits/Second</code>, <code>Megabits/Second</code>, <code>Gigabits/Second</code>, <code>Terabits/Second</code>, <code>Count/Second</code>, <code>None</code>]</li>
260
+ * </ul></li>
261
+ * </ul>
262
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
263
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
264
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
265
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
266
+ */
267
+ public function put_metric_data($namespace, $metric_data, $opt = null)
268
+ {
269
+ if (!$opt) $opt = array();
270
+ $opt['Namespace'] = $namespace;
271
+
272
+ // Handle Timestamps
273
+ for ($i = 0, $max = count($metric_data); $i < $max; $i++)
274
+ {
275
+ if (isset($metric_data[$i]['Timestamp']))
276
+ {
277
+ $metric_data[$i]['Timestamp'] = $this->util->convert_date_to_iso8601($metric_data[$i]['Timestamp']);
278
+ }
279
+ }
280
+
281
+ // Required parameter
282
+ $opt = array_merge($opt, CFComplexType::map(array(
283
+ 'MetricData' => (is_array($metric_data) ? $metric_data : array($metric_data))
284
+ ), 'member'));
285
+
286
+ return $this->authenticate('PutMetricData', $opt, $this->hostname);
287
+ }
288
+
289
+ /**
290
+ *
291
+ * Returns a list of valid metrics stored for the AWS account owner. Returned metrics can be used with GetMetricStatistics to obtain
292
+ * statistical data for a given metric.
293
+ *
294
+ * Up to 500 results are returned for any one call. To retrieve further results, use returned <code>NextToken</code> values with subsequent
295
+ * <code>ListMetrics</code> operations.
296
+ *
297
+ * If you create a metric with the PutMetricData action, allow up to fifteen minutes for the metric to appear in calls to the
298
+ * <code>ListMetrics</code> action. Statistics about the metric, however, are available sooner using GetMetricStatistics.
299
+ *
300
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
301
+ * <li><code>Namespace</code> - <code>string</code> - Optional - The namespace to filter against. </li>
302
+ * <li><code>MetricName</code> - <code>string</code> - Optional - The name of the metric to filter against. </li>
303
+ * <li><code>Dimensions</code> - <code>array</code> - Optional - A list of dimensions to filter against. <ul>
304
+ * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
305
+ * <li><code>Name</code> - <code>string</code> - Required - The dimension name to be matched. </li>
306
+ * <li><code>Value</code> - <code>string</code> - Optional - The value of the dimension to be matched. Specifying a <code>Name</code> without specifying a <code>Value</code> returns all values associated with that <code>Name</code>. </li>
307
+ * </ul></li>
308
+ * </ul></li>
309
+ * <li><code>NextToken</code> - <code>string</code> - Optional - The token returned by a previous call to indicate that there is more data available. </li>
310
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
311
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
312
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
313
+ */
314
+ public function list_metrics($opt = null)
315
+ {
316
+ if (!$opt) $opt = array();
317
+
318
+ // Optional parameter
319
+ if (isset($opt['Dimensions']))
320
+ {
321
+ $opt = array_merge($opt, CFComplexType::map(array(
322
+ 'Dimensions' => $opt['Dimensions']
323
+ ), 'member'));
324
+ unset($opt['Dimensions']);
325
+ }
326
+
327
+ return $this->authenticate('ListMetrics', $opt, $this->hostname);
328
+ }
329
+
330
+ /**
331
+ *
332
+ * Gets statistics for the specified metric.
333
+ *
334
+ * The maximum number of data points returned from a single <code>GetMetricStatistics</code> request is 1,440. If a request is made that
335
+ * generates more than 1,440 data points, Amazon CloudWatch returns an error. In such a case, alter the request by narrowing the specified time
336
+ * range or increasing the specified period. Alternatively, make multiple requests across adjacent time ranges.
337
+ *
338
+ * Amazon CloudWatch aggregates data points based on the length of the <code>period</code> that you specify. For example, if you request
339
+ * statistics with a one-minute granularity, Amazon CloudWatch aggregates data points with time stamps that fall within the same one-minute
340
+ * period. In such a case, the data points queried can greatly outnumber the data points returned.
341
+ *
342
+ * The maximum number of data points that can be queried is 50,850; whereas the maximum number of data points returned is 1,440.
343
+ *
344
+ * The following examples show various statistics allowed by the data point query maximum of 50,850 when you call
345
+ * <code>GetMetricStatistics</code> on Amazon EC2 instances with detailed (one-minute) monitoring enabled:
346
+ *
347
+ * <ul> <li>Statistics for up to 400 instances for a span of one hour</li>
348
+ *
349
+ * <li>Statistics for up to 35 instances over a span of 24 hours</li>
350
+ *
351
+ * <li>Statistics for up to 2 instances over a span of 2 weeks</li>
352
+ *
353
+ * </ul>
354
+ *
355
+ * @param string $namespace (Required) The namespace of the metric.
356
+ * @param string $metric_name (Required) The name of the metric.
357
+ * @param string $start_time (Required) The time stamp to use for determining the first datapoint to return. The value specified is inclusive; results include datapoints with the time stamp specified. The specified start time is rounded down to the nearest value. Datapoints are returned for start times up to two weeks in the past. Specified start times that are more than two weeks in the past will not return datapoints for metrics that are older than two weeks. Accepts any value that <php:strtotime()> understands.
358
+ * @param string $end_time (Required) The time stamp to use for determining the last datapoint to return. The value specified is exclusive; results will include datapoints up to the time stamp specified. Accepts any value that <php:strtotime()> understands.
359
+ * @param integer $period (Required) The granularity, in seconds, of the returned datapoints. <code>Period</code> must be at least 60 seconds and must be a multiple of 60. The default value is 60.
360
+ * @param string|array $statistics (Required) The metric statistics to return. Pass a string for a single value, or an indexed array for multiple values.
361
+ * @param string $unit (Required) The unit for the metric. [Allowed values: <code>Seconds</code>, <code>Microseconds</code>, <code>Milliseconds</code>, <code>Bytes</code>, <code>Kilobytes</code>, <code>Megabytes</code>, <code>Gigabytes</code>, <code>Terabytes</code>, <code>Bits</code>, <code>Kilobits</code>, <code>Megabits</code>, <code>Gigabits</code>, <code>Terabits</code>, <code>Percent</code>, <code>Count</code>, <code>Bytes/Second</code>, <code>Kilobytes/Second</code>, <code>Megabytes/Second</code>, <code>Gigabytes/Second</code>, <code>Terabytes/Second</code>, <code>Bits/Second</code>, <code>Kilobits/Second</code>, <code>Megabits/Second</code>, <code>Gigabits/Second</code>, <code>Terabits/Second</code>, <code>Count/Second</code>, <code>None</code>]
362
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
363
+ * <li><code>Dimensions</code> - <code>array</code> - Optional - A list of dimensions describing qualities of the metric. <ul>
364
+ * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
365
+ * <li><code>Name</code> - <code>string</code> - Required - The name of the dimension. </li>
366
+ * <li><code>Value</code> - <code>string</code> - Required - The value representing the dimension measurement </li>
367
+ * </ul></li>
368
+ * </ul></li>
369
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
370
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
371
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
372
+ */
373
+ public function get_metric_statistics($namespace, $metric_name, $start_time, $end_time, $period, $statistics, $unit, $opt = null)
374
+ {
375
+ if (!$opt) $opt = array();
376
+ $opt['Namespace'] = $namespace;
377
+ $opt['MetricName'] = $metric_name;
378
+
379
+ // Optional parameter
380
+ if (isset($opt['Dimensions']))
381
+ {
382
+ $opt = array_merge($opt, CFComplexType::map(array(
383
+ 'Dimensions' => $opt['Dimensions']
384
+ ), 'member'));
385
+ unset($opt['Dimensions']);
386
+ }
387
+ $opt['StartTime'] = $this->util->convert_date_to_iso8601($start_time);
388
+ $opt['EndTime'] = $this->util->convert_date_to_iso8601($end_time);
389
+ $opt['Period'] = $period;
390
+
391
+ // Required parameter
392
+ $opt = array_merge($opt, CFComplexType::map(array(
393
+ 'Statistics' => (is_array($statistics) ? $statistics : array($statistics))
394
+ ), 'member'));
395
+ $opt['Unit'] = $unit;
396
+
397
+ return $this->authenticate('GetMetricStatistics', $opt, $this->hostname);
398
+ }
399
+
400
+ /**
401
+ *
402
+ * Disables actions for the specified alarms. When an alarm's actions are disabled the alarm's state may change, but none of the alarm's
403
+ * actions will execute.
404
+ *
405
+ * @param string|array $alarm_names (Required) The names of the alarms to disable actions for. Pass a string for a single value, or an indexed array for multiple values.
406
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
407
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
408
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
409
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
410
+ */
411
+ public function disable_alarm_actions($alarm_names, $opt = null)
412
+ {
413
+ if (!$opt) $opt = array();
414
+
415
+ // Required parameter
416
+ $opt = array_merge($opt, CFComplexType::map(array(
417
+ 'AlarmNames' => (is_array($alarm_names) ? $alarm_names : array($alarm_names))
418
+ ), 'member'));
419
+
420
+ return $this->authenticate('DisableAlarmActions', $opt, $this->hostname);
421
+ }
422
+
423
+ /**
424
+ *
425
+ * Retrieves alarms with the specified names. If no name is specified, all alarms for the user are returned. Alarms can be retrieved by using
426
+ * only a prefix for the alarm name, the alarm state, or a prefix for any action.
427
+ *
428
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
429
+ * <li><code>AlarmNames</code> - <code>string|array</code> - Optional - A list of alarm names to retrieve information for. Pass a string for a single value, or an indexed array for multiple values. </li>
430
+ * <li><code>AlarmNamePrefix</code> - <code>string</code> - Optional - The alarm name prefix. <code>AlarmNames</code> cannot be specified if this parameter is specified. </li>
431
+ * <li><code>StateValue</code> - <code>string</code> - Optional - The state value to be used in matching alarms. [Allowed values: <code>OK</code>, <code>ALARM</code>, <code>INSUFFICIENT_DATA</code>]</li>
432
+ * <li><code>ActionPrefix</code> - <code>string</code> - Optional - The action name prefix. </li>
433
+ * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of alarm descriptions to retrieve. </li>
434
+ * <li><code>NextToken</code> - <code>string</code> - Optional - The token returned by a previous call to indicate that there is more data available. </li>
435
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
436
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
437
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
438
+ */
439
+ public function describe_alarms($opt = null)
440
+ {
441
+ if (!$opt) $opt = array();
442
+
443
+ // Optional parameter
444
+ if (isset($opt['AlarmNames']))
445
+ {
446
+ $opt = array_merge($opt, CFComplexType::map(array(
447
+ 'AlarmNames' => (is_array($opt['AlarmNames']) ? $opt['AlarmNames'] : array($opt['AlarmNames']))
448
+ ), 'member'));
449
+ unset($opt['AlarmNames']);
450
+ }
451
+
452
+ return $this->authenticate('DescribeAlarms', $opt, $this->hostname);
453
+ }
454
+
455
+ /**
456
+ *
457
+ * Retrieves all alarms for a single metric. Specify a statistic, period, or unit to filter the set of alarms further.
458
+ *
459
+ * @param string $metric_name (Required) The name of the metric.
460
+ * @param string $namespace (Required) The namespace of the metric.
461
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
462
+ * <li><code>Statistic</code> - <code>string</code> - Optional - The statistic for the metric. [Allowed values: <code>SampleCount</code>, <code>Average</code>, <code>Sum</code>, <code>Minimum</code>, <code>Maximum</code>]</li>
463
+ * <li><code>Dimensions</code> - <code>array</code> - Optional - The list of dimensions associated with the metric. <ul>
464
+ * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
465
+ * <li><code>Name</code> - <code>string</code> - Required - The name of the dimension. </li>
466
+ * <li><code>Value</code> - <code>string</code> - Required - The value representing the dimension measurement </li>
467
+ * </ul></li>
468
+ * </ul></li>
469
+ * <li><code>Period</code> - <code>integer</code> - Optional - The period in seconds over which the statistic is applied. </li>
470
+ * <li><code>Unit</code> - <code>string</code> - Optional - The unit for the metric. [Allowed values: <code>Seconds</code>, <code>Microseconds</code>, <code>Milliseconds</code>, <code>Bytes</code>, <code>Kilobytes</code>, <code>Megabytes</code>, <code>Gigabytes</code>, <code>Terabytes</code>, <code>Bits</code>, <code>Kilobits</code>, <code>Megabits</code>, <code>Gigabits</code>, <code>Terabits</code>, <code>Percent</code>, <code>Count</code>, <code>Bytes/Second</code>, <code>Kilobytes/Second</code>, <code>Megabytes/Second</code>, <code>Gigabytes/Second</code>, <code>Terabytes/Second</code>, <code>Bits/Second</code>, <code>Kilobits/Second</code>, <code>Megabits/Second</code>, <code>Gigabits/Second</code>, <code>Terabits/Second</code>, <code>Count/Second</code>, <code>None</code>]</li>
471
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
472
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
473
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
474
+ */
475
+ public function describe_alarms_for_metric($metric_name, $namespace, $opt = null)
476
+ {
477
+ if (!$opt) $opt = array();
478
+ $opt['MetricName'] = $metric_name;
479
+ $opt['Namespace'] = $namespace;
480
+
481
+ // Optional parameter
482
+ if (isset($opt['Dimensions']))
483
+ {
484
+ $opt = array_merge($opt, CFComplexType::map(array(
485
+ 'Dimensions' => $opt['Dimensions']
486
+ ), 'member'));
487
+ unset($opt['Dimensions']);
488
+ }
489
+
490
+ return $this->authenticate('DescribeAlarmsForMetric', $opt, $this->hostname);
491
+ }
492
+
493
+ /**
494
+ *
495
+ * Retrieves history for the specified alarm. Filter alarms by date range or item type. If an alarm name is not specified, Amazon CloudWatch
496
+ * returns histories for all of the owner's alarms.
497
+ *
498
+ * Amazon CloudWatch retains the history of an alarm for two weeks, whether or not you delete the alarm.
499
+ *
500
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
501
+ * <li><code>AlarmName</code> - <code>string</code> - Optional - The name of the alarm. </li>
502
+ * <li><code>HistoryItemType</code> - <code>string</code> - Optional - The type of alarm histories to retrieve. [Allowed values: <code>ConfigurationUpdate</code>, <code>StateUpdate</code>, <code>Action</code>]</li>
503
+ * <li><code>StartDate</code> - <code>string</code> - Optional - The starting date to retrieve alarm history. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
504
+ * <li><code>EndDate</code> - <code>string</code> - Optional - The ending date to retrieve alarm history. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
505
+ * <li><code>MaxRecords</code> - <code>integer</code> - Optional - The maximum number of alarm history records to retrieve. </li>
506
+ * <li><code>NextToken</code> - <code>string</code> - Optional - The token returned by a previous call to indicate that there is more data available. </li>
507
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
508
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
509
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
510
+ */
511
+ public function describe_alarm_history($opt = null)
512
+ {
513
+ if (!$opt) $opt = array();
514
+
515
+ // Optional parameter
516
+ if (isset($opt['StartDate']))
517
+ {
518
+ $opt['StartDate'] = $this->util->convert_date_to_iso8601($opt['StartDate']);
519
+ }
520
+
521
+ // Optional parameter
522
+ if (isset($opt['EndDate']))
523
+ {
524
+ $opt['EndDate'] = $this->util->convert_date_to_iso8601($opt['EndDate']);
525
+ }
526
+
527
+ return $this->authenticate('DescribeAlarmHistory', $opt, $this->hostname);
528
+ }
529
+
530
+ /**
531
+ *
532
+ * Enables actions for the specified alarms.
533
+ *
534
+ * @param string|array $alarm_names (Required) The names of the alarms to enable actions for. Pass a string for a single value, or an indexed array for multiple values.
535
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
536
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
537
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
538
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
539
+ */
540
+ public function enable_alarm_actions($alarm_names, $opt = null)
541
+ {
542
+ if (!$opt) $opt = array();
543
+
544
+ // Required parameter
545
+ $opt = array_merge($opt, CFComplexType::map(array(
546
+ 'AlarmNames' => (is_array($alarm_names) ? $alarm_names : array($alarm_names))
547
+ ), 'member'));
548
+
549
+ return $this->authenticate('EnableAlarmActions', $opt, $this->hostname);
550
+ }
551
+
552
+ /**
553
+ *
554
+ * Deletes all specified alarms. In the event of an error, no alarms are deleted.
555
+ *
556
+ * @param string|array $alarm_names (Required) A list of alarms to be deleted. Pass a string for a single value, or an indexed array for multiple values.
557
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
558
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
559
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
560
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
561
+ */
562
+ public function delete_alarms($alarm_names, $opt = null)
563
+ {
564
+ if (!$opt) $opt = array();
565
+
566
+ // Required parameter
567
+ $opt = array_merge($opt, CFComplexType::map(array(
568
+ 'AlarmNames' => (is_array($alarm_names) ? $alarm_names : array($alarm_names))
569
+ ), 'member'));
570
+
571
+ return $this->authenticate('DeleteAlarms', $opt, $this->hostname);
572
+ }
573
+
574
+ /**
575
+ *
576
+ * Temporarily sets the state of an alarm. When the updated <code>StateValue</code> differs from the previous value, the action configured for
577
+ * the appropriate state is invoked. This is not a permanent change. The next periodic alarm check (in about a minute) will set the alarm to
578
+ * its actual state.
579
+ *
580
+ * @param string $alarm_name (Required) The descriptive name for the alarm. This name must be unique within the user's AWS account. The maximum length is 255 characters.
581
+ * @param string $state_value (Required) The value of the state. [Allowed values: <code>OK</code>, <code>ALARM</code>, <code>INSUFFICIENT_DATA</code>]
582
+ * @param string $state_reason (Required) The reason that this alarm is set to this specific state (in human-readable text format)
583
+ * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
584
+ * <li><code>StateReasonData</code> - <code>string</code> - Optional - The reason that this alarm is set to this specific state (in machine-readable JSON format) </li>
585
+ * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
586
+ * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
587
+ * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
588
+ */
589
+ public function set_alarm_state($alarm_name, $state_value, $state_reason, $opt = null)
590
+ {
591
+ if (!$opt) $opt = array();
592
+ $opt['AlarmName'] = $alarm_name;
593
+ $opt['StateValue'] = $state_value;
594
+ $opt['StateReason'] = $state_reason;
595
+
596
+ return $this->authenticate('SetAlarmState', $opt, $this->hostname);
597
+ }
598
+ }
599
+
600
+
601
+ /*%******************************************************************************************%*/
602
+ // EXCEPTIONS
603
+
604
+ /**
605
+ * Default CloudWatch Exception.
606
+ */
607
  class CloudWatch_Exception extends Exception {}
app/libs/aws/services/ec2.class.php CHANGED
@@ -1,3995 +1,3984 @@
1
- <?php
2
- /*
3
- * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- /**
18
- *
19
- * Amazon Elastic Compute Cloud (Amazon EC2) is a web service that provides resizable compute capacity in the cloud. It is
20
- * designed to make web-scale computing easier for developers.
21
- *
22
- * Amazon EC2's simple web service interface allows you to obtain and configure capacity with minimal friction. It
23
- * provides you with complete control of your computing resources and lets you run on Amazon's proven computing
24
- * environment. Amazon EC2 reduces the time required to obtain and boot new server instances to minutes, allowing you to
25
- * quickly scale capacity, both up and down, as your computing requirements change. Amazon EC2 changes the economics of
26
- * computing by allowing you to pay only for capacity that you actually use. Amazon EC2 provides developers the tools to
27
- * build failure resilient applications and isolate themselves from common failure scenarios.
28
- *
29
- * Visit <a href="http://aws.amazon.com/ec2/">http://aws.amazon.com/ec2/</a> for more information.
30
- *
31
- * @version Fri Mar 25 13:14:50 PDT 2011
32
- * @license See the included NOTICE.md file for complete information.
33
- * @copyright See the included NOTICE.md file for complete information.
34
- * @link http://aws.amazon.com/ec2/Amazon Elastic Compute Cloud
35
- * @link http://aws.amazon.com/documentation/ec2/Amazon Elastic Compute Cloud documentation
36
- */
37
- class AmazonEC2 extends CFRuntime
38
- {
39
-
40
- /*%******************************************************************************************%*/
41
- // CLASS CONSTANTS
42
-
43
- /**
44
- * Specify the default queue URL.
45
- */
46
- const DEFAULT_URL = 'ec2.amazonaws.com';
47
-
48
- /**
49
- * Specify the queue URL for the US-East (Northern Virginia) Region.
50
- */
51
- const REGION_US_E1 = 'us-east-1';
52
-
53
- /**
54
- * Specify the queue URL for the US-West (Northern California) Region.
55
- */
56
- const REGION_US_W1 = 'us-west-1';
57
-
58
- /**
59
- * Specify the queue URL for the EU (Ireland) Region.
60
- */
61
- const REGION_EU_W1 = 'eu-west-1';
62
-
63
- /**
64
- * Specify the queue URL for the Asia Pacific (Singapore) Region.
65
- */
66
- const REGION_APAC_SE1 = 'ap-southeast-1';
67
-
68
- /**
69
- * Specify the queue URL for the Asia Pacific (Japan) Region.
70
- */
71
- const REGION_APAC_NE1 = 'ap-northeast-1';
72
-
73
- /**
74
- * The "pending" state code of an EC2 instance. Useful for conditionals.
75
- */
76
- const STATE_PENDING = 0;
77
-
78
- /**
79
- * The "running" state code of an EC2 instance. Useful for conditionals.
80
- */
81
- const STATE_RUNNING = 16;
82
-
83
- /**
84
- * The "shutting-down" state code of an EC2 instance. Useful for conditionals.
85
- */
86
- const STATE_SHUTTING_DOWN = 32;
87
-
88
- /**
89
- * The "terminated" state code of an EC2 instance. Useful for conditionals.
90
- */
91
- const STATE_TERMINATED = 48;
92
-
93
- /**
94
- * The "stopping" state code of an EC2 instance. Useful for conditionals.
95
- */
96
- const STATE_STOPPING = 64;
97
-
98
- /**
99
- * The "stopped" state code of an EC2 instance. Useful for conditionals.
100
- */
101
- const STATE_STOPPED = 80;
102
-
103
-
104
- /*%******************************************************************************************%*/
105
- // SETTERS
106
-
107
- /**
108
- * This allows you to explicitly sets the region for the service to use.
109
- *
110
- * @param string $region (Required) The region to explicitly set. Available options are <REGION_US_E1>, <REGION_US_W1>, <REGION_EU_W1>, or <REGION_APAC_SE1>.
111
- * @return $this A reference to the current instance.
112
- */
113
- public function set_region($region)
114
- {
115
- $this->set_hostname('http://ec2.'. $region .'.amazonaws.com');
116
- return $this;
117
- }
118
-
119
-
120
- /*%******************************************************************************************%*/
121
- // CONSTRUCTOR
122
-
123
- /**
124
- * Constructs a new instance of <AmazonEC2>.
125
- *
126
- * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <code>AWS_KEY</code> constant.
127
- * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant.
128
- * @return boolean false if no valid values are set, otherwise true.
129
- */
130
- public function __construct($key = null, $secret_key = null)
131
- {
132
- $this->api_version = '2011-01-01';
133
- $this->hostname = self::DEFAULT_URL;
134
-
135
- if (!$key && !defined('AWS_KEY'))
136
- {
137
- throw new EC2_Exception('No account key was passed into the constructor, nor was it set in the AWS_KEY constant.');
138
- }
139
-
140
- if (!$secret_key && !defined('AWS_SECRET_KEY'))
141
- {
142
- throw new EC2_Exception('No account secret was passed into the constructor, nor was it set in the AWS_SECRET_KEY constant.');
143
- }
144
-
145
- return parent::__construct($key, $secret_key);
146
- }
147
-
148
-
149
- /*%******************************************************************************************%*/
150
- // SERVICE METHODS
151
-
152
- /**
153
- *
154
- * The RebootInstances operation requests a reboot of one or more instances. This operation is asynchronous; it only
155
- * queues a request to reboot the specified instance(s). The operation will succeed if the instances are valid and belong
156
- * to the user. Requests to reboot terminated instances are ignored.
157
- *
158
- * @param string|array $instance_id (Required) The list of instances to terminate. Pass a string for a single value, or an indexed array for multiple values.
159
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
160
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
161
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
162
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
163
- */
164
- public function reboot_instances($instance_id, $opt = null)
165
- {
166
- if (!$opt) $opt = array();
167
-
168
- // Required parameter
169
- $opt = array_merge($opt, CFComplexType::map(array(
170
- 'InstanceId' => (is_array($instance_id) ? $instance_id : array($instance_id))
171
- )));
172
-
173
- return $this->authenticate('RebootInstances', $opt, $this->hostname);
174
- }
175
-
176
- /**
177
- *
178
- * The DescribeReservedInstances operation describes Reserved Instances that were purchased for use with your account.
179
- *
180
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
181
- * <li><code>ReservedInstancesId</code> - <code>string|array</code> - Optional - The optional list of Reserved Instance IDs to describe. Pass a string for a single value, or an indexed array for multiple values. </li>
182
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for ReservedInstances. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
183
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
184
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
185
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
186
- * </ul></li>
187
- * </ul></li>
188
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
189
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
190
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
191
- */
192
- public function describe_reserved_instances($opt = null)
193
- {
194
- if (!$opt) $opt = array();
195
-
196
- // Optional parameter
197
- if (isset($opt['ReservedInstancesId']))
198
- {
199
- $opt = array_merge($opt, CFComplexType::map(array(
200
- 'ReservedInstancesId' => (is_array($opt['ReservedInstancesId']) ? $opt['ReservedInstancesId'] : array($opt['ReservedInstancesId']))
201
- )));
202
- unset($opt['ReservedInstancesId']);
203
- }
204
-
205
- // Optional parameter
206
- if (isset($opt['Filter']))
207
- {
208
- $opt = array_merge($opt, CFComplexType::map(array(
209
- 'Filter' => $opt['Filter']
210
- )));
211
- unset($opt['Filter']);
212
- }
213
-
214
- return $this->authenticate('DescribeReservedInstances', $opt, $this->hostname);
215
- }
216
-
217
- /**
218
- *
219
- * The DescribeAvailabilityZones operation describes availability zones that are currently available to the account and
220
- * their states.
221
- *
222
- * Availability zones are not the same across accounts. The availability zone <code>us-east-1a</code> for account A is not
223
- * necessarily the same as <code>us-east-1a</code> for account B. Zone assignments are mapped independently for each
224
- * account.
225
- *
226
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
227
- * <li><code>ZoneName</code> - <code>string|array</code> - Optional - A list of the availability zone names to describe. Pass a string for a single value, or an indexed array for multiple values. </li>
228
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for AvailabilityZones. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
229
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
230
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
231
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
232
- * </ul></li>
233
- * </ul></li>
234
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
235
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
236
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
237
- */
238
- public function describe_availability_zones($opt = null)
239
- {
240
- if (!$opt) $opt = array();
241
-
242
- // Optional parameter
243
- if (isset($opt['ZoneName']))
244
- {
245
- $opt = array_merge($opt, CFComplexType::map(array(
246
- 'ZoneName' => (is_array($opt['ZoneName']) ? $opt['ZoneName'] : array($opt['ZoneName']))
247
- )));
248
- unset($opt['ZoneName']);
249
- }
250
-
251
- // Optional parameter
252
- if (isset($opt['Filter']))
253
- {
254
- $opt = array_merge($opt, CFComplexType::map(array(
255
- 'Filter' => $opt['Filter']
256
- )));
257
- unset($opt['Filter']);
258
- }
259
-
260
- return $this->authenticate('DescribeAvailabilityZones', $opt, $this->hostname);
261
- }
262
-
263
- /**
264
- *
265
- * Detach a previously attached volume from a running instance.
266
- *
267
- * @param string $volume_id (Required) The ID of the volume to detach.
268
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
269
- * <li><code>InstanceId</code> - <code>string</code> - Optional - The ID of the instance from which to detach the the specified volume. </li>
270
- * <li><code>Device</code> - <code>string</code> - Optional - The device name to which the volume is attached on the specified instance. </li>
271
- * <li><code>Force</code> - <code>boolean</code> - Optional - Forces detachment if the previous detachment attempt did not occur cleanly (logging into an instance, unmounting the volume, and detaching normally). This option can lead to data loss or a corrupted file system. Use this option only as a last resort to detach a volume from a failed instance. The instance will not have an opportunity to flush file system caches nor file system meta data. If you use this option, you must perform file system check and repair procedures. </li>
272
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
273
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
274
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
275
- */
276
- public function detach_volume($volume_id, $opt = null)
277
- {
278
- if (!$opt) $opt = array();
279
- $opt['VolumeId'] = $volume_id;
280
-
281
- return $this->authenticate('DetachVolume', $opt, $this->hostname);
282
- }
283
-
284
- /**
285
- *
286
- * The DeleteKeyPair operation deletes a key pair.
287
- *
288
- * @param string $key_name (Required) The name of the Amazon EC2 key pair to delete.
289
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
290
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
291
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
292
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
293
- */
294
- public function delete_key_pair($key_name, $opt = null)
295
- {
296
- if (!$opt) $opt = array();
297
- $opt['KeyName'] = $key_name;
298
-
299
- return $this->authenticate('DeleteKeyPair', $opt, $this->hostname);
300
- }
301
-
302
- /**
303
- *
304
- * Disables monitoring for a running instance.
305
- *
306
- * @param string|array $instance_id (Required) The list of Amazon EC2 instances on which to disable monitoring. Pass a string for a single value, or an indexed array for multiple values.
307
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
308
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
309
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
310
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
311
- */
312
- public function unmonitor_instances($instance_id, $opt = null)
313
- {
314
- if (!$opt) $opt = array();
315
-
316
- // Required parameter
317
- $opt = array_merge($opt, CFComplexType::map(array(
318
- 'InstanceId' => (is_array($instance_id) ? $instance_id : array($instance_id))
319
- )));
320
-
321
- return $this->authenticate('UnmonitorInstances', $opt, $this->hostname);
322
- }
323
-
324
- /**
325
- *
326
- * Attaches a VPN gateway to a VPC. This is the last step required to get your VPC fully connected to your data center
327
- * before launching instances in it. For more information, go to Process for Using Amazon VPC in the Amazon Virtual Private
328
- * Cloud Developer Guide.
329
- *
330
- * @param string $vpn_gateway_id (Required) The ID of the VPN gateway to attach to the VPC.
331
- * @param string $vpc_id (Required) The ID of the VPC to attach to the VPN gateway.
332
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
333
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
334
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
335
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
336
- */
337
- public function attach_vpn_gateway($vpn_gateway_id, $vpc_id, $opt = null)
338
- {
339
- if (!$opt) $opt = array();
340
- $opt['VpnGatewayId'] = $vpn_gateway_id;
341
- $opt['VpcId'] = $vpc_id;
342
-
343
- return $this->authenticate('AttachVpnGateway', $opt, $this->hostname);
344
- }
345
-
346
- /**
347
- *
348
- * Creates an Amazon EBS-backed AMI from a "running" or "stopped" instance. AMIs that use an Amazon EBS root device boot
349
- * faster than AMIs that use instance stores. They can be up to 1 TiB in size, use storage that persists on instance
350
- * failure, and can be stopped and started.
351
- *
352
- * @param string $instance_id (Required) The ID of the instance from which to create the new image.
353
- * @param string $name (Required) The name for the new AMI being created.
354
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
355
- * <li><code>Description</code> - <code>string</code> - Optional - The description for the new AMI being created. </li>
356
- * <li><code>NoReboot</code> - <code>boolean</code> - Optional - By default this property is set to <code>false</code>, which means Amazon EC2 attempts to cleanly shut down the instance before image creation and reboots the instance afterwards. When set to true, Amazon EC2 will not shut down the instance before creating the image. When this option is used, file system integrity on the created image cannot be guaranteed. </li>
357
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
358
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
359
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
360
- */
361
- public function create_image($instance_id, $name, $opt = null)
362
- {
363
- if (!$opt) $opt = array();
364
- $opt['InstanceId'] = $instance_id;
365
- $opt['Name'] = $name;
366
-
367
- return $this->authenticate('CreateImage', $opt, $this->hostname);
368
- }
369
-
370
- /**
371
- *
372
- * The DeleteSecurityGroup operation deletes a security group.
373
- *
374
- * If you attempt to delete a security group that contains instances, a fault is returned.
375
- *
376
- * If you attempt to delete a security group that is referenced by another security group, a fault is returned. For
377
- * example, if security group B has a rule that allows access from security group A, security group A cannot be deleted
378
- * until the allow rule is removed.
379
- *
380
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
381
- * <li><code>GroupName</code> - <code>string</code> - Optional - The name of the Amazon EC2 security group to delete. </li>
382
- * <li><code>GroupId</code> - <code>string</code> - Optional - The ID of the Amazon EC2 security group to delete. </li>
383
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
384
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
385
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
386
- */
387
- public function delete_security_group($opt = null)
388
- {
389
- if (!$opt) $opt = array();
390
-
391
- return $this->authenticate('DeleteSecurityGroup', $opt, $this->hostname);
392
- }
393
-
394
- /**
395
- *
396
- * This action applies only to security groups in a VPC; it's not supported for EC2 security groups. For information about
397
- * Amazon Virtual Private Cloud and VPC security groups, go to the Amazon Virtual Private Cloud User Guide.
398
- *
399
- * The action adds one or more egress rules to a VPC security group. Specifically, this permits instances in a security
400
- * group to send traffic to either one or more destination CIDR IP address ranges, or to one or more destination security
401
- * groups in the same VPC.
402
- *
403
- * Each rule consists of the protocol (e.g., TCP), plus either a CIDR range, or a source group. For the TCP and UDP
404
- * protocols, you must also specify the destination port or port range. For the ICMP protocol, you must also specify the
405
- * ICMP type and code. You can use <code>-1</code> as a wildcard for the ICMP type or code.
406
- *
407
- * Rule changes are propagated to instances within the security group as quickly as possible. However, a small delay might
408
- * occur.
409
- *
410
- * <b>Important: </b> For VPC security groups: You can have up to 50 rules total per group (covering both ingress and
411
- * egress).
412
- *
413
- * @param string $group_id (Required) ID of the VPC security group to modify.
414
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
415
- * <li><code>IpPermissions</code> - <code>array</code> - Optional - List of IP permissions to authorize on the specified security group. Specifying permissions through IP permissions is the preferred way of authorizing permissions since it offers more flexibility and control. <ul>
416
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
417
- * <li><code>IpProtocol</code> - <code>string</code> - Optional - The IP protocol of this permission. Valid protocol values: <code>tcp</code>, <code>udp</code>, <code>icmp</code> </li>
418
- * <li><code>FromPort</code> - <code>integer</code> - Optional - Start of port range for the TCP and UDP protocols, or an ICMP type number. An ICMP type number of <code>-1</code> indicates a wildcard (i.e., any ICMP type number). </li>
419
- * <li><code>ToPort</code> - <code>integer</code> - Optional - End of port range for the TCP and UDP protocols, or an ICMP code. An ICMP code of <code>-1</code> indicates a wildcard (i.e., any ICMP code). </li>
420
- * <li><code>Groups</code> - <code>array</code> - Optional - The list of AWS user IDs and groups included in this permission. <ul>
421
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
422
- * <li><code>UserId</code> - <code>string</code> - Optional - The AWS user ID of an account. </li>
423
- * <li><code>GroupName</code> - <code>string</code> - Optional - Name of the security group in the specified AWS account. Cannot be used when specifying a CIDR IP address range. </li>
424
- * <li><code>GroupId</code> - <code>string</code> - Optional - ID of the security group in the specified AWS account. Cannot be used when specifying a CIDR IP address range. </li>
425
- * </ul></li>
426
- * </ul></li>
427
- * <li><code>IpRanges</code> - <code>string|array</code> - Optional - The list of CIDR IP ranges included in this permission. Pass a string for a single value, or an indexed array for multiple values. </li>
428
- * </ul></li>
429
- * </ul></li>
430
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
431
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
432
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
433
- */
434
- public function authorize_security_group_egress($group_id, $opt = null)
435
- {
436
- if (!$opt) $opt = array();
437
- $opt['GroupId'] = $group_id;
438
-
439
- // Optional parameter
440
- if (isset($opt['IpPermissions']))
441
- {
442
- $opt = array_merge($opt, CFComplexType::map(array(
443
- 'IpPermissions' => $opt['IpPermissions']
444
- )));
445
- unset($opt['IpPermissions']);
446
- }
447
-
448
- return $this->authenticate('AuthorizeSecurityGroupEgress', $opt, $this->hostname);
449
- }
450
-
451
- /**
452
- * Retrieves the encrypted administrator password for the instances running Windows.
453
- *
454
- * The Windows password is only generated the first time an AMI is launched. It is not generated for
455
- * rebundled AMIs or after the password is changed on an instance. The password is encrypted using the
456
- * key pair that you provided.
457
- *
458
- * @param string $instance_id (Required) The ID of the instance for which you want the Windows administrator password.
459
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
460
- * <li><code>DecryptPasswordWithKey</code> - <code>string</code> - Optional - Enables the decryption of the Administrator password for the given Microsoft Windows instance. Specifies the RSA private key that is associated with the keypair ID which was used to launch the Microsoft Windows instance.</li>
461
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
462
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This is useful for manually-managed batch requests.</li></ul>
463
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
464
- */
465
- public function get_password_data($instance_id, $opt = null)
466
- {
467
- if (!$opt) $opt = array();
468
- $opt['InstanceId'] = $instance_id;
469
-
470
- // Unless DecryptPasswordWithKey is set, simply return the response.
471
- if (!isset($opt['DecryptPasswordWithKey']))
472
- {
473
- return $this->authenticate('GetPasswordData', $opt, $this->hostname);
474
- }
475
-
476
- // Otherwise, decrypt the password.
477
- else
478
- {
479
- // Get a resource representing the private key.
480
- $private_key = openssl_pkey_get_private($opt['DecryptPasswordWithKey']);
481
- unset($opt['DecryptPasswordWithKey']);
482
-
483
- // Fetch the encrypted password.
484
- $response = $this->authenticate('GetPasswordData', $opt, $this->hostname);
485
- $data = trim((string) $response->body->passwordData);
486
-
487
- // If it's Base64-encoded...
488
- if ($this->util->is_base64($data))
489
- {
490
- // Base64-decode it, and decrypt it with the private key.
491
- if (openssl_private_decrypt(base64_decode($data), $decrypted, $private_key))
492
- {
493
- // Replace the previous password data with the decrypted value.
494
- $response->body->passwordData = $decrypted;
495
- }
496
- }
497
-
498
- return $response;
499
- }
500
- }
501
-
502
- /**
503
- *
504
- * Associates a set of DHCP options (that you've previously created) with the specified VPC. Or, associates the default
505
- * DHCP options with the VPC. The default set consists of the standard EC2 host name, no domain name, no DNS server, no NTP
506
- * server, and no NetBIOS server or node type. After you associate the options with the VPC, any existing instances and all
507
- * new instances that you launch in that VPC use the options. For more information about the supported DHCP options and
508
- * using them with Amazon VPC, go to Using DHCP Options in the Amazon Virtual Private Cloud Developer Guide.
509
- *
510
- * @param string $dhcp_options_id (Required) The ID of the DHCP options to associate with the VPC. Specify "default" to associate the default DHCP options with the VPC.
511
- * @param string $vpc_id (Required) The ID of the VPC to associate the DHCP options with.
512
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
513
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
514
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
515
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
516
- */
517
- public function associate_dhcp_options($dhcp_options_id, $vpc_id, $opt = null)
518
- {
519
- if (!$opt) $opt = array();
520
- $opt['DhcpOptionsId'] = $dhcp_options_id;
521
- $opt['VpcId'] = $vpc_id;
522
-
523
- return $this->authenticate('AssociateDhcpOptions', $opt, $this->hostname);
524
- }
525
-
526
- /**
527
- *
528
- * Stops an instance that uses an Amazon EBS volume as its root device. Instances that use Amazon EBS volumes as their
529
- * root devices can be quickly stopped and started. When an instance is stopped, the compute resources are released and you
530
- * are not billed for hourly instance usage. However, your root partition Amazon EBS volume remains, continues to persist
531
- * your data, and you are charged for Amazon EBS volume usage. You can restart your instance at any time.
532
- *
533
- * Before stopping an instance, make sure it is in a state from which it can be restarted. Stopping an instance does not
534
- * preserve data stored in RAM.
535
- *
536
- * Performing this operation on an instance that uses an instance store as its root device returns an error.
537
- *
538
- * @param string|array $instance_id (Required) The list of Amazon EC2 instances to stop. Pass a string for a single value, or an indexed array for multiple values.
539
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
540
- * <li><code>Force</code> - <code>boolean</code> - Optional - Forces the instance to stop. The instance will not have an opportunity to flush file system caches nor file system meta data. If you use this option, you must perform file system check and repair procedures. This option is not recommended for Windows instances. </li>
541
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
542
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
543
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
544
- */
545
- public function stop_instances($instance_id, $opt = null)
546
- {
547
- if (!$opt) $opt = array();
548
-
549
- // Required parameter
550
- $opt = array_merge($opt, CFComplexType::map(array(
551
- 'InstanceId' => (is_array($instance_id) ? $instance_id : array($instance_id))
552
- )));
553
-
554
- return $this->authenticate('StopInstances', $opt, $this->hostname);
555
- }
556
-
557
- /**
558
- * Imports the public key from an RSA key pair created with a third-party tool. This operation differs
559
- * from CreateKeyPair as the private key is never transferred between the caller and AWS servers.
560
- *
561
- * RSA key pairs are easily created on Microsoft Windows and Linux OS systems using the <code>ssh-keygen</code>
562
- * command line tool provided with the standard OpenSSH installation. Standard library support for RSA
563
- * key pair creation is also available for Java, Ruby, Python, and many other programming languages.
564
- *
565
- * The following formats are supported:
566
- *
567
- * <ul>
568
- * <li>OpenSSH public key format.</li>
569
- * <li>Base64 encoded DER format.</li>
570
- * <li>SSH public key file format as specified in <a href="http://tools.ietf.org/html/rfc4716">RFC 4716</a>.</li>
571
- * </ul>
572
- *
573
- * @param string $key_name (Required) The unique name for the key pair.
574
- * @param string $public_key_material (Required) The public key portion of the key pair being imported.
575
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
576
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
577
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This is useful for manually-managed batch requests.</li></ul>
578
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
579
- */
580
- public function import_key_pair($key_name, $public_key_material, $opt = null)
581
- {
582
- if (!$opt) $opt = array();
583
- $opt['KeyName'] = $key_name;
584
- $opt['PublicKeyMaterial'] = $this->util->is_base64($public_key_material) ? $public_key_material : base64_encode($public_key_material);
585
-
586
- return $this->authenticate('ImportKeyPair', $opt, $this->hostname);
587
- }
588
-
589
- /**
590
- *
591
- * The CreateSecurityGroup operation creates a new security group.
592
- *
593
- * Every instance is launched in a security group. If no security group is specified during launch, the instances are
594
- * launched in the default security group. Instances within the same security group have unrestricted network access to
595
- * each other. Instances will reject network access attempts from other instances in a different security group. As the
596
- * owner of instances you can grant or revoke specific permissions using the AuthorizeSecurityGroupIngress and
597
- * RevokeSecurityGroupIngress operations.
598
- *
599
- * @param string $group_name (Required) Name of the security group.
600
- * @param string $group_description (Required) Description of the group. This is informational only.
601
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
602
- * <li><code>VpcId</code> - <code>string</code> - Optional - ID of the VPC. </li>
603
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
604
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
605
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
606
- */
607
- public function create_security_group($group_name, $group_description, $opt = null)
608
- {
609
- if (!$opt) $opt = array();
610
- $opt['GroupName'] = $group_name;
611
- $opt['GroupDescription'] = $group_description;
612
-
613
- return $this->authenticate('CreateSecurityGroup', $opt, $this->hostname);
614
- }
615
-
616
- /**
617
- *
618
- * Describes the Spot Price history.
619
- *
620
- * Spot Instances are instances that Amazon EC2 starts on your behalf when the maximum price that you specify exceeds the
621
- * current Spot Price. Amazon EC2 periodically sets the Spot Price based on available Spot Instance capacity and current
622
- * spot instance requests.
623
- *
624
- * For conceptual information about Spot Instances, refer to the Amazon Elastic Compute Cloud Developer Guide or Amazon
625
- * Elastic Compute Cloud User Guide.
626
- *
627
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
628
- * <li><code>StartTime</code> - <code>string</code> - Optional - The start date and time of the Spot Instance price history data. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
629
- * <li><code>EndTime</code> - <code>string</code> - Optional - The end date and time of the Spot Instance price history data. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
630
- * <li><code>InstanceType</code> - <code>string|array</code> - Optional - Specifies the instance type to return. Pass a string for a single value, or an indexed array for multiple values. </li>
631
- * <li><code>ProductDescription</code> - <code>string|array</code> - Optional - The description of the AMI. Pass a string for a single value, or an indexed array for multiple values. </li>
632
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for SpotPriceHistory. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
633
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
634
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
635
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
636
- * </ul></li>
637
- * </ul></li>
638
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
639
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
640
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
641
- */
642
- public function describe_spot_price_history($opt = null)
643
- {
644
- if (!$opt) $opt = array();
645
-
646
- // Optional parameter
647
- if (isset($opt['StartTime']))
648
- {
649
- $opt['StartTime'] = $this->util->convert_date_to_iso8601($opt['StartTime']);
650
- }
651
-
652
- // Optional parameter
653
- if (isset($opt['EndTime']))
654
- {
655
- $opt['EndTime'] = $this->util->convert_date_to_iso8601($opt['EndTime']);
656
- }
657
-
658
- // Optional parameter
659
- if (isset($opt['InstanceType']))
660
- {
661
- $opt = array_merge($opt, CFComplexType::map(array(
662
- 'InstanceType' => (is_array($opt['InstanceType']) ? $opt['InstanceType'] : array($opt['InstanceType']))
663
- )));
664
- unset($opt['InstanceType']);
665
- }
666
-
667
- // Optional parameter
668
- if (isset($opt['ProductDescription']))
669
- {
670
- $opt = array_merge($opt, CFComplexType::map(array(
671
- 'ProductDescription' => (is_array($opt['ProductDescription']) ? $opt['ProductDescription'] : array($opt['ProductDescription']))
672
- )));
673
- unset($opt['ProductDescription']);
674
- }
675
-
676
- // Optional parameter
677
- if (isset($opt['Filter']))
678
- {
679
- $opt = array_merge($opt, CFComplexType::map(array(
680
- 'Filter' => $opt['Filter']
681
- )));
682
- unset($opt['Filter']);
683
- }
684
-
685
- return $this->authenticate('DescribeSpotPriceHistory', $opt, $this->hostname);
686
- }
687
-
688
- /**
689
- *
690
- * The DescribeRegions operation describes regions zones that are currently available to the account.
691
- *
692
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
693
- * <li><code>RegionName</code> - <code>string|array</code> - Optional - The optional list of regions to describe. Pass a string for a single value, or an indexed array for multiple values. </li>
694
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for Regions. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
695
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
696
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
697
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
698
- * </ul></li>
699
- * </ul></li>
700
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
701
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
702
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
703
- */
704
- public function describe_regions($opt = null)
705
- {
706
- if (!$opt) $opt = array();
707
-
708
- // Optional parameter
709
- if (isset($opt['RegionName']))
710
- {
711
- $opt = array_merge($opt, CFComplexType::map(array(
712
- 'RegionName' => (is_array($opt['RegionName']) ? $opt['RegionName'] : array($opt['RegionName']))
713
- )));
714
- unset($opt['RegionName']);
715
- }
716
-
717
- // Optional parameter
718
- if (isset($opt['Filter']))
719
- {
720
- $opt = array_merge($opt, CFComplexType::map(array(
721
- 'Filter' => $opt['Filter']
722
- )));
723
- unset($opt['Filter']);
724
- }
725
-
726
- return $this->authenticate('DescribeRegions', $opt, $this->hostname);
727
- }
728
-
729
- /**
730
- *
731
- * Creates a set of DHCP options that you can then associate with one or more VPCs, causing all existing and new instances
732
- * that you launch in those VPCs to use the set of DHCP options. The following table lists the individual DHCP options you
733
- * can specify. For more information about the options, go to <a
734
- * href="http://www.ietf.org/rfc/rfc2132.txt">http://www.ietf.org/rfc/rfc2132.txt</a>
735
- *
736
- * @param array $dhcp_configuration (Required) A set of one or more DHCP configurations. <ul>
737
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
738
- * <li><code>Key</code> - <code>string</code> - Optional - Contains the name of a DHCP option. </li>
739
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains a set of values for a DHCP option. Pass a string for a single value, or an indexed array for multiple values. </li>
740
- * </ul></li>
741
- * </ul>
742
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
743
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
744
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
745
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
746
- */
747
- public function create_dhcp_options($dhcp_configuration, $opt = null)
748
- {
749
- if (!$opt) $opt = array();
750
-
751
- // Required parameter
752
- $opt = array_merge($opt, CFComplexType::map(array(
753
- 'DhcpConfiguration' => (is_array($dhcp_configuration) ? $dhcp_configuration : array($dhcp_configuration))
754
- )));
755
-
756
- return $this->authenticate('CreateDhcpOptions', $opt, $this->hostname);
757
- }
758
-
759
- /**
760
- *
761
- * Resets permission settings for the specified snapshot.
762
- *
763
- * @param string $snapshot_id (Required) The ID of the snapshot whose attribute is being reset.
764
- * @param string $attribute (Required) The name of the attribute being reset. Available attribute names: <code>createVolumePermission</code>
765
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
766
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
767
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
768
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
769
- */
770
- public function reset_snapshot_attribute($snapshot_id, $attribute, $opt = null)
771
- {
772
- if (!$opt) $opt = array();
773
- $opt['SnapshotId'] = $snapshot_id;
774
- $opt['Attribute'] = $attribute;
775
-
776
- return $this->authenticate('ResetSnapshotAttribute', $opt, $this->hostname);
777
- }
778
-
779
- /**
780
- *
781
- * Deletes a route from a route table in a VPC. For more information about route tables, go to <a
782
- * href="http://docs.amazonwebservices.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html">Route Tables</a> in the Amazon
783
- * Virtual Private Cloud User Guide.
784
- *
785
- * @param string $route_table_id (Required) The ID of the route table where the route will be deleted.
786
- * @param string $destination_cidr_block (Required) The CIDR range for the route you want to delete. The value you specify must exactly match the CIDR for the route you want to delete.
787
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
788
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
789
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
790
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
791
- */
792
- public function delete_route($route_table_id, $destination_cidr_block, $opt = null)
793
- {
794
- if (!$opt) $opt = array();
795
- $opt['RouteTableId'] = $route_table_id;
796
- $opt['DestinationCidrBlock'] = $destination_cidr_block;
797
-
798
- return $this->authenticate('DeleteRoute', $opt, $this->hostname);
799
- }
800
-
801
- /**
802
- *
803
- * Gives you information about your Internet gateways. You can filter the results to return information only about
804
- * Internet gateways that match criteria you specify. For example, you could get information only about gateways with
805
- * particular tags. The Internet gateway must match at least one of the specified values for it to be included in the
806
- * results.
807
- *
808
- * You can specify multiple filters (e.g., the Internet gateway is attached to a particular VPC and is tagged with a
809
- * particular value). The result includes information for a particular Internet gateway only if the gateway matches all
810
- * your filters. If there's no match, no special message is returned; the response is simply empty.
811
- *
812
- * You can use wildcards with the filter values: an asterisk matches zero or more characters, and <code>?</code> matches
813
- * exactly one character. You can escape special characters using a backslash before the character. For example, a value of
814
- * <code>\*amazon\?\\</code> searches for the literal string <code>*amazon?\</code>.
815
- *
816
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
817
- * <li><code>InternetGatewayId</code> - <code>string|array</code> - Optional - One or more Internet gateway IDs. Pass a string for a single value, or an indexed array for multiple values. </li>
818
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for Internet Gateways. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
819
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
820
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
821
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
822
- * </ul></li>
823
- * </ul></li>
824
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
825
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
826
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
827
- */
828
- public function describe_internet_gateways($opt = null)
829
- {
830
- if (!$opt) $opt = array();
831
-
832
- // Optional parameter
833
- if (isset($opt['InternetGatewayId']))
834
- {
835
- $opt = array_merge($opt, CFComplexType::map(array(
836
- 'InternetGatewayId' => (is_array($opt['InternetGatewayId']) ? $opt['InternetGatewayId'] : array($opt['InternetGatewayId']))
837
- )));
838
- unset($opt['InternetGatewayId']);
839
- }
840
-
841
- // Optional parameter
842
- if (isset($opt['Filter']))
843
- {
844
- $opt = array_merge($opt, CFComplexType::map(array(
845
- 'Filter' => $opt['Filter']
846
- )));
847
- unset($opt['Filter']);
848
- }
849
-
850
- return $this->authenticate('DescribeInternetGateways', $opt, $this->hostname);
851
- }
852
-
853
- /**
854
- *
855
- * The DescribeSecurityGroups operation returns information about security groups that you own.
856
- *
857
- * If you specify security group names, information about those security group is returned. Otherwise, information for all
858
- * security group is returned. If you specify a group that does not exist, a fault is returned.
859
- *
860
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
861
- * <li><code>GroupName</code> - <code>string|array</code> - Optional - The optional list of Amazon EC2 security groups to describe. Pass a string for a single value, or an indexed array for multiple values. </li>
862
- * <li><code>GroupId</code> - <code>string|array</code> - Optional - Pass a string for a single value, or an indexed array for multiple values. </li>
863
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for SecurityGroups. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
864
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
865
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
866
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
867
- * </ul></li>
868
- * </ul></li>
869
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
870
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
871
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
872
- */
873
- public function describe_security_groups($opt = null)
874
- {
875
- if (!$opt) $opt = array();
876
-
877
- // Optional parameter
878
- if (isset($opt['GroupName']))
879
- {
880
- $opt = array_merge($opt, CFComplexType::map(array(
881
- 'GroupName' => (is_array($opt['GroupName']) ? $opt['GroupName'] : array($opt['GroupName']))
882
- )));
883
- unset($opt['GroupName']);
884
- }
885
-
886
- // Optional parameter
887
- if (isset($opt['GroupId']))
888
- {
889
- $opt = array_merge($opt, CFComplexType::map(array(
890
- 'GroupId' => (is_array($opt['GroupId']) ? $opt['GroupId'] : array($opt['GroupId']))
891
- )));
892
- unset($opt['GroupId']);
893
- }
894
-
895
- // Optional parameter
896
- if (isset($opt['Filter']))
897
- {
898
- $opt = array_merge($opt, CFComplexType::map(array(
899
- 'Filter' => $opt['Filter']
900
- )));
901
- unset($opt['Filter']);
902
- }
903
-
904
- return $this->authenticate('DescribeSecurityGroups', $opt, $this->hostname);
905
- }
906
-
907
- /**
908
- *
909
- * Detaches a VPN gateway from a VPC. You do this if you're planning to turn off the VPC and not use it anymore. You can
910
- * confirm a VPN gateway has been completely detached from a VPC by describing the VPN gateway (any attachments to the VPN
911
- * gateway are also described).
912
- *
913
- * You must wait for the attachment's state to switch to detached before you can delete the VPC or attach a different VPC
914
- * to the VPN gateway.
915
- *
916
- * @param string $vpn_gateway_id (Required) The ID of the VPN gateway to detach from the VPC.
917
- * @param string $vpc_id (Required) The ID of the VPC to detach the VPN gateway from.
918
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
919
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
920
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
921
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
922
- */
923
- public function detach_vpn_gateway($vpn_gateway_id, $vpc_id, $opt = null)
924
- {
925
- if (!$opt) $opt = array();
926
- $opt['VpnGatewayId'] = $vpn_gateway_id;
927
- $opt['VpcId'] = $vpc_id;
928
-
929
- return $this->authenticate('DetachVpnGateway', $opt, $this->hostname);
930
- }
931
-
932
- /**
933
- *
934
- * The DeregisterImage operation deregisters an AMI. Once deregistered, instances of the AMI can no longer be launched.
935
- *
936
- * @param string $image_id (Required) The ID of the AMI to deregister.
937
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
938
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
939
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
940
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
941
- */
942
- public function deregister_image($image_id, $opt = null)
943
- {
944
- if (!$opt) $opt = array();
945
- $opt['ImageId'] = $image_id;
946
-
947
- return $this->authenticate('DeregisterImage', $opt, $this->hostname);
948
- }
949
-
950
- /**
951
- *
952
- * Describes the data feed for Spot Instances.
953
- *
954
- * For conceptual information about Spot Instances, refer to the Amazon Elastic Compute Cloud Developer Guide or Amazon
955
- * Elastic Compute Cloud User Guide.
956
- *
957
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
958
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
959
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
960
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
961
- */
962
- public function describe_spot_datafeed_subscription($opt = null)
963
- {
964
- if (!$opt) $opt = array();
965
-
966
- return $this->authenticate('DescribeSpotDatafeedSubscription', $opt, $this->hostname);
967
- }
968
-
969
- /**
970
- *
971
- * Deletes tags from the specified Amazon EC2 resources.
972
- *
973
- * @param string|array $resource_id (Required) A list of one or more resource IDs. This could be the ID of an AMI, an instance, an EBS volume, or snapshot, etc. Pass a string for a single value, or an indexed array for multiple values.
974
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
975
- * <li><code>Tag</code> - <code>array</code> - Optional - The tags to delete from the specified resources. Each tag item consists of a key-value pair. If a tag is specified without a value, the tag and all of its values are deleted. <ul>
976
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
977
- * <li><code>Key</code> - <code>string</code> - Optional - The tag's key. </li>
978
- * <li><code>Value</code> - <code>string</code> - Optional - The tag's value. </li>
979
- * </ul></li>
980
- * </ul></li>
981
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
982
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
983
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
984
- */
985
- public function delete_tags($resource_id, $opt = null)
986
- {
987
- if (!$opt) $opt = array();
988
-
989
- // Required parameter
990
- $opt = array_merge($opt, CFComplexType::map(array(
991
- 'ResourceId' => (is_array($resource_id) ? $resource_id : array($resource_id))
992
- )));
993
-
994
- // Optional parameter
995
- if (isset($opt['Tag']))
996
- {
997
- $opt = array_merge($opt, CFComplexType::map(array(
998
- 'Tag' => $opt['Tag']
999
- )));
1000
- unset($opt['Tag']);
1001
- }
1002
-
1003
- return $this->authenticate('DeleteTags', $opt, $this->hostname);
1004
- }
1005
-
1006
- /**
1007
- *
1008
- * Deletes a subnet from a VPC. You must terminate all running instances in the subnet before deleting it, otherwise
1009
- * Amazon VPC returns an error.
1010
- *
1011
- * @param string $subnet_id (Required) The ID of the subnet you want to delete.
1012
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1013
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1014
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1015
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1016
- */
1017
- public function delete_subnet($subnet_id, $opt = null)
1018
- {
1019
- if (!$opt) $opt = array();
1020
- $opt['SubnetId'] = $subnet_id;
1021
-
1022
- return $this->authenticate('DeleteSubnet', $opt, $this->hostname);
1023
- }
1024
-
1025
- /**
1026
- *
1027
- * Creates a new VPN gateway. A VPN gateway is the VPC-side endpoint for your VPN connection. You can create a VPN gateway
1028
- * before creating the VPC itself.
1029
- *
1030
- * @param string $type (Required) The type of VPN connection this VPN gateway supports.
1031
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1032
- * <li><code>AvailabilityZone</code> - <code>string</code> - Optional - The Availability Zone in which to create the VPN gateway. </li>
1033
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1034
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1035
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1036
- */
1037
- public function create_vpn_gateway($type, $opt = null)
1038
- {
1039
- if (!$opt) $opt = array();
1040
- $opt['Type'] = $type;
1041
-
1042
- return $this->authenticate('CreateVpnGateway', $opt, $this->hostname);
1043
- }
1044
-
1045
- /**
1046
- *
1047
- * Deletes a VPN gateway. Use this when you want to delete a VPC and all its associated components because you no longer
1048
- * need them. We recommend that before you delete a VPN gateway, you detach it from the VPC and delete the VPN connection.
1049
- * Note that you don't need to delete the VPN gateway if you just want to delete and re-create the VPN connection between
1050
- * your VPC and data center.
1051
- *
1052
- * @param string $vpn_gateway_id (Required) The ID of the VPN gateway to delete.
1053
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1054
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1055
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1056
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1057
- */
1058
- public function delete_vpn_gateway($vpn_gateway_id, $opt = null)
1059
- {
1060
- if (!$opt) $opt = array();
1061
- $opt['VpnGatewayId'] = $vpn_gateway_id;
1062
-
1063
- return $this->authenticate('DeleteVpnGateway', $opt, $this->hostname);
1064
- }
1065
-
1066
- /**
1067
- *
1068
- * Attach a previously created volume to a running instance.
1069
- *
1070
- * @param string $volume_id (Required) The ID of the Amazon EBS volume. The volume and instance must be within the same Availability Zone and the instance must be running.
1071
- * @param string $instance_id (Required) The ID of the instance to which the volume attaches. The volume and instance must be within the same Availability Zone and the instance must be running.
1072
- * @param string $device (Required) Specifies how the device is exposed to the instance (e.g., <code>/dev/sdh</code>).
1073
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1074
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1075
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1076
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1077
- */
1078
- public function attach_volume($volume_id, $instance_id, $device, $opt = null)
1079
- {
1080
- if (!$opt) $opt = array();
1081
- $opt['VolumeId'] = $volume_id;
1082
- $opt['InstanceId'] = $instance_id;
1083
- $opt['Device'] = $device;
1084
-
1085
- return $this->authenticate('AttachVolume', $opt, $this->hostname);
1086
- }
1087
-
1088
- /**
1089
- *
1090
- * Provides details of a user's registered licenses. Zero or more IDs may be specified on the call. When one or more
1091
- * license IDs are specified, only data for the specified IDs are returned.
1092
- *
1093
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1094
- * <li><code>LicenseId</code> - <code>string|array</code> - Optional - Specifies the license registration for which details are to be returned. Pass a string for a single value, or an indexed array for multiple values. </li>
1095
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for Licenses. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
1096
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
1097
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
1098
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
1099
- * </ul></li>
1100
- * </ul></li>
1101
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1102
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1103
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1104
- */
1105
- public function describe_licenses($opt = null)
1106
- {
1107
- if (!$opt) $opt = array();
1108
-
1109
- // Optional parameter
1110
- if (isset($opt['LicenseId']))
1111
- {
1112
- $opt = array_merge($opt, CFComplexType::map(array(
1113
- 'LicenseId' => (is_array($opt['LicenseId']) ? $opt['LicenseId'] : array($opt['LicenseId']))
1114
- )));
1115
- unset($opt['LicenseId']);
1116
- }
1117
-
1118
- // Optional parameter
1119
- if (isset($opt['Filter']))
1120
- {
1121
- $opt = array_merge($opt, CFComplexType::map(array(
1122
- 'Filter' => $opt['Filter']
1123
- )));
1124
- unset($opt['Filter']);
1125
- }
1126
-
1127
- return $this->authenticate('DescribeLicenses', $opt, $this->hostname);
1128
- }
1129
-
1130
- /**
1131
- *
1132
- * Activates a specific number of licenses for a 90-day period. Activations can be done against a specific license ID.
1133
- *
1134
- * @param string $license_id (Required) Specifies the ID for the specific license to activate against.
1135
- * @param integer $capacity (Required) Specifies the additional number of licenses to activate.
1136
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1137
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1138
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1139
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1140
- */
1141
- public function activate_license($license_id, $capacity, $opt = null)
1142
- {
1143
- if (!$opt) $opt = array();
1144
- $opt['LicenseId'] = $license_id;
1145
- $opt['Capacity'] = $capacity;
1146
-
1147
- return $this->authenticate('ActivateLicense', $opt, $this->hostname);
1148
- }
1149
-
1150
- /**
1151
- *
1152
- * The ResetImageAttribute operation resets an attribute of an AMI to its default value.
1153
- *
1154
- * The productCodes attribute cannot be reset.
1155
- *
1156
- * @param string $image_id (Required) The ID of the AMI whose attribute is being reset.
1157
- * @param string $attribute (Required) The name of the attribute being reset. Available attribute names: <code>launchPermission</code>
1158
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1159
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1160
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1161
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1162
- */
1163
- public function reset_image_attribute($image_id, $attribute, $opt = null)
1164
- {
1165
- if (!$opt) $opt = array();
1166
- $opt['ImageId'] = $image_id;
1167
- $opt['Attribute'] = $attribute;
1168
-
1169
- return $this->authenticate('ResetImageAttribute', $opt, $this->hostname);
1170
- }
1171
-
1172
- /**
1173
- *
1174
- * Gives you information about your VPN connections.
1175
- *
1176
- * We strongly recommend you use HTTPS when calling this operation because the response contains sensitive cryptographic
1177
- * information for configuring your customer gateway.
1178
- *
1179
- * You can filter the results to return information only about VPN connections that match criteria you specify. For
1180
- * example, you could ask to get information about a particular VPN connection (or all) only if the VPN's state is pending
1181
- * or available. You can specify multiple filters (e.g., the VPN connection is associated with a particular VPN gateway,
1182
- * and the gateway's state is pending or available). The result includes information for a particular VPN connection only
1183
- * if the VPN connection matches all your filters. If there's no match, no special message is returned; the response is
1184
- * simply empty. The following table shows the available filters.
1185
- *
1186
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1187
- * <li><code>VpnConnectionId</code> - <code>string|array</code> - Optional - A VPN connection ID. More than one may be specified per request. Pass a string for a single value, or an indexed array for multiple values. </li>
1188
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for VPN Connections. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
1189
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
1190
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
1191
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
1192
- * </ul></li>
1193
- * </ul></li>
1194
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1195
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1196
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1197
- */
1198
- public function describe_vpn_connections($opt = null)
1199
- {
1200
- if (!$opt) $opt = array();
1201
-
1202
- // Optional parameter
1203
- if (isset($opt['VpnConnectionId']))
1204
- {
1205
- $opt = array_merge($opt, CFComplexType::map(array(
1206
- 'VpnConnectionId' => (is_array($opt['VpnConnectionId']) ? $opt['VpnConnectionId'] : array($opt['VpnConnectionId']))
1207
- )));
1208
- unset($opt['VpnConnectionId']);
1209
- }
1210
-
1211
- // Optional parameter
1212
- if (isset($opt['Filter']))
1213
- {
1214
- $opt = array_merge($opt, CFComplexType::map(array(
1215
- 'Filter' => $opt['Filter']
1216
- )));
1217
- unset($opt['Filter']);
1218
- }
1219
-
1220
- return $this->authenticate('DescribeVpnConnections', $opt, $this->hostname);
1221
- }
1222
-
1223
- /**
1224
- *
1225
- * Create a snapshot of the volume identified by volume ID. A volume does not have to be detached at the time the snapshot
1226
- * is taken.
1227
- *
1228
- * Snapshot creation requires that the system is in a consistent state. For instance, this means that if taking a snapshot
1229
- * of a database, the tables must be read-only locked to ensure that the snapshot will not contain a corrupted version of
1230
- * the database. Therefore, be careful when using this API to ensure that the system remains in the consistent state until
1231
- * the create snapshot status has returned.
1232
- *
1233
- * @param string $volume_id (Required) The ID of the volume from which to create the snapshot.
1234
- * @param string $description (Required) The description for the new snapshot.
1235
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1236
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1237
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1238
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1239
- */
1240
- public function create_snapshot($volume_id, $description, $opt = null)
1241
- {
1242
- if (!$opt) $opt = array();
1243
- $opt['VolumeId'] = $volume_id;
1244
- $opt['Description'] = $description;
1245
-
1246
- return $this->authenticate('CreateSnapshot', $opt, $this->hostname);
1247
- }
1248
-
1249
- /**
1250
- *
1251
- * Deletes a previously created volume. Once successfully deleted, a new volume can be created with the same name.
1252
- *
1253
- * @param string $volume_id (Required) The ID of the EBS volume to delete.
1254
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1255
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1256
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1257
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1258
- */
1259
- public function delete_volume($volume_id, $opt = null)
1260
- {
1261
- if (!$opt) $opt = array();
1262
- $opt['VolumeId'] = $volume_id;
1263
-
1264
- return $this->authenticate('DeleteVolume', $opt, $this->hostname);
1265
- }
1266
-
1267
- /**
1268
- *
1269
- * Gives you information about your VPCs. You can filter the results to return information only about VPCs that match
1270
- * criteria you specify.
1271
- *
1272
- * For example, you could ask to get information about a particular VPC or VPCs (or all your VPCs) only if the VPC's state
1273
- * is available. You can specify multiple filters (e.g., the VPC uses one of several sets of DHCP options, and the VPC's
1274
- * state is available). The result includes information for a particular VPC only if the VPC matches all your filters.
1275
- *
1276
- * If there's no match, no special message is returned; the response is simply empty. The following table shows the
1277
- * available filters.
1278
- *
1279
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1280
- * <li><code>VpcId</code> - <code>string|array</code> - Optional - The ID of a VPC you want information about. Pass a string for a single value, or an indexed array for multiple values. </li>
1281
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for VPCs. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
1282
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
1283
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
1284
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
1285
- * </ul></li>
1286
- * </ul></li>
1287
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1288
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1289
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1290
- */
1291
- public function describe_vpcs($opt = null)
1292
- {
1293
- if (!$opt) $opt = array();
1294
-
1295
- // Optional parameter
1296
- if (isset($opt['VpcId']))
1297
- {
1298
- $opt = array_merge($opt, CFComplexType::map(array(
1299
- 'VpcId' => (is_array($opt['VpcId']) ? $opt['VpcId'] : array($opt['VpcId']))
1300
- )));
1301
- unset($opt['VpcId']);
1302
- }
1303
-
1304
- // Optional parameter
1305
- if (isset($opt['Filter']))
1306
- {
1307
- $opt = array_merge($opt, CFComplexType::map(array(
1308
- 'Filter' => $opt['Filter']
1309
- )));
1310
- unset($opt['Filter']);
1311
- }
1312
-
1313
- return $this->authenticate('DescribeVpcs', $opt, $this->hostname);
1314
- }
1315
-
1316
- /**
1317
- *
1318
- * Deactivates a specific number of licenses. Deactivations can be done against a specific license ID after they have
1319
- * persisted for at least a 90-day period.
1320
- *
1321
- * @param string $license_id (Required) Specifies the ID for the specific license to deactivate against.
1322
- * @param integer $capacity (Required) Specifies the amount of capacity to deactivate against the license.
1323
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1324
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1325
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1326
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1327
- */
1328
- public function deactivate_license($license_id, $capacity, $opt = null)
1329
- {
1330
- if (!$opt) $opt = array();
1331
- $opt['LicenseId'] = $license_id;
1332
- $opt['Capacity'] = $capacity;
1333
-
1334
- return $this->authenticate('DeactivateLicense', $opt, $this->hostname);
1335
- }
1336
-
1337
- /**
1338
- *
1339
- * The AssociateAddress operation associates an elastic IP address with an instance.
1340
- *
1341
- * If the IP address is currently assigned to another instance, the IP address is assigned to the new instance. This is an
1342
- * idempotent operation. If you enter it more than once, Amazon EC2 does not return an error.
1343
- *
1344
- * @param string $instance_id (Required) The instance to associate with the IP address.
1345
- * @param string $public_ip (Required) IP address that you are assigning to the instance.
1346
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1347
- * <li><code>AllocationId</code> - <code>string</code> - Optional - The allocation ID that AWS returned when you allocated the elastic IP address for use with Amazon VPC. </li>
1348
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1349
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1350
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1351
- */
1352
- public function associate_address($instance_id, $public_ip, $opt = null)
1353
- {
1354
- if (!$opt) $opt = array();
1355
- $opt['InstanceId'] = $instance_id;
1356
- $opt['PublicIp'] = $public_ip;
1357
-
1358
- return $this->authenticate('AssociateAddress', $opt, $this->hostname);
1359
- }
1360
-
1361
- /**
1362
- *
1363
- * Deletes a customer gateway. You must delete the VPN connection before deleting the customer gateway.
1364
- *
1365
- * You can have a single active customer gateway per AWS account (active means that you've created a VPN connection with
1366
- * that customer gateway). AWS might delete any customer gateway you leave inactive for an extended period of time.
1367
- *
1368
- * @param string $customer_gateway_id (Required) The ID of the customer gateway to delete.
1369
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1370
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1371
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1372
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1373
- */
1374
- public function delete_customer_gateway($customer_gateway_id, $opt = null)
1375
- {
1376
- if (!$opt) $opt = array();
1377
- $opt['CustomerGatewayId'] = $customer_gateway_id;
1378
-
1379
- return $this->authenticate('DeleteCustomerGateway', $opt, $this->hostname);
1380
- }
1381
-
1382
- /**
1383
- *
1384
- * Creates an entry (i.e., rule) in a network ACL with a rule number you specify. Each network ACL has a set of numbered
1385
- * ingress rules and a separate set of numbered egress rules. When determining whether a packet should be allowed in or out
1386
- * of a subnet associated with the ACL, Amazon VPC processes the entries in the ACL according to the rule numbers, in
1387
- * ascending order.
1388
- *
1389
- * <b>Important: </b> We recommend that you leave room between the rules (e.g., 100, 110, 120, etc.), and not number them
1390
- * sequentially (101, 102, 103, etc.). This allows you to easily add a new rule between existing ones without having to
1391
- * renumber the rules.
1392
- *
1393
- * After you add an entry, you can't modify it; you must either replace it, or create a new entry and delete the old one.
1394
- *
1395
- * For more information about network ACLs, go to Network ACLs in the Amazon Virtual Private Cloud User Guide.
1396
- *
1397
- * @param string $network_acl_id (Required) ID of the ACL where the entry will be created.
1398
- * @param integer $rule_number (Required) Rule number to assign to the entry (e.g., 100). ACL entries are processed in ascending order by rule number.
1399
- * @param string $protocol (Required) IP protocol the rule applies to. Valid Values: <code>tcp</code>, <code>udp</code>, <code>icmp</code> or an IP protocol number.
1400
- * @param string $rule_action (Required) Whether to allow or deny traffic that matches the rule. [Allowed values: <code>allow</code>, <code>deny</code>]
1401
- * @param boolean $egress (Required) Whether this rule applies to egress traffic from the subnet (<code>true</code>) or ingress traffic to the subnet (<code>false</code>).
1402
- * @param string $cidr_block (Required) The CIDR range to allow or deny, in CIDR notation (e.g., <code>172.16.0.0/24</code>).
1403
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1404
- * <li><code>Icmp</code> - <code>array</code> - Optional - ICMP values. <ul>
1405
- * <li><code>Type</code> - <code>integer</code> - Optional - For the ICMP protocol, the ICMP type. A value of <code>-1</code> is a wildcard meaning all types. Required if specifying <code>icmp</code> for the protocol. </li>
1406
- * <li><code>Code</code> - <code>integer</code> - Optional - For the ICMP protocol, the ICMP code. A value of <code>-1</code> is a wildcard meaning all codes. Required if specifying <code>icmp</code> for the protocol. </li></ul></li>
1407
- * <li><code>PortRange</code> - <code>array</code> - Optional - Port ranges. <ul>
1408
- * <li><code>From</code> - <code>integer</code> - Optional - The first port in the range. Required if specifying <code>tcp</code> or <code>udp</code> for the protocol. </li>
1409
- * <li><code>To</code> - <code>integer</code> - Optional - The last port in the range. Required if specifying <code>tcp</code> or <code>udp</code> for the protocol. </li></ul></li>
1410
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1411
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1412
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1413
- */
1414
- public function create_network_acl_entry($network_acl_id, $rule_number, $protocol, $rule_action, $egress, $cidr_block, $opt = null)
1415
- {
1416
- if (!$opt) $opt = array();
1417
- $opt['NetworkAclId'] = $network_acl_id;
1418
- $opt['RuleNumber'] = $rule_number;
1419
- $opt['Protocol'] = $protocol;
1420
- $opt['RuleAction'] = $rule_action;
1421
- $opt['Egress'] = $egress;
1422
- $opt['CidrBlock'] = $cidr_block;
1423
-
1424
- // Optional parameter
1425
- if (isset($opt['Icmp']))
1426
- {
1427
- $opt = array_merge($opt, CFComplexType::map(array(
1428
- 'Icmp' => $opt['Icmp']
1429
- )));
1430
- unset($opt['Icmp']);
1431
- }
1432
-
1433
- // Optional parameter
1434
- if (isset($opt['PortRange']))
1435
- {
1436
- $opt = array_merge($opt, CFComplexType::map(array(
1437
- 'PortRange' => $opt['PortRange']
1438
- )));
1439
- unset($opt['PortRange']);
1440
- }
1441
-
1442
- return $this->authenticate('CreateNetworkAclEntry', $opt, $this->hostname);
1443
- }
1444
-
1445
- /**
1446
- *
1447
- * Detaches an Internet gateway from a VPC, disabling connectivity between the Internet and the VPC. The VPC must not
1448
- * contain any running instances with elastic IP addresses. For more information about your VPC and Internet gateway, go to
1449
- * Amazon Virtual Private Cloud User Guide.
1450
- *
1451
- * For more information about Amazon Virtual Private Cloud and Internet gateways, go to the Amazon Virtual Private Cloud
1452
- * User Guide.
1453
- *
1454
- * @param string $internet_gateway_id (Required) The ID of the Internet gateway to detach.
1455
- * @param string $vpc_id (Required) The ID of the VPC.
1456
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1457
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1458
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1459
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1460
- */
1461
- public function detach_internet_gateway($internet_gateway_id, $vpc_id, $opt = null)
1462
- {
1463
- if (!$opt) $opt = array();
1464
- $opt['InternetGatewayId'] = $internet_gateway_id;
1465
- $opt['VpcId'] = $vpc_id;
1466
-
1467
- return $this->authenticate('DetachInternetGateway', $opt, $this->hostname);
1468
- }
1469
-
1470
- /**
1471
- *
1472
- * Creates a new route table within a VPC. After you create a new route table, you can add routes and associate the table
1473
- * with a subnet. For more information about route tables, go to <a
1474
- * href="http://docs.amazonwebservices.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html">Route Tables</a> in the Amazon
1475
- * Virtual Private Cloud User Guide.
1476
- *
1477
- * @param string $vpc_id (Required) The ID of the VPC where the route table will be created.
1478
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1479
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1480
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1481
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1482
- */
1483
- public function create_route_table($vpc_id, $opt = null)
1484
- {
1485
- if (!$opt) $opt = array();
1486
- $opt['VpcId'] = $vpc_id;
1487
-
1488
- return $this->authenticate('CreateRouteTable', $opt, $this->hostname);
1489
- }
1490
-
1491
- /**
1492
- *
1493
- * Describes the status of the indicated volume or, in lieu of any specified, all volumes belonging to the caller. Volumes
1494
- * that have been deleted are not described.
1495
- *
1496
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1497
- * <li><code>VolumeId</code> - <code>string|array</code> - Optional - The optional list of EBS volumes to describe. Pass a string for a single value, or an indexed array for multiple values. </li>
1498
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for Volumes. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
1499
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
1500
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
1501
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
1502
- * </ul></li>
1503
- * </ul></li>
1504
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1505
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1506
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1507
- */
1508
- public function describe_volumes($opt = null)
1509
- {
1510
- if (!$opt) $opt = array();
1511
-
1512
- // Optional parameter
1513
- if (isset($opt['VolumeId']))
1514
- {
1515
- $opt = array_merge($opt, CFComplexType::map(array(
1516
- 'VolumeId' => (is_array($opt['VolumeId']) ? $opt['VolumeId'] : array($opt['VolumeId']))
1517
- )));
1518
- unset($opt['VolumeId']);
1519
- }
1520
-
1521
- // Optional parameter
1522
- if (isset($opt['Filter']))
1523
- {
1524
- $opt = array_merge($opt, CFComplexType::map(array(
1525
- 'Filter' => $opt['Filter']
1526
- )));
1527
- unset($opt['Filter']);
1528
- }
1529
-
1530
- return $this->authenticate('DescribeVolumes', $opt, $this->hostname);
1531
- }
1532
-
1533
- /**
1534
- *
1535
- * Gives you information about your route tables. You can filter the results to return information only about tables that
1536
- * match criteria you specify. For example, you could get information only about a table associated with a particular
1537
- * subnet. You can specify multiple values for the filter. The table must match at least one of the specified values for it
1538
- * to be included in the results.
1539
- *
1540
- * You can specify multiple filters (e.g., the table has a particular route, and is associated with a particular subnet).
1541
- * The result includes information for a particular table only if it matches all your filters. If there's no match, no
1542
- * special message is returned; the response is simply empty.
1543
- *
1544
- * You can use wildcards with the filter values: an asterisk matches zero or more characters, and <code>?</code> matches
1545
- * exactly one character. You can escape special characters using a backslash before the character. For example, a value of
1546
- * <code>\*amazon\?\\</code> searches for the literal string <code>*amazon?\</code>.
1547
- *
1548
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1549
- * <li><code>RouteTableId</code> - <code>string|array</code> - Optional - One or more route table IDs. Pass a string for a single value, or an indexed array for multiple values. </li>
1550
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for Route Tables. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
1551
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
1552
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
1553
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
1554
- * </ul></li>
1555
- * </ul></li>
1556
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1557
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1558
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1559
- */
1560
- public function describe_route_tables($opt = null)
1561
- {
1562
- if (!$opt) $opt = array();
1563
-
1564
- // Optional parameter
1565
- if (isset($opt['RouteTableId']))
1566
- {
1567
- $opt = array_merge($opt, CFComplexType::map(array(
1568
- 'RouteTableId' => (is_array($opt['RouteTableId']) ? $opt['RouteTableId'] : array($opt['RouteTableId']))
1569
- )));
1570
- unset($opt['RouteTableId']);
1571
- }
1572
-
1573
- // Optional parameter
1574
- if (isset($opt['Filter']))
1575
- {
1576
- $opt = array_merge($opt, CFComplexType::map(array(
1577
- 'Filter' => $opt['Filter']
1578
- )));
1579
- unset($opt['Filter']);
1580
- }
1581
-
1582
- return $this->authenticate('DescribeRouteTables', $opt, $this->hostname);
1583
- }
1584
-
1585
- /**
1586
- *
1587
- * Enables monitoring for a running instance.
1588
- *
1589
- * @param string|array $instance_id (Required) The list of Amazon EC2 instances on which to enable monitoring. Pass a string for a single value, or an indexed array for multiple values.
1590
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1591
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1592
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1593
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1594
- */
1595
- public function monitor_instances($instance_id, $opt = null)
1596
- {
1597
- if (!$opt) $opt = array();
1598
-
1599
- // Required parameter
1600
- $opt = array_merge($opt, CFComplexType::map(array(
1601
- 'InstanceId' => (is_array($instance_id) ? $instance_id : array($instance_id))
1602
- )));
1603
-
1604
- return $this->authenticate('MonitorInstances', $opt, $this->hostname);
1605
- }
1606
-
1607
- /**
1608
- *
1609
- * Gives you information about one or more sets of DHCP options. You can specify one or more DHCP options set IDs, or no
1610
- * IDs (to describe all your sets of DHCP options). The returned information consists of:
1611
- *
1612
- * <ul> <li> The DHCP options set ID </li>
1613
- *
1614
- * <li> The options </li>
1615
- *
1616
- * </ul>
1617
- *
1618
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1619
- * <li><code>DhcpOptionsId</code> - <code>string|array</code> - Optional - Pass a string for a single value, or an indexed array for multiple values. </li>
1620
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for DhcpOptions. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
1621
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
1622
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
1623
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
1624
- * </ul></li>
1625
- * </ul></li>
1626
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1627
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1628
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1629
- */
1630
- public function describe_dhcp_options($opt = null)
1631
- {
1632
- if (!$opt) $opt = array();
1633
-
1634
- // Optional parameter
1635
- if (isset($opt['DhcpOptionsId']))
1636
- {
1637
- $opt = array_merge($opt, CFComplexType::map(array(
1638
- 'DhcpOptionsId' => (is_array($opt['DhcpOptionsId']) ? $opt['DhcpOptionsId'] : array($opt['DhcpOptionsId']))
1639
- )));
1640
- unset($opt['DhcpOptionsId']);
1641
- }
1642
-
1643
- // Optional parameter
1644
- if (isset($opt['Filter']))
1645
- {
1646
- $opt = array_merge($opt, CFComplexType::map(array(
1647
- 'Filter' => $opt['Filter']
1648
- )));
1649
- unset($opt['Filter']);
1650
- }
1651
-
1652
- return $this->authenticate('DescribeDhcpOptions', $opt, $this->hostname);
1653
- }
1654
-
1655
- /**
1656
- *
1657
- * Gives you information about the network ACLs in your VPC. You can filter the results to return information only about
1658
- * ACLs that match criteria you specify. For example, you could get information only the ACL associated with a particular
1659
- * subnet. The ACL must match at least one of the specified values for it to be included in the results.
1660
- *
1661
- * You can specify multiple filters (e.g., the ACL is associated with a particular subnet and has an egress entry that
1662
- * denies traffic to a particular port). The result includes information for a particular ACL only if it matches all your
1663
- * filters. If there's no match, no special message is returned; the response is simply empty.
1664
- *
1665
- * You can use wildcards with the filter values: an asterisk matches zero or more characters, and <code>?</code> matches
1666
- * exactly one character. You can escape special characters using a backslash before the character. For example, a value of
1667
- * <code>\*amazon\?\\</code> searches for the literal string <code>*amazon?\</code>.
1668
- *
1669
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1670
- * <li><code>NetworkAclId</code> - <code>string|array</code> - Optional - One or more network ACL IDs. Pass a string for a single value, or an indexed array for multiple values. </li>
1671
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for Network ACLs. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
1672
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
1673
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
1674
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
1675
- * </ul></li>
1676
- * </ul></li>
1677
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1678
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1679
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1680
- */
1681
- public function describe_network_acls($opt = null)
1682
- {
1683
- if (!$opt) $opt = array();
1684
-
1685
- // Optional parameter
1686
- if (isset($opt['NetworkAclId']))
1687
- {
1688
- $opt = array_merge($opt, CFComplexType::map(array(
1689
- 'NetworkAclId' => (is_array($opt['NetworkAclId']) ? $opt['NetworkAclId'] : array($opt['NetworkAclId']))
1690
- )));
1691
- unset($opt['NetworkAclId']);
1692
- }
1693
-
1694
- // Optional parameter
1695
- if (isset($opt['Filter']))
1696
- {
1697
- $opt = array_merge($opt, CFComplexType::map(array(
1698
- 'Filter' => $opt['Filter']
1699
- )));
1700
- unset($opt['Filter']);
1701
- }
1702
-
1703
- return $this->authenticate('DescribeNetworkAcls', $opt, $this->hostname);
1704
- }
1705
-
1706
- /**
1707
- *
1708
- * The DescribeBundleTasks operation describes in-progress and recent bundle tasks. Complete and failed tasks are removed
1709
- * from the list a short time after completion. If no bundle ids are given, all bundle tasks are returned.
1710
- *
1711
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1712
- * <li><code>BundleId</code> - <code>string|array</code> - Optional - The list of bundle task IDs to describe. Pass a string for a single value, or an indexed array for multiple values. </li>
1713
- * <li><code>Filter</code> - <code>array</code> - Optional - A list of filters used to match properties for BundleTasks. For a complete reference to the available filter keys for this operation, see the Amazon EC2 API reference. <ul>
1714
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
1715
- * <li><code>Name</code> - <code>string</code> - Optional - Specifies the name of the filter. </li>
1716
- * <li><code>Value</code> - <code>string|array</code> - Optional - Contains one or more values for the filter. Pass a string for a single value, or an indexed array for multiple values. </li>
1717
- * </ul></li>
1718
- * </ul></li>
1719
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1720
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1721
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1722
- */
1723
- public function describe_bundle_tasks($opt = null)
1724
- {
1725
- if (!$opt) $opt = array();
1726
-
1727
- // Optional parameter
1728
- if (isset($opt['BundleId']))
1729
- {
1730
- $opt = array_merge($opt, CFComplexType::map(array(
1731
- 'BundleId' => (is_array($opt['BundleId']) ? $opt['BundleId'] : array($opt['BundleId']))
1732
- )));
1733
- unset($opt['BundleId']);
1734
- }
1735
-
1736
- // Optional parameter
1737
- if (isset($opt['Filter']))
1738
- {
1739
- $opt = array_merge($opt, CFComplexType::map(array(
1740
- 'Filter' => $opt['Filter']
1741
- )));
1742
- unset($opt['Filter']);
1743
- }
1744
-
1745
- return $this->authenticate('DescribeBundleTasks', $opt, $this->hostname);
1746
- }
1747
-
1748
- /**
1749
- *
1750
- * The RevokeSecurityGroupIngress operation revokes permissions from a security group. The permissions used to revoke must
1751
- * be specified using the same values used to grant the permissions.
1752
- *
1753
- * Permissions are specified by IP protocol (TCP, UDP, or ICMP), the source of the request (by IP range or an Amazon EC2
1754
- * user-group pair), the source and destination port ranges (for TCP and UDP), and the ICMP codes and types (for ICMP).
1755
- *
1756
- * Permission changes are quickly propagated to instances within the security group. However, depending on the number of
1757
- * instances in the group, a small delay might occur.
1758
- *
1759
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1760
- * <li><code>GroupName</code> - <code>string</code> - Optional - Name of the standard (EC2) security group to modify. The group must belong to your account. Can be used instead of GroupID for standard (EC2) security groups. </li>
1761
- * <li><code>GroupId</code> - <code>string</code> - Optional - ID of the standard (EC2) or VPC security group to modify. The group must belong to your account. Required for VPC security groups; can be used instead of GroupName for standard (EC2) security groups. </li>
1762
- * <li><code>IpPermissions</code> - <code>array</code> - Optional - List of IP permissions to revoke on the specified security group. For an IP permission to be removed, it must exactly match one of the IP permissions you specify in this list. Specifying permissions through IP permissions is the preferred way of revoking permissions since it offers more flexibility and control. <ul>
1763
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
1764
- * <li><code>IpProtocol</code> - <code>string</code> - Optional - The IP protocol of this permission. Valid protocol values: <code>tcp</code>, <code>udp</code>, <code>icmp</code> </li>
1765
- * <li><code>FromPort</code> - <code>integer</code> - Optional - Start of port range for the TCP and UDP protocols, or an ICMP type number. An ICMP type number of <code>-1</code> indicates a wildcard (i.e., any ICMP type number). </li>
1766
- * <li><code>ToPort</code> - <code>integer</code> - Optional - End of port range for the TCP and UDP protocols, or an ICMP code. An ICMP code of <code>-1</code> indicates a wildcard (i.e., any ICMP code). </li>
1767
- * <li><code>Groups</code> - <code>array</code> - Optional - The list of AWS user IDs and groups included in this permission. <ul>
1768
- * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
1769
- * <li><code>UserId</code> - <code>string</code> - Optional - The AWS user ID of an account. </li>
1770
- * <li><code>GroupName</code> - <code>string</code> - Optional - Name of the security group in the specified AWS account. Cannot be used when specifying a CIDR IP address range. </li>
1771
- * <li><code>GroupId</code> - <code>string</code> - Optional - ID of the security group in the specified AWS account. Cannot be used when specifying a CIDR IP address range. </li>
1772
- * </ul></li>
1773
- * </ul></li>
1774
- * <li><code>IpRanges</code> - <code>string|array</code> - Optional - The list of CIDR IP ranges included in this permission. Pass a string for a single value, or an indexed array for multiple values. </li>
1775
- * </ul></li>
1776
- * </ul></li>
1777
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1778
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1779
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1780
- */
1781
- public function revoke_security_group_ingress($opt = null)
1782
- {
1783
- if (!$opt) $opt = array();
1784
-
1785
- // Optional parameter
1786
- if (isset($opt['IpPermissions']))
1787
- {
1788
- $opt = array_merge($opt, CFComplexType::map(array(
1789
- 'IpPermissions' => $opt['IpPermissions']
1790
- )));
1791
- unset($opt['IpPermissions']);
1792
- }
1793
-
1794
- return $this->authenticate('RevokeSecurityGroupIngress', $opt, $this->hostname);
1795
- }
1796
-
1797
- /**
1798
- * The GetConsoleOutput operation retrieves console output for the specified instance.
1799
- *
1800
- * Instance console output is buffered and posted shortly after instance boot, reboot, and
1801
- * termination. Amazon EC2 preserves the most recent 64 KB output which will be available for at least
1802
- * one hour after the most recent post.
1803
- *
1804
- * @param string $instance_id (Required) The ID of the instance for which you want console output.
1805
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1806
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1807
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This is useful for manually-managed batch requests.</li></ul>
1808
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response. The value of <code>output</code> is automatically Base64-decoded.
1809
- */
1810
- public function get_console_output($instance_id, $opt = null)
1811
- {
1812
- if (!$opt) $opt = array();
1813
- $opt['InstanceId'] = $instance_id;
1814
-
1815
- $response = $this->authenticate('GetConsoleOutput', $opt, $this->hostname);
1816
-
1817
- // Automatically Base64-decode the <output> value.
1818
- if ($this->util->is_base64((string) $response->body->output))
1819
- {
1820
- $response->body->output = base64_decode($response->body->output);
1821
- }
1822
-
1823
- return $response;
1824
- }
1825
-
1826
- /**
1827
- *
1828
- * Creates a new Internet gateway in your AWS account. After creating the Internet gateway, you then attach it to a VPC
1829
- * using <code>AttachInternetGateway</code>. For more information about your VPC and Internet gateway, go to Amazon Virtual
1830
- * Private Cloud User Guide.
1831
- *
1832
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1833
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1834
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1835
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1836
- */
1837
- public function create_internet_gateway($opt = null)
1838
- {
1839
- if (!$opt) $opt = array();
1840
-
1841
- return $this->authenticate('CreateInternetGateway', $opt, $this->hostname);
1842
- }
1843
-
1844
- /**
1845
- *
1846
- * The ModifyImageAttribute operation modifies an attribute of an AMI.
1847
- *
1848
- * @param string $image_id (Required) The ID of the AMI whose attribute you want to modify.
1849
- * @param string $attribute (Required) The name of the AMI attribute you want to modify. Available attributes: <code>launchPermission</code>, <code>productCodes</code>
1850
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1851
- * <li><code>OperationType</code> - <code>string</code> - Optional - The type of operation being requested. Available operation types: <code>add</code>, <code>remove</code> </li>
1852
- * <li><code>UserId</code> - <code>string|array</code> - Optional - The AWS user ID being added to or removed from the list of users with launch permissions for this AMI. Only valid when the launchPermission attribute is being modified. Pass a string for a single value, or an indexed array for multiple values. </li>
1853
- * <li><code>UserGroup</code> - <code>string|array</code> - Optional - The user group being added to or removed from the list of user groups with launch permissions for this AMI. Only valid when the launchPermission attribute is being modified. Available user groups: <code>all</code> Pass a string for a single value, or an indexed array for multiple values. </li>
1854
- * <li><code>ProductCode</code> - <code>string|array</code> - Optional - The list of product codes being added to or removed from the specified AMI. Only valid when the productCodes attribute is being modified. Pass a string for a single value, or an indexed array for multiple values. </li>
1855
- * <li><code>Value</code> - <code>string</code> - Optional - The value of the attribute being modified. Only valid when the description attribute is being modified. </li>
1856
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1857
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1858
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1859
- */
1860
- public function modify_image_attribute($image_id, $attribute, $opt = null)
1861
- {
1862
- if (!$opt) $opt = array();
1863
- $opt['ImageId'] = $image_id;
1864
- $opt['Attribute'] = $attribute;
1865
-
1866
- // Optional parameter
1867
- if (isset($opt['UserId']))
1868
- {
1869
- $opt = array_merge($opt, CFComplexType::map(array(
1870
- 'UserId' => (is_array($opt['UserId']) ? $opt['UserId'] : array($opt['UserId']))
1871
- )));
1872
- unset($opt['UserId']);
1873
- }
1874
-
1875
- // Optional parameter
1876
- if (isset($opt['UserGroup']))
1877
- {
1878
- $opt = array_merge($opt, CFComplexType::map(array(
1879
- 'UserGroup' => (is_array($opt['UserGroup']) ? $opt['UserGroup'] : array($opt['UserGroup']))
1880
- )));
1881
- unset($opt['UserGroup']);
1882
- }
1883
-
1884
- // Optional parameter
1885
- if (isset($opt['ProductCode']))
1886
- {
1887
- $opt = array_merge($opt, CFComplexType::map(array(
1888
- 'ProductCode' => (is_array($opt['ProductCode']) ? $opt['ProductCode'] : array($opt['ProductCode']))
1889
- )));
1890
- unset($opt['ProductCode']);
1891
- }
1892
-
1893
- return $this->authenticate('ModifyImageAttribute', $opt, $this->hostname);
1894
- }
1895
-
1896
- /**
1897
- *
1898
- * Provides information to AWS about your customer gateway device. The customer gateway is the appliance at your end of
1899
- * the VPN connection (compared to the VPN gateway, which is the device at the AWS side of the VPN connection). You can
1900
- * have a single active customer gateway per AWS account (active means that you've created a VPN connection to use with the
1901
- * customer gateway). AWS might delete any customer gateway that you create with this operation if you leave it inactive
1902
- * for an extended period of time.
1903
- *
1904
- * You must provide the Internet-routable IP address of the customer gateway's external interface. The IP address must be
1905
- * static.
1906
- *
1907
- * You must also provide the device's Border Gateway Protocol (BGP) Autonomous System Number (ASN). You can use an
1908
- * existing ASN assigned to your network. If you don't have an ASN already, you can use a private ASN (in the 64512 - 65534
1909
- * range). For more information about ASNs, go to <a
1910
- * .wikipedia.org/wiki/Autonomous_system_%28Internet%29">http://en.wikipedia.org/wiki/Autonomous_system_%28Internet%29</a>.
1911
- *
1912
- * @param string $type (Required) The type of VPN connection this customer gateway supports.
1913
- * @param string $ip_address (Required) The Internet-routable IP address for the customer gateway's outside interface. The address must be static
1914
- * @param integer $bgp_asn (Required) The customer gateway's Border Gateway Protocol (BGP) Autonomous System Number (ASN).
1915
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1916
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1917
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1918
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1919
- */
1920
- public function create_customer_gateway($type, $ip_address, $bgp_asn, $opt = null)
1921
- {
1922
- if (!$opt) $opt = array();
1923
- $opt['Type'] = $type;
1924
- $opt['IpAddress'] = $ip_address;
1925
- $opt['BgpAsn'] = $bgp_asn;
1926
-
1927
- return $this->authenticate('CreateCustomerGateway', $opt, $this->hostname);
1928
- }
1929
-
1930
- /**
1931
- *
1932
- * Creates the data feed for Spot Instances, enabling you to view Spot Instance usage logs. You can create one data feed
1933
- * per account.
1934
- *
1935
- * For conceptual information about Spot Instances, refer to the Amazon Elastic Compute Cloud Developer Guide or Amazon
1936
- * Elastic Compute Cloud User Guide.
1937
- *
1938
- * @param string $bucket (Required) The Amazon S3 bucket in which to store the Spot Instance datafeed.
1939
- * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
1940
- * <li><code>Prefix</code> - <code>string</code> - Optional - The prefix that is prepended to datafeed files. </li>
1941
- * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
1942
- * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
1943
- * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
1944
- */
1945
- public function create_spot_datafeed_subscription($buc