From 9311583f43242925640631ceb065ab1a46453e04 Mon Sep 17 00:00:00 2001 From: Zaher Ghaibeh Date: Sun, 13 Jan 2019 10:21:37 +0300 Subject: [PATCH 01/58] adding the .idea file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 42cd73d..3aa184c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ +/.idea /vendor/ \ No newline at end of file From 6f1ac605f5bb1e7c42a3d99b79f46bd23c73f75c Mon Sep 17 00:00:00 2001 From: Zaher Ghaibeh Date: Sun, 13 Jan 2019 12:31:18 +0300 Subject: [PATCH 02/58] adding User's Account Memberships --- composer.json | 8 +- src/Endpoints/Membership.php | 83 +++++++++++++++++ tests/Endpoints/MembershipTest.php | 93 +++++++++++++++++++ .../Fixtures/Endpoints/deleteMembership.json | 8 ++ .../Endpoints/getMembershipDetails.json | 70 ++++++++++++++ tests/Fixtures/Endpoints/listMemberships.json | 78 ++++++++++++++++ .../Endpoints/updateMembershipStatus.json | 70 ++++++++++++++ 7 files changed, 409 insertions(+), 1 deletion(-) create mode 100644 src/Endpoints/Membership.php create mode 100644 tests/Endpoints/MembershipTest.php create mode 100644 tests/Fixtures/Endpoints/deleteMembership.json create mode 100644 tests/Fixtures/Endpoints/getMembershipDetails.json create mode 100644 tests/Fixtures/Endpoints/listMemberships.json create mode 100644 tests/Fixtures/Endpoints/updateMembershipStatus.json diff --git a/composer.json b/composer.json index a6dbadd..642dab3 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,8 @@ "require": { "guzzlehttp/guzzle": "^6.2.2", "php": ">=7.0.0", - "psr/http-message": "~1.0" + "psr/http-message": "~1.0", + "ext-json": "*" }, "require-dev": { "phpunit/phpunit": "5.7.5", @@ -28,5 +29,10 @@ "classmap": [ "tests/" ] + }, + "config": { + "preferred-install": "dist", + "sort-packages": true, + "optimize-autoloader": true } } diff --git a/src/Endpoints/Membership.php b/src/Endpoints/Membership.php new file mode 100644 index 0000000..6a783cb --- /dev/null +++ b/src/Endpoints/Membership.php @@ -0,0 +1,83 @@ +adapter = $adapter; + } + + + public function listMemberships( + string $name = '', + string $status = '', + int $page = 1, + int $perPage = 20, + string $order = '', + string $direction = '' + ): \stdClass { + $query = [ + 'page' => $page, + 'per_page' => $perPage + ]; + + if (!empty($name)) { + $query['account.name'] = $name; + } + + if (!empty($status) && in_array($status, ['accepted', 'pending', 'rejected'], true)) { + $query['status'] = $status; + } + + if (!empty($order) && in_array($order, ['id', 'account.name', 'status'], true)) { + $query['order'] = $order; + } + + if (!empty($direction) && in_array($direction, ['asc', 'desc'], true)) { + $query['direction'] = $direction; + } + + $memberships = $this->adapter->get('memberships', $query); + $this->body = json_decode($memberships->getBody()); + + return (object)['result' => $this->body->result, 'result_info' => $this->body->result_info]; + } + + public function getMembershipDetails(string $membershipId): \stdClass + { + $membership = $this->adapter->get(sprintf('memberships/%s', $membershipId)); + $this->body = json_decode($membership->getBody()); + return $this->body->result; + } + + public function updateMembershipStatus(string $membershipId, string $status): \stdClass + { + $response = $this->adapter->put(sprintf('memberships/%s', $membershipId), ['status' => $status]); + $this->body = json_decode($response->getBody()); + return $this->body; + } + + public function deleteMembership(string $membershipId): bool + { + $response = $this->adapter->delete(sprintf('memberships/%s', $membershipId)); + + $this->body = json_decode($response->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } +} diff --git a/tests/Endpoints/MembershipTest.php b/tests/Endpoints/MembershipTest.php new file mode 100644 index 0000000..3f93c1e --- /dev/null +++ b/tests/Endpoints/MembershipTest.php @@ -0,0 +1,93 @@ +getPsr7JsonResponseForFixture('Endpoints/listMemberships.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('memberships'), + $this->equalTo([ + 'page' => 1, + 'per_page' => 20, + 'account.name' => 'Demo Account', + 'status' => 'accepted', + 'order' => 'status', + 'direction' => 'desc', + ]) + ); + + $zones = new \Cloudflare\API\Endpoints\Membership($mock); + $result = $zones->listMemberships('Demo Account', 'accepted', 1, 20, 'status', 'desc'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertObjectHasAttribute('result_info', $result); + + $this->assertEquals('4536bcfad5faccb111b47003c79917fa', $result->result[0]->id); + $this->assertEquals(1, $result->result_info->page); + $this->assertEquals('4536bcfad5faccb111b47003c79917fa', $zones->getBody()->result[0]->id); + } + + public function testGetMembershipDetails() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getMembershipDetails.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $membership = new \Cloudflare\API\Endpoints\Membership($mock); + $details = $membership->getMembershipDetails('4536bcfad5faccb111b47003c79917fa'); + + $this->assertObjectHasAttribute('id', $details); + $this->assertEquals('4536bcfad5faccb111b47003c79917fa', $details->id); + $this->assertObjectHasAttribute('code', $details); + $this->assertEquals('05dd05cce12bbed97c0d87cd78e89bc2fd41a6cee72f27f6fc84af2e45c0fac0', $details->code); + $this->assertEquals('4536bcfad5faccb111b47003c79917fa', $membership->getBody()->result->id); + } + + public function testUpdateMembershipDetails() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateMembershipStatus.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('put')->willReturn($response); + + $mock->expects($this->once()) + ->method('put') + ->with( + $this->equalTo('memberships/4536bcfad5faccb111b47003c79917fa'), + $this->equalTo([ + 'status' => 'accepted' + ]) + ); + + $membership = new \Cloudflare\API\Endpoints\Membership($mock); + $membership->updateMembershipStatus('4536bcfad5faccb111b47003c79917fa', 'accepted'); + $this->assertEquals('4536bcfad5faccb111b47003c79917fa', $membership->getBody()->result->id); + } + + public function testDeleteMembership() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteMembership.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with($this->equalTo('memberships/4536bcfad5faccb111b47003c79917fa')); + + $membership = new \Cloudflare\API\Endpoints\Membership($mock); + + $membership->deleteMembership('4536bcfad5faccb111b47003c79917fa'); + + $this->assertEquals('4536bcfad5faccb111b47003c79917fa', $membership->getBody()->result->id); + } +} diff --git a/tests/Fixtures/Endpoints/deleteMembership.json b/tests/Fixtures/Endpoints/deleteMembership.json new file mode 100644 index 0000000..02111aa --- /dev/null +++ b/tests/Fixtures/Endpoints/deleteMembership.json @@ -0,0 +1,8 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "4536bcfad5faccb111b47003c79917fa" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getMembershipDetails.json b/tests/Fixtures/Endpoints/getMembershipDetails.json new file mode 100644 index 0000000..b3d65f3 --- /dev/null +++ b/tests/Fixtures/Endpoints/getMembershipDetails.json @@ -0,0 +1,70 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "4536bcfad5faccb111b47003c79917fa", + "code": "05dd05cce12bbed97c0d87cd78e89bc2fd41a6cee72f27f6fc84af2e45c0fac0", + "status": "accepted", + "account": { + "id": "01a7362d577a6c3019a474fd6f485823", + "name": "Demo Account", + "settings": { + "enforce_twofactor": false + } + }, + "roles": [ + "Account Administrator" + ], + "permissions": { + "analytics": { + "read": true, + "write": true + }, + "billing": { + "read": true, + "write": true + }, + "cache_purge": { + "read": true, + "write": true + }, + "dns": { + "read": true, + "write": true + }, + "dns_records": { + "read": true, + "write": true + }, + "lb": { + "read": true, + "write": true + }, + "logs": { + "read": true, + "write": true + }, + "organization": { + "read": true, + "write": true + }, + "ssl": { + "read": true, + "write": true + }, + "waf": { + "read": true, + "write": true + }, + "zones": { + "read": true, + "write": true + }, + "zone_settings": { + "read": true, + "write": true + } + } +} +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/listMemberships.json b/tests/Fixtures/Endpoints/listMemberships.json new file mode 100644 index 0000000..0e209d3 --- /dev/null +++ b/tests/Fixtures/Endpoints/listMemberships.json @@ -0,0 +1,78 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": [ + { + "id": "4536bcfad5faccb111b47003c79917fa", + "code": "05dd05cce12bbed97c0d87cd78e89bc2fd41a6cee72f27f6fc84af2e45c0fac0", + "status": "accepted", + "account": { + "id": "01a7362d577a6c3019a474fd6f485823", + "name": "Demo Account", + "settings": { + "enforce_twofactor": false + } + }, + "roles": [ + "Account Administrator" + ], + "permissions": { + "analytics": { + "read": true, + "write": true + }, + "billing": { + "read": true, + "write": true + }, + "cache_purge": { + "read": true, + "write": true + }, + "dns": { + "read": true, + "write": true + }, + "dns_records": { + "read": true, + "write": true + }, + "lb": { + "read": true, + "write": true + }, + "logs": { + "read": true, + "write": true + }, + "organization": { + "read": true, + "write": true + }, + "ssl": { + "read": true, + "write": true + }, + "waf": { + "read": true, + "write": true + }, + "zones": { + "read": true, + "write": true + }, + "zone_settings": { + "read": true, + "write": true + } + } + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateMembershipStatus.json b/tests/Fixtures/Endpoints/updateMembershipStatus.json new file mode 100644 index 0000000..978f58f --- /dev/null +++ b/tests/Fixtures/Endpoints/updateMembershipStatus.json @@ -0,0 +1,70 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "4536bcfad5faccb111b47003c79917fa", + "code": "05dd05cce12bbed97c0d87cd78e89bc2fd41a6cee72f27f6fc84af2e45c0fac0", + "status": "accepted", + "account": { + "id": "01a7362d577a6c3019a474fd6f485823", + "name": "Demo Account", + "settings": { + "enforce_twofactor": false + } + }, + "roles": [ + "Account Administrator" + ], + "permissions": { + "analytics": { + "read": true, + "write": true + }, + "billing": { + "read": true, + "write": true + }, + "cache_purge": { + "read": true, + "write": true + }, + "dns": { + "read": true, + "write": true + }, + "dns_records": { + "read": true, + "write": true + }, + "lb": { + "read": true, + "write": true + }, + "logs": { + "read": true, + "write": true + }, + "organization": { + "read": true, + "write": true + }, + "ssl": { + "read": true, + "write": true + }, + "waf": { + "read": true, + "write": true + }, + "zones": { + "read": true, + "write": true + }, + "zone_settings": { + "read": true, + "write": true + } + } + } +} \ No newline at end of file From d6f0eada8c935acc17e261e970d32635d7834fd8 Mon Sep 17 00:00:00 2001 From: Wesley Vestjens Date: Wed, 16 Jan 2019 21:43:58 +0100 Subject: [PATCH 03/58] Add getZoneById($zoneId) method --- src/Endpoints/Zones.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Endpoints/Zones.php b/src/Endpoints/Zones.php index 8595cb6..1bd9ff7 100644 --- a/src/Endpoints/Zones.php +++ b/src/Endpoints/Zones.php @@ -58,6 +58,15 @@ class Zones implements API return false; } + public function getZoneById( + string $zoneId + ): \stdClass { + $user = $this->adapter->get('zones/' . $zoneId); + $this->body = json_decode($user->getBody()); + + return (object)['result' => $this->body->result]; + } + public function listZones( string $name = '', string $status = '', From 6410f50f6d59379ef38d93478f237091530dd82a Mon Sep 17 00:00:00 2001 From: Wesley Vestjens Date: Wed, 16 Jan 2019 22:09:49 +0100 Subject: [PATCH 04/58] Add tests for getZoneById() method --- tests/Endpoints/ZonesTest.php | 19 ++++++++ tests/Fixtures/Endpoints/getZoneById.json | 59 +++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 tests/Fixtures/Endpoints/getZoneById.json diff --git a/tests/Endpoints/ZonesTest.php b/tests/Endpoints/ZonesTest.php index 0bda651..f6b75fc 100644 --- a/tests/Endpoints/ZonesTest.php +++ b/tests/Endpoints/ZonesTest.php @@ -102,6 +102,25 @@ class ZonesTest extends TestCase $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result[0]->id); } + public function testGetZoneByID() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getZoneById.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with($this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353')); + + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $result = $zones->getZoneById('023e105f4ecef8ad9ca31a8372d0c353'); + + $this->assertInstanceOf(\stdClass::class, $result); + $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result->id); + $this->assertEquals('example.com', $zones->getBody()->result->name); + } + public function testGetZoneID() { $response = $this->getPsr7JsonResponseForFixture('Endpoints/getZoneId.json'); diff --git a/tests/Fixtures/Endpoints/getZoneById.json b/tests/Fixtures/Endpoints/getZoneById.json new file mode 100644 index 0000000..bbe6fdb --- /dev/null +++ b/tests/Fixtures/Endpoints/getZoneById.json @@ -0,0 +1,59 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "name": "example.com", + "development_mode": 7200, + "original_name_servers": [ + "ns1.originaldnshost.com", + "ns2.originaldnshost.com" + ], + "original_registrar": "GoDaddy", + "original_dnshost": "NameCheap", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "activated_on": "2014-01-02T00:01:00.12345Z", + "owner": { + "id": "7c5dae5552338874e5053f2534d2767a", + "email": "user@example.com", + "type": "user" + }, + "account": { + "id": "01a7362d577a6c3019a474fd6f485823", + "name": "Demo Account" + }, + "permissions": [ + "#zone:read", + "#zone:edit" + ], + "plan": { + "id": "e592fd9519420ba7405e1307bff33214", + "name": "Pro Plan", + "price": 20, + "currency": "USD", + "frequency": "monthly", + "legacy_id": "pro", + "is_subscribed": true, + "can_subscribe": true + }, + "plan_pending": { + "id": "e592fd9519420ba7405e1307bff33214", + "name": "Pro Plan", + "price": 20, + "currency": "USD", + "frequency": "monthly", + "legacy_id": "pro", + "is_subscribed": true, + "can_subscribe": true + }, + "status": "active", + "paused": false, + "type": "full", + "name_servers": [ + "tony.ns.cloudflare.com", + "woz.ns.cloudflare.com" + ] + } +} \ No newline at end of file From 6acf09ba822df411e788b2e493044982dc9a3eb2 Mon Sep 17 00:00:00 2001 From: Sebastien MALOT Date: Sun, 27 Jan 2019 14:53:16 +0100 Subject: [PATCH 05/58] Feature: Add cache level methods Add `getCachingLevel` and `setCachingLevel` methods --- src/Endpoints/Zones.php | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/Endpoints/Zones.php b/src/Endpoints/Zones.php index 8595cb6..68ec257 100644 --- a/src/Endpoints/Zones.php +++ b/src/Endpoints/Zones.php @@ -144,6 +144,38 @@ class Zones implements API return false; } + /** + * Return caching level settings + * @param string $zoneID + * @return string + */ + public function getCachingLevel(string $zoneID): string + { + $response = $this->adapter->get('zones/' . $zoneID . '/settings/cache_level'); + + $this->body = json_decode($response->getBody()); + + return $this->body->result->value; + } + + /** + * Change caching level settings + * @param string $zoneID + * @param string $level (aggressive | basic | simplified) + * @return bool + */ + public function setCachingLevel(string $zoneID, string $level = 'aggressive'): bool + { + $response = $this->adapter->patch('zones/' . $zoneID . '/settings/cache_level', ['value' => $level]); + + $this->body = json_decode($response->getBody()); + + if ($this->body->success) { + return true; + } + + return false; + } /** * Purge Everything From bd92b2a4c0da0932dce2206cacaf9b1850dbff60 Mon Sep 17 00:00:00 2001 From: Justin Smith Date: Mon, 11 Feb 2019 14:44:05 -0700 Subject: [PATCH 06/58] Allow creation of ASN access rule Added setASN() method to allow creation of ASN access rules --- src/Configurations/AccessRules.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Configurations/AccessRules.php b/src/Configurations/AccessRules.php index 17ea57f..ece5e62 100644 --- a/src/Configurations/AccessRules.php +++ b/src/Configurations/AccessRules.php @@ -21,6 +21,11 @@ class AccessRules implements Configurations $this->config = ['target' => 'country', 'value' => $value]; } + public function setASN(string $value) + { + $this->config = ['target' => 'asn', 'value' => $value]; + } + public function getArray(): array { return $this->config; From 2b253659888efdc240f9a6348f173cf9fd1fce49 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 22 Feb 2019 23:54:14 +0000 Subject: [PATCH 07/58] Updated TLS.php and added new endpoints to new ZoneSettings.php --- CONTRIBUTING.md | 17 + LICENSE | 26 + Makefile | 17 + README.md | 47 + cloudflare-php | 1 + composer.json | 32 + composer.lock | 3002 +++++++++++++++++ paul | 30 + paul.pub | 1 + phpunit.xml | 13 + src/Adapter/Adapter.php | 76 + src/Adapter/Guzzle.php | 109 + src/Adapter/JSONException.php | 13 + src/Adapter/ResponseException.php | 13 + src/Auth/APIKey.php | 28 + src/Auth/Auth.php | 13 + src/Auth/None.php | 17 + src/Auth/UserServiceKey.php | 25 + src/Configurations/AccessRules.php | 28 + src/Configurations/Configurations.php | 14 + .../ConfigurationsException.php | 13 + src/Configurations/PageRulesActions.php | 313 ++ src/Configurations/PageRulesTargets.php | 32 + src/Configurations/UARules.php | 24 + src/Configurations/ZoneLockdown.php | 29 + src/Endpoints/API.php | 15 + src/Endpoints/AccessRules.php | 156 + src/Endpoints/CustomHostnames.php | 153 + src/Endpoints/DNS.php | 147 + src/Endpoints/EndpointException.php | 13 + src/Endpoints/IPs.php | 32 + src/Endpoints/PageRules.php | 161 + src/Endpoints/Railgun.php | 102 + src/Endpoints/TLS.php | 124 + src/Endpoints/UARules.php | 120 + src/Endpoints/User.php | 47 + src/Endpoints/WAF.php | 183 + src/Endpoints/ZoneLockdown.php | 119 + src/Endpoints/ZoneSettings.php | 153 + src/Endpoints/Zones.php | 195 ++ src/Traits/BodyAccessorTrait.php | 13 + tests/Adapter/GuzzleTest.php | 136 + tests/Auth/APIKeyTest.php | 23 + tests/Auth/NoneTest.php | 18 + tests/Auth/UserServiceKeyTest.php | 24 + .../ConfigurationsUARulesTest.php | 27 + .../ConfigurationsZoneLockdownTest.php | 34 + tests/Configurations/PageRulesActionTest.php | 21 + tests/Configurations/PageRulesTargetTest.php | 22 + tests/Endpoints/AccessRulesTest.php | 112 + tests/Endpoints/CustomHostnamesTest.php | 138 + tests/Endpoints/DNSTest.php | 121 + tests/Endpoints/IPsTest.php | 31 + tests/Endpoints/PageRulesTest.php | 132 + tests/Endpoints/RailgunTest.php | 149 + tests/Endpoints/TLSTest.php | 71 + tests/Endpoints/UARulesTest.php | 142 + tests/Endpoints/UserTest.php | 68 + tests/Endpoints/WAFTest.php | 221 ++ tests/Endpoints/ZoneLockdownTest.php | 145 + tests/Endpoints/ZonesTest.php | 246 ++ tests/Fixtures/Endpoints/activationTest.json | 8 + tests/Fixtures/Endpoints/addLockdown.json | 18 + tests/Fixtures/Endpoints/addRecord.json | 20 + tests/Fixtures/Endpoints/addZone.json | 54 + tests/Fixtures/Endpoints/cachePurge.json | 8 + .../Endpoints/cachePurgeEverything.json | 8 + tests/Fixtures/Endpoints/cachePurgeHost.json | 8 + .../Endpoints/changeDevelopmentMode.json | 12 + .../Endpoints/changeMinimumTLSVersion.json | 6 + .../Fixtures/Endpoints/createAccessRule.json | 30 + .../Endpoints/createCustomHostname.json | 20 + tests/Fixtures/Endpoints/createPageRule.json | 31 + tests/Fixtures/Endpoints/createRailgun.json | 23 + tests/Fixtures/Endpoints/createRule.json | 18 + .../Fixtures/Endpoints/deleteAccessRule.json | 12 + tests/Fixtures/Endpoints/deleteHostname.json | 3 + tests/Fixtures/Endpoints/deleteLockdown.json | 12 + tests/Fixtures/Endpoints/deletePageRule.json | 12 + tests/Fixtures/Endpoints/deleteRailgun.json | 12 + tests/Fixtures/Endpoints/deleteRule.json | 12 + tests/Fixtures/Endpoints/disableTLS13.json | 6 + tests/Fixtures/Endpoints/enableTLS13.json | 6 + .../Endpoints/getAnalyticsDashboard.json | 176 + .../Endpoints/getDNSRecordDetails.json | 20 + tests/Fixtures/Endpoints/getHostname.json | 20 + .../Endpoints/getPackageGroupInfo.json | 22 + tests/Fixtures/Endpoints/getPackageInfo.json | 17 + .../Endpoints/getPackageRuleInfo.json | 24 + .../Endpoints/getPageRuleDetails.json | 31 + tests/Fixtures/Endpoints/getRailgun.json | 23 + .../Fixtures/Endpoints/getRecordDetails.json | 22 + tests/Fixtures/Endpoints/getRuleDetails.json | 18 + tests/Fixtures/Endpoints/getUserDetails.json | 18 + tests/Fixtures/Endpoints/getUserEmail.json | 18 + tests/Fixtures/Endpoints/getUserId.json | 18 + tests/Fixtures/Endpoints/getZoneId.json | 62 + tests/Fixtures/Endpoints/listAccessRules.json | 38 + tests/Fixtures/Endpoints/listHostnames.json | 28 + tests/Fixtures/Endpoints/listIPs.json | 13 + tests/Fixtures/Endpoints/listLockdowns.json | 26 + .../Fixtures/Endpoints/listPackageGroups.json | 30 + .../Fixtures/Endpoints/listPackageRules.json | 38 + tests/Fixtures/Endpoints/listPackages.json | 25 + tests/Fixtures/Endpoints/listPageRules.json | 39 + .../Fixtures/Endpoints/listRailgunZones.json | 30 + tests/Fixtures/Endpoints/listRailguns.json | 31 + tests/Fixtures/Endpoints/listRecords.json | 28 + tests/Fixtures/Endpoints/listRules.json | 26 + tests/Fixtures/Endpoints/listZones.json | 62 + .../Fixtures/Endpoints/updateAccessRule.json | 30 + tests/Fixtures/Endpoints/updateDNSRecord.json | 24 + tests/Fixtures/Endpoints/updateHostname.json | 20 + tests/Fixtures/Endpoints/updateLockdown.json | 22 + .../Endpoints/updatePackageGroup.json | 22 + .../Fixtures/Endpoints/updatePackageRule.json | 24 + tests/Fixtures/Endpoints/updatePageRule.json | 31 + tests/Fixtures/Endpoints/updateRailgun.json | 23 + tests/Fixtures/Endpoints/updateRule.json | 18 + .../Fixtures/Endpoints/updateUserDetails.json | 18 + tests/TestCase.php | 46 + 121 files changed, 9067 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 160000 cloudflare-php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 paul create mode 100644 paul.pub create mode 100644 phpunit.xml create mode 100644 src/Adapter/Adapter.php create mode 100644 src/Adapter/Guzzle.php create mode 100644 src/Adapter/JSONException.php create mode 100644 src/Adapter/ResponseException.php create mode 100644 src/Auth/APIKey.php create mode 100644 src/Auth/Auth.php create mode 100644 src/Auth/None.php create mode 100644 src/Auth/UserServiceKey.php create mode 100644 src/Configurations/AccessRules.php create mode 100644 src/Configurations/Configurations.php create mode 100644 src/Configurations/ConfigurationsException.php create mode 100644 src/Configurations/PageRulesActions.php create mode 100644 src/Configurations/PageRulesTargets.php create mode 100644 src/Configurations/UARules.php create mode 100644 src/Configurations/ZoneLockdown.php create mode 100644 src/Endpoints/API.php create mode 100644 src/Endpoints/AccessRules.php create mode 100644 src/Endpoints/CustomHostnames.php create mode 100644 src/Endpoints/DNS.php create mode 100644 src/Endpoints/EndpointException.php create mode 100644 src/Endpoints/IPs.php create mode 100644 src/Endpoints/PageRules.php create mode 100644 src/Endpoints/Railgun.php create mode 100644 src/Endpoints/TLS.php create mode 100644 src/Endpoints/UARules.php create mode 100644 src/Endpoints/User.php create mode 100644 src/Endpoints/WAF.php create mode 100644 src/Endpoints/ZoneLockdown.php create mode 100644 src/Endpoints/ZoneSettings.php create mode 100644 src/Endpoints/Zones.php create mode 100644 src/Traits/BodyAccessorTrait.php create mode 100644 tests/Adapter/GuzzleTest.php create mode 100644 tests/Auth/APIKeyTest.php create mode 100644 tests/Auth/NoneTest.php create mode 100644 tests/Auth/UserServiceKeyTest.php create mode 100644 tests/Configurations/ConfigurationsUARulesTest.php create mode 100644 tests/Configurations/ConfigurationsZoneLockdownTest.php create mode 100644 tests/Configurations/PageRulesActionTest.php create mode 100644 tests/Configurations/PageRulesTargetTest.php create mode 100644 tests/Endpoints/AccessRulesTest.php create mode 100644 tests/Endpoints/CustomHostnamesTest.php create mode 100644 tests/Endpoints/DNSTest.php create mode 100644 tests/Endpoints/IPsTest.php create mode 100644 tests/Endpoints/PageRulesTest.php create mode 100644 tests/Endpoints/RailgunTest.php create mode 100644 tests/Endpoints/TLSTest.php create mode 100644 tests/Endpoints/UARulesTest.php create mode 100644 tests/Endpoints/UserTest.php create mode 100644 tests/Endpoints/WAFTest.php create mode 100644 tests/Endpoints/ZoneLockdownTest.php create mode 100644 tests/Endpoints/ZonesTest.php create mode 100644 tests/Fixtures/Endpoints/activationTest.json create mode 100644 tests/Fixtures/Endpoints/addLockdown.json create mode 100644 tests/Fixtures/Endpoints/addRecord.json create mode 100644 tests/Fixtures/Endpoints/addZone.json create mode 100644 tests/Fixtures/Endpoints/cachePurge.json create mode 100644 tests/Fixtures/Endpoints/cachePurgeEverything.json create mode 100644 tests/Fixtures/Endpoints/cachePurgeHost.json create mode 100644 tests/Fixtures/Endpoints/changeDevelopmentMode.json create mode 100644 tests/Fixtures/Endpoints/changeMinimumTLSVersion.json create mode 100644 tests/Fixtures/Endpoints/createAccessRule.json create mode 100644 tests/Fixtures/Endpoints/createCustomHostname.json create mode 100644 tests/Fixtures/Endpoints/createPageRule.json create mode 100644 tests/Fixtures/Endpoints/createRailgun.json create mode 100644 tests/Fixtures/Endpoints/createRule.json create mode 100644 tests/Fixtures/Endpoints/deleteAccessRule.json create mode 100644 tests/Fixtures/Endpoints/deleteHostname.json create mode 100644 tests/Fixtures/Endpoints/deleteLockdown.json create mode 100644 tests/Fixtures/Endpoints/deletePageRule.json create mode 100644 tests/Fixtures/Endpoints/deleteRailgun.json create mode 100644 tests/Fixtures/Endpoints/deleteRule.json create mode 100644 tests/Fixtures/Endpoints/disableTLS13.json create mode 100644 tests/Fixtures/Endpoints/enableTLS13.json create mode 100644 tests/Fixtures/Endpoints/getAnalyticsDashboard.json create mode 100644 tests/Fixtures/Endpoints/getDNSRecordDetails.json create mode 100644 tests/Fixtures/Endpoints/getHostname.json create mode 100644 tests/Fixtures/Endpoints/getPackageGroupInfo.json create mode 100644 tests/Fixtures/Endpoints/getPackageInfo.json create mode 100644 tests/Fixtures/Endpoints/getPackageRuleInfo.json create mode 100644 tests/Fixtures/Endpoints/getPageRuleDetails.json create mode 100644 tests/Fixtures/Endpoints/getRailgun.json create mode 100644 tests/Fixtures/Endpoints/getRecordDetails.json create mode 100644 tests/Fixtures/Endpoints/getRuleDetails.json create mode 100644 tests/Fixtures/Endpoints/getUserDetails.json create mode 100644 tests/Fixtures/Endpoints/getUserEmail.json create mode 100644 tests/Fixtures/Endpoints/getUserId.json create mode 100644 tests/Fixtures/Endpoints/getZoneId.json create mode 100644 tests/Fixtures/Endpoints/listAccessRules.json create mode 100644 tests/Fixtures/Endpoints/listHostnames.json create mode 100644 tests/Fixtures/Endpoints/listIPs.json create mode 100644 tests/Fixtures/Endpoints/listLockdowns.json create mode 100644 tests/Fixtures/Endpoints/listPackageGroups.json create mode 100644 tests/Fixtures/Endpoints/listPackageRules.json create mode 100644 tests/Fixtures/Endpoints/listPackages.json create mode 100644 tests/Fixtures/Endpoints/listPageRules.json create mode 100644 tests/Fixtures/Endpoints/listRailgunZones.json create mode 100644 tests/Fixtures/Endpoints/listRailguns.json create mode 100644 tests/Fixtures/Endpoints/listRecords.json create mode 100644 tests/Fixtures/Endpoints/listRules.json create mode 100644 tests/Fixtures/Endpoints/listZones.json create mode 100644 tests/Fixtures/Endpoints/updateAccessRule.json create mode 100644 tests/Fixtures/Endpoints/updateDNSRecord.json create mode 100644 tests/Fixtures/Endpoints/updateHostname.json create mode 100644 tests/Fixtures/Endpoints/updateLockdown.json create mode 100644 tests/Fixtures/Endpoints/updatePackageGroup.json create mode 100644 tests/Fixtures/Endpoints/updatePackageRule.json create mode 100644 tests/Fixtures/Endpoints/updatePageRule.json create mode 100644 tests/Fixtures/Endpoints/updateRailgun.json create mode 100644 tests/Fixtures/Endpoints/updateRule.json create mode 100644 tests/Fixtures/Endpoints/updateUserDetails.json create mode 100644 tests/TestCase.php diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..f8d4e37 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,17 @@ +# Contributing to Cloudflare PHP API Binding + +👍🎉 First off, thanks for taking the time to contribute! 🎉👍 + +## How To Contribute + +We welcome community contribution to this repository. To help add functionality or address issues, please take the following steps: + +* Fork the repository from the master branch. +* Create a new branch for your features / fixes. +* Make the changes you wish to see. +* Add tests for all changes. +* Run `make fix` command to ensure the code is styled. +* Run `make test` command to ensure the tests pass. +* Create a pull request with details of what changes have been made and explanation of new behaviour. +* Ensure documentation contains the correct information. +* Pull requests will be reviewed and hopefully merged into a release. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..534ca68 --- /dev/null +++ b/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2015-2016, Cloudflare. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors +may be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2bd666d --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +THIS := $(realpath $(lastword $(MAKEFILE_LIST))) +HERE := $(shell dirname $(THIS)) + +.PHONY: all fix lint test + +all: lint test + +fix: + php $(HERE)/vendor/bin/php-cs-fixer fix --config=$(HERE)/.php_cs + +lint: + php $(HERE)/vendor/bin/php-cs-fixer fix --config=$(HERE)/.php_cs --dry-run + php $(HERE)/vendor/bin/phpmd src/ text cleancode,codesize,controversial,design,naming,unusedcode + php $(HERE)/vendor/bin/phpmd tests/ text cleancode,codesize,controversial,design,naming,unusedcode + +test: + php $(HERE)/vendor/bin/phpunit --configuration $(HERE)/phpunit.xml diff --git a/README.md b/README.md new file mode 100644 index 0000000..a0f52fe --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# Cloudflare SDK (v4 API Binding for PHP 7) + +[![Build Status](https://travis-ci.org/cloudflare/cloudflare-php.svg?branch=master)](https://travis-ci.org/cloudflare/cloudflare-php) + +## Installation + +The recommended way to install this package is via the Packagist Dependency Manager ([cloudflare/sdk](https://packagist.org/packages/cloudflare/sdk)). You can get specific usage examples on the Cloudflare Knowledge Base under: [Cloudflare PHP API Binding](https://support.cloudflare.com/hc/en-us/articles/115001661191) + +## Cloudflare API version 4 + +The Cloudflare API can be found [here](https://api.cloudflare.com/). +Each API call is provided via a similarly named function within various classes in the **Cloudflare\API\Endpoints** namespace: + +- [x] [DNS Records](https://www.cloudflare.com/dns/) +- [x] Zones +- [x] User Administration (partial) +- [x] [Cloudflare IPs](https://www.cloudflare.com/ips/) +- [x] [Page Rules](https://support.cloudflare.com/hc/en-us/articles/200168306-Is-there-a-tutorial-for-Page-Rules-) +- [x] [Web Application Firewall (WAF)](https://www.cloudflare.com/waf/) +- [ ] Virtual DNS Management +- [x] Custom hostnames +- [x] Manage TLS settings +- [x] Zone Lockdown and User-Agent Block rules +- [ ] Organization Administration +- [x] [Railgun](https://www.cloudflare.com/railgun/) administration +- [ ] [Keyless SSL](https://blog.cloudflare.com/keyless-ssl-the-nitty-gritty-technical-details/) +- [ ] [Origin CA](https://blog.cloudflare.com/universal-ssl-encryption-all-the-way-to-the-origin-for-free/) + +Note that this repository is currently under development, additional classes and endpoints being actively added. + +## Getting Started + +```php +$key = new Cloudflare\API\Auth\APIKey('user@example.com', 'apiKey'); +$adapter = new Cloudflare\API\Adapter\Guzzle($key); +$user = new Cloudflare\API\Endpoints\User($adapter); + +echo $user->getUserID(); +``` + +## Contributions + +We welcome community contribution to this repository. [CONTRIBUTING.md](CONTRIBUTING.md) will help you start contributing. + +## Licensing + +Licensed under the 3-clause BSD license. See the [LICENSE](LICENSE) file for details. diff --git a/cloudflare-php b/cloudflare-php new file mode 160000 index 0000000..4694904 --- /dev/null +++ b/cloudflare-php @@ -0,0 +1 @@ +Subproject commit 4694904b38fdf5f251559a473cecf77a63cf9202 diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..a6dbadd --- /dev/null +++ b/composer.json @@ -0,0 +1,32 @@ +{ + "name": "cloudflare/sdk", + "description": "PHP binding for v4 of the Cloudflare Client API.", + "type": "library", + "require": { + "guzzlehttp/guzzle": "^6.2.2", + "php": ">=7.0.0", + "psr/http-message": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "5.7.5", + "phpmd/phpmd" : "@stable", + "friendsofphp/php-cs-fixer": "^2.6" + }, + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Junade Ali", + "email": "junade@cloudflare.com" + } + ], + "autoload": { + "psr-4": { + "Cloudflare\\API\\": "src/" + } + }, + "autoload-dev": { + "classmap": [ + "tests/" + ] + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..0b8441f --- /dev/null +++ b/composer.lock @@ -0,0 +1,3002 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "9a243e606c74dcbd67ae934182df9d2c", + "packages": [ + { + "name": "guzzlehttp/guzzle", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2018-04-22T15:46:56+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2017-03-20T17:10:46+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + } + ], + "packages-dev": [ + { + "name": "composer/semver", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573", + "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "time": "2016-08-30T16:08:34+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "b8e9745fb9b06ea6664d8872c4505fb16df4611c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/b8e9745fb9b06ea6664d8872c4505fb16df4611c", + "reference": "b8e9745fb9b06ea6664d8872c4505fb16df4611c", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "time": "2018-08-31T19:07:57+00:00" + }, + { + "name": "doctrine/annotations", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "54cacc9b81758b14e3ce750f205a393d52339e97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97", + "reference": "54cacc9b81758b14e3ce750f205a393d52339e97", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2017-02-24T16:22:25+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2015-06-14T21:17:01+00:00" + }, + { + "name": "doctrine/lexer", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Lexer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "lexer", + "parser" + ], + "time": "2014-09-09T13:34:57+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v2.13.1", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "54814c62d5beef3ba55297b9b3186ed8b8a1b161" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/54814c62d5beef3ba55297b9b3186ed8b8a1b161", + "reference": "54814c62d5beef3ba55297b9b3186ed8b8a1b161", + "shasum": "" + }, + "require": { + "composer/semver": "^1.4", + "composer/xdebug-handler": "^1.2", + "doctrine/annotations": "^1.2", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^5.6 || >=7.0 <7.3", + "php-cs-fixer/diff": "^1.3", + "symfony/console": "^3.4.17 || ^4.1.6", + "symfony/event-dispatcher": "^3.0 || ^4.0", + "symfony/filesystem": "^3.0 || ^4.0", + "symfony/finder": "^3.0 || ^4.0", + "symfony/options-resolver": "^3.0 || ^4.0", + "symfony/polyfill-php70": "^1.0", + "symfony/polyfill-php72": "^1.4", + "symfony/process": "^3.0 || ^4.0", + "symfony/stopwatch": "^3.0 || ^4.0" + }, + "conflict": { + "hhvm": "*" + }, + "require-dev": { + "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0", + "justinrainbow/json-schema": "^5.0", + "keradus/cli-executor": "^1.1", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.1", + "php-cs-fixer/accessible-object": "^1.0", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.0.1", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.0.1", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1", + "phpunitgoodpractices/traits": "^1.5.1", + "symfony/phpunit-bridge": "^4.0" + }, + "suggest": { + "ext-mbstring": "For handling non-UTF8 characters in cache signature.", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", + "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "classmap": [ + "tests/Test/AbstractFixerTestCase.php", + "tests/Test/AbstractIntegrationCaseFactory.php", + "tests/Test/AbstractIntegrationTestCase.php", + "tests/Test/Assert/AssertTokensTrait.php", + "tests/Test/IntegrationCase.php", + "tests/Test/IntegrationCaseFactory.php", + "tests/Test/IntegrationCaseFactoryInterface.php", + "tests/Test/InternalIntegrationCaseFactory.php", + "tests/TestCase.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "time": "2018-10-21T00:32:10+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2017-10-19T19:58:43+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "time": "2018-07-02T15:55:56+00:00" + }, + { + "name": "pdepend/pdepend", + "version": "2.5.2", + "source": { + "type": "git", + "url": "https://github.com/pdepend/pdepend.git", + "reference": "9daf26d0368d4a12bed1cacae1a9f3a6f0adf239" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/9daf26d0368d4a12bed1cacae1a9f3a6f0adf239", + "reference": "9daf26d0368d4a12bed1cacae1a9f3a6f0adf239", + "shasum": "" + }, + "require": { + "php": ">=5.3.7", + "symfony/config": "^2.3.0|^3|^4", + "symfony/dependency-injection": "^2.3.0|^3|^4", + "symfony/filesystem": "^2.3.0|^3|^4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.7", + "squizlabs/php_codesniffer": "^2.0.0" + }, + "bin": [ + "src/bin/pdepend" + ], + "type": "library", + "autoload": { + "psr-4": { + "PDepend\\": "src/main/php/PDepend" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Official version of pdepend to be handled with Composer", + "time": "2017-12-13T13:21:38+00:00" + }, + { + "name": "php-cs-fixer/diff", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/diff.git", + "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/78bb099e9c16361126c86ce82ec4405ebab8e756", + "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.23 || ^6.4.3", + "symfony/process": "^3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "SpacePossum" + } + ], + "description": "sebastian/diff v2 backport support for PHP5.6", + "homepage": "https://github.com/PHP-CS-Fixer", + "keywords": [ + "diff" + ], + "time": "2018-02-15T16:58:55+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2017-09-11T18:02:19+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "4.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "shasum": "" + }, + "require": { + "php": "^7.0", + "phpdocumentor/reflection-common": "^1.0.0", + "phpdocumentor/type-resolver": "^0.4.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "doctrine/instantiator": "~1.0.5", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2017-11-30T07:14:17+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "time": "2017-07-14T14:27:02+00:00" + }, + { + "name": "phpmd/phpmd", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/phpmd/phpmd.git", + "reference": "4e9924b2c157a3eb64395460fcf56b31badc8374" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/4e9924b2c157a3eb64395460fcf56b31badc8374", + "reference": "4e9924b2c157a3eb64395460fcf56b31badc8374", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "pdepend/pdepend": "^2.5", + "php": ">=5.3.9" + }, + "require-dev": { + "phpunit/phpunit": "^4.0", + "squizlabs/php_codesniffer": "^2.0" + }, + "bin": [ + "src/bin/phpmd" + ], + "type": "project", + "autoload": { + "psr-0": { + "PHPMD\\": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Manuel Pichler", + "email": "github@manuel-pichler.de", + "homepage": "https://github.com/manuelpichler", + "role": "Project Founder" + }, + { + "name": "Other contributors", + "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", + "role": "Contributors" + }, + { + "name": "Marc Würth", + "email": "ravage@bluewin.ch", + "homepage": "https://github.com/ravage84", + "role": "Project Maintainer" + } + ], + "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", + "homepage": "http://phpmd.org/", + "keywords": [ + "mess detection", + "mess detector", + "pdepend", + "phpmd", + "pmd" + ], + "time": "2017-01-20T14:41:10+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2018-08-05T17:53:17+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^5.6 || ^7.0", + "phpunit/php-file-iterator": "^1.3", + "phpunit/php-text-template": "^1.2", + "phpunit/php-token-stream": "^1.4.2 || ^2.0", + "sebastian/code-unit-reverse-lookup": "^1.0", + "sebastian/environment": "^1.3.2 || ^2.0", + "sebastian/version": "^1.0 || ^2.0" + }, + "require-dev": { + "ext-xdebug": "^2.1.4", + "phpunit/phpunit": "^5.7" + }, + "suggest": { + "ext-xdebug": "^2.5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2017-04-02T07:44:40+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2017-11-27T13:52:08+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2017-02-26T11:10:40+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "791198a2c6254db10131eecfe8c06670700904db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", + "reference": "791198a2c6254db10131eecfe8c06670700904db", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2017-11-27T05:48:46+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "5.7.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "50fd2be8f3e23e91da825f36f08e5f9633076ffe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/50fd2be8f3e23e91da825f36f08e5f9633076ffe", + "reference": "50fd2be8f3e23e91da825f36f08e5f9633076ffe", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "~1.3", + "php": "^5.6 || ^7.0", + "phpspec/prophecy": "^1.6.2", + "phpunit/php-code-coverage": "^4.0.3", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "^1.0.6", + "phpunit/phpunit-mock-objects": "^3.2", + "sebastian/comparator": "~1.2.2", + "sebastian/diff": "~1.2", + "sebastian/environment": "^1.3.4 || ^2.0", + "sebastian/exporter": "~2.0", + "sebastian/global-state": "^1.0 || ^2.0", + "sebastian/object-enumerator": "~2.0", + "sebastian/resource-operations": "~1.0", + "sebastian/version": "~1.0|~2.0", + "symfony/yaml": "~2.1|~3.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-xdebug": "*", + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.7.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2016-12-28T07:18:51+00:00" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", + "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.6 || ^7.0", + "phpunit/php-text-template": "^1.2", + "sebastian/exporter": "^1.2 || ^2.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2017-06-30T09:13:00+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/log", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10T12:19:37+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "1.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2 || ~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2017-01-29T09:50:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2017-05-22T07:24:03+00:00" + }, + { + "name": "sebastian/environment", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2016-11-26T07:53:53+00:00" + }, + { + "name": "sebastian/exporter", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~2.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2016-11-19T08:54:04+00:00" + }, + { + "name": "sebastian/global-state", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2017-04-27T15:39:26+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "sebastian/recursion-context": "~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-02-18T15:18:39+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2016-11-19T07:33:16+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2015-07-28T20:34:47+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "symfony/config", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "e5389132dc6320682de3643091121c048ff796b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/e5389132dc6320682de3643091121c048ff796b3", + "reference": "e5389132dc6320682de3643091121c048ff796b3", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/filesystem": "~2.8|~3.0|~4.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/dependency-injection": "<3.3", + "symfony/finder": "<3.3" + }, + "require-dev": { + "symfony/dependency-injection": "~3.3|~4.0", + "symfony/event-dispatcher": "~3.3|~4.0", + "symfony/finder": "~3.3|~4.0", + "symfony/yaml": "~3.0|~4.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2018-09-08T13:15:14+00:00" + }, + { + "name": "symfony/console", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b", + "reference": "3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/debug": "~2.8|~3.0|~4.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.3|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.3|~4.0" + }, + "suggest": { + "psr/log-implementation": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2018-10-02T16:33:53+00:00" + }, + { + "name": "symfony/debug", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "0a612e9dfbd2ccce03eb174365f31ecdca930ff6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/0a612e9dfbd2ccce03eb174365f31ecdca930ff6", + "reference": "0a612e9dfbd2ccce03eb174365f31ecdca930ff6", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/http-kernel": "~2.8|~3.0|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2018-10-02T16:33:53+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "aea20fef4e92396928b5db175788b90234c0270d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/aea20fef4e92396928b5db175788b90234c0270d", + "reference": "aea20fef4e92396928b5db175788b90234c0270d", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/container": "^1.0" + }, + "conflict": { + "symfony/config": "<3.3.7", + "symfony/finder": "<3.3", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "~3.3|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2018-10-02T12:28:39+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb", + "reference": "b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "conflict": { + "symfony/dependency-injection": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "~3.3|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/stopwatch": "~2.8|~3.0|~4.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T09:06:28+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "d69930fc337d767607267d57c20a7403d0a822a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d69930fc337d767607267d57c20a7403d0a822a4", + "reference": "d69930fc337d767607267d57c20a7403d0a822a4", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2018-10-02T12:28:39+00:00" + }, + { + "name": "symfony/finder", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "54ba444dddc5bd5708a34bd095ea67c6eb54644d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/54ba444dddc5bd5708a34bd095ea67c6eb54644d", + "reference": "54ba444dddc5bd5708a34bd095ea67c6eb54644d", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2018-10-03T08:46:40+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "1cf7d8e704a9cc4164c92e430f2dfa3e6983661d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/1cf7d8e704a9cc4164c92e430f2dfa3e6983661d", + "reference": "1cf7d8e704a9cc4164c92e430f2dfa3e6983661d", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony OptionsResolver Component", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "time": "2018-09-17T17:29:18+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "1e24b0c4a56d55aaf368763a06c6d1c7d3194934" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/1e24b0c4a56d55aaf368763a06c6d1c7d3194934", + "reference": "1e24b0c4a56d55aaf368763a06c6d1c7d3194934", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/95c50420b0baed23852452a7f0c7b527303ed5ae", + "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/process", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "1dc2977afa7d70f90f3fefbcd84152813558910e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/1dc2977afa7d70f90f3fefbcd84152813558910e", + "reference": "1dc2977afa7d70f90f3fefbcd84152813558910e", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2018-10-02T12:28:39+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "05e52a39de52ba690aebaed462b2bc8a9649f0a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/05e52a39de52ba690aebaed462b2bc8a9649f0a4", + "reference": "05e52a39de52ba690aebaed462b2bc8a9649f0a4", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "time": "2018-10-02T12:28:39+00:00" + }, + { + "name": "symfony/yaml", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "640b6c27fed4066d64b64d5903a86043f4a4de7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/640b6c27fed4066d64b64d5903a86043f4a4de7f", + "reference": "640b6c27fed4066d64b64d5903a86043f4a4de7f", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<3.4" + }, + "require-dev": { + "symfony/console": "~3.4|~4.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2018-10-02T16:33:53+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "0df1908962e7a3071564e857d86874dad1ef204a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", + "reference": "0df1908962e7a3071564e857d86874dad1ef204a", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2018-01-29T19:49:41+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "phpmd/phpmd": 0 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.0.0" + }, + "platform-dev": [] +} diff --git a/paul b/paul new file mode 100644 index 0000000..f4053e3 --- /dev/null +++ b/paul @@ -0,0 +1,30 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,FFE357F099C6FA798FDA620AFC29061B + +TfyWfEzwfCdPB75tX3E6niZBGvOFpP4det7fNPGw0rfUPhn4lgBDMdL1zXgAZred +Ham1RQ6u0KZiaiGjn111ZP5XA6y8WV46IFaT59UMl1ZPu5AjMjZIAZ9WTJvhIaz2 +pMJhcBAe9M5guWX0qGgiajS+3DvVISxwmgOjFjNIFUjrJKxxD+J2HESf8+uO19NA +jZpxxF47KipaaTLFe4IGX8rf6aaSqaxDOGC8u4T9eyEDwsARe2H6g8Wm4ABnE/cB +kn6KoPupky20UIOZlOTc+R3UDrVK0w1ZcxgQi9Ly8qM+oPRemgvIbUHQWRgeXUaU +4p2hze04yQANwpZiWgz7+j5qU4CFfneLVJc1SNvzx+lPNgzwAihv4AKlJ3dBtpSw +41RyGbisE/RuPcaHGDOXf0g+wA2Bz1ByspQaB05BcqCef+rMvyavgaT2o5rgOVcF +D6AfKCYu0nO3RvCCm9jE19JDHW5oynnw8qiY9spvMkKaFGwXNYtBkvxdrW/xbNfu +VotHxKUcJbxjci2dJ10I7w58p2czlMA2vWtPqXqo7eDgrCLOBFM6CKQea8lsQKvA +uis2QMoWJYAhl20fxB8VxA77Gh5Fp402tj7Qu2/D8bDkZwqD6/ShFDqA6sK83JF+ +2QNfm3hTOmYytVSyl9uCjGJTqchK6O3zoteVihST4CGaIufbLjk6PkjzQc6JSFdG +aPWNBM4whR7LcUJ2LQ4lTcbcChB7d1ox+KRgKQ9FxmG1F9cftjKtfPAn3h2AYk+P +g/BBMmwV5R4Ly580QD0GgNYCYyKtT9Rn0inWh9o+tcX7B98xrghM1FOVBFuyw4P0 +eQrmi6oBXPWB7X5HzedFclpo/SjUinq4mVUfMHEv3vwaJI7XoFSNvd4sboc2IKkA +NbsbL5rk+QPTtCJJohIG4urAJPrpEqOfAQL26YJg+aamefmoiUCF46xb+sMYgPlq +a6P7kGv5iYvKsvVfZr1JCNJGa4f4R3toded0sYpvyodzm+X1Y+VzjgspXT0lh6EH +AR+JZ8w4zPnPaVaeDbkp0dgHFSyFWRl4CQSmQHGthaFAPagwJt2JJYmKEgPZYz7f +65kaMmhSANNUw0rtFfctA6VJqWRbdG1Gyn77nmg69SrwBUc17f+Mtui03FSIAFjg +yYooJxdNMT31wItBcDVEAvcLd/b4Bp2xKsKm7XYj3aWVgBFZO0scAGMqPfJaJy3o +o3dE4AvYzup46GbH3fz3xwDUjCbPSLNdKPLc37Yv5v0SAQaGuQbhwovp0Y4Mvsqt +lE74zywcxCJzp2pCJ9FlSjE+FPyHd+2Y3y3sod1Gs1s3IC8/u3sVOQ4velvVyO2v +Il86j9yglrNQ2vhq6KBedqeukPI71HnYjXSU/H5NLlMyRt/Y5g1F5yfgHmZyioVT +lyrvJCX//hm9K/8NLV1uIczT1Z+Lcpdrm2c8QpsCZseaCD/yVtNmo/LvRD5TH7aT +/QGUbfvkCUl8HVOId/LLZrDscdcDSj9LYcp+KDLm6qfLQX+uqHzXFgI2t8g2k3KR +N9sEFJq1rDX4PDzrUkWXrqW33LneOm+7KeXFHvdEzRnZylgo14ZkdAgKx6smaPuj +-----END RSA PRIVATE KEY----- diff --git a/paul.pub b/paul.pub new file mode 100644 index 0000000..680eaed --- /dev/null +++ b/paul.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4RGhsoezP9fixY7Q+UkiUuKQDEVeOY2B5e15PG6lu90AM9nfvvUYvMu+w4/xB1MNsfBihKGJEcMuau9LiSuQjnym5BQ29ECL3Qm9nJ7BZB3jH7hA9uSep5+mvBchqSMFRMW/TUQFAm7o0/+GDRGKI8LnEGApyKrxIm4UaB/est9sVr9J5t+3HuldrUmxFt0o2oTreBgIrBKuDZ4QNP8G+l8A9sFiPJXnYrTo96J79LN7cx5jKWrJFybBwN6UgUMhTfWOOEoo5O61sepg/i9Jr+mz4/zCP5ai2U/Ea/CL4XZW+iHYnGWfEQ7eJLENILC25XlBfrI5Px3gi/2HV+wMn paul.adams@ADAMS-MBP.local diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..65002f7 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,13 @@ + + + + + ./tests/ + + + + + ./src/ + + + diff --git a/src/Adapter/Adapter.php b/src/Adapter/Adapter.php new file mode 100644 index 0000000..44d83c5 --- /dev/null +++ b/src/Adapter/Adapter.php @@ -0,0 +1,76 @@ +getHeaders(); + + $this->client = new Client([ + 'base_uri' => $baseURI, + 'headers' => $headers, + 'Accept' => 'application/json' + ]); + } + + + /** + * @inheritDoc + */ + public function get(string $uri, array $data = [], array $headers = []): ResponseInterface + { + return $this->request('get', $uri, $data, $headers); + } + + /** + * @inheritDoc + */ + public function post(string $uri, array $data = [], array $headers = []): ResponseInterface + { + return $this->request('post', $uri, $data, $headers); + } + + /** + * @inheritDoc + */ + public function put(string $uri, array $data = [], array $headers = []): ResponseInterface + { + return $this->request('put', $uri, $data, $headers); + } + + /** + * @inheritDoc + */ + public function patch(string $uri, array $data = [], array $headers = []): ResponseInterface + { + return $this->request('patch', $uri, $data, $headers); + } + + /** + * @inheritDoc + */ + public function delete(string $uri, array $data = [], array $headers = []): ResponseInterface + { + return $this->request('delete', $uri, $data, $headers); + } + + public function request(string $method, string $uri, array $data = [], array $headers = []) + { + if (!in_array($method, ['get', 'post', 'put', 'patch', 'delete'])) { + throw new \InvalidArgumentException('Request method must be get, post, put, patch, or delete'); + } + + $response = $this->client->$method($uri, [ + 'headers' => $headers, + ($method === 'get' ? 'query' : 'json') => $data, + ]); + + $this->checkError($response); + + return $response; + } + + private function checkError(ResponseInterface $response) + { + $json = json_decode($response->getBody()); + + if (json_last_error() !== JSON_ERROR_NONE) { + throw new JSONException(); + } + + if (isset($json->errors) && count($json->errors) >= 1) { + throw new ResponseException($json->errors[0]->message, $json->errors[0]->code); + } + + if (isset($json->success) && !$json->success) { + throw new ResponseException('Request was unsuccessful.'); + } + } +} diff --git a/src/Adapter/JSONException.php b/src/Adapter/JSONException.php new file mode 100644 index 0000000..e9da7e4 --- /dev/null +++ b/src/Adapter/JSONException.php @@ -0,0 +1,13 @@ +email = $email; + $this->apiKey = $apiKey; + } + + public function getHeaders(): array + { + return [ + 'X-Auth-Email' => $this->email, + 'X-Auth-Key' => $this->apiKey + ]; + } +} diff --git a/src/Auth/Auth.php b/src/Auth/Auth.php new file mode 100644 index 0000000..55cead8 --- /dev/null +++ b/src/Auth/Auth.php @@ -0,0 +1,13 @@ +userServiceKey = $userServiceKey; + } + + public function getHeaders(): array + { + return [ + 'X-Auth-User-Service-Key' => $this->userServiceKey, + ]; + } +} diff --git a/src/Configurations/AccessRules.php b/src/Configurations/AccessRules.php new file mode 100644 index 0000000..17ea57f --- /dev/null +++ b/src/Configurations/AccessRules.php @@ -0,0 +1,28 @@ +config = ['target' => 'ip', 'value' => $value]; + } + + public function setIPRange(string $value) + { + $this->config = ['target' => 'ip_range', 'value' => $value]; + } + + public function setCountry(string $value) + { + $this->config = ['target' => 'country', 'value' => $value]; + } + + public function getArray(): array + { + return $this->config; + } +} diff --git a/src/Configurations/Configurations.php b/src/Configurations/Configurations.php new file mode 100644 index 0000000..ba20907 --- /dev/null +++ b/src/Configurations/Configurations.php @@ -0,0 +1,14 @@ +addConfigurationOption('always_online', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setAlwaysUseHTTPS(bool $active) + { + $this->addConfigurationOption('always_use_https', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setBrowserCacheTTL(int $ttl) + { + $this->addConfigurationOption('browser_cache_ttl', [ + 'value' => $ttl + ]); + } + + public function setBrowserIntegrityCheck(bool $active) + { + $this->addConfigurationOption('browser_check', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setBypassCacheOnCookie(string $value) + { + if (preg_match('/^([a-zA-Z0-9\.=|_*-]+)$/i', $value) < 1) { + throw new ConfigurationsException('Invalid cookie string.'); + } + + $this->addConfigurationOption('bypass_cache_on_cookie', [ + 'value' => $value + ]); + } + + public function setCacheByDeviceType(bool $active) + { + $this->addConfigurationOption('cache_by_device_type', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setCacheKey(string $value) + { + $this->addConfigurationOption('cache_key', [ + 'value' => $value + ]); + } + + public function setCacheLevel(string $value) + { + if (!in_array($value, ['bypass', 'basic', 'simplified', 'aggressive', 'cache_everything'])) { + throw new ConfigurationsException('Invalid cache level'); + } + + $this->addConfigurationOption('cache_level', [ + 'value' => $value + ]); + } + + public function setCacheOnCookie(string $value) + { + if (preg_match('/^([a-zA-Z0-9\.=|_*-]+)$/i', $value) < 1) { + throw new ConfigurationsException('Invalid cookie string.'); + } + + $this->addConfigurationOption('cache_on_cookie', [ + 'value' => $value + ]); + } + + public function setDisableApps(bool $active) + { + $this->addConfigurationOption('disable_apps', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setDisablePerformance(bool $active) + { + $this->addConfigurationOption('disable_performance', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setDisableSecurity(bool $active) + { + $this->addConfigurationOption('disable_security', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setEdgeCacheTTL(int $value) + { + if ($value > 2419200) { + throw new ConfigurationsException('Edge Cache TTL too high.'); + } + + $this->addConfigurationOption('edge_cache_ttl', [ + 'value' => $value + ]); + } + + public function setEmailObfuscation(bool $active) + { + $this->addConfigurationOption('disable_security', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setForwardingURL(int $statusCode, string $forwardingUrl) + { + if (!in_array($statusCode, ['301', '302'])) { + throw new ConfigurationsException('Status Codes can only be 301 or 302.'); + } + + $this->addConfigurationOption("forwarding_url", [ + 'value' => [ + 'status_code' => $statusCode, + 'url' => $forwardingUrl, + ], + ]); + } + + public function setHostHeaderOverride(bool $active) + { + $this->addConfigurationOption('host_header_override', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setHotlinkProtection(bool $active) + { + $this->addConfigurationOption('hotlink_protection', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setIPGeoLocationHeader(bool $active) + { + $this->addConfigurationOption('ip_geolocation', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setMinification(bool $html, bool $css, bool $javascript) + { + $this->addConfigurationOption('minification', [ + 'html' => $this->getBoolAsOnOrOff($html), + 'css' => $this->getBoolAsOnOrOff($css), + 'js' => $this->getBoolAsOnOrOff($javascript), + ]); + } + + public function setMirage(bool $active) + { + $this->addConfigurationOption('mirage', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setOriginErrorPagePassthru(bool $active) + { + $this->addConfigurationOption('origin_error_page_pass_thru', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setQueryStringSort(bool $active) + { + $this->addConfigurationOption('sort_query_string_for_cache', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setDisableRailgun(bool $active) + { + $this->addConfigurationOption('disable_railgun', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setResolveOverride(bool $value) + { + $this->addConfigurationOption('resolve_override', [ + 'value' => $value + ]); + } + + public function setRespectStrongEtag(bool $active) + { + $this->addConfigurationOption('respect_strong_etag', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setResponseBuffering(bool $active) + { + $this->addConfigurationOption('response_buffering', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setRocketLoader(string $value) + { + if (!in_array($value, ['off', 'manual', 'automatic'])) { + throw new ConfigurationsException('Rocket Loader can only be off, automatic, or manual.'); + } + + $this->addConfigurationOption('rocket_loader', [ + 'value' => $value + ]); + } + + public function setSecurityLevel(string $value) + { + if (!in_array($value, ['off', 'essentially_off', 'low', 'medium', 'high', 'under_attack'])) { + throw new ConfigurationsException('Can only be set to off, essentially_off, low, medium, high or under_attack.'); + } + + $this->addConfigurationOption('security_level', [ + 'value' => $value + ]); + } + + public function setServerSideExcludes(bool $active) + { + $this->addConfigurationOption('server_side_exclude', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setSmartErrors(bool $active) + { + $this->addConfigurationOption('smart_errors', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setSSL(string $value) + { + if (!in_array($value, ['off', 'flexible', 'full', 'strict', 'origin_pull'])) { + throw new ConfigurationsException('Can only be set to off, flexible, full, strict, origin_pull.'); + } + + $this->addConfigurationOption('ssl', [ + 'value' => $value + ]); + } + + public function setTrueClientIpHeader(bool $active) + { + $this->addConfigurationOption('true_client_ip_header', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setWAF(bool $active) + { + $this->addConfigurationOption('waf', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setAutomatedHTTPSRewrites(bool $active) + { + $this->addConfigurationOption('automatic_https_rewrites', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function setOpportunisticEncryption(bool $active) + { + $this->addConfigurationOption('opportunistic_encryption', [ + 'value' => $this->getBoolAsOnOrOff($active) + ]); + } + + public function getArray(): array + { + return $this->configs; + } + + private function addConfigurationOption(string $setting, array $configuration) + { + $configuration['id'] = $setting; + + array_push($this->configs, $configuration); + } + + private function getBoolAsOnOrOff(bool $value): string + { + return true === $value ? 'on' : 'off'; + } +} diff --git a/src/Configurations/PageRulesTargets.php b/src/Configurations/PageRulesTargets.php new file mode 100644 index 0000000..0c13a4c --- /dev/null +++ b/src/Configurations/PageRulesTargets.php @@ -0,0 +1,32 @@ +targets = [ + [ + 'target' => 'url', + 'constraint' => [ + 'operator' => 'matches', + 'value' => $queryUrl + ] + ] + ]; + } + + public function getArray(): array + { + return $this->targets; + } +} diff --git a/src/Configurations/UARules.php b/src/Configurations/UARules.php new file mode 100644 index 0000000..9acbc29 --- /dev/null +++ b/src/Configurations/UARules.php @@ -0,0 +1,24 @@ +configs[] = ['target' => 'ua', 'value' => $value]; + } + + public function getArray(): array + { + return $this->configs; + } +} diff --git a/src/Configurations/ZoneLockdown.php b/src/Configurations/ZoneLockdown.php new file mode 100644 index 0000000..a530677 --- /dev/null +++ b/src/Configurations/ZoneLockdown.php @@ -0,0 +1,29 @@ +configs[] = ['target' => 'ip', 'value' => $value]; + } + + public function addIPRange(string $value) + { + $this->configs[] = ['target' => 'ip_range', 'value' => $value]; + } + + public function getArray(): array + { + return $this->configs; + } +} diff --git a/src/Endpoints/API.php b/src/Endpoints/API.php new file mode 100644 index 0000000..113075f --- /dev/null +++ b/src/Endpoints/API.php @@ -0,0 +1,15 @@ +adapter = $adapter; + } + + /** + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + * + * @param string $zoneID + * @param string $scopeType + * @param string $mode + * @param string $configurationTarget + * @param string $configurationValue + * @param int $page + * @param int $perPage + * @param string $order + * @param string $direction + * @param string $match + * @param string $notes + * @return \stdClass + */ + public function listRules( + string $zoneID, + string $scopeType = '', + string $mode = '', + string $configurationTarget = '', + string $configurationValue = '', + int $page = 1, + int $perPage = 50, + string $order = '', + string $direction = '', + string $match = 'all', + string $notes = '' + ): \stdClass { + $query = [ + 'page' => $page, + 'per_page' => $perPage, + 'match' => $match + ]; + + if (!empty($scopeType)) { + $query['scope_type'] = $scopeType; + } + + if (!empty($mode)) { + $query['mode'] = $mode; + } + + if (!empty($configurationTarget)) { + $query['configuration_target'] = $configurationTarget; + } + + if (!empty($configurationValue)) { + $query['configuration_value'] = $configurationValue; + } + + if (!empty($order)) { + $query['order'] = $order; + } + + if (!empty($direction)) { + $query['direction'] = $direction; + } + + if (!empty($notes)) { + $query['notes'] = $notes; + } + + $data = $this->adapter->get('zones/' . $zoneID . '/firewall/access_rules/rules', $query); + $this->body = json_decode($data->getBody()); + + return (object)['result' => $this->body->result, 'result_info' => $this->body->result_info]; + } + + public function createRule( + string $zoneID, + string $mode, + Configurations $configuration, + string $notes = null + ): bool { + $options = [ + 'mode' => $mode, + 'configuration' => $configuration->getArray() + ]; + + if ($notes !== null) { + $options['notes'] = $notes; + } + + $query = $this->adapter->post('zones/' . $zoneID . '/firewall/access_rules/rules', $options); + + $this->body = json_decode($query->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + public function updateRule( + string $zoneID, + string $ruleID, + string $mode, + string $notes = null + ): bool { + $options = [ + 'mode' => $mode + ]; + + if ($notes !== null) { + $options['notes'] = $notes; + } + + $query = $this->adapter->patch('zones/' . $zoneID . '/firewall/access_rules/rules/' . $ruleID, $options); + + $this->body = json_decode($query->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + public function deleteRule(string $zoneID, string $ruleID, string $cascade = 'none'): bool + { + $options = [ + 'cascade' => $cascade + ]; + + $data = $this->adapter->delete('zones/' . $zoneID . '/firewall/access_rules/rules/' . $ruleID, $options); + + $this->body = json_decode($data->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } +} diff --git a/src/Endpoints/CustomHostnames.php b/src/Endpoints/CustomHostnames.php new file mode 100644 index 0000000..4af5c9e --- /dev/null +++ b/src/Endpoints/CustomHostnames.php @@ -0,0 +1,153 @@ +adapter = $adapter; + } + + + /** + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) + * + * @param string $zoneID + * @param string $hostname + * @param string $sslMethod + * @param string $sslType + * @return \stdClass + */ + public function addHostname(string $zoneID, string $hostname, string $sslMethod = 'http', string $sslType = 'dv'): \stdClass + { + $options = [ + 'hostname' => $hostname, + 'ssl' => [ + 'method' => $sslMethod, + 'type' => $sslType + ] + ]; + + $zone = $this->adapter->post('zones/'.$zoneID.'/custom_hostnames', $options); + $this->body = json_decode($zone->getBody()); + return $this->body->result; + } + + /** + * @param string $zoneID + * @param string $hostname + * @param string $id + * @param int $page + * @param int $perPage + * @param string $order + * @param string $direction + * @param int $ssl + * @return \stdClass + */ + public function listHostnames( + string $zoneID, + string $hostname = '', + string $hostnameID = '', + int $page = 1, + int $perPage = 20, + string $order = '', + string $direction = '', + int $ssl = 0 + ): \stdClass { + $query = [ + 'page' => $page, + 'per_page' => $perPage, + 'ssl' => $ssl + ]; + + if (!empty($hostname)) { + $query['hostname'] = $hostname; + } + + if (!empty($hostnameID)) { + $query['id'] = $hostnameID; + } + + if (!empty($order)) { + $query['order'] = $order; + } + + if (!empty($direction)) { + $query['direction'] = $direction; + } + + $zone = $this->adapter->get('zones/'.$zoneID.'/custom_hostnames', $query); + $this->body = json_decode($zone->getBody()); + + return (object)['result' => $this->body->result, 'result_info' => $this->body->result_info]; + } + + /** + * @param string $zoneID + * @param string $hostnameID + * @return mixed + */ + public function getHostname(string $zoneID, string $hostnameID) + { + $zone = $this->adapter->get('zones/'.$zoneID.'/custom_hostnames/'.$hostnameID); + $this->body = json_decode($zone->getBody()); + + return $this->body->result; + } + + /** + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) + * + * @param string $zoneID + * @param string $hostnameID + * @param string $sslMethod + * @param string $sslType + * @return \stdClass + */ + public function updateHostname(string $zoneID, string $hostnameID, string $sslMethod = '', string $sslType = ''): \stdClass + { + $query = []; + + if (!empty($sslMethod)) { + $query['method'] = $sslMethod; + } + + if (!empty($sslType)) { + $query['type'] = $sslType; + } + + $options = [ + 'ssl' => $query + ]; + + $zone = $this->adapter->patch('zones/'.$zoneID.'/custom_hostnames/'.$hostnameID, $options); + $this->body = json_decode($zone->getBody()); + return $this->body->result; + } + + /** + * @param string $zoneID + * @param string $hostnameID + * @return \stdClass + */ + public function deleteHostname(string $zoneID, string $hostnameID): \stdClass + { + $zone = $this->adapter->delete('zones/'.$zoneID.'/custom_hostnames/'.$hostnameID); + $this->body = json_decode($zone->getBody()); + return $this->body; + } +} diff --git a/src/Endpoints/DNS.php b/src/Endpoints/DNS.php new file mode 100644 index 0000000..d06116f --- /dev/null +++ b/src/Endpoints/DNS.php @@ -0,0 +1,147 @@ +adapter = $adapter; + } + + /** + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) + * + * @param string $zoneID + * @param string $type + * @param string $name + * @param string $content + * @param int $ttl + * @param bool $proxied + * @param string $priority + * @param array $data + * @return bool + */ + public function addRecord( + string $zoneID, + string $type, + string $name, + string $content, + int $ttl = 0, + bool $proxied = true, + string $priority = '', + array $data = [] + ): bool { + $options = [ + 'type' => $type, + 'name' => $name, + 'content' => $content, + 'proxied' => $proxied + ]; + + if ($ttl > 0) { + $options['ttl'] = $ttl; + } + + if (!empty($priority)) { + $options['priority'] = (int)$priority; + } + + if (!empty($data)) { + $options['data'] = $data; + } + + $user = $this->adapter->post('zones/' . $zoneID . '/dns_records', $options); + + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + public function listRecords( + string $zoneID, + string $type = '', + string $name = '', + string $content = '', + int $page = 1, + int $perPage = 20, + string $order = '', + string $direction = '', + string $match = 'all' + ): \stdClass { + $query = [ + 'page' => $page, + 'per_page' => $perPage, + 'match' => $match + ]; + + if (!empty($type)) { + $query['type'] = $type; + } + + if (!empty($name)) { + $query['name'] = $name; + } + + if (!empty($content)) { + $query['content'] = $content; + } + + if (!empty($order)) { + $query['order'] = $order; + } + + if (!empty($direction)) { + $query['direction'] = $direction; + } + + $user = $this->adapter->get('zones/' . $zoneID . '/dns_records', $query); + $this->body = json_decode($user->getBody()); + + return (object)['result' => $this->body->result, 'result_info' => $this->body->result_info]; + } + + public function getRecordDetails(string $zoneID, string $recordID): \stdClass + { + $user = $this->adapter->get('zones/' . $zoneID . '/dns_records/' . $recordID); + $this->body = json_decode($user->getBody()); + return $this->body->result; + } + + public function updateRecordDetails(string $zoneID, string $recordID, array $details): \stdClass + { + $response = $this->adapter->put('zones/' . $zoneID . '/dns_records/' . $recordID, $details); + $this->body = json_decode($response->getBody()); + return $this->body; + } + + public function deleteRecord(string $zoneID, string $recordID): bool + { + $user = $this->adapter->delete('zones/' . $zoneID . '/dns_records/' . $recordID); + + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } +} diff --git a/src/Endpoints/EndpointException.php b/src/Endpoints/EndpointException.php new file mode 100644 index 0000000..2855e00 --- /dev/null +++ b/src/Endpoints/EndpointException.php @@ -0,0 +1,13 @@ +adapter = $adapter; + } + + public function listIPs(): \stdClass + { + $ips = $this->adapter->get('ips'); + $this->body = json_decode($ips->getBody()); + + return $this->body->result; + } +} diff --git a/src/Endpoints/PageRules.php b/src/Endpoints/PageRules.php new file mode 100644 index 0000000..3e56007 --- /dev/null +++ b/src/Endpoints/PageRules.php @@ -0,0 +1,161 @@ +adapter = $adapter; + } + + /** + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) + * + * @param string $zoneID + * @param PageRulesTargets $target + * @param PageRulesActions $actions + * @param bool $active + * @param int|null $priority + * @return bool + */ + public function createPageRule( + string $zoneID, + PageRulesTargets $target, + PageRulesActions $actions, + bool $active = true, + int $priority = null + ): bool { + $options = [ + 'targets' => $target->getArray(), + 'actions' => $actions->getArray() + ]; + + if ($active !== null) { + $options['status'] = $active == true ? 'active' : 'disabled'; + } + + if ($priority !== null) { + $options['priority'] = $priority; + } + + + $query = $this->adapter->post('zones/' . $zoneID . '/pagerules', $options); + + $this->body = json_decode($query->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + public function listPageRules( + string $zoneID, + string $status = null, + string $order = null, + string $direction = null, + string $match = null + ): array { + if ($status === null && !in_array($status, ['active', 'disabled'])) { + throw new EndpointException('Page Rules can only be listed by status of active or disabled.'); + } + + if ($order === null && !in_array($order, ['status', 'priority'])) { + throw new EndpointException('Page Rules can only be ordered by status or priority.'); + } + + if ($direction === null && !in_array($direction, ['asc', 'desc'])) { + throw new EndpointException('Direction of Page Rule ordering can only be asc or desc.'); + } + + if ($match === null && !in_array($match, ['all', 'any'])) { + throw new EndpointException('Match can only be any or all.'); + } + + $query = [ + 'status' => $status, + 'order' => $order, + 'direction' => $direction, + 'match' => $match + ]; + + $user = $this->adapter->get('zones/' . $zoneID . '/pagerules', $query); + $this->body = json_decode($user->getBody()); + + return $this->body->result; + } + + public function getPageRuleDetails(string $zoneID, string $ruleID): \stdClass + { + $user = $this->adapter->get('zones/' . $zoneID . '/pagerules/' . $ruleID); + $this->body = json_decode($user->getBody()); + return $this->body->result; + } + + public function updatePageRule( + string $zoneID, + PageRulesTargets $target = null, + PageRulesActions $actions = null, + bool $active = null, + int $priority = null + ): bool { + $options = []; + + if ($target !== null) { + $options['targets'] = $target->getArray(); + } + + if ($actions !== null) { + $options['actions'] = $actions->getArray(); + } + + if ($active !== null) { + $options['status'] = $active == true ? 'active' : 'disabled'; + } + + if ($priority !== null) { + $options['priority'] = $priority; + } + + + $query = $this->adapter->patch('zones/' . $zoneID . '/pagerules', $options); + + $this->body = json_decode($query->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + public function deletePageRule(string $zoneID, string $ruleID): bool + { + $user = $this->adapter->delete('zones/' . $zoneID . '/pagerules/' . $ruleID); + + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } +} diff --git a/src/Endpoints/Railgun.php b/src/Endpoints/Railgun.php new file mode 100644 index 0000000..8ba3182 --- /dev/null +++ b/src/Endpoints/Railgun.php @@ -0,0 +1,102 @@ +adapter = $adapter; + } + + public function create( + string $name + ): \stdClass { + $query = [ + 'name' => $name, + ]; + + $user = $this->adapter->post('railguns', $query); + $this->body = json_decode($user->getBody()); + + return $this->body; + } + + public function list( + int $page = 1, + int $perPage = 20, + string $direction = '' + ): \stdClass { + $query = [ + 'page' => $page, + 'per_page' => $perPage + ]; + + if (!empty($direction)) { + $query['direction'] = $direction; + } + + $user = $this->adapter->get('railguns', $query); + $this->body = json_decode($user->getBody()); + + return (object)['result' => $this->body->result, 'result_info' => $this->body->result_info]; + } + + public function get( + string $railgunID + ): \stdClass { + $user = $this->adapter->get('railguns/' . $railgunID); + $this->body = json_decode($user->getBody()); + + return $this->body->result; + } + + public function getZones( + string $railgunID + ): \stdClass { + $user = $this->adapter->get('railguns/' . $railgunID . '/zones'); + $this->body = json_decode($user->getBody()); + + return (object)['result' => $this->body->result, 'result_info' => $this->body->result_info]; + } + + public function update( + string $railgunID, + bool $status + ): \stdClass { + $query = [ + 'enabled' => $status + ]; + + $user = $this->adapter->patch('railguns/' . $railgunID, $query); + $this->body = json_decode($user->getBody()); + + return $this->body->result; + } + + public function delete( + string $railgunID + ): bool { + $user = $this->adapter->delete('railguns/' . $railgunID); + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } +} diff --git a/src/Endpoints/TLS.php b/src/Endpoints/TLS.php new file mode 100644 index 0000000..f539d9a --- /dev/null +++ b/src/Endpoints/TLS.php @@ -0,0 +1,124 @@ +adapter = $adapter; + } + + public function enableTLS13($zoneID) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/tls_1_3', + ['value' => 'on'] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + + public function disableTLS13($zoneID) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/tls_1_3', + ['value' => 'off'] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + + + + public function changeMinimumTLSVersion($zoneID, $minimumVersion) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/min_tls_version', + [ + 'value' => $minimumVersion + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + public function getHTTPSRedirectStatus($zoneID) { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/always_use_https' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result; + } + + return false; + } + public function getHTTPSRewritesStatus($zoneID) { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/automatic_https_rewrites' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result; + } + + return false; + } + public function updateHTTPSRedirects($zoneID, $value) { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/always_use_https', + [ + 'value' => $value + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + public function updateHTTPSRewrites($zoneID, $value) { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/automatic_https_rewrites', + [ + 'value' => $value + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } +} diff --git a/src/Endpoints/UARules.php b/src/Endpoints/UARules.php new file mode 100644 index 0000000..8c7bfd9 --- /dev/null +++ b/src/Endpoints/UARules.php @@ -0,0 +1,120 @@ +adapter = $adapter; + } + + public function listRules( + string $zoneID, + int $page = 1, + int $perPage = 20 + ): \stdClass { + $query = [ + 'page' => $page, + 'per_page' => $perPage + ]; + + $user = $this->adapter->get('zones/' . $zoneID . '/firewall/ua_rules', $query); + $this->body = json_decode($user->getBody()); + + return (object)['result' => $this->body->result, 'result_info' => $this->body->result_info]; + } + + public function createRule( + string $zoneID, + string $mode, + Configurations $configuration, + string $ruleID = null, + string $description = null + ): bool { + $options = [ + 'mode' => $mode, + 'configurations' => $configuration->getArray() + ]; + + if ($ruleID !== null) { + $options['id'] = $ruleID; + } + + if ($description !== null) { + $options['description'] = $description; + } + + $user = $this->adapter->post('zones/' . $zoneID . '/firewall/ua_rules', $options); + + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + public function getRuleDetails(string $zoneID, string $blockID): \stdClass + { + $user = $this->adapter->get('zones/' . $zoneID . '/firewall/ua_rules/' . $blockID); + $this->body = json_decode($user->getBody()); + return $this->body->result; + } + + public function updateRule( + string $zoneID, + string $ruleID, + string $mode, + \Cloudflare\API\Configurations\UARules $configuration, + string $description = null + ): bool { + $options = [ + 'mode' => $mode, + 'id' => $ruleID, + 'configurations' => $configuration->getArray() + ]; + + if ($description !== null) { + $options['description'] = $description; + } + + $user = $this->adapter->put('zones/' . $zoneID . '/firewall/ua_rules/' . $ruleID, $options); + + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + public function deleteRule(string $zoneID, string $ruleID): bool + { + $user = $this->adapter->delete('zones/' . $zoneID . '/firewall/ua_rules/' . $ruleID); + + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } +} diff --git a/src/Endpoints/User.php b/src/Endpoints/User.php new file mode 100644 index 0000000..93d3826 --- /dev/null +++ b/src/Endpoints/User.php @@ -0,0 +1,47 @@ +adapter = $adapter; + } + + public function getUserDetails(): \stdClass + { + $user = $this->adapter->get('user'); + $this->body = json_decode($user->getBody()); + return $this->body->result; + } + + public function getUserID(): string + { + return $this->getUserDetails()->id; + } + + public function getUserEmail(): string + { + return $this->getUserDetails()->email; + } + + public function updateUserDetails(array $details): \stdClass + { + $response = $this->adapter->patch('user', $details); + $this->body = json_decode($response->getBody()); + return $this->body; + } +} diff --git a/src/Endpoints/WAF.php b/src/Endpoints/WAF.php new file mode 100644 index 0000000..b1e3611 --- /dev/null +++ b/src/Endpoints/WAF.php @@ -0,0 +1,183 @@ +adapter = $adapter; + } + + public function getPackages( + string $zoneID, + int $page = 1, + int $perPage = 20, + string $order = '', + string $direction = '', + string $match = 'all' + ): \stdClass { + $query = [ + 'page' => $page, + 'per_page' => $perPage, + 'match' => $match + ]; + + if (!empty($order)) { + $query['order'] = $order; + } + + if (!empty($direction)) { + $query['direction'] = $direction; + } + + $user = $this->adapter->get('zones/' . $zoneID . '/firewall/waf/packages', $query); + $this->body = json_decode($user->getBody()); + + return (object)['result' => $this->body->result, 'result_info' => $this->body->result_info]; + } + + + public function getPackageInfo( + string $zoneID, + string $packageID + ): \stdClass { + $user = $this->adapter->get('zones/' . $zoneID . '/firewall/waf/packages/' . $packageID); + $this->body = json_decode($user->getBody()); + + return $this->body->result; + } + + public function getRules( + string $zoneID, + string $packageID, + int $page = 1, + int $perPage = 20, + string $order = '', + string $direction = '', + string $match = 'all' + ): \stdClass { + $query = [ + 'page' => $page, + 'per_page' => $perPage, + 'match' => $match + ]; + + if (!empty($order)) { + $query['order'] = $order; + } + + if (!empty($direction)) { + $query['direction'] = $direction; + } + $user = $this->adapter->get('zones/' . $zoneID . '/firewall/waf/packages/' . $packageID . '/rules', $query); + $this->body = json_decode($user->getBody()); + + return (object)['result' => $this->body->result, 'result_info' => $this->body->result_info]; + } + + public function getRuleInfo( + string $zoneID, + string $packageID, + string $ruleID + ): \stdClass { + $user = $this->adapter->get('zones/' . $zoneID . '/firewall/waf/packages/' . $packageID . '/rules/' . $ruleID); + $this->body = json_decode($user->getBody()); + + return $this->body->result; + } + + public function updateRule( + string $zoneID, + string $packageID, + string $ruleID, + string $status + ): \stdClass { + $query = [ + 'mode' => $status, + ]; + + $user = $this->adapter->patch( + 'zones/' . $zoneID . '/firewall/waf/packages/' . $packageID . '/rules/' . $ruleID, + $query + ); + $this->body = json_decode($user->getBody()); + + return $this->body->result; + } + + public function getGroups( + string $zoneID, + string $packageID, + int $page = 1, + int $perPage = 20, + string $order = '', + string $direction = '', + string $match = 'all' + ): \stdClass { + $query = [ + 'page' => $page, + 'per_page' => $perPage, + 'match' => $match + ]; + + if (!empty($order)) { + $query['order'] = $order; + } + + if (!empty($direction)) { + $query['direction'] = $direction; + } + + $user = $this->adapter->get( + 'zones/' . $zoneID . '/firewall/waf/packages/' . $packageID . '/groups', + $query + ); + $this->body = json_decode($user->getBody()); + + return (object)['result' => $this->body->result, 'result_info' => $this->body->result_info]; + } + + public function getGroupInfo( + string $zoneID, + string $packageID, + string $groupID + ): \stdClass { + $user = $this->adapter->get('zones/' . $zoneID . '/firewall/waf/packages/' . $packageID . '/groups/' . $groupID); + $this->body = json_decode($user->getBody()); + + return $this->body->result; + } + + public function updateGroup( + string $zoneID, + string $packageID, + string $groupID, + string $status + ): \stdClass { + $query = [ + 'mode' => $status + ]; + + $user = $this->adapter->patch( + 'zones/' . $zoneID . '/firewall/waf/packages/' . $packageID . '/groups/' . $groupID, + $query + ); + $this->body = json_decode($user->getBody()); + + return $this->body->result; + } +} diff --git a/src/Endpoints/ZoneLockdown.php b/src/Endpoints/ZoneLockdown.php new file mode 100644 index 0000000..aeccb25 --- /dev/null +++ b/src/Endpoints/ZoneLockdown.php @@ -0,0 +1,119 @@ +adapter = $adapter; + } + + public function listLockdowns( + string $zoneID, + int $page = 1, + int $perPage = 20 + ): \stdClass { + $query = [ + 'page' => $page, + 'per_page' => $perPage + ]; + + $user = $this->adapter->get('zones/' . $zoneID . '/firewall/lockdowns', $query); + $this->body = json_decode($user->getBody()); + + return (object)['result' => $this->body->result, 'result_info' => $this->body->result_info]; + } + + public function createLockdown( + string $zoneID, + array $urls, + \Cloudflare\API\Configurations\ZoneLockdown $configuration, + string $lockdownID = null, + string $description = null + ): bool { + $options = [ + 'urls' => $urls, + 'configurations' => $configuration->getArray() + ]; + + if ($lockdownID !== null) { + $options['id'] = $lockdownID; + } + + if ($description !== null) { + $options['description'] = $description; + } + + $user = $this->adapter->post('zones/' . $zoneID . '/firewall/lockdowns', $options); + + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + public function getLockdownDetails(string $zoneID, string $lockdownID): \stdClass + { + $user = $this->adapter->get('zones/' . $zoneID . '/firewall/lockdowns/' . $lockdownID); + $this->body = json_decode($user->getBody()); + return $this->body->result; + } + + public function updateLockdown( + string $zoneID, + string $lockdownID, + array $urls, + \Cloudflare\API\Configurations\ZoneLockdown $configuration, + string $description = null + ): bool { + $options = [ + 'urls' => $urls, + 'id' => $lockdownID, + 'configurations' => $configuration->getArray() + ]; + + if ($description !== null) { + $options['description'] = $description; + } + + $user = $this->adapter->put('zones/' . $zoneID . '/firewall/lockdowns/' . $lockdownID, $options); + + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + public function deleteLockdown(string $zoneID, string $lockdownID): bool + { + $user = $this->adapter->delete('zones/' . $zoneID . '/firewall/lockdowns/' . $lockdownID); + + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } +} diff --git a/src/Endpoints/ZoneSettings.php b/src/Endpoints/ZoneSettings.php new file mode 100644 index 0000000..7fc9f2f --- /dev/null +++ b/src/Endpoints/ZoneSettings.php @@ -0,0 +1,153 @@ +adapter = $adapter; + } + public function getMinifySetting($zoneID) { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/minify' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result; + } + + return false; + } + public function getRocketLoaderSetting($zoneID) { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/rocket_loader' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result; + } + + return false; + } + public function getAlwaysOnlineSetting($zoneID) { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/always_online' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result; + } + + return false; + } + public function getEmailObfuscationSetting($zoneID) { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/email_obfuscation' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result; + } + + return false; + } + public function getHotlinkProtectionSetting($zoneID) { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/hotlink_protection' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result; + } + + return false; + } + public function updateMinifySetting($zoneID, $html, $css, $js) { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/minify', [ + 'html' => $html, + 'css' => $css, + 'js' => $js + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + public function updateRocketLoaderSetting($zoneID, $value) { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/rocket_loader', [ + 'value' => $value + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + public function updateAlwaysOnlineSetting($zoneID, $value) { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/always_online', [ + 'value' => $value + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + public function updateEmailObfuscationSetting($zoneID, $value) { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/email_obfuscation', [ + 'value' => $value + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + public function updateHotlinkProtectionSetting($zoneID, $value) { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/hotlink_protection', [ + 'value' => $value + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } +} \ No newline at end of file diff --git a/src/Endpoints/Zones.php b/src/Endpoints/Zones.php new file mode 100644 index 0000000..8595cb6 --- /dev/null +++ b/src/Endpoints/Zones.php @@ -0,0 +1,195 @@ +adapter = $adapter; + } + + /** + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) + * + * @param string $name + * @param bool $jumpStart + * @param string $organizationID + * @return \stdClass + */ + public function addZone(string $name, bool $jumpStart = false, string $organizationID = ''): \stdClass + { + $options = [ + 'name' => $name, + 'jump_start' => $jumpStart + ]; + + if (!empty($organizationID)) { + $options['organization'] = ['id' => $organizationID]; + } + + $user = $this->adapter->post('zones', $options); + $this->body = json_decode($user->getBody()); + return $this->body->result; + } + + public function activationCheck(string $zoneID): bool + { + $user = $this->adapter->put('zones/' . $zoneID . '/activation_check'); + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + public function listZones( + string $name = '', + string $status = '', + int $page = 1, + int $perPage = 20, + string $order = '', + string $direction = '', + string $match = 'all' + ): \stdClass { + $query = [ + 'page' => $page, + 'per_page' => $perPage, + 'match' => $match + ]; + + if (!empty($name)) { + $query['name'] = $name; + } + + if (!empty($status)) { + $query['status'] = $status; + } + + if (!empty($order)) { + $query['order'] = $order; + } + + if (!empty($direction)) { + $query['direction'] = $direction; + } + + $user = $this->adapter->get('zones', $query); + $this->body = json_decode($user->getBody()); + + return (object)['result' => $this->body->result, 'result_info' => $this->body->result_info]; + } + + public function getZoneID(string $name = ''): string + { + $zones = $this->listZones($name); + + if (count($zones->result) < 1) { + throw new EndpointException('Could not find zones with specified name.'); + } + + return $zones->result[0]->id; + } + + /** + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) + * + * @param string $zoneID + * @param string $since + * @param string $until + * @param bool $continuous + * @return \stdClass + */ + public function getAnalyticsDashboard(string $zoneID, string $since = '-10080', string $until = '0', bool $continuous = true): \stdClass + { + $response = $this->adapter->get('zones/' . $zoneID . '/analytics/dashboard', ['since' => $since, 'until' => $until, 'continuous' => var_export($continuous, true)]); + + $this->body = $response->getBody(); + + return json_decode($this->body)->result; + } + + /** + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) + * + * @param string $zoneID + * @param bool $enable + * @return bool + */ + public function changeDevelopmentMode(string $zoneID, bool $enable = false): bool + { + $response = $this->adapter->patch('zones/' . $zoneID . '/settings/development_mode', ['value' => $enable ? 'on' : 'off']); + + $this->body = json_decode($response->getBody()); + + if ($this->body->success) { + return true; + } + + return false; + } + + + /** + * Purge Everything + * @param string $zoneID + * @return bool + */ + public function cachePurgeEverything(string $zoneID): bool + { + $user = $this->adapter->delete('zones/' . $zoneID . '/purge_cache', ['purge_everything' => true]); + + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + public function cachePurge(string $zoneID, array $files = null, array $tags = null, array $hosts = null): bool + { + if ($files === null && $tags === null && $hosts === null) { + throw new EndpointException('No files, tags or hosts to purge.'); + } + + $options = []; + if (!is_null($files)) { + $options['files'] = $files; + } + + if (!is_null($tags)) { + $options['tags'] = $tags; + } + + if (!is_null($hosts)) { + $options['hosts'] = $hosts; + } + + $user = $this->adapter->delete('zones/' . $zoneID . '/purge_cache', $options); + + $this->body = json_decode($user->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } +} diff --git a/src/Traits/BodyAccessorTrait.php b/src/Traits/BodyAccessorTrait.php new file mode 100644 index 0000000..add13ad --- /dev/null +++ b/src/Traits/BodyAccessorTrait.php @@ -0,0 +1,13 @@ +body; + } +} diff --git a/tests/Adapter/GuzzleTest.php b/tests/Adapter/GuzzleTest.php new file mode 100644 index 0000000..505ed72 --- /dev/null +++ b/tests/Adapter/GuzzleTest.php @@ -0,0 +1,136 @@ +getMockBuilder(\Cloudflare\API\Auth\Auth::class) + ->setMethods(['getHeaders']) + ->getMock(); + + $auth->method('getHeaders') + ->willReturn(['X-Testing' => 'Test']); + + $this->client = new \Cloudflare\API\Adapter\Guzzle($auth, 'https://httpbin.org/'); + } + + public function testGet() + { + $response = $this->client->get('https://httpbin.org/get'); + + $headers = $response->getHeaders(); + $this->assertEquals('application/json', $headers['Content-Type'][0]); + + $body = json_decode($response->getBody()); + $this->assertEquals('Test', $body->headers->{'X-Testing'}); + + $response = $this->client->get('https://httpbin.org/get', [], ['X-Another-Test' => 'Test2']); + $body = json_decode($response->getBody()); + $this->assertEquals('Test2', $body->headers->{'X-Another-Test'}); + } + + public function testPost() + { + $response = $this->client->post('https://httpbin.org/post', ['X-Post-Test' => 'Testing a POST request.']); + + $headers = $response->getHeaders(); + $this->assertEquals('application/json', $headers['Content-Type'][0]); + + $body = json_decode($response->getBody()); + $this->assertEquals('Testing a POST request.', $body->json->{'X-Post-Test'}); + } + + public function testPut() + { + $response = $this->client->put('https://httpbin.org/put', ['X-Put-Test' => 'Testing a PUT request.']); + + $headers = $response->getHeaders(); + $this->assertEquals('application/json', $headers['Content-Type'][0]); + + $body = json_decode($response->getBody()); + $this->assertEquals('Testing a PUT request.', $body->json->{'X-Put-Test'}); + } + + public function testPatch() + { + $response = $this->client->patch( + 'https://httpbin.org/patch', + ['X-Patch-Test' => 'Testing a PATCH request.'] + ); + + $headers = $response->getHeaders(); + $this->assertEquals('application/json', $headers['Content-Type'][0]); + + $body = json_decode($response->getBody()); + $this->assertEquals('Testing a PATCH request.', $body->json->{'X-Patch-Test'}); + } + + public function testDelete() + { + $response = $this->client->delete( + 'https://httpbin.org/delete', + ['X-Delete-Test' => 'Testing a DELETE request.'] + ); + + $headers = $response->getHeaders(); + $this->assertEquals('application/json', $headers['Content-Type'][0]); + + $body = json_decode($response->getBody()); + $this->assertEquals('Testing a DELETE request.', $body->json->{'X-Delete-Test'}); + } + + public function testErrors() + { + $class = new ReflectionClass(\Cloudflare\API\Adapter\Guzzle::class); + $method = $class->getMethod('checkError'); + $method->setAccessible(true); + + $body = + '{ + "result": null, + "success": false, + "errors": [{"code":1003,"message":"Invalid or missing zone id."}], + "messages": [] + }' + ; + $response = new Response(200, [], $body); + + $this->expectException(\Cloudflare\API\Adapter\ResponseException::class); + $method->invokeArgs($this->client, [$response]); + + $body = + '{ + "result": null, + "success": false, + "errors": [], + "messages": [] + }' + ; + $response = new Response(200, [], $body); + + $this->expectException(\Cloudflare\API\Adapter\ResponseException::class); + $method->invokeArgs($this->client, [$response]); + + $body = 'this isnt json.'; + $response = new Response(200, [], $body); + + $this->expectException(\Cloudflare\API\Adapter\JSONException::class); + $method->invokeArgs($this->client, [$response]); + } + + public function testNotFound() + { + $this->expectException(\GuzzleHttp\Exception\RequestException::class); + $this->client->get('https://httpbin.org/status/404'); + } +} diff --git a/tests/Auth/APIKeyTest.php b/tests/Auth/APIKeyTest.php new file mode 100644 index 0000000..10a788b --- /dev/null +++ b/tests/Auth/APIKeyTest.php @@ -0,0 +1,23 @@ +getHeaders(); + + $this->assertArrayHasKey('X-Auth-Key', $headers); + $this->assertArrayHasKey('X-Auth-Email', $headers); + + $this->assertEquals('example@example.com', $headers['X-Auth-Email']); + $this->assertEquals('1234567893feefc5f0q5000bfo0c38d90bbeb', $headers['X-Auth-Key']); + + $this->assertCount(2, $headers); + } +} diff --git a/tests/Auth/NoneTest.php b/tests/Auth/NoneTest.php new file mode 100644 index 0000000..7e46b42 --- /dev/null +++ b/tests/Auth/NoneTest.php @@ -0,0 +1,18 @@ +getHeaders(); + + $this->assertEquals([], $headers); + } +} diff --git a/tests/Auth/UserServiceKeyTest.php b/tests/Auth/UserServiceKeyTest.php new file mode 100644 index 0000000..53e29b3 --- /dev/null +++ b/tests/Auth/UserServiceKeyTest.php @@ -0,0 +1,24 @@ +getHeaders(); + + $this->assertArrayHasKey('X-Auth-User-Service-Key', $headers); + + $this->assertEquals( + 'v1.0-e24fd090c02efcfecb4de8f4ff246fd5c75b48946fdf0ce26c59f91d0d90797b-cfa33fe60e8e34073c149323454383fc9005d25c9b4c502c2f063457ef65322eade065975001a0b4b4c591c5e1bd36a6e8f7e2d4fa8a9ec01c64c041e99530c2-07b9efe0acd78c82c8d9c690aacb8656d81c369246d7f996a205fe3c18e9254a', + $headers['X-Auth-User-Service-Key'] + ); + + $this->assertCount(1, $headers); + } +} diff --git a/tests/Configurations/ConfigurationsUARulesTest.php b/tests/Configurations/ConfigurationsUARulesTest.php new file mode 100644 index 0000000..bd6d45b --- /dev/null +++ b/tests/Configurations/ConfigurationsUARulesTest.php @@ -0,0 +1,27 @@ +addUA('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4'); + + $array = $configuration->getArray(); + $this->assertCount(1, $array); + + $this->assertArrayHasKey('target', $array[0]); + $this->assertEquals('ua', $array[0]['target']); + $this->assertArrayHasKey('value', $array[0]); + $this->assertEquals( + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4', + $array[0]['value'] + ); + } +} diff --git a/tests/Configurations/ConfigurationsZoneLockdownTest.php b/tests/Configurations/ConfigurationsZoneLockdownTest.php new file mode 100644 index 0000000..7614042 --- /dev/null +++ b/tests/Configurations/ConfigurationsZoneLockdownTest.php @@ -0,0 +1,34 @@ +addIP('1.2.3.4'); + + $array = $configuration->getArray(); + $this->assertCount(1, $array); + + $this->assertArrayHasKey('target', $array[0]); + $this->assertEquals('ip', $array[0]['target']); + $this->assertArrayHasKey('value', $array[0]); + $this->assertEquals('1.2.3.4', $array[0]['value']); + + $configuration->addIPRange('1.2.3.4/24'); + + $array = $configuration->getArray(); + $this->assertCount(2, $array); + + $this->assertArrayHasKey('target', $array[1]); + $this->assertEquals('ip_range', $array[1]['target']); + $this->assertArrayHasKey('value', $array[1]); + $this->assertEquals('1.2.3.4/24', $array[1]['value']); + } +} diff --git a/tests/Configurations/PageRulesActionTest.php b/tests/Configurations/PageRulesActionTest.php new file mode 100644 index 0000000..cc0f871 --- /dev/null +++ b/tests/Configurations/PageRulesActionTest.php @@ -0,0 +1,21 @@ +setForwardingURL($statusCode, $forwardingURL); + $configuration = $actions->getArray(); + + $this->assertCount(1, $configuration); + $this->assertEquals($identifier, $configuration[0]['id']); + $this->assertEquals($statusCode, $configuration[0]['value']['status_code']); + $this->assertEquals($forwardingURL, $configuration[0]['value']['url']); + } +} diff --git a/tests/Configurations/PageRulesTargetTest.php b/tests/Configurations/PageRulesTargetTest.php new file mode 100644 index 0000000..d322c5e --- /dev/null +++ b/tests/Configurations/PageRulesTargetTest.php @@ -0,0 +1,22 @@ +getArray(); + + $this->assertCount(1, $array); + $this->assertEquals('junade.com/*', $array[0]['constraint']['value']); + $this->assertEquals('matches', $array[0]['constraint']['operator']); + } +} diff --git a/tests/Endpoints/AccessRulesTest.php b/tests/Endpoints/AccessRulesTest.php new file mode 100644 index 0000000..fbe4bd4 --- /dev/null +++ b/tests/Endpoints/AccessRulesTest.php @@ -0,0 +1,112 @@ +getPsr7JsonResponseForFixture('Endpoints/listAccessRules.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/access_rules/rules'), + $this->equalTo([ + 'page' => 1, + 'per_page' => 50, + 'match' => 'all' + ]) + ); + + $zones = new \Cloudflare\API\Endpoints\AccessRules($mock); + $result = $zones->listRules('023e105f4ecef8ad9ca31a8372d0c353'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertObjectHasAttribute('result_info', $result); + + $this->assertEquals('92f17202ed8bd63d69a66b86a49a8f6b', $result->result[0]->id); + $this->assertEquals(1, $result->result_info->page); + $this->assertEquals('92f17202ed8bd63d69a66b86a49a8f6b', $zones->getBody()->result[0]->id); + } + + public function testCreateRule() + { + $config = new \Cloudflare\API\Configurations\AccessRules(); + $config->setIP('1.2.3.4'); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/createAccessRule.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('post')->willReturn($response); + + $mock->expects($this->once()) + ->method('post') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/access_rules/rules'), + $this->equalTo([ + 'mode' => 'challenge', + 'configuration' => $config->getArray(), + 'notes' => 'This rule is on because of an event that occured on date X', + ]) + ); + + $rules = new \Cloudflare\API\Endpoints\AccessRules($mock); + $rules->createRule( + '023e105f4ecef8ad9ca31a8372d0c353', + 'challenge', + $config, + 'This rule is on because of an event that occured on date X' + ); + $this->assertEquals('92f17202ed8bd63d69a66b86a49a8f6b', $rules->getBody()->result->id); + } + + public function testUpdateRule() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateAccessRule.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/access_rules/rules/92f17202ed8bd63d69a66b86a49a8f6b'), + $this->equalTo([ + 'mode' => 'challenge', + 'notes' => 'This rule is on because of an event that occured on date X', + ]) + ); + + $rules = new \Cloudflare\API\Endpoints\AccessRules($mock); + $rules->updateRule( + '023e105f4ecef8ad9ca31a8372d0c353', + '92f17202ed8bd63d69a66b86a49a8f6b', + 'challenge', + 'This rule is on because of an event that occured on date X' + ); + $this->assertEquals('92f17202ed8bd63d69a66b86a49a8f6b', $rules->getBody()->result->id); + } + + public function testDeleteRule() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteAccessRule.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/access_rules/rules/92f17202ed8bd63d69a66b86a49a8f6b'), + $this->equalTo([ + 'cascade' => 'none' + ]) + ); + + $rules = new \Cloudflare\API\Endpoints\AccessRules($mock); + $rules->deleteRule('023e105f4ecef8ad9ca31a8372d0c353', '92f17202ed8bd63d69a66b86a49a8f6b'); + $this->assertEquals('92f17202ed8bd63d69a66b86a49a8f6b', $rules->getBody()->result->id); + } +} diff --git a/tests/Endpoints/CustomHostnamesTest.php b/tests/Endpoints/CustomHostnamesTest.php new file mode 100644 index 0000000..faa247f --- /dev/null +++ b/tests/Endpoints/CustomHostnamesTest.php @@ -0,0 +1,138 @@ +getPsr7JsonResponseForFixture('Endpoints/createCustomHostname.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('post')->willReturn($response); + + $mock->expects($this->once()) + ->method('post') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/custom_hostnames'), + $this->equalTo([ + 'hostname' => 'app.example.com', + 'ssl' => [ + 'method' => 'http', + 'type' => 'dv' + ] + ]) + ); + + $hostname = new CustomHostnames($mock); + $hostname->addHostname('023e105f4ecef8ad9ca31a8372d0c353', 'app.example.com', 'http', 'dv'); + $this->assertEquals('0d89c70d-ad9f-4843-b99f-6cc0252067e9', $hostname->getBody()->result->id); + } + + public function testListHostnames() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/listHostnames.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/custom_hostnames'), + $this->equalTo([ + 'hostname' => 'app.example.com', + 'id' => '0d89c70d-ad9f-4843-b99f-6cc0252067e9', + 'page' => 1, + 'per_page' => 20, + 'order' => 'ssl', + 'direction' => 'desc', + 'ssl' => 0 + ]) + ); + + $zones = new \Cloudflare\API\Endpoints\CustomHostnames($mock); + $result = $zones->listHostnames('023e105f4ecef8ad9ca31a8372d0c353', 'app.example.com', '0d89c70d-ad9f-4843-b99f-6cc0252067e9', 1, 20, 'ssl', 'desc', 0); + + $this->assertObjectHasAttribute('result', $result); + $this->assertObjectHasAttribute('result_info', $result); + + $this->assertEquals('0d89c70d-ad9f-4843-b99f-6cc0252067e9', $result->result[0]->id); + $this->assertEquals(1, $result->result_info->page); + $this->assertEquals('0d89c70d-ad9f-4843-b99f-6cc0252067e9', $zones->getBody()->result[0]->id); + } + + public function testGetHostname() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getHostname.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/custom_hostnames/0d89c70d-ad9f-4843-b99f-6cc0252067e9') + ); + + $zones = new \Cloudflare\API\Endpoints\CustomHostnames($mock); + $result = $zones->getHostname('023e105f4ecef8ad9ca31a8372d0c353', '0d89c70d-ad9f-4843-b99f-6cc0252067e9', '0d89c70d-ad9f-4843-b99f-6cc0252067e9'); + + $this->assertObjectHasAttribute('id', $result); + $this->assertObjectHasAttribute('hostname', $result); + $this->assertEquals('0d89c70d-ad9f-4843-b99f-6cc0252067e9', $zones->getBody()->result->id); + } + + public function testUpdateHostname() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateHostname.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/custom_hostnames/0d89c70d-ad9f-4843-b99f-6cc0252067e9'), + $this->equalTo([ + 'ssl' => [ + 'method' => 'http', + 'type' => 'dv' + ] + ]) + ); + + $zones = new \Cloudflare\API\Endpoints\CustomHostnames($mock); + $result = $zones->updateHostname('023e105f4ecef8ad9ca31a8372d0c353', '0d89c70d-ad9f-4843-b99f-6cc0252067e9', 'http', 'dv'); + + $this->assertObjectHasAttribute('id', $result); + $this->assertObjectHasAttribute('hostname', $result); + $this->assertEquals('0d89c70d-ad9f-4843-b99f-6cc0252067e9', $zones->getBody()->result->id); + } + + public function testDeleteHostname() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteHostname.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/custom_hostnames/0d89c70d-ad9f-4843-b99f-6cc0252067e9') + ); + + $zones = new \Cloudflare\API\Endpoints\CustomHostnames($mock); + $result = $zones->deleteHostname('023e105f4ecef8ad9ca31a8372d0c353', '0d89c70d-ad9f-4843-b99f-6cc0252067e9'); + + $this->assertEquals('0d89c70d-ad9f-4843-b99f-6cc0252067e9', $result->id); + $this->assertEquals('0d89c70d-ad9f-4843-b99f-6cc0252067e9', $zones->getBody()->id); + } +} diff --git a/tests/Endpoints/DNSTest.php b/tests/Endpoints/DNSTest.php new file mode 100644 index 0000000..11c21fa --- /dev/null +++ b/tests/Endpoints/DNSTest.php @@ -0,0 +1,121 @@ +getPsr7JsonResponseForFixture('Endpoints/addRecord.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('post')->willReturn($response); + + $mock->expects($this->once()) + ->method('post') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records'), + $this->equalTo([ + 'type' => 'A', + 'name' => 'example.com', + 'content' => '127.0.0.1', + 'ttl' => 120, + 'proxied' => false + ]) + ); + + $dns = new \Cloudflare\API\Endpoints\DNS($mock); + $dns->addRecord('023e105f4ecef8ad9ca31a8372d0c353', 'A', 'example.com', '127.0.0.1', '120', false); + } + + public function testListRecords() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/listRecords.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records'), + $this->equalTo([ + 'page' => 1, + 'per_page' => 20, + 'match' => 'all', + 'type' => 'A', + 'name' => 'example.com', + 'content' => '127.0.0.1', + 'order' => 'type', + 'direction' => 'desc', + ]) + ); + + $zones = new \Cloudflare\API\Endpoints\DNS($mock); + $result = $zones->listRecords('023e105f4ecef8ad9ca31a8372d0c353', 'A', 'example.com', '127.0.0.1', 1, 20, 'type', 'desc'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertObjectHasAttribute('result_info', $result); + + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $result->result[0]->id); + $this->assertEquals(1, $result->result_info->page); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $zones->getBody()->result[0]->id); + } + + public function testGetDNSRecordDetails() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getDNSRecordDetails.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records/372e67954025e0ba6aaa6d586b9e0b59') + ); + + $dns = new \Cloudflare\API\Endpoints\DNS($mock); + $result = $dns->getRecordDetails('023e105f4ecef8ad9ca31a8372d0c353', '372e67954025e0ba6aaa6d586b9e0b59'); + + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $result->id); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $dns->getBody()->result->id); + } + + public function testUpdateDNSRecord() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateDNSRecord.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('put')->willReturn($response); + + $details = [ + 'type' => 'A', + 'name' => 'example.com', + 'content' => '1.2.3.4', + 'ttl' => 120, + 'proxied' => false, + ]; + + $mock->expects($this->once()) + ->method('put') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records/372e67954025e0ba6aaa6d586b9e0b59'), + $this->equalTo($details) + ); + + $dns = new \Cloudflare\API\Endpoints\DNS($mock); + $result = $dns->updateRecordDetails('023e105f4ecef8ad9ca31a8372d0c353', '372e67954025e0ba6aaa6d586b9e0b59', $details); + + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $result->result->id); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $dns->getBody()->result->id); + + foreach ($details as $property => $value) { + $this->assertEquals($result->result->{ $property }, $value); + } + } +} diff --git a/tests/Endpoints/IPsTest.php b/tests/Endpoints/IPsTest.php new file mode 100644 index 0000000..1f92804 --- /dev/null +++ b/tests/Endpoints/IPsTest.php @@ -0,0 +1,31 @@ +getPsr7JsonResponseForFixture('Endpoints/listIPs.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('ips') + ); + + $ipsMock = new \Cloudflare\API\Endpoints\IPs($mock); + $ips = $ipsMock->listIPs(); + $this->assertObjectHasAttribute('ipv4_cidrs', $ips); + $this->assertObjectHasAttribute('ipv6_cidrs', $ips); + $this->assertObjectHasAttribute('ipv4_cidrs', $ipsMock->getBody()->result); + $this->assertObjectHasAttribute('ipv6_cidrs', $ipsMock->getBody()->result); + } +} diff --git a/tests/Endpoints/PageRulesTest.php b/tests/Endpoints/PageRulesTest.php new file mode 100644 index 0000000..f2813fd --- /dev/null +++ b/tests/Endpoints/PageRulesTest.php @@ -0,0 +1,132 @@ +setAlwaysOnline(true); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/createPageRule.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('post')->willReturn($response); + + $mock->expects($this->once()) + ->method('post') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/pagerules'), + $this->equalTo([ + 'targets' => $target->getArray(), + 'actions' => $action->getArray(), + 'status' => 'active', + 'priority' => 1 + ]) + ); + + $pageRules = new \Cloudflare\API\Endpoints\PageRules($mock); + $result = $pageRules->createPageRule('023e105f4ecef8ad9ca31a8372d0c353', $target, $action, true, 1); + + $this->assertTrue($result); + $this->assertEquals('9a7806061c88ada191ed06f989cc3dac', $pageRules->getBody()->result->id); + } + + public function testListPageRules() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/listPageRules.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/pagerules'), + $this->equalTo([ + 'status' => 'active', + 'order' => 'status', + 'direction' => 'desc', + 'match' => 'all' + ]) + ); + + $pageRules = new \Cloudflare\API\Endpoints\PageRules($mock); + $pageRules->listPageRules('023e105f4ecef8ad9ca31a8372d0c353', 'active', 'status', 'desc', 'all'); + $this->assertEquals('9a7806061c88ada191ed06f989cc3dac', $pageRules->getBody()->result[0]->id); + } + + public function testGetPageRuleDetails() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getPageRuleDetails.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/pagerules/9a7806061c88ada191ed06f989cc3dac') + ); + + $pageRules = new \Cloudflare\API\Endpoints\PageRules($mock); + $pageRules->getPageRuleDetails('023e105f4ecef8ad9ca31a8372d0c353', '9a7806061c88ada191ed06f989cc3dac'); + $this->assertEquals('9a7806061c88ada191ed06f989cc3dac', $pageRules->getBody()->result->id); + } + + public function testUpdatePageRule() + { + $target = new \Cloudflare\API\Configurations\PageRulesTargets('*example.com/images/*'); + $action = new \Cloudflare\API\Configurations\PageRulesActions(); + $action->setAlwaysOnline(true); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updatePageRule.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/pagerules'), + $this->equalTo([ + 'targets' => $target->getArray(), + 'actions' => $action->getArray(), + 'status' => 'active', + 'priority' => 1 + ]) + ); + + $pageRules = new \Cloudflare\API\Endpoints\PageRules($mock); + $result = $pageRules->updatePageRule('023e105f4ecef8ad9ca31a8372d0c353', $target, $action, true, 1); + + $this->assertTrue($result); + $this->assertEquals('9a7806061c88ada191ed06f989cc3dac', $pageRules->getBody()->result->id); + } + + public function testDeletePageRule() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deletePageRule.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/pagerules/9a7806061c88ada191ed06f989cc3dac') + ); + + $pageRules = new \Cloudflare\API\Endpoints\PageRules($mock); + $result = $pageRules->deletePageRule('023e105f4ecef8ad9ca31a8372d0c353', '9a7806061c88ada191ed06f989cc3dac'); + + $this->assertTrue($result); + $this->assertEquals('9a7806061c88ada191ed06f989cc3dac', $pageRules->getBody()->result->id); + } +} diff --git a/tests/Endpoints/RailgunTest.php b/tests/Endpoints/RailgunTest.php new file mode 100644 index 0000000..15e210b --- /dev/null +++ b/tests/Endpoints/RailgunTest.php @@ -0,0 +1,149 @@ + 'My Railgun', + ]; + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/createRailgun.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('post')->willReturn($response); + + $mock->expects($this->once()) + ->method('post') + ->with( + $this->equalTo('railguns'), + $this->equalTo(['name' => $details['name']]) + ); + + $railgun = new \Cloudflare\API\Endpoints\Railgun($mock); + $result = $railgun->create($details['name']); + + $this->assertObjectHasAttribute('result', $result); + + foreach ($details as $property => $value) { + $this->assertEquals($result->result->{ $property }, $value); + } + $this->assertEquals('e928d310693a83094309acf9ead50448', $railgun->getBody()->result->id); + } + + public function testlist() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/listRailguns.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('railguns'), + $this->equalTo([ + 'page' => 1, + 'per_page' => 20, + 'direction' => 'desc' + ]) + ); + + $railgun = new \Cloudflare\API\Endpoints\Railgun($mock); + $result = $railgun->list(1, 20, 'desc'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertObjectHasAttribute('result_info', $result); + $this->assertEquals('e928d310693a83094309acf9ead50448', $railgun->getBody()->result[0]->id); + } + + public function testget() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getRailgun.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('railguns/e928d310693a83094309acf9ead50448') + ); + + $railgun = new \Cloudflare\API\Endpoints\Railgun($mock); + $result = $railgun->get('e928d310693a83094309acf9ead50448'); + + $this->assertEquals('e928d310693a83094309acf9ead50448', $result->id); + $this->assertEquals('e928d310693a83094309acf9ead50448', $railgun->getBody()->result->id); + } + + public function testgetZones() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/listRailgunZones.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('railguns/e928d310693a83094309acf9ead50448/zones') + ); + + $railgun = new \Cloudflare\API\Endpoints\Railgun($mock); + $result = $railgun->getZones('e928d310693a83094309acf9ead50448'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertObjectHasAttribute('result_info', $result); + $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $railgun->getBody()->result[0]->id); + } + + public function testupdate() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateRailgun.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $details = [ + 'enabled' => true, + ]; + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('railguns/e928d310693a83094309acf9ead50448'), + $this->equalTo($details) + ); + + $waf = new \Cloudflare\API\Endpoints\Railgun($mock); + $result = $waf->update('e928d310693a83094309acf9ead50448', true); + + $this->assertEquals('e928d310693a83094309acf9ead50448', $result->id); + $this->assertEquals('e928d310693a83094309acf9ead50448', $waf->getBody()->result->id); + } + + public function testdelete() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteRailgun.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('railguns/e928d310693a83094309acf9ead50448') + ); + + $waf = new \Cloudflare\API\Endpoints\Railgun($mock); + $waf->delete('e928d310693a83094309acf9ead50448'); + $this->assertEquals('e928d310693a83094309acf9ead50448', $waf->getBody()->result->id); + } +} diff --git a/tests/Endpoints/TLSTest.php b/tests/Endpoints/TLSTest.php new file mode 100644 index 0000000..d17aabb --- /dev/null +++ b/tests/Endpoints/TLSTest.php @@ -0,0 +1,71 @@ +getPsr7JsonResponseForFixture('Endpoints/enableTLS13.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/tls_1_3'), + $this->equalTo(['value' => 'on']) + ); + + $zoneTLSSettings = new \Cloudflare\API\Endpoints\TLS($mock); + $result = $zoneTLSSettings->enableTLS13('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', true); + + $this->assertTrue($result); + } + + public function testDisableTLS13() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/disableTLS13.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/tls_1_3'), + $this->equalTo(['value' => 'off']) + ); + + $zoneTLSSettings = new \Cloudflare\API\Endpoints\TLS($mock); + $result = $zoneTLSSettings->disableTLS13('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', true); + + $this->assertTrue($result); + } + + public function testChangeMinimimTLSVersion() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/changeMinimumTLSVersion.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/min_tls_version'), + $this->equalTo(['value' => '1.1']) + ); + + $zoneTLSSettings = new \Cloudflare\API\Endpoints\TLS($mock); + $result = $zoneTLSSettings->changeMinimumTLSVersion('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', '1.1'); + + $this->assertTrue($result); + } +} diff --git a/tests/Endpoints/UARulesTest.php b/tests/Endpoints/UARulesTest.php new file mode 100644 index 0000000..fec94b5 --- /dev/null +++ b/tests/Endpoints/UARulesTest.php @@ -0,0 +1,142 @@ +getPsr7JsonResponseForFixture('Endpoints/listRules.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/ua_rules'), + $this->equalTo([ + 'page' => 1, + 'per_page' => 20 + ]) + ); + + $zones = new \Cloudflare\API\Endpoints\UARules($mock); + $result = $zones->listRules('023e105f4ecef8ad9ca31a8372d0c353'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertObjectHasAttribute('result_info', $result); + + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $result->result[0]->id); + $this->assertEquals(1, $result->result_info->page); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $zones->getBody()->result[0]->id); + } + + public function testCreateRule() + { + $config = new \Cloudflare\API\Configurations\UARules(); + $config->addUA('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4'); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/createRule.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('post')->willReturn($response); + + $mock->expects($this->once()) + ->method('post') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/ua_rules'), + $this->equalTo([ + 'mode' => 'js_challenge', + 'id' => '372e67954025e0ba6aaa6d586b9e0b59', + 'description' => 'Prevent access from abusive clients identified by this UserAgent to mitigate DDoS attack', + 'configurations' => $config->getArray(), + ]) + ); + + $rules = new \Cloudflare\API\Endpoints\UARules($mock); + $rules->createRule( + '023e105f4ecef8ad9ca31a8372d0c353', + 'js_challenge', + $config, + '372e67954025e0ba6aaa6d586b9e0b59', + 'Prevent access from abusive clients identified by this UserAgent to mitigate DDoS attack' + ); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $rules->getBody()->result->id); + } + + public function getRuleDetails() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getRuleDetails.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/ua_rules/372e67954025e0ba6aaa6d586b9e0b59') + ); + + $lockdown = new \Cloudflare\API\Endpoints\UARules($mock); + $result = $lockdown->getRuleDetails('023e105f4ecef8ad9ca31a8372d0c353', '372e67954025e0ba6aaa6d586b9e0b59'); + + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $result->id); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $lockdown->getBody()->result->id); + } + + public function testUpdateRule() + { + $config = new \Cloudflare\API\Configurations\UARules(); + $config->addUA('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4'); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateRule.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('put')->willReturn($response); + + $mock->expects($this->once()) + ->method('put') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/ua_rules/372e67954025e0ba6aaa6d586b9e0b59'), + $this->equalTo([ + 'mode' => 'js_challenge', + 'id' => '372e67954025e0ba6aaa6d586b9e0b59', + 'description' => 'Restrict access to these endpoints to requests from a known IP address', + 'configurations' => $config->getArray(), + ]) + ); + + $rules = new \Cloudflare\API\Endpoints\UARules($mock); + $rules->updateRule( + '023e105f4ecef8ad9ca31a8372d0c353', + '372e67954025e0ba6aaa6d586b9e0b59', + 'js_challenge', + $config, + 'Restrict access to these endpoints to requests from a known IP address' + ); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $rules->getBody()->result->id); + } + + public function testDeleteRule() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteRule.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/ua_rules/372e67954025e0ba6aaa6d586b9e0b59') + ); + + $rules = new \Cloudflare\API\Endpoints\UARules($mock); + $rules->deleteRule('023e105f4ecef8ad9ca31a8372d0c353', '372e67954025e0ba6aaa6d586b9e0b59'); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $rules->getBody()->result->id); + } +} diff --git a/tests/Endpoints/UserTest.php b/tests/Endpoints/UserTest.php new file mode 100644 index 0000000..07dc424 --- /dev/null +++ b/tests/Endpoints/UserTest.php @@ -0,0 +1,68 @@ +getPsr7JsonResponseForFixture('Endpoints/getUserDetails.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $user = new \Cloudflare\API\Endpoints\User($mock); + $details = $user->getUserDetails(); + + $this->assertObjectHasAttribute('id', $details); + $this->assertEquals('7c5dae5552338874e5053f2534d2767a', $details->id); + $this->assertObjectHasAttribute('email', $details); + $this->assertEquals('user@example.com', $details->email); + $this->assertEquals('7c5dae5552338874e5053f2534d2767a', $user->getBody()->result->id); + } + + public function testGetUserID() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getUserId.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $user = new \Cloudflare\API\Endpoints\User($mock); + $this->assertEquals('7c5dae5552338874e5053f2534d2767a', $user->getUserID()); + $this->assertEquals('7c5dae5552338874e5053f2534d2767a', $user->getBody()->result->id); + } + + public function testGetUserEmail() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getUserEmail.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once())->method('get'); + + $user = new \Cloudflare\API\Endpoints\User($mock); + $this->assertEquals('user@example.com', $user->getUserEmail()); + $this->assertEquals('user@example.com', $user->getBody()->result->email); + } + + public function testUpdateUserDetails() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateUserDetails.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with($this->equalTo('user'), $this->equalTo(['email' => 'user2@example.com'])); + + $user = new \Cloudflare\API\Endpoints\User($mock); + $user->updateUserDetails(['email' => 'user2@example.com']); + $this->assertEquals('7c5dae5552338874e5053f2534d2767a', $user->getBody()->result->id); + } +} diff --git a/tests/Endpoints/WAFTest.php b/tests/Endpoints/WAFTest.php new file mode 100644 index 0000000..f0c97aa --- /dev/null +++ b/tests/Endpoints/WAFTest.php @@ -0,0 +1,221 @@ +getPsr7JsonResponseForFixture('Endpoints/listPackages.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/waf/packages'), + $this->equalTo([ + 'page' => 1, + 'per_page' => 20, + 'match' => 'all', + 'order' => 'status', + 'direction' => 'desc' + ]) + ); + + $waf = new \Cloudflare\API\Endpoints\WAF($mock); + $result = $waf->getPackages('023e105f4ecef8ad9ca31a8372d0c353', 1, 20, 'status', 'desc'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertObjectHasAttribute('result_info', $result); + + $this->assertEquals('a25a9a7e9c00afc1fb2e0245519d725b', $result->result[0]->id); + $this->assertEquals(1, $result->result_info->page); + $this->assertEquals('a25a9a7e9c00afc1fb2e0245519d725b', $waf->getBody()->result[0]->id); + } + + public function testgetPackageInfo() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getPackageInfo.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/waf/packages/a25a9a7e9c00afc1fb2e0245519d725b') + ); + + $waf = new \Cloudflare\API\Endpoints\WAF($mock); + $result = $waf->getPackageInfo('023e105f4ecef8ad9ca31a8372d0c353', 'a25a9a7e9c00afc1fb2e0245519d725b'); + + $this->assertEquals('a25a9a7e9c00afc1fb2e0245519d725b', $result->id); + $this->assertEquals('a25a9a7e9c00afc1fb2e0245519d725b', $waf->getBody()->result->id); + } + + public function testgetRules() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/listPackageRules.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/waf/packages/a25a9a7e9c00afc1fb2e0245519d725b/rules'), + $this->equalTo([ + 'page' => 1, + 'per_page' => 20, + 'match' => 'all', + 'order' => 'status', + 'direction' => 'desc' + ]) + ); + + $waf = new \Cloudflare\API\Endpoints\WAF($mock); + $result = $waf->getRules('023e105f4ecef8ad9ca31a8372d0c353', 'a25a9a7e9c00afc1fb2e0245519d725b', 1, 20, 'status', 'desc'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertObjectHasAttribute('result_info', $result); + + $this->assertEquals('92f17202ed8bd63d69a66b86a49a8f6b', $result->result[0]->id); + $this->assertEquals(1, $result->result_info->page); + $this->assertEquals('92f17202ed8bd63d69a66b86a49a8f6b', $waf->getBody()->result[0]->id); + } + + public function testgetRuleInfo() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getPackageRuleInfo.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/waf/packages/a25a9a7e9c00afc1fb2e0245519d725b/rules/f939de3be84e66e757adcdcb87908023') + ); + + $waf = new \Cloudflare\API\Endpoints\WAF($mock); + $result = $waf->getRuleInfo('023e105f4ecef8ad9ca31a8372d0c353', 'a25a9a7e9c00afc1fb2e0245519d725b', 'f939de3be84e66e757adcdcb87908023'); + + $this->assertEquals('f939de3be84e66e757adcdcb87908023', $result->id); + $this->assertEquals('f939de3be84e66e757adcdcb87908023', $waf->getBody()->result->id); + } + + public function testupdateRule() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updatePackageRule.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $details = [ + 'mode' => 'on', + ]; + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/waf/packages/a25a9a7e9c00afc1fb2e0245519d725b/rules/f939de3be84e66e757adcdcb87908023'), + $this->equalTo($details) + ); + + $waf = new \Cloudflare\API\Endpoints\WAF($mock); + $result = $waf->updateRule('023e105f4ecef8ad9ca31a8372d0c353', 'a25a9a7e9c00afc1fb2e0245519d725b', 'f939de3be84e66e757adcdcb87908023', 'on'); + + $this->assertEquals('f939de3be84e66e757adcdcb87908023', $result->id); + + foreach ($details as $property => $value) { + $this->assertEquals($result->{ $property }, $value); + } + $this->assertEquals('f939de3be84e66e757adcdcb87908023', $waf->getBody()->result->id); + } + + public function getGroups() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/listPackageGroups.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/waf/packages/a25a9a7e9c00afc1fb2e0245519d725b/groups'), + $this->equalTo([ + 'page' => 1, + 'per_page' => 20, + 'match' => 'all', + 'order' => 'status', + 'direction' => 'desc' + ]) + ); + + $waf = new \Cloudflare\API\Endpoints\WAF($mock); + $result = $waf->getGroups('023e105f4ecef8ad9ca31a8372d0c353', 'a25a9a7e9c00afc1fb2e0245519d725b', 1, 20, 'status', 'desc'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertObjectHasAttribute('result_info', $result); + + $this->assertEquals('de677e5818985db1285d0e80225f06e5', $result->result[0]->id); + $this->assertEquals(1, $result->result_info->page); + $this->assertEquals('de677e5818985db1285d0e80225f06e5', $waf->getBody()->result[0]->id); + } + + public function testgetGroupInfo() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getPackageGroupInfo.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/waf/packages/a25a9a7e9c00afc1fb2e0245519d725b/groups/de677e5818985db1285d0e80225f06e5') + ); + + $waf = new \Cloudflare\API\Endpoints\WAF($mock); + $result = $waf->getGroupInfo('023e105f4ecef8ad9ca31a8372d0c353', 'a25a9a7e9c00afc1fb2e0245519d725b', 'de677e5818985db1285d0e80225f06e5'); + + $this->assertEquals('de677e5818985db1285d0e80225f06e5', $result->id); + $this->assertEquals('de677e5818985db1285d0e80225f06e5', $waf->getBody()->result->id); + } + + public function testupdateGroup() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updatePackageGroup.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $details = [ + 'mode' => 'off', + ]; + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/waf/packages/a25a9a7e9c00afc1fb2e0245519d725b/groups/de677e5818985db1285d0e80225f06e5'), + $this->equalTo($details) + ); + + $waf = new \Cloudflare\API\Endpoints\WAF($mock); + $result = $waf->updateGroup('023e105f4ecef8ad9ca31a8372d0c353', 'a25a9a7e9c00afc1fb2e0245519d725b', 'de677e5818985db1285d0e80225f06e5', 'off'); + + $this->assertEquals('de677e5818985db1285d0e80225f06e5', $result->id); + + foreach ($details as $property => $value) { + $this->assertEquals($result->{ $property }, $value); + } + $this->assertEquals('de677e5818985db1285d0e80225f06e5', $waf->getBody()->result->id); + } +} diff --git a/tests/Endpoints/ZoneLockdownTest.php b/tests/Endpoints/ZoneLockdownTest.php new file mode 100644 index 0000000..2af55ac --- /dev/null +++ b/tests/Endpoints/ZoneLockdownTest.php @@ -0,0 +1,145 @@ +getPsr7JsonResponseForFixture('Endpoints/listLockdowns.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/lockdowns'), + $this->equalTo([ + 'page' => 1, + 'per_page' => 20, + ]) + ); + + $zones = new \Cloudflare\API\Endpoints\ZoneLockdown($mock); + $result = $zones->listLockdowns('023e105f4ecef8ad9ca31a8372d0c353'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertObjectHasAttribute('result_info', $result); + + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $result->result[0]->id); + $this->assertEquals(1, $result->result_info->page); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $zones->getBody()->result[0]->id); + } + + public function testAddLockdown() + { + $config = new \Cloudflare\API\Configurations\ZoneLockdown(); + $config->addIP('1.2.3.4'); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/addLockdown.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('post')->willReturn($response); + + $mock->expects($this->once()) + ->method('post') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/lockdowns'), + $this->equalTo([ + 'urls' => ['api.mysite.com/some/endpoint*'], + 'id' => '372e67954025e0ba6aaa6d586b9e0b59', + 'description' => 'Restrict access to these endpoints to requests from a known IP address', + 'configurations' => $config->getArray(), + ]) + ); + + $zoneLockdown = new \Cloudflare\API\Endpoints\ZoneLockdown($mock); + $zoneLockdown->createLockdown( + '023e105f4ecef8ad9ca31a8372d0c353', + ['api.mysite.com/some/endpoint*'], + $config, + '372e67954025e0ba6aaa6d586b9e0b59', + 'Restrict access to these endpoints to requests from a known IP address' + ); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $zoneLockdown->getBody()->result->id); + } + + public function testGetRecordDetails() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getRecordDetails.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/lockdowns/372e67954025e0ba6aaa6d586b9e0b59') + ); + + $lockdown = new \Cloudflare\API\Endpoints\ZoneLockdown($mock); + $result = $lockdown->getLockdownDetails('023e105f4ecef8ad9ca31a8372d0c353', '372e67954025e0ba6aaa6d586b9e0b59'); + + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $result->id); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $lockdown->getBody()->result->id); + } + + public function testUpdateLockdown() + { + $config = new \Cloudflare\API\Configurations\ZoneLockdown(); + $config->addIP('1.2.3.4'); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateLockdown.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('put')->willReturn($response); + + $mock->expects($this->once()) + ->method('put') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/lockdowns/372e67954025e0ba6aaa6d586b9e0b59'), + $this->equalTo([ + 'urls' => ['api.mysite.com/some/endpoint*'], + 'id' => '372e67954025e0ba6aaa6d586b9e0b59', + 'description' => 'Restrict access to these endpoints to requests from a known IP address', + 'configurations' => $config->getArray(), + ]) + ); + + $zoneLockdown = new \Cloudflare\API\Endpoints\ZoneLockdown($mock); + $zoneLockdown->updateLockdown( + '023e105f4ecef8ad9ca31a8372d0c353', + '372e67954025e0ba6aaa6d586b9e0b59', + ['api.mysite.com/some/endpoint*'], + $config, + 'Restrict access to these endpoints to requests from a known IP address' + ); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $zoneLockdown->getBody()->result->id); + } + + public function testDeleteLockdown() + { + $config = new \Cloudflare\API\Configurations\ZoneLockdown(); + $config->addIP('1.2.3.4'); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteLockdown.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/lockdowns/372e67954025e0ba6aaa6d586b9e0b59') + ); + + $zoneLockdown = new \Cloudflare\API\Endpoints\ZoneLockdown($mock); + $zoneLockdown->deleteLockdown('023e105f4ecef8ad9ca31a8372d0c353', '372e67954025e0ba6aaa6d586b9e0b59'); + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $zoneLockdown->getBody()->result->id); + } +} diff --git a/tests/Endpoints/ZonesTest.php b/tests/Endpoints/ZonesTest.php new file mode 100644 index 0000000..0bda651 --- /dev/null +++ b/tests/Endpoints/ZonesTest.php @@ -0,0 +1,246 @@ +getPsr7JsonResponseForFixture('Endpoints/addZone.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('post')->willReturn($response); + + $mock->expects($this->once()) + ->method('post') + ->with( + $this->equalTo('zones'), + $this->equalTo(['name' => 'example.com', 'jump_start' => false]) + ); + + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $result = $zones->addZone('example.com'); + + $this->assertObjectHasAttribute('id', $result); + $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $result->id); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/createPageRule.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('post')->willReturn($response); + + $mock->expects($this->once()) + ->method('post') + ->with( + $this->equalTo('zones'), + $this->equalTo([ + 'name' => 'example.com', + 'jump_start' => true, + 'organization' => ['id' => '01a7362d577a6c3019a474fd6f485823'] + ]) + ); + + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $zones->addZone('example.com', true, '01a7362d577a6c3019a474fd6f485823'); + $this->assertEquals('9a7806061c88ada191ed06f989cc3dac', $zones->getBody()->result->id); + } + + public function testActivationTest() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/activationTest.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('put')->willReturn($response); + + $mock->expects($this->once()) + ->method('put') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/activation_check') + ); + + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $result = $zones->activationCheck('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertTrue($result); + $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result->id); + } + + public function testListZones() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/listZones.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones'), + $this->equalTo([ + 'page' => 1, + 'per_page' => 20, + 'match' => 'all', + 'name' => 'example.com', + 'status' => 'active', + 'order' => 'status', + 'direction' => 'desc', + ]) + ); + + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $result = $zones->listZones('example.com', 'active', 1, 20, 'status', 'desc'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertObjectHasAttribute('result_info', $result); + + $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $result->result[0]->id); + $this->assertEquals(1, $result->result_info->page); + $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result[0]->id); + } + + public function testGetZoneID() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getZoneId.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones'), + $this->equalTo([ + 'page' => 1, + 'per_page' => 20, + 'match' => 'all', + 'name' => 'example.com', + ]) + ); + + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $result = $zones->getZoneID('example.com'); + + $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $result); + $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result[0]->id); + } + + public function testGetAnalyticsDashboard() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getAnalyticsDashboard.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/analytics/dashboard'), + $this->equalTo(['since' => '-10080', 'until' => '0', 'continuous' => var_export(true, true)]) + ); + + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $analytics = $zones->getAnalyticsDashboard('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertObjectHasAttribute('since', $analytics->totals); + $this->assertObjectHasAttribute('since', $analytics->timeseries[0]); + } + + public function testChangeDevelopmentMode() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/changeDevelopmentMode.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/development_mode'), + $this->equalTo(['value' => 'on']) + ); + + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $result = $zones->changeDevelopmentMode('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', true); + + $this->assertTrue($result); + $this->assertEquals('development_mode', $zones->getBody()->result->id); + } + + public function testCachePurgeEverything() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/cachePurgeEverything.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/purge_cache'), + $this->equalTo(['purge_everything' => true]) + ); + + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $result = $zones->cachePurgeEverything('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertTrue($result); + $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result->id); + } + + public function testCachePurgeHost() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/cachePurgeHost.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/purge_cache'), + $this->equalTo( + [ + 'files' => [], + 'tags' => [], + 'hosts' => ['dash.cloudflare.com'] + ] + ) + ); + + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $result = $zones->cachePurge('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', [], [], ['dash.cloudflare.com']); + + $this->assertTrue($result); + $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result->id); + } + + public function testCachePurge() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/cachePurge.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/purge_cache'), + $this->equalTo(['files' => [ + 'https://example.com/file.jpg', + ] + ]) + ); + + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $result = $zones->cachePurge('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', [ + 'https://example.com/file.jpg', + ]); + + $this->assertTrue($result); + $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result->id); + } +} diff --git a/tests/Fixtures/Endpoints/activationTest.json b/tests/Fixtures/Endpoints/activationTest.json new file mode 100644 index 0000000..bedd2f5 --- /dev/null +++ b/tests/Fixtures/Endpoints/activationTest.json @@ -0,0 +1,8 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "023e105f4ecef8ad9ca31a8372d0c353" + } +} diff --git a/tests/Fixtures/Endpoints/addLockdown.json b/tests/Fixtures/Endpoints/addLockdown.json new file mode 100644 index 0000000..48d1311 --- /dev/null +++ b/tests/Fixtures/Endpoints/addLockdown.json @@ -0,0 +1,18 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "description": "Restrict access to these endpoints to requests from a known IP address", + "urls": [ + "api.mysite.com/some/endpoint*" + ], + "configurations": [ + { + "target": "ip", + "value": "1.2.3.4" + } + ] + } +} diff --git a/tests/Fixtures/Endpoints/addRecord.json b/tests/Fixtures/Endpoints/addRecord.json new file mode 100644 index 0000000..e5c6225 --- /dev/null +++ b/tests/Fixtures/Endpoints/addRecord.json @@ -0,0 +1,20 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "type": "A", + "name": "example.com", + "content": "1.2.3.4", + "proxiable": true, + "proxied": false, + "ttl": 120, + "locked": false, + "zone_id": "023e105f4ecef8ad9ca31a8372d0c353", + "zone_name": "example.com", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "data": {} + } +} diff --git a/tests/Fixtures/Endpoints/addZone.json b/tests/Fixtures/Endpoints/addZone.json new file mode 100644 index 0000000..d3903c1 --- /dev/null +++ b/tests/Fixtures/Endpoints/addZone.json @@ -0,0 +1,54 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "name": "example.com", + "development_mode": 7200, + "original_name_servers": [ + "ns1.originaldnshost.com", + "ns2.originaldnshost.com" + ], + "original_registrar": "GoDaddy", + "original_dnshost": "NameCheap", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "name_servers": [ + "tony.ns.cloudflare.com", + "woz.ns.cloudflare.com" + ], + "owner": { + "id": "7c5dae5552338874e5053f2534d2767a", + "email": "user@example.com", + "owner_type": "user" + }, + "permissions": [ + "#zone:read", + "#zone:edit" + ], + "plan": { + "id": "e592fd9519420ba7405e1307bff33214", + "name": "Pro Plan", + "price": 20, + "currency": "USD", + "frequency": "monthly", + "legacy_id": "pro", + "is_subscribed": true, + "can_subscribe": true + }, + "plan_pending": { + "id": "e592fd9519420ba7405e1307bff33214", + "name": "Pro Plan", + "price": 20, + "currency": "USD", + "frequency": "monthly", + "legacy_id": "pro", + "is_subscribed": true, + "can_subscribe": true + }, + "status": "active", + "paused": false, + "type": "full" + } +} diff --git a/tests/Fixtures/Endpoints/cachePurge.json b/tests/Fixtures/Endpoints/cachePurge.json new file mode 100644 index 0000000..bedd2f5 --- /dev/null +++ b/tests/Fixtures/Endpoints/cachePurge.json @@ -0,0 +1,8 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "023e105f4ecef8ad9ca31a8372d0c353" + } +} diff --git a/tests/Fixtures/Endpoints/cachePurgeEverything.json b/tests/Fixtures/Endpoints/cachePurgeEverything.json new file mode 100644 index 0000000..bedd2f5 --- /dev/null +++ b/tests/Fixtures/Endpoints/cachePurgeEverything.json @@ -0,0 +1,8 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "023e105f4ecef8ad9ca31a8372d0c353" + } +} diff --git a/tests/Fixtures/Endpoints/cachePurgeHost.json b/tests/Fixtures/Endpoints/cachePurgeHost.json new file mode 100644 index 0000000..bedd2f5 --- /dev/null +++ b/tests/Fixtures/Endpoints/cachePurgeHost.json @@ -0,0 +1,8 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "023e105f4ecef8ad9ca31a8372d0c353" + } +} diff --git a/tests/Fixtures/Endpoints/changeDevelopmentMode.json b/tests/Fixtures/Endpoints/changeDevelopmentMode.json new file mode 100644 index 0000000..2180658 --- /dev/null +++ b/tests/Fixtures/Endpoints/changeDevelopmentMode.json @@ -0,0 +1,12 @@ +{ + "result": { + "id": "development_mode", + "value": "on", + "modified_on": "2017-11-06T05:16:42.864300Z", + "time_remaining": 10800, + "editable": true + }, + "success": true, + "errors": [], + "messages": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/changeMinimumTLSVersion.json b/tests/Fixtures/Endpoints/changeMinimumTLSVersion.json new file mode 100644 index 0000000..f136586 --- /dev/null +++ b/tests/Fixtures/Endpoints/changeMinimumTLSVersion.json @@ -0,0 +1,6 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": "1.1" +} diff --git a/tests/Fixtures/Endpoints/createAccessRule.json b/tests/Fixtures/Endpoints/createAccessRule.json new file mode 100644 index 0000000..3f34b6a --- /dev/null +++ b/tests/Fixtures/Endpoints/createAccessRule.json @@ -0,0 +1,30 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "92f17202ed8bd63d69a66b86a49a8f6b", + "notes": "This rule is on because of an event that occured on date X", + "allowed_modes": [ + "whitelist", + "block", + "challenge" + ], + "mode": "challenge", + "configuration": { + "target": "ip", + "value": "1.2.3.4" + }, + "scope": { + "id": "7c5dae5552338874e5053f2534d2767a", + "email": "user@example.com", + "type": "user" + }, + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/createCustomHostname.json b/tests/Fixtures/Endpoints/createCustomHostname.json new file mode 100644 index 0000000..1ea6dae --- /dev/null +++ b/tests/Fixtures/Endpoints/createCustomHostname.json @@ -0,0 +1,20 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "0d89c70d-ad9f-4843-b99f-6cc0252067e9", + "hostname": "app.example.com", + "ssl": { + "status": "pending_validation", + "method": "http", + "type": "dv", + "cname_target": "dcv.digicert.com", + "cname": "810b7d5f01154524b961ba0cd578acc2.app.example.com" + } + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/createPageRule.json b/tests/Fixtures/Endpoints/createPageRule.json new file mode 100644 index 0000000..8996def --- /dev/null +++ b/tests/Fixtures/Endpoints/createPageRule.json @@ -0,0 +1,31 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "9a7806061c88ada191ed06f989cc3dac", + "targets": [ + { + "target": "url", + "constraint": { + "operator": "matches", + "value": "*example.com/images/*" + } + } + ], + "actions": [ + { + "id": "always_online", + "value": "on" + } + ], + "priority": 1, + "status": "active", + "modified_on": "2014-01-01T05:20:00.12345Z", + "created_on": "2014-01-01T05:20:00.12345Z" + } +} diff --git a/tests/Fixtures/Endpoints/createRailgun.json b/tests/Fixtures/Endpoints/createRailgun.json new file mode 100644 index 0000000..33054a7 --- /dev/null +++ b/tests/Fixtures/Endpoints/createRailgun.json @@ -0,0 +1,23 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "e928d310693a83094309acf9ead50448", + "name": "My Railgun", + "status": "active", + "enabled": true, + "zones_connected": 2, + "build": "b1234", + "version": "2.1", + "revision": "123", + "activation_key": "e4edc00281cb56ebac22c81be9bac8f3", + "activated_on": "2014-01-02T02:20:00Z", + "created_on": "2014-01-01T05:20:00Z", + "modified_on": "2014-01-01T05:20:00Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/createRule.json b/tests/Fixtures/Endpoints/createRule.json new file mode 100644 index 0000000..af721e6 --- /dev/null +++ b/tests/Fixtures/Endpoints/createRule.json @@ -0,0 +1,18 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "description": "Prevent access from abusive clients identified by this UserAgent to mitigate DDoS attack", + "mode": "js_challenge", + "configuration": { + "target": "ua", + "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4" + } + } +} diff --git a/tests/Fixtures/Endpoints/deleteAccessRule.json b/tests/Fixtures/Endpoints/deleteAccessRule.json new file mode 100644 index 0000000..2c1ae81 --- /dev/null +++ b/tests/Fixtures/Endpoints/deleteAccessRule.json @@ -0,0 +1,12 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "92f17202ed8bd63d69a66b86a49a8f6b" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/deleteHostname.json b/tests/Fixtures/Endpoints/deleteHostname.json new file mode 100644 index 0000000..4ac88c9 --- /dev/null +++ b/tests/Fixtures/Endpoints/deleteHostname.json @@ -0,0 +1,3 @@ +{ + "id": "0d89c70d-ad9f-4843-b99f-6cc0252067e9" +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/deleteLockdown.json b/tests/Fixtures/Endpoints/deleteLockdown.json new file mode 100644 index 0000000..7599aee --- /dev/null +++ b/tests/Fixtures/Endpoints/deleteLockdown.json @@ -0,0 +1,12 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "372e67954025e0ba6aaa6d586b9e0b59" + } +} diff --git a/tests/Fixtures/Endpoints/deletePageRule.json b/tests/Fixtures/Endpoints/deletePageRule.json new file mode 100644 index 0000000..330525b --- /dev/null +++ b/tests/Fixtures/Endpoints/deletePageRule.json @@ -0,0 +1,12 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "9a7806061c88ada191ed06f989cc3dac" + } +} diff --git a/tests/Fixtures/Endpoints/deleteRailgun.json b/tests/Fixtures/Endpoints/deleteRailgun.json new file mode 100644 index 0000000..a16e6c7 --- /dev/null +++ b/tests/Fixtures/Endpoints/deleteRailgun.json @@ -0,0 +1,12 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "e928d310693a83094309acf9ead50448" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/deleteRule.json b/tests/Fixtures/Endpoints/deleteRule.json new file mode 100644 index 0000000..7599aee --- /dev/null +++ b/tests/Fixtures/Endpoints/deleteRule.json @@ -0,0 +1,12 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "372e67954025e0ba6aaa6d586b9e0b59" + } +} diff --git a/tests/Fixtures/Endpoints/disableTLS13.json b/tests/Fixtures/Endpoints/disableTLS13.json new file mode 100644 index 0000000..5fe9c2c --- /dev/null +++ b/tests/Fixtures/Endpoints/disableTLS13.json @@ -0,0 +1,6 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": "off" +} diff --git a/tests/Fixtures/Endpoints/enableTLS13.json b/tests/Fixtures/Endpoints/enableTLS13.json new file mode 100644 index 0000000..cb21ca2 --- /dev/null +++ b/tests/Fixtures/Endpoints/enableTLS13.json @@ -0,0 +1,6 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": "on" +} diff --git a/tests/Fixtures/Endpoints/getAnalyticsDashboard.json b/tests/Fixtures/Endpoints/getAnalyticsDashboard.json new file mode 100644 index 0000000..893b0f9 --- /dev/null +++ b/tests/Fixtures/Endpoints/getAnalyticsDashboard.json @@ -0,0 +1,176 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "totals": { + "since": "2015-01-01T12:23:00Z", + "until": "2015-01-02T12:23:00Z", + "requests": { + "all": 1234085328, + "cached": 1234085328, + "uncached": 13876154, + "content_type": { + "css": 15343, + "html": 1234213, + "javascript": 318236, + "gif": 23178, + "jpeg": 1982048 + }, + "country": { + "US": 4181364, + "AG": 37298, + "GI": 293846 + }, + "ssl": { + "encrypted": 12978361, + "unencrypted": 781263 + }, + "http_status": { + "200": 13496983, + "301": 283, + "400": 187936, + "402": 1828, + "404": 1293 + } + }, + "bandwidth": { + "all": 213867451, + "cached": 113205063, + "uncached": 113205063, + "content_type": { + "css": 237421, + "html": 1231290, + "javascript": 123245, + "gif": 1234242, + "jpeg": 784278 + }, + "country": { + "US": 123145433, + "AG": 2342483, + "GI": 984753 + }, + "ssl": { + "encrypted": 37592942, + "unencrypted": 237654192 + } + }, + "threats": { + "all": 23423873, + "country": { + "US": 123, + "CN": 523423, + "AU": 91 + }, + "type": { + "user.ban.ip": 123, + "hot.ban.unknown": 5324, + "macro.chl.captchaErr": 1341, + "macro.chl.jschlErr": 5323 + } + }, + "pageviews": { + "all": 5724723, + "search_engines": { + "googlebot": 35272, + "pingdom": 13435, + "bingbot": 5372, + "baidubot": 1345 + } + }, + "uniques": { + "all": 12343 + } + }, + "timeseries": [ + { + "since": "2015-01-01T12:23:00Z", + "until": "2015-01-02T12:23:00Z", + "requests": { + "all": 1234085328, + "cached": 1234085328, + "uncached": 13876154, + "content_type": { + "css": 15343, + "html": 1234213, + "javascript": 318236, + "gif": 23178, + "jpeg": 1982048 + }, + "country": { + "US": 4181364, + "AG": 37298, + "GI": 293846 + }, + "ssl": { + "encrypted": 12978361, + "unencrypted": 781263 + }, + "http_status": { + "200": 13496983, + "301": 283, + "400": 187936, + "402": 1828, + "404": 1293 + } + }, + "bandwidth": { + "all": 213867451, + "cached": 113205063, + "uncached": 113205063, + "content_type": { + "css": 237421, + "html": 1231290, + "javascript": 123245, + "gif": 1234242, + "jpeg": 784278 + }, + "country": { + "US": 123145433, + "AG": 2342483, + "GI": 984753 + }, + "ssl": { + "encrypted": 37592942, + "unencrypted": 237654192 + } + }, + "threats": { + "all": 23423873, + "country": { + "US": 123, + "CN": 523423, + "AU": 91 + }, + "type": { + "user.ban.ip": 123, + "hot.ban.unknown": 5324, + "macro.chl.captchaErr": 1341, + "macro.chl.jschlErr": 5323 + } + }, + "pageviews": { + "all": 5724723, + "search_engines": { + "googlebot": 35272, + "pingdom": 13435, + "bingbot": 5372, + "baidubot": 1345 + } + }, + "uniques": { + "all": 12343 + } + } + ] + }, + "query": { + "since": "2015-01-01T12:23:00Z", + "until": "2015-01-02T12:23:00Z", + "time_delta": 60 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getDNSRecordDetails.json b/tests/Fixtures/Endpoints/getDNSRecordDetails.json new file mode 100644 index 0000000..e5c6225 --- /dev/null +++ b/tests/Fixtures/Endpoints/getDNSRecordDetails.json @@ -0,0 +1,20 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "type": "A", + "name": "example.com", + "content": "1.2.3.4", + "proxiable": true, + "proxied": false, + "ttl": 120, + "locked": false, + "zone_id": "023e105f4ecef8ad9ca31a8372d0c353", + "zone_name": "example.com", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "data": {} + } +} diff --git a/tests/Fixtures/Endpoints/getHostname.json b/tests/Fixtures/Endpoints/getHostname.json new file mode 100644 index 0000000..1ea6dae --- /dev/null +++ b/tests/Fixtures/Endpoints/getHostname.json @@ -0,0 +1,20 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "0d89c70d-ad9f-4843-b99f-6cc0252067e9", + "hostname": "app.example.com", + "ssl": { + "status": "pending_validation", + "method": "http", + "type": "dv", + "cname_target": "dcv.digicert.com", + "cname": "810b7d5f01154524b961ba0cd578acc2.app.example.com" + } + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getPackageGroupInfo.json b/tests/Fixtures/Endpoints/getPackageGroupInfo.json new file mode 100644 index 0000000..e607ddd --- /dev/null +++ b/tests/Fixtures/Endpoints/getPackageGroupInfo.json @@ -0,0 +1,22 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "de677e5818985db1285d0e80225f06e5", + "name": "Project Honey Pot", + "description": "Group designed to protect against IP addresses that are a threat and typically used to launch DDoS attacks", + "rules_count": 10, + "modified_rules_count": 2, + "package_id": "a25a9a7e9c00afc1fb2e0245519d725b", + "mode": "on", + "allowed_modes": [ + "on", + "off" + ] + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getPackageInfo.json b/tests/Fixtures/Endpoints/getPackageInfo.json new file mode 100644 index 0000000..5c94df8 --- /dev/null +++ b/tests/Fixtures/Endpoints/getPackageInfo.json @@ -0,0 +1,17 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "a25a9a7e9c00afc1fb2e0245519d725b", + "name": "WordPress rules", + "description": "Common WordPress exploit protections", + "detection_mode": "traditional", + "zone_id": "023e105f4ecef8ad9ca31a8372d0c353", + "status": "active" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getPackageRuleInfo.json b/tests/Fixtures/Endpoints/getPackageRuleInfo.json new file mode 100644 index 0000000..c40c3d2 --- /dev/null +++ b/tests/Fixtures/Endpoints/getPackageRuleInfo.json @@ -0,0 +1,24 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "f939de3be84e66e757adcdcb87908023", + "description": "SQL injection prevention for SELECT statements", + "priority": 5, + "group": { + "id": "de677e5818985db1285d0e80225f06e5", + "name": "Project Honey Pot" + }, + "package_id": "a25a9a7e9c00afc1fb2e0245519d725b", + "allowed_modes": [ + "on", + "off" + ], + "mode": "on" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getPageRuleDetails.json b/tests/Fixtures/Endpoints/getPageRuleDetails.json new file mode 100644 index 0000000..8996def --- /dev/null +++ b/tests/Fixtures/Endpoints/getPageRuleDetails.json @@ -0,0 +1,31 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "9a7806061c88ada191ed06f989cc3dac", + "targets": [ + { + "target": "url", + "constraint": { + "operator": "matches", + "value": "*example.com/images/*" + } + } + ], + "actions": [ + { + "id": "always_online", + "value": "on" + } + ], + "priority": 1, + "status": "active", + "modified_on": "2014-01-01T05:20:00.12345Z", + "created_on": "2014-01-01T05:20:00.12345Z" + } +} diff --git a/tests/Fixtures/Endpoints/getRailgun.json b/tests/Fixtures/Endpoints/getRailgun.json new file mode 100644 index 0000000..33054a7 --- /dev/null +++ b/tests/Fixtures/Endpoints/getRailgun.json @@ -0,0 +1,23 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "e928d310693a83094309acf9ead50448", + "name": "My Railgun", + "status": "active", + "enabled": true, + "zones_connected": 2, + "build": "b1234", + "version": "2.1", + "revision": "123", + "activation_key": "e4edc00281cb56ebac22c81be9bac8f3", + "activated_on": "2014-01-02T02:20:00Z", + "created_on": "2014-01-01T05:20:00Z", + "modified_on": "2014-01-01T05:20:00Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getRecordDetails.json b/tests/Fixtures/Endpoints/getRecordDetails.json new file mode 100644 index 0000000..5a3900d --- /dev/null +++ b/tests/Fixtures/Endpoints/getRecordDetails.json @@ -0,0 +1,22 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "description": "Restrict access to these endpoints to requests from a known IP address", + "urls": [ + "api.mysite.com/some/endpoint*" + ], + "configurations": [ + { + "target": "ip", + "value": "1.2.3.4" + } + ] + } +} diff --git a/tests/Fixtures/Endpoints/getRuleDetails.json b/tests/Fixtures/Endpoints/getRuleDetails.json new file mode 100644 index 0000000..af721e6 --- /dev/null +++ b/tests/Fixtures/Endpoints/getRuleDetails.json @@ -0,0 +1,18 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "description": "Prevent access from abusive clients identified by this UserAgent to mitigate DDoS attack", + "mode": "js_challenge", + "configuration": { + "target": "ua", + "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4" + } + } +} diff --git a/tests/Fixtures/Endpoints/getUserDetails.json b/tests/Fixtures/Endpoints/getUserDetails.json new file mode 100644 index 0000000..18d9111 --- /dev/null +++ b/tests/Fixtures/Endpoints/getUserDetails.json @@ -0,0 +1,18 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "7c5dae5552338874e5053f2534d2767a", + "email": "user@example.com", + "first_name": "John", + "last_name": "Appleseed", + "username": "cfuser12345", + "telephone": "+1 123-123-1234", + "country": "US", + "zipcode": "12345", + "created_on": "2014-01-01T05:20:00Z", + "modified_on": "2014-01-01T05:20:00Z", + "two_factor_authentication_enabled": false + } +} diff --git a/tests/Fixtures/Endpoints/getUserEmail.json b/tests/Fixtures/Endpoints/getUserEmail.json new file mode 100644 index 0000000..18d9111 --- /dev/null +++ b/tests/Fixtures/Endpoints/getUserEmail.json @@ -0,0 +1,18 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "7c5dae5552338874e5053f2534d2767a", + "email": "user@example.com", + "first_name": "John", + "last_name": "Appleseed", + "username": "cfuser12345", + "telephone": "+1 123-123-1234", + "country": "US", + "zipcode": "12345", + "created_on": "2014-01-01T05:20:00Z", + "modified_on": "2014-01-01T05:20:00Z", + "two_factor_authentication_enabled": false + } +} diff --git a/tests/Fixtures/Endpoints/getUserId.json b/tests/Fixtures/Endpoints/getUserId.json new file mode 100644 index 0000000..18d9111 --- /dev/null +++ b/tests/Fixtures/Endpoints/getUserId.json @@ -0,0 +1,18 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "7c5dae5552338874e5053f2534d2767a", + "email": "user@example.com", + "first_name": "John", + "last_name": "Appleseed", + "username": "cfuser12345", + "telephone": "+1 123-123-1234", + "country": "US", + "zipcode": "12345", + "created_on": "2014-01-01T05:20:00Z", + "modified_on": "2014-01-01T05:20:00Z", + "two_factor_authentication_enabled": false + } +} diff --git a/tests/Fixtures/Endpoints/getZoneId.json b/tests/Fixtures/Endpoints/getZoneId.json new file mode 100644 index 0000000..462e4b4 --- /dev/null +++ b/tests/Fixtures/Endpoints/getZoneId.json @@ -0,0 +1,62 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": [ + { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "name": "example.com", + "development_mode": 7200, + "original_name_servers": [ + "ns1.originaldnshost.com", + "ns2.originaldnshost.com" + ], + "original_registrar": "GoDaddy", + "original_dnshost": "NameCheap", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "name_servers": [ + "tony.ns.cloudflare.com", + "woz.ns.cloudflare.com" + ], + "owner": { + "id": "7c5dae5552338874e5053f2534d2767a", + "email": "user@example.com", + "owner_type": "user" + }, + "permissions": [ + "#zone:read", + "#zone:edit" + ], + "plan": { + "id": "e592fd9519420ba7405e1307bff33214", + "name": "Pro Plan", + "price": 20, + "currency": "USD", + "frequency": "monthly", + "legacy_id": "pro", + "is_subscribed": true, + "can_subscribe": true + }, + "plan_pending": { + "id": "e592fd9519420ba7405e1307bff33214", + "name": "Pro Plan", + "price": 20, + "currency": "USD", + "frequency": "monthly", + "legacy_id": "pro", + "is_subscribed": true, + "can_subscribe": true + }, + "status": "active", + "paused": false, + "type": "full" + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} diff --git a/tests/Fixtures/Endpoints/listAccessRules.json b/tests/Fixtures/Endpoints/listAccessRules.json new file mode 100644 index 0000000..a11d418 --- /dev/null +++ b/tests/Fixtures/Endpoints/listAccessRules.json @@ -0,0 +1,38 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": [ + { + "id": "92f17202ed8bd63d69a66b86a49a8f6b", + "notes": "This rule is on because of an event that occured on date X", + "allowed_modes": [ + "whitelist", + "block", + "challenge" + ], + "mode": "challenge", + "configuration": { + "target": "ip", + "value": "1.2.3.4" + }, + "scope": { + "id": "7c5dae5552338874e5053f2534d2767a", + "email": "user@example.com", + "type": "user" + }, + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z" + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/listHostnames.json b/tests/Fixtures/Endpoints/listHostnames.json new file mode 100644 index 0000000..e89ade5 --- /dev/null +++ b/tests/Fixtures/Endpoints/listHostnames.json @@ -0,0 +1,28 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": [ + { + "id": "0d89c70d-ad9f-4843-b99f-6cc0252067e9", + "hostname": "app.example.com", + "ssl": { + "status": "pending_validation", + "method": "http", + "type": "dv", + "cname_target": "dcv.digicert.com", + "cname": "810b7d5f01154524b961ba0cd578acc2.app.example.com" + } + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/listIPs.json b/tests/Fixtures/Endpoints/listIPs.json new file mode 100644 index 0000000..3a8ffbf --- /dev/null +++ b/tests/Fixtures/Endpoints/listIPs.json @@ -0,0 +1,13 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "ipv4_cidrs": [ + "199.27.128.0/21" + ], + "ipv6_cidrs": [ + "2400:cb00::/32" + ] + } +} diff --git a/tests/Fixtures/Endpoints/listLockdowns.json b/tests/Fixtures/Endpoints/listLockdowns.json new file mode 100644 index 0000000..c9b1ce0 --- /dev/null +++ b/tests/Fixtures/Endpoints/listLockdowns.json @@ -0,0 +1,26 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": [ + { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "description": "Restrict access to these endpoints to requests from a known IP address", + "urls": [ + "api.mysite.com/some/endpoint*" + ], + "configurations": [ + { + "target": "ip", + "value": "1.2.3.4" + } + ] + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} diff --git a/tests/Fixtures/Endpoints/listPackageGroups.json b/tests/Fixtures/Endpoints/listPackageGroups.json new file mode 100644 index 0000000..11855a0 --- /dev/null +++ b/tests/Fixtures/Endpoints/listPackageGroups.json @@ -0,0 +1,30 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": [ + { + "id": "de677e5818985db1285d0e80225f06e5", + "name": "Project Honey Pot", + "description": "Group designed to protect against IP addresses that are a threat and typically used to launch DDoS attacks", + "rules_count": 10, + "modified_rules_count": 2, + "package_id": "a25a9a7e9c00afc1fb2e0245519d725b", + "mode": "on", + "allowed_modes": [ + "on", + "off" + ] + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/listPackageRules.json b/tests/Fixtures/Endpoints/listPackageRules.json new file mode 100644 index 0000000..a11d418 --- /dev/null +++ b/tests/Fixtures/Endpoints/listPackageRules.json @@ -0,0 +1,38 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": [ + { + "id": "92f17202ed8bd63d69a66b86a49a8f6b", + "notes": "This rule is on because of an event that occured on date X", + "allowed_modes": [ + "whitelist", + "block", + "challenge" + ], + "mode": "challenge", + "configuration": { + "target": "ip", + "value": "1.2.3.4" + }, + "scope": { + "id": "7c5dae5552338874e5053f2534d2767a", + "email": "user@example.com", + "type": "user" + }, + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z" + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/listPackages.json b/tests/Fixtures/Endpoints/listPackages.json new file mode 100644 index 0000000..d6be34c --- /dev/null +++ b/tests/Fixtures/Endpoints/listPackages.json @@ -0,0 +1,25 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": [ + { + "id": "a25a9a7e9c00afc1fb2e0245519d725b", + "name": "WordPress rules", + "description": "Common WordPress exploit protections", + "detection_mode": "traditional", + "zone_id": "023e105f4ecef8ad9ca31a8372d0c353", + "status": "active" + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/listPageRules.json b/tests/Fixtures/Endpoints/listPageRules.json new file mode 100644 index 0000000..5d51042 --- /dev/null +++ b/tests/Fixtures/Endpoints/listPageRules.json @@ -0,0 +1,39 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": [ + { + "id": "9a7806061c88ada191ed06f989cc3dac", + "targets": [ + { + "target": "url", + "constraint": { + "operator": "matches", + "value": "*example.com/images/*" + } + } + ], + "actions": [ + { + "id": "always_online", + "value": "on" + } + ], + "priority": 1, + "status": "active", + "modified_on": "2014-01-01T05:20:00.12345Z", + "created_on": "2014-01-01T05:20:00.12345Z" + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} diff --git a/tests/Fixtures/Endpoints/listRailgunZones.json b/tests/Fixtures/Endpoints/listRailgunZones.json new file mode 100644 index 0000000..983004a --- /dev/null +++ b/tests/Fixtures/Endpoints/listRailgunZones.json @@ -0,0 +1,30 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": [ + { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "name": "example.com", + "development_mode": 7200, + "original_name_servers": [ + "ns1.originaldnshost.com", + "ns2.originaldnshost.com" + ], + "original_registrar": "GoDaddy", + "original_dnshost": "NameCheap", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z" + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/listRailguns.json b/tests/Fixtures/Endpoints/listRailguns.json new file mode 100644 index 0000000..7a4db43 --- /dev/null +++ b/tests/Fixtures/Endpoints/listRailguns.json @@ -0,0 +1,31 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": [ + { + "id": "e928d310693a83094309acf9ead50448", + "name": "My Railgun", + "status": "active", + "enabled": true, + "zones_connected": 2, + "build": "b1234", + "version": "2.1", + "revision": "123", + "activation_key": "e4edc00281cb56ebac22c81be9bac8f3", + "activated_on": "2014-01-02T02:20:00Z", + "created_on": "2014-01-01T05:20:00Z", + "modified_on": "2014-01-01T05:20:00Z" + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/listRecords.json b/tests/Fixtures/Endpoints/listRecords.json new file mode 100644 index 0000000..9d87373 --- /dev/null +++ b/tests/Fixtures/Endpoints/listRecords.json @@ -0,0 +1,28 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": [ + { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "type": "A", + "name": "example.com", + "content": "1.2.3.4", + "proxiable": true, + "proxied": false, + "ttl": 120, + "locked": false, + "zone_id": "023e105f4ecef8ad9ca31a8372d0c353", + "zone_name": "example.com", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "data": {} + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} diff --git a/tests/Fixtures/Endpoints/listRules.json b/tests/Fixtures/Endpoints/listRules.json new file mode 100644 index 0000000..a168aa8 --- /dev/null +++ b/tests/Fixtures/Endpoints/listRules.json @@ -0,0 +1,26 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": [ + { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "description": "Prevent access from abusive clients identified by this UserAgent to mitigate DDoS attack", + "mode": "js_challenge", + "configuration": { + "target": "ua", + "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4" + } + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} diff --git a/tests/Fixtures/Endpoints/listZones.json b/tests/Fixtures/Endpoints/listZones.json new file mode 100644 index 0000000..462e4b4 --- /dev/null +++ b/tests/Fixtures/Endpoints/listZones.json @@ -0,0 +1,62 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": [ + { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "name": "example.com", + "development_mode": 7200, + "original_name_servers": [ + "ns1.originaldnshost.com", + "ns2.originaldnshost.com" + ], + "original_registrar": "GoDaddy", + "original_dnshost": "NameCheap", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "name_servers": [ + "tony.ns.cloudflare.com", + "woz.ns.cloudflare.com" + ], + "owner": { + "id": "7c5dae5552338874e5053f2534d2767a", + "email": "user@example.com", + "owner_type": "user" + }, + "permissions": [ + "#zone:read", + "#zone:edit" + ], + "plan": { + "id": "e592fd9519420ba7405e1307bff33214", + "name": "Pro Plan", + "price": 20, + "currency": "USD", + "frequency": "monthly", + "legacy_id": "pro", + "is_subscribed": true, + "can_subscribe": true + }, + "plan_pending": { + "id": "e592fd9519420ba7405e1307bff33214", + "name": "Pro Plan", + "price": 20, + "currency": "USD", + "frequency": "monthly", + "legacy_id": "pro", + "is_subscribed": true, + "can_subscribe": true + }, + "status": "active", + "paused": false, + "type": "full" + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} diff --git a/tests/Fixtures/Endpoints/updateAccessRule.json b/tests/Fixtures/Endpoints/updateAccessRule.json new file mode 100644 index 0000000..3f34b6a --- /dev/null +++ b/tests/Fixtures/Endpoints/updateAccessRule.json @@ -0,0 +1,30 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "92f17202ed8bd63d69a66b86a49a8f6b", + "notes": "This rule is on because of an event that occured on date X", + "allowed_modes": [ + "whitelist", + "block", + "challenge" + ], + "mode": "challenge", + "configuration": { + "target": "ip", + "value": "1.2.3.4" + }, + "scope": { + "id": "7c5dae5552338874e5053f2534d2767a", + "email": "user@example.com", + "type": "user" + }, + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateDNSRecord.json b/tests/Fixtures/Endpoints/updateDNSRecord.json new file mode 100644 index 0000000..33253a4 --- /dev/null +++ b/tests/Fixtures/Endpoints/updateDNSRecord.json @@ -0,0 +1,24 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "type": "A", + "name": "example.com", + "content": "1.2.3.4", + "proxiable": true, + "proxied": false, + "ttl": 120, + "locked": false, + "zone_id": "023e105f4ecef8ad9ca31a8372d0c353", + "zone_name": "example.com", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "data": {} + } +} diff --git a/tests/Fixtures/Endpoints/updateHostname.json b/tests/Fixtures/Endpoints/updateHostname.json new file mode 100644 index 0000000..1ea6dae --- /dev/null +++ b/tests/Fixtures/Endpoints/updateHostname.json @@ -0,0 +1,20 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "0d89c70d-ad9f-4843-b99f-6cc0252067e9", + "hostname": "app.example.com", + "ssl": { + "status": "pending_validation", + "method": "http", + "type": "dv", + "cname_target": "dcv.digicert.com", + "cname": "810b7d5f01154524b961ba0cd578acc2.app.example.com" + } + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateLockdown.json b/tests/Fixtures/Endpoints/updateLockdown.json new file mode 100644 index 0000000..5a3900d --- /dev/null +++ b/tests/Fixtures/Endpoints/updateLockdown.json @@ -0,0 +1,22 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "description": "Restrict access to these endpoints to requests from a known IP address", + "urls": [ + "api.mysite.com/some/endpoint*" + ], + "configurations": [ + { + "target": "ip", + "value": "1.2.3.4" + } + ] + } +} diff --git a/tests/Fixtures/Endpoints/updatePackageGroup.json b/tests/Fixtures/Endpoints/updatePackageGroup.json new file mode 100644 index 0000000..61db152 --- /dev/null +++ b/tests/Fixtures/Endpoints/updatePackageGroup.json @@ -0,0 +1,22 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "de677e5818985db1285d0e80225f06e5", + "name": "Project Honey Pot", + "description": "Group designed to protect against IP addresses that are a threat and typically used to launch DDoS attacks", + "rules_count": 10, + "modified_rules_count": 2, + "package_id": "a25a9a7e9c00afc1fb2e0245519d725b", + "mode": "off", + "allowed_modes": [ + "on", + "off" + ] + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updatePackageRule.json b/tests/Fixtures/Endpoints/updatePackageRule.json new file mode 100644 index 0000000..c40c3d2 --- /dev/null +++ b/tests/Fixtures/Endpoints/updatePackageRule.json @@ -0,0 +1,24 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "f939de3be84e66e757adcdcb87908023", + "description": "SQL injection prevention for SELECT statements", + "priority": 5, + "group": { + "id": "de677e5818985db1285d0e80225f06e5", + "name": "Project Honey Pot" + }, + "package_id": "a25a9a7e9c00afc1fb2e0245519d725b", + "allowed_modes": [ + "on", + "off" + ], + "mode": "on" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updatePageRule.json b/tests/Fixtures/Endpoints/updatePageRule.json new file mode 100644 index 0000000..8996def --- /dev/null +++ b/tests/Fixtures/Endpoints/updatePageRule.json @@ -0,0 +1,31 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "9a7806061c88ada191ed06f989cc3dac", + "targets": [ + { + "target": "url", + "constraint": { + "operator": "matches", + "value": "*example.com/images/*" + } + } + ], + "actions": [ + { + "id": "always_online", + "value": "on" + } + ], + "priority": 1, + "status": "active", + "modified_on": "2014-01-01T05:20:00.12345Z", + "created_on": "2014-01-01T05:20:00.12345Z" + } +} diff --git a/tests/Fixtures/Endpoints/updateRailgun.json b/tests/Fixtures/Endpoints/updateRailgun.json new file mode 100644 index 0000000..33054a7 --- /dev/null +++ b/tests/Fixtures/Endpoints/updateRailgun.json @@ -0,0 +1,23 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "e928d310693a83094309acf9ead50448", + "name": "My Railgun", + "status": "active", + "enabled": true, + "zones_connected": 2, + "build": "b1234", + "version": "2.1", + "revision": "123", + "activation_key": "e4edc00281cb56ebac22c81be9bac8f3", + "activated_on": "2014-01-02T02:20:00Z", + "created_on": "2014-01-01T05:20:00Z", + "modified_on": "2014-01-01T05:20:00Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateRule.json b/tests/Fixtures/Endpoints/updateRule.json new file mode 100644 index 0000000..af721e6 --- /dev/null +++ b/tests/Fixtures/Endpoints/updateRule.json @@ -0,0 +1,18 @@ +{ + "success": true, + "errors": [ + {} + ], + "messages": [ + {} + ], + "result": { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "description": "Prevent access from abusive clients identified by this UserAgent to mitigate DDoS attack", + "mode": "js_challenge", + "configuration": { + "target": "ua", + "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4" + } + } +} diff --git a/tests/Fixtures/Endpoints/updateUserDetails.json b/tests/Fixtures/Endpoints/updateUserDetails.json new file mode 100644 index 0000000..18d9111 --- /dev/null +++ b/tests/Fixtures/Endpoints/updateUserDetails.json @@ -0,0 +1,18 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "7c5dae5552338874e5053f2534d2767a", + "email": "user@example.com", + "first_name": "John", + "last_name": "Appleseed", + "username": "cfuser12345", + "telephone": "+1 123-123-1234", + "country": "US", + "zipcode": "12345", + "created_on": "2014-01-01T05:20:00Z", + "modified_on": "2014-01-01T05:20:00Z", + "two_factor_authentication_enabled": false + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..418bc92 --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,46 @@ +assertFileExists($path); + + $stream = Psr7\stream_for(file_get_contents($path)); + + $this->assertInstanceOf(Psr7\Stream::class, $stream); + + return $stream; + } + + /** + * Returns a PSR7 Response (JSON) for a given fixture. + * + * @param string $fixture The fixture to create the response for. + * @param integer $statusCode A HTTP Status Code for the response. + * @return Psr7\Response + */ + protected function getPsr7JsonResponseForFixture($fixture, $statusCode = 200): Psr7\Response + { + $stream = $this->getPsr7StreamForFixture($fixture); + + $this->assertNotNull(json_decode($stream)); + $this->assertEquals(JSON_ERROR_NONE, json_last_error()); + + return new Psr7\Response($statusCode, ['Content-Type' => 'application/json'], $stream); + } +} From c394f5ac4d2f7911c4ac073a87016f13e5fc6023 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Sat, 23 Feb 2019 00:05:37 +0000 Subject: [PATCH 08/58] Removed additional directory created by mistake --- src/Endpoints/TLS.php.orig | 127 +++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 src/Endpoints/TLS.php.orig diff --git a/src/Endpoints/TLS.php.orig b/src/Endpoints/TLS.php.orig new file mode 100644 index 0000000..cb67298 --- /dev/null +++ b/src/Endpoints/TLS.php.orig @@ -0,0 +1,127 @@ +adapter = $adapter; + } + + public function enableTLS13($zoneID) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/tls_1_3', + ['value' => 'on'] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + + public function disableTLS13($zoneID) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/tls_1_3', + ['value' => 'off'] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + + + + public function changeMinimumTLSVersion($zoneID, $minimumVersion) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/min_tls_version', + [ + 'value' => $minimumVersion + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } +<<<<<<< HEAD + public function getHTTPSRedirectStatus($zoneID) { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/always_use_https' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result; + } + + return false; + } + public function getHTTPSRewritesStatus($zoneID) { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/automatic_https_rewrites' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result; + } + + return false; + } + public function updateHTTPSRedirects($zoneID, $value) { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/always_use_https', + [ + 'value' => $value + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + public function updateHTTPSRewrites($zoneID, $value) { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/automatic_https_rewrites', + [ + 'value' => $value + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } +======= +>>>>>>> 4694904b38fdf5f251559a473cecf77a63cf9202 +} From 68b9fa3353794c62a2e35782d5e7918cce5ec6fc Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Sat, 23 Feb 2019 00:06:39 +0000 Subject: [PATCH 09/58] Removed additional directory created by mistake --- cloudflare-php | 1 - paul | 30 ------------------------------ paul.pub | 1 - 3 files changed, 32 deletions(-) delete mode 160000 cloudflare-php delete mode 100644 paul delete mode 100644 paul.pub diff --git a/cloudflare-php b/cloudflare-php deleted file mode 160000 index 4694904..0000000 --- a/cloudflare-php +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4694904b38fdf5f251559a473cecf77a63cf9202 diff --git a/paul b/paul deleted file mode 100644 index f4053e3..0000000 --- a/paul +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: AES-128-CBC,FFE357F099C6FA798FDA620AFC29061B - -TfyWfEzwfCdPB75tX3E6niZBGvOFpP4det7fNPGw0rfUPhn4lgBDMdL1zXgAZred -Ham1RQ6u0KZiaiGjn111ZP5XA6y8WV46IFaT59UMl1ZPu5AjMjZIAZ9WTJvhIaz2 -pMJhcBAe9M5guWX0qGgiajS+3DvVISxwmgOjFjNIFUjrJKxxD+J2HESf8+uO19NA -jZpxxF47KipaaTLFe4IGX8rf6aaSqaxDOGC8u4T9eyEDwsARe2H6g8Wm4ABnE/cB -kn6KoPupky20UIOZlOTc+R3UDrVK0w1ZcxgQi9Ly8qM+oPRemgvIbUHQWRgeXUaU -4p2hze04yQANwpZiWgz7+j5qU4CFfneLVJc1SNvzx+lPNgzwAihv4AKlJ3dBtpSw -41RyGbisE/RuPcaHGDOXf0g+wA2Bz1ByspQaB05BcqCef+rMvyavgaT2o5rgOVcF -D6AfKCYu0nO3RvCCm9jE19JDHW5oynnw8qiY9spvMkKaFGwXNYtBkvxdrW/xbNfu -VotHxKUcJbxjci2dJ10I7w58p2czlMA2vWtPqXqo7eDgrCLOBFM6CKQea8lsQKvA -uis2QMoWJYAhl20fxB8VxA77Gh5Fp402tj7Qu2/D8bDkZwqD6/ShFDqA6sK83JF+ -2QNfm3hTOmYytVSyl9uCjGJTqchK6O3zoteVihST4CGaIufbLjk6PkjzQc6JSFdG -aPWNBM4whR7LcUJ2LQ4lTcbcChB7d1ox+KRgKQ9FxmG1F9cftjKtfPAn3h2AYk+P -g/BBMmwV5R4Ly580QD0GgNYCYyKtT9Rn0inWh9o+tcX7B98xrghM1FOVBFuyw4P0 -eQrmi6oBXPWB7X5HzedFclpo/SjUinq4mVUfMHEv3vwaJI7XoFSNvd4sboc2IKkA -NbsbL5rk+QPTtCJJohIG4urAJPrpEqOfAQL26YJg+aamefmoiUCF46xb+sMYgPlq -a6P7kGv5iYvKsvVfZr1JCNJGa4f4R3toded0sYpvyodzm+X1Y+VzjgspXT0lh6EH -AR+JZ8w4zPnPaVaeDbkp0dgHFSyFWRl4CQSmQHGthaFAPagwJt2JJYmKEgPZYz7f -65kaMmhSANNUw0rtFfctA6VJqWRbdG1Gyn77nmg69SrwBUc17f+Mtui03FSIAFjg -yYooJxdNMT31wItBcDVEAvcLd/b4Bp2xKsKm7XYj3aWVgBFZO0scAGMqPfJaJy3o -o3dE4AvYzup46GbH3fz3xwDUjCbPSLNdKPLc37Yv5v0SAQaGuQbhwovp0Y4Mvsqt -lE74zywcxCJzp2pCJ9FlSjE+FPyHd+2Y3y3sod1Gs1s3IC8/u3sVOQ4velvVyO2v -Il86j9yglrNQ2vhq6KBedqeukPI71HnYjXSU/H5NLlMyRt/Y5g1F5yfgHmZyioVT -lyrvJCX//hm9K/8NLV1uIczT1Z+Lcpdrm2c8QpsCZseaCD/yVtNmo/LvRD5TH7aT -/QGUbfvkCUl8HVOId/LLZrDscdcDSj9LYcp+KDLm6qfLQX+uqHzXFgI2t8g2k3KR -N9sEFJq1rDX4PDzrUkWXrqW33LneOm+7KeXFHvdEzRnZylgo14ZkdAgKx6smaPuj ------END RSA PRIVATE KEY----- diff --git a/paul.pub b/paul.pub deleted file mode 100644 index 680eaed..0000000 --- a/paul.pub +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4RGhsoezP9fixY7Q+UkiUuKQDEVeOY2B5e15PG6lu90AM9nfvvUYvMu+w4/xB1MNsfBihKGJEcMuau9LiSuQjnym5BQ29ECL3Qm9nJ7BZB3jH7hA9uSep5+mvBchqSMFRMW/TUQFAm7o0/+GDRGKI8LnEGApyKrxIm4UaB/est9sVr9J5t+3HuldrUmxFt0o2oTreBgIrBKuDZ4QNP8G+l8A9sFiPJXnYrTo96J79LN7cx5jKWrJFybBwN6UgUMhTfWOOEoo5O61sepg/i9Jr+mz4/zCP5ai2U/Ea/CL4XZW+iHYnGWfEQ7eJLENILC25XlBfrI5Px3gi/2HV+wMn paul.adams@ADAMS-MBP.local From 910644f88de07d7496e2d40c04b1f32de1ef9b13 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Sat, 23 Feb 2019 00:13:29 +0000 Subject: [PATCH 10/58] Removed file created by mistake --- src/Endpoints/TLS.php.orig | 127 ------------------------------------- 1 file changed, 127 deletions(-) delete mode 100644 src/Endpoints/TLS.php.orig diff --git a/src/Endpoints/TLS.php.orig b/src/Endpoints/TLS.php.orig deleted file mode 100644 index cb67298..0000000 --- a/src/Endpoints/TLS.php.orig +++ /dev/null @@ -1,127 +0,0 @@ -adapter = $adapter; - } - - public function enableTLS13($zoneID) - { - $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/tls_1_3', - ['value' => 'on'] - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return true; - } - - return false; - } - - public function disableTLS13($zoneID) - { - $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/tls_1_3', - ['value' => 'off'] - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return true; - } - - return false; - } - - - - public function changeMinimumTLSVersion($zoneID, $minimumVersion) - { - $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/min_tls_version', - [ - 'value' => $minimumVersion - ] - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return true; - } - - return false; - } -<<<<<<< HEAD - public function getHTTPSRedirectStatus($zoneID) { - $return = $this->adapter->get( - 'zones/' . $zoneID . '/settings/always_use_https' - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return $body->result; - } - - return false; - } - public function getHTTPSRewritesStatus($zoneID) { - $return = $this->adapter->get( - 'zones/' . $zoneID . '/settings/automatic_https_rewrites' - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return $body->result; - } - - return false; - } - public function updateHTTPSRedirects($zoneID, $value) { - $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/always_use_https', - [ - 'value' => $value - ] - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return true; - } - - return false; - } - public function updateHTTPSRewrites($zoneID, $value) { - $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/automatic_https_rewrites', - [ - 'value' => $value - ] - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return true; - } - - return false; - } -======= ->>>>>>> 4694904b38fdf5f251559a473cecf77a63cf9202 -} From f105d38d85d80165d15935a0f9cbe883b0b19270 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Sat, 23 Feb 2019 00:18:05 +0000 Subject: [PATCH 11/58] updated TLS.php --- src/Endpoints/TLS.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Endpoints/TLS.php b/src/Endpoints/TLS.php index cb67298..38f0a46 100644 --- a/src/Endpoints/TLS.php +++ b/src/Endpoints/TLS.php @@ -67,7 +67,6 @@ class TLS implements API return false; } -<<<<<<< HEAD public function getHTTPSRedirectStatus($zoneID) { $return = $this->adapter->get( 'zones/' . $zoneID . '/settings/always_use_https' @@ -122,6 +121,4 @@ class TLS implements API return false; } -======= ->>>>>>> 4694904b38fdf5f251559a473cecf77a63cf9202 -} +} \ No newline at end of file From 9d434a23b3fe80ab700ab4b59f0d485167e35098 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Tue, 26 Feb 2019 20:06:07 +0000 Subject: [PATCH 12/58] Updated to PSR-2 --- src/Endpoints/TLS.php | 41 +++++++++------- src/Endpoints/ZoneSettings.php | 86 +++++++++++++++++++++------------- 2 files changed, 78 insertions(+), 49 deletions(-) diff --git a/src/Endpoints/TLS.php b/src/Endpoints/TLS.php index 38f0a46..a675b01 100644 --- a/src/Endpoints/TLS.php +++ b/src/Endpoints/TLS.php @@ -25,7 +25,7 @@ class TLS implements API 'zones/' . $zoneID . '/settings/tls_1_3', ['value' => 'on'] ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { return true; @@ -40,7 +40,7 @@ class TLS implements API 'zones/' . $zoneID . '/settings/tls_1_3', ['value' => 'off'] ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { return true; @@ -50,16 +50,15 @@ class TLS implements API } - public function changeMinimumTLSVersion($zoneID, $minimumVersion) { $return = $this->adapter->patch( 'zones/' . $zoneID . '/settings/min_tls_version', [ - 'value' => $minimumVersion + 'value' => $minimumVersion, ] ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { return true; @@ -67,38 +66,44 @@ class TLS implements API return false; } - public function getHTTPSRedirectStatus($zoneID) { + + public function getHTTPSRedirectSetting($zoneID) + { $return = $this->adapter->get( 'zones/' . $zoneID . '/settings/always_use_https' ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { - return $body->result; + return $body->result->value; } return false; } - public function getHTTPSRewritesStatus($zoneID) { + + public function getHTTPSRewritesSetting($zoneID) + { $return = $this->adapter->get( 'zones/' . $zoneID . '/settings/automatic_https_rewrites' ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { - return $body->result; + return $body->result->value; } return false; } - public function updateHTTPSRedirects($zoneID, $value) { + + public function updateHTTPSRedirectStatus($zoneID, $value) + { $return = $this->adapter->patch( 'zones/' . $zoneID . '/settings/always_use_https', [ - 'value' => $value + 'value' => $value, ] ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { return true; @@ -106,14 +111,16 @@ class TLS implements API return false; } - public function updateHTTPSRewrites($zoneID, $value) { + + public function updateHTTPSRewritesStatus($zoneID, $value) + { $return = $this->adapter->patch( 'zones/' . $zoneID . '/settings/automatic_https_rewrites', [ - 'value' => $value + 'value' => $value, ] ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { return true; diff --git a/src/Endpoints/ZoneSettings.php b/src/Endpoints/ZoneSettings.php index 7fc9f2f..e8877b7 100644 --- a/src/Endpoints/ZoneSettings.php +++ b/src/Endpoints/ZoneSettings.php @@ -18,75 +18,89 @@ class ZoneSettings implements API { $this->adapter = $adapter; } - public function getMinifySetting($zoneID) { + + public function getMinifySetting($zoneID) + { $return = $this->adapter->get( 'zones/' . $zoneID . '/settings/minify' ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { - return $body->result; + return $body->result->value; } return false; } - public function getRocketLoaderSetting($zoneID) { + + public function getRocketLoaderSetting($zoneID) + { $return = $this->adapter->get( 'zones/' . $zoneID . '/settings/rocket_loader' ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { - return $body->result; + return $body->result->value; } return false; } - public function getAlwaysOnlineSetting($zoneID) { + + public function getAlwaysOnlineSetting($zoneID) + { $return = $this->adapter->get( 'zones/' . $zoneID . '/settings/always_online' ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { - return $body->result; + return $body->result->value; } return false; } - public function getEmailObfuscationSetting($zoneID) { + + public function getEmailObfuscationSetting($zoneID) + { $return = $this->adapter->get( 'zones/' . $zoneID . '/settings/email_obfuscation' ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { - return $body->result; + return $body->result->value; } return false; } - public function getHotlinkProtectionSetting($zoneID) { + + public function getHotlinkProtectionSetting($zoneID) + { $return = $this->adapter->get( 'zones/' . $zoneID . '/settings/hotlink_protection' ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { - return $body->result; + return $body->result->value; } return false; } - public function updateMinifySetting($zoneID, $html, $css, $js) { + + public function updateMinifySetting($zoneID, $html, $css, $js) + { $return = $this->adapter->patch( 'zones/' . $zoneID . '/settings/minify', [ - 'html' => $html, - 'css' => $css, - 'js' => $js + 'value' => [ + 'html' => $html, + 'css' => $css, + 'js' => $js, + ], ] ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { return true; @@ -94,13 +108,15 @@ class ZoneSettings implements API return false; } - public function updateRocketLoaderSetting($zoneID, $value) { + + public function updateRocketLoaderSetting($zoneID, $value) + { $return = $this->adapter->patch( 'zones/' . $zoneID . '/settings/rocket_loader', [ - 'value' => $value + 'value' => $value, ] ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { return true; @@ -108,13 +124,15 @@ class ZoneSettings implements API return false; } - public function updateAlwaysOnlineSetting($zoneID, $value) { + + public function updateAlwaysOnlineSetting($zoneID, $value) + { $return = $this->adapter->patch( 'zones/' . $zoneID . '/settings/always_online', [ - 'value' => $value + 'value' => $value, ] ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { return true; @@ -122,13 +140,15 @@ class ZoneSettings implements API return false; } - public function updateEmailObfuscationSetting($zoneID, $value) { + + public function updateEmailObfuscationSetting($zoneID, $value) + { $return = $this->adapter->patch( 'zones/' . $zoneID . '/settings/email_obfuscation', [ - 'value' => $value + 'value' => $value, ] ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { return true; @@ -136,13 +156,15 @@ class ZoneSettings implements API return false; } - public function updateHotlinkProtectionSetting($zoneID, $value) { + + public function updateHotlinkProtectionSetting($zoneID, $value) + { $return = $this->adapter->patch( 'zones/' . $zoneID . '/settings/hotlink_protection', [ - 'value' => $value + 'value' => $value, ] ); - $body = json_decode($return->getBody()); + $body = json_decode($return->getBody()); if ($body->success) { return true; From df12f7ba6f9fffa3b1ba766b87d93871c23849e6 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Tue, 26 Feb 2019 20:20:13 +0000 Subject: [PATCH 13/58] Updated to PSR-2 --- src/Endpoints/TLS.php | 2 +- src/Endpoints/ZoneSettings.php | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Endpoints/TLS.php b/src/Endpoints/TLS.php index a675b01..46c960e 100644 --- a/src/Endpoints/TLS.php +++ b/src/Endpoints/TLS.php @@ -128,4 +128,4 @@ class TLS implements API return false; } -} \ No newline at end of file +} diff --git a/src/Endpoints/ZoneSettings.php b/src/Endpoints/ZoneSettings.php index e8877b7..03c66d9 100644 --- a/src/Endpoints/ZoneSettings.php +++ b/src/Endpoints/ZoneSettings.php @@ -92,7 +92,8 @@ class ZoneSettings implements API public function updateMinifySetting($zoneID, $html, $css, $js) { $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/minify', [ + 'zones/' . $zoneID . '/settings/minify', + [ 'value' => [ 'html' => $html, 'css' => $css, @@ -112,7 +113,8 @@ class ZoneSettings implements API public function updateRocketLoaderSetting($zoneID, $value) { $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/rocket_loader', [ + 'zones/' . $zoneID . '/settings/rocket_loader', + [ 'value' => $value, ] ); @@ -128,7 +130,8 @@ class ZoneSettings implements API public function updateAlwaysOnlineSetting($zoneID, $value) { $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/always_online', [ + 'zones/' . $zoneID . '/settings/always_online', + [ 'value' => $value, ] ); @@ -144,7 +147,8 @@ class ZoneSettings implements API public function updateEmailObfuscationSetting($zoneID, $value) { $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/email_obfuscation', [ + 'zones/' . $zoneID . '/settings/email_obfuscation', + [ 'value' => $value, ] ); @@ -160,7 +164,8 @@ class ZoneSettings implements API public function updateHotlinkProtectionSetting($zoneID, $value) { $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/hotlink_protection', [ + 'zones/' . $zoneID . '/settings/hotlink_protection', + [ 'value' => $value, ] ); @@ -172,4 +177,4 @@ class ZoneSettings implements API return false; } -} \ No newline at end of file +} From 8182aa881030ccbae137f8d8d892fb3018b467d5 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Tue, 26 Feb 2019 20:35:51 +0000 Subject: [PATCH 14/58] PSR-2 --- phpcbf.phar | Bin 0 -> 1172921 bytes phpcs.phar | Bin 0 -> 1172917 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 phpcbf.phar create mode 100644 phpcs.phar diff --git a/phpcbf.phar b/phpcbf.phar new file mode 100644 index 0000000000000000000000000000000000000000..67714405ef3c16bf3735ba35cbe3cf3c74f55fd2 GIT binary patch literal 1172921 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%0D(i&960 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�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 A^8f$< literal 0 HcmV?d00001 diff --git a/phpcs.phar b/phpcs.phar new file mode 100644 index 0000000000000000000000000000000000000000..b8ed399839358fe90971784cb5cb057ad604f87d GIT binary patch literal 1172917 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Km3C2AjPM^I|wA^60^y`ruE|0iZnTZ;wCA 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μ-7J|mVw_&?HI z1KZ3htF}{A4N$^fx?9!2-1XSJgaoTRwkUrYZ(*$K);Rc0F9kH+8h|S~JnxRrC(kOC ztsgpQ&ki&$=^q$U=>55e_gr4$rH#jZyw26vOSLUGdapOb{mJ?EU~thL%6$bdC+9#c z@W9V9?lUCC-gYP0^OzT)QIMjBUcVu zF{Y;gSy)1;zgX%5hkc?7xm{}4T~D#PtxqF#G{MTbrt`Y@{w*FeYR<5-IyW~=&5$Uu zi;r36Z(I)T&DoV?Guoij7rR8AyIN?%`>XL7w>Tv!XN9fiaKa={`P&&=FU~k`=9Fe( z&S2Z(4i6rddNsl$S!g`I?Dz0|hjZDjr)zj7_T+SQ{@(aIqzXi6%cF@DJzOfub1gB* zT}8~?RNpv|yTpm#A~!Y?zEVm$(@TW^S<9OsL1r$K`on5Kk4Mbe)R^`G@O8*S@v~SU z3M0$(D}qGz&Ba8XPAXJzV|oIzVYpFThoM4XFWu#!vlfEIkW(cYa+D84e#OYw5w^tu zACBB6y^H=C9uFKYlgI#jNnA%h%gu?)@e+uN;xO)O5=d2^Hv>#m5N+O80(x=;E3GjQ z++8EazN>1CQAItL>}LomQ@+ypI3kD zG>fWkMEgCr0wA>F*1ggkB2o>15FS#~vsGlVi zN~j+E$orhTss-m_OH+yR9kk%YF8?apJcFzMRG9TGchD9bt?u@Q%V+b9RoE{kj77>t zJx{^zE@0>YQ5&qPkU|k9b95!qq3L)sPL-Mv2)l3QN6W>qZX{=UZ}Dmk3jBj~lB~8} z4_0rfQz^P&19hlzRmJxFXims$xXqA$Yd|cyXW_ej^H7)3J+^Y;y_@juGoXU6rqY(i zdAvK7?SU~?Lda(TvxX=mU)pz7I&IuLd(}I8y#rhKYK&58p5EZUdTc4%%dm`{A_az7 znZ%1>ubQPN36L=X+vgVR8-#S-cfGtOw6ZBlCB>wF#i%UYU+iS<{Iuc*dWa?+H&#p| zI}M5Uc;R70Uhp-x^25x`t>OT=W{^@j$I@KPCMy=(D5pwRb17MA8pR|9C6ckJ74|;91V5r6UfqM7@ zvjR-%-+&v)5z*?JLx#Fc0;4x2-<39>3Z3#US7;$#xTqjL7!}x+-$H7ki%O~x6Ls{~ z5&%>_A{LQl$?x8Nh8kdmHRpFu(N8>-$CWNUKi4TDv^q}wbxr{Abh{XzW%dR)p;U&^ zQmM7A<>gm%o!Prk8eyf4PH&Mm63PnH28nxNOLi=!ostEXBUZA0u-Pd#d!G+Wx98+F zAM^)ST=2Y~$u~>R&2!JRT=HyNMvzkP-_Etb;~0OQCWNC7|NBs#d*#x+l8l z%ymjfS-@P8-(MjfH@pItgh6MY4tZRGX+=7l7zw_AGa?Jj$Bf-Xk~Rs%EVHKZp*p17 zj~{RUr8txgtg21KEj;@6;PLT^v`(VWMb2D3Aj*Q6WS3J_jKMR{&QYy#uoa6ANg!88 zcRdi3iBu>pb}p6zx|Q>1`Im zP28fGS=+6g$g{zymX{V#4^gDyf^tn)25u`%;sd}V4)K(9rdiiETT;t(LUAc82R|vl zEIYvIa&kRYs-aQ70fK-Wz{9FKKXU~$eYltdOc!n*ATX|_F8*i99{gzD#zhv}#>i;h{nbS7+RB1vCo ziGZ7emo{HFD?!>oZ#d;D>iAKzC#7KQVL+x)C0K9Lg&UCk$wvDs9scBlrJoy)gnXbF z@enJa{SXKe31t&qh@ikf#1CH77WIarikEMDDCA1PLg`lZ`mZmxXyD^=ZGOIZF>zI( z5wuV_8ds6^Y3HdQRVAHYxl0(4LxP##21sPM=uwk)G`W{go3eT$_53a}5fQkVOgi6p z2mSL0y%$|vVaC6&ZvOIyXSpmb%kEsEdngoTXSfvhh&x>{yc$_H=fv>W9x8#woEY&t z?U?}U&Q}2BpUG~Lzn-rB*d6z~r-R;!GM6RM$lW6d*l4$q%DUrm_x%Ynq)vM8`jgAa z`kFz_Lv|aV6zKg|D~r-&3ZYk<|MLBt-pMOe3&zY88f$A*2QYq9mYX&7iLB_z8uR${ znb67{={8*z_zEx)%;blq%;(PAJ}#-)(48MiGWI~!De|)Qk!t1zz`CJaNtxOMpoLN( zC;%w(-STlLUptKoz7e~I2S2tick!?_SbRA=#O&trXmA9KpItIQ-;xl^BZSGb?Nea9 zdv>xw-jk$4b@U-?zTRH;~<0_$2N4O$-AzN?%BG z#RoJ|7Ad}(%B!{3?=7FxBnBxUkaXMY%0I{We0wMR(Y(7X!!mis|8D-h;f?HE$HgmJ z>wfnya4$eNQ9tB8UP6ubL-og64Qp!wAW&2(csU&qiECI4urd;Xsia3f?2ol5guUrg^;;i34AoG? z)I9HxA;fT3=f#MZa|+)#Y|eFz!iZb53}LpWT~*U?sy$d)Fn2bgnA;lnXm(Cz;XWj< zAn)>mBS_Q;;R>xSlTJQCsnMnLc*gQiZ1tEnoZAY6=!tOQj@F_|*%KBd*4I#>(5BN{ zIyie;W}$FzZPSxuTw;SJcO(n2x)y|sqJkg80fLJ*g@7Tk_53 zICpkAF?IPZfi>yVu>1zGHCHsP$QLip+#p^xs#cR`IRfV~b3%poixquuIE7MUL}=_%MKM1)L8N0ckc!_w0p*<{V3C$AS<(%|%=@#? z@wJeya5lkd;OzY-hVl9wb%Vr#;AoIdrZY84QB4$=X^SI!>lIw_aB4quu~B;yN0}TG zZrniyXyt+XEg|H@XE~&s1Xh9L)^V_*iy$&uh7#F&kOdiOvGz1!e6mE3X zr~X+tgj3l#V`?Bfkq-MdZYOym1E&E6M-4aL%I^8BaGu_uOKoxApoYP#RFo|*wdoSr z71OG1sCY=}#%>xzRxV)sCm>v|qX&wh(E?6Mr+nCR(m6gg9|+?2^2C{qSeb1B7spy2CS7zF9i!Y+zvNKXjNMKCZ2zT~Db(1KqfUhV8RDWO5R1%l<_Q zMCZXoz+|bQy!ya+{OU|fF6VAOZqWB_3_?IUaUDUK$U;E{+Pq#Pz-}7JS<#2vg zFqH^4SVmy0TZL!cH~q`*pfl+4e2)R?sg|EZ6|KJ=9fAOe_~DYo5?saMX#bqlAV^`s zPyz9NUk?1>dk(;R>uVPr65cohjVPm)(?tr zpnEFHBn~s_pCeZi80`-ym%Xk$nQDqRlQTx*H+huSC&jmUSta0`!w7Tyc2e9A;*ZW? zU`-L}a^}k*FzYYyLI+;bKG^|>N}t~NS#c=b)F7TJ2c_`Pigb~rR4>42FLDGjXrS|) z0z;}Z;%Kw7uGso-4nYNdwt%kf8$HIu?_!*^t$Yy#jnUMh<{GX zKP5B}f4>@5T1*DL-kaFsZTEHWs`zp_0&q~eu@y!+Auzr85h@=?1z}nJ;g5)N#4qQ) z(<`|2FGk@bbV3zlj&Q-*TK9?>GoWlAnmw*g2mQ1BSi=e5sa7OPj)i(gckaaR#~yMS zjby*{Z)Bn6hmw)8Vy*=4R@XB*@ae2KnMg;*4f;bFXnpFVFlSfeu{0AIsLlsyAu=C! zQGww#R2X#j;0G&??4sLX zwRUN_XjZp|PEMZw^+e5~FrcV@HHt*093pbX=}n2{mV0NPc0RX(4L4eBAc~@=DwsG( z2>n-fC8?h8WcSqoTlvFe1!oLUHll&Q#K9x71R!WTGJZz^frImEbTv3ff-2ak2M?!r z?qR(15m>j^L2@Zl`_7Q6w20zYP#(w-Px1&gJ3#0=B1Md;ytR90oE5+_j@Wekh7kfrtaqc^>?{);|P2We4ncrx+d z*(I!?98Jy0H{+)Vqx$d>hwk) zfs{P4xk4qwYto0!vp;Gljwrs60 z+4AXU(5)oxfS-C`KDcK}qUAm&<8$>A>J9srwUU*h&Wm*unk1@5;hj7E$quM=0EZ7r z#pMv6YPeAKzx`3sB|_{im@dh^37_Wc;5_4uFyOx-HsA@u4Wb@ye@%%?SSUKZzvBPw#3bea-c;*dJc)NG|kREVp>+!Qc2MY{J* zdW`Yl5|ZY9`wZ+_Oa=&QGcTQiML%r=>AJ6841yz<9^c#<$ukM%V!iB6GN_!e)gELj6@NqqV=6W?a+3*dKumIYxc4y15#0DhO6JUNv0jBbE!JW-upU z2-@y+5tHnW=^C7km{JdGlk}Ez&!(z-pCg2tlF$U*23aa|nsiqal@YDOg0Ul+0|@+{ zRG{-^v2JDTMl+#kH;0wb6o_pCAbO6)97S}p_=Um4WRN#=W@{`rVuW&lTZX771)hef zU-SnEpkE_S?M8oO6pMU{LauENrS9|)cy&V;i>o&6KnR7KWD8^z1-Qt8D#&P1iS)uF zs}fZd?)c3pG{l+XwkTOIdEX3rN&Hv+@(&jQb~w1Iz@o{Pgc7FeS0#;DTpz*~ zW|TMT{@x z0Bg*o8p|-2%L-8>)^)-HTp59CHQvOHZCgLp|BXTec^8%z7|2MO7QT1>p24*94Do1q zBxfTthq|tGq)Ea|hvCcSBQ23plV@{^!KO2>;!sS2ogEkUHo3~d_G^+!DmGqm42LV! zkkx}5lcX~cXlYM%!5EHBm|lwp`sL1@6fu?XGx9`m(mOnt6VP}M5Z__0634sJJqq3; zVOP5I;*ZNnD-qD1+Ly-_aT@B@+eH>JkKi9nO%zV^=HXgrma$Umo5(spKH^UR!>(u0 zSMyY|u>RCQAPW;xAz=V+pqWoTZf=wpNeGTl;wy|SzqosHy#1#FruM#m(?{S)^i@-f zwbLQr8}W1-JP(xE!l4Mb30~J3ZZXKl%gwwr$sce@n;w%71@&ir@bzhO=by7cXe5@_ zV6Ssi2hVxLX)&AykF(hFkX+FI*BUoPjYT<3+bhjDEeNs!Z)<-UU1<>#ijbA9k3U|4 zWBeZHIEF(BW#ZMgghu;b!Q>C)(Gc${qa!VfyzX`|jbKSqjk!hkJIl2Qu_SN2OduSN zI;XJ^-3$0Sa;volaJj2>pEVOL_U{N@7^q2Zuj(;?bJLMM9^K4kHb{CiDmp}!-I9TX zw}e?;XF_$Sv~AP?W9vE^xLROXvW&yIfJq>=hdPNJOK*YxGcv?)alV}c>_ z!m)KSrw@j`k&L6F&YAw0B#K0j5;7D@-MezzcJ%GK&V}(QGs6jf2VHn$VB!4|;I$;+ zQ7<2+{0jLemEuhSJ?^0b1g>8v&MQQKFJ3l-j9>IUel;Gw#fido`XU^GA}I6roo18R z3Z~~GsKnD{@Ptl@twIlFIzm2DsW+P{fcq0Uk?Icgpa#9^pyV?fkj+}i&(KV_dV`c4 zL%gfVz))1XADU})GI2kI-feQqBF|#Tp1M43dAswCH4<{oZ(GWfme-`+2Ul;9>w?qU z$3ml})v4Nx)51Fij!P)FoCr0Q+fv^pui8SKnb-ol-hPj9)`QX!oqSsFxgS6brAy z=5RrDRcpA!>moI$Xn}A|N3n5{F7VjU*CB)`DA_b<6F1B-l7SU zSfH58bS!?iF)5)UwEq3+ZOmkbbNIbcj_jt@)+t>vbVF5W;X5S}C#7kM#Z=U?i3t&D ztN+D)0IJ@R=ddlf7sJ2crt2Tqp*qxbVYVP?W2T9u)F;r?iBC3x;a>p7f79Y~AQ2S; zgz^*q8GkWb$$!nJlP%9a97{$bz7Yc-kf>MxWmBnoos_-F|99(a{&V%0f4P-uejP-A zOR0Wgx+nA=gk)lW&jOI?5|&_Z55)@QNDcREU<_zOaEF*wy8C)6RsYG+3w}pK4z$6u zIT?swqx-e=J4U;L)ht6u$Qs^9<&nxM2IBJkOwfT3D3BHx<#0M-; z_Sb$>2)@U68exgpt*gt5%H&@(Ozv25OgJEa6qIH%Ot}8SD9y&6OO8KlgP}4}1W7>F@Xl{(oq4_&o#R9=Oq%5oQoOX?Ff zA+lnywn8TmT}*;8K^%Uu-O?(ZR!l?WaP{?=b}sKSy1PYaa1v;MZP5$ z(0}IGpgZ)}pY&k9tU02qr92L;9BeY^tO0B?H1(a~U~k9WH&ClDQM)vT0*zZ`B_LIp z189LYY&2p!d=A40OQKllt@;lFznB^m1o!|+c(heq+)PUlkn-=mXfWQmSE-1lx=|WCWwx2S zlN?_@|^auz(DP@AY0pghtkG}+}53F|B1*qkbGolZ^l^a>Q$w+h*Wb! zYTDDbtFAopgG*=)@0;kSPm@Sy4&6!nVqV=D=3Kh!By;>jRi|wlZ3#zgMQ#@CE&MQ# zBK{xU8Faw^=uTDt{~2|slfTGjl{uxLQ~fM5x0&b>%Amk}Dz2oOy1%*Ec)2s8SrzTr zX0Xnromk}A4x9ylUN?7mDP}6FLTF8UTHYMdR{$&9>{Iz%wHTv^TG=PO8|x)Y22lA1MwVzi>@DYd6%W*)jo5p@>m18XYMd(W7Ea^|# z>eNjmC+WxRKw#{1eQH~80q_r=(yH?@ahlQ@u(Uj}bR+W)g$$&HOq$5O-C58qT8)3w z9Cu=lW6{Y9=&KvUhPNY%BRE-hCM$3p!*mDe!DRn^uf<)a}JUySo^np|m_Tfo)_ z%&jcsF+{FE6mGus+Vhk`{Lkv|gpF&>UsE)A&|A~Vuxo4o+!414+n*@uus0rTRPxR6 zM1+Y?JW$X(-|Re*%(ShJA$D_xl%+$^8|>iB0Eug9zK^$1$UrYlY_jD763j6GV9SKI zX6eO?A}VH~jOI(Y|7R(;CU-+p&$X>Bo<`)+N(N~XR3V8m^b-jcyjWLdskLZXJLgC{ zyCu&TO>cYKZULgLh=QAt0aj~t@IgWScp0F6Oi()?Z>2!bHSfY0nIJgVob4U2w9J{y zy~FYqg{<+~MI5a70XJPLRdpH@x{=!ZkF0G+=NNnx14nKtI$uWmr41}X;DHsYlQUi_ z7e;F_kQkkl-)p`&LwaQ-`9`VK2@`gdlEYv)eVUrg7g#x|V%NDbt69!wVYb3bg$DK= z$@-aJ6BOK>FmS7?5F(x@fBI&lS=Mx+?aoyG;%HE)Dx?=JEoU0ovRNu93(BQ}HO*NQ z%e%}(Mc!3wE~&FgWl5S=jGJXc)KBE8#I#(X?@_b|WjBjC#Bziqh`B}T>pWnsxEn=I zX|^KSsV$eeDYL8254kdP;ry9tLMUwAmElaksoTIPHU5u=y?h6~KJKCJ`=oaV1`Rz; z&0{GIT+5{D{HRFL%VEg$40j7ciM|ydv2zz^cC12hVjb@#OQbM{4VJng{6lxlSBTe@ zkw6;2A|N(!Y>P-s(Ez^o1x?cttx9Q0SCBXj3-{R-q^fdix_*?>ABFa?)yNR|hKaH- zN8|T$Fpm%8-rukAnpLhI2TY-q-stVg1zybTl>LS4j9hkj zjr|qSCOn2E@bUwbM6QPb+!nGdj|KWi;Lm%=F(p+h30`Xy$bh+Qv*Qz~9gmAvAJ!rC zh~1IjatT^I+$PDfv*O|$Pm-D*>8U6v8N8}>AMC>Te7q}yc+$J*BSea~uS#7LAUN9n z?$OS{-oZWrFvX`p6A0QL#mClhDl177H!P+3f?VTbf(b#R!O!W}ayJ}19o4!OQ0#Y=xWazuim}-Fuf9QLB}1+>Y?H;D zGetVG!u4FB6kjMTeu|Y#O~3K4nJ(3A&RMAlu)NbMu5Hq&jrBNF6XUJw z6T=wp=`5c+U$SPAdAf*C9`Ev>hfnVBJ=&3fJ%054_OX6^d~m$GbG-Y2-yc5O-`?Xt zkfL;~O}FpEsNUW|oqCLQuzw`~IDCwqeSG|vbiB|Xo`~h2lZFxo5?{dv)kRdYTLOvC zM-~$cI{u@GA^?0{p48JB?50S<#`GhhF3VEXY-VFjkO%}reE-tva%xgD>;Q_&RQ#qc z4X1Wj*Q%qhmeW1L|4+F*B><+Gpw`!bD))$@hEjRp$7eLpzRZA`60lzjr6!URSX*O} zS@*P9d?Hs8DP<-Is^%bNG-d*FKS@+vC+^mti!W`tOl+LOeH8J*}_Dr?I)2f%EDOn;6$YMT`FR+-0>>@BH zZjkGysJG6_{{V|MnZ>KcL9*O64M8Qahaa$M-7iK4Y!gMAM~fqg<7BE}bTCc2gu1rr zRbIXDAo0l3WOzQ|xN`8OG7n!T8gSH1ue^)4Nc|BL0aVBs&|ZbYgGFDzwBZ4eKxN=d z*##fWB}!q@=#SWPt06#Jra}z!-ca{V7;-yIK*U(i_3^%Y@#gaV0yvL^2)kYK?wJ7* z7$s4r2j2Xq97E)!GNP_dj@X_m)hnfUU$W!V9BEO?uG6evo1Kj<%(WPi8qOhLvVgB+ zO@?hG)QC1eyw|Jf6mxc~b}hZ+VFM|ZX}go&yZ+?TBrbs0uch6?HyloIa5FyPRq%DZ zC5gRAZJBJE>F8#^E9r#n;OS0%Ts5;i7M5a=FQ;8?%G7g*h zOFbA*-(dSXy`Er<3QbOR&b>%gsR~BJ1;)koBJfTDFfZBpT&9EGpr? z`VrJFZVkW(d=8^)*E5DP6zLJKWj{JCBC@-z# zimr*%Bk54qCAwLvd@wi{5D!P`%Unk!l?27Kaq@9wzf+}k6{1rua?mqwc z7HW^&U4M!MM{E8(|Di)|u08)a{(kG@Z=U+Z&!28!c>JC|JllM#Fg^eI^H2Zxuea{4 zN+BOpXlnac9vL+~%&UfUbH35zckze3;x9rg{0YwVMQ7zfe*&xaeMbz=yL9WQ*uLq# z>$3d)CS1~cl7pIjy7pQQmb#%dk{B&9HvZ4^pTGF^ z*82M9&$sbEPyNHKuRH6TpWG_88P<`F7@kfM6Ujb5{iELc$1|(+0V`j<$XjEN4UL8- z#lGEn_5RH(oR2!KfFSq)+U46GK9XwiI>MljcZ)g*yLJX}74gsa_(+zSgGSPhe=GB7 zu4w_<7mbUtuUt&ANPNfD5MMHC@G!XR%USWaC8x-=Cw^pB^30(dyejm5oX=a7pE7gZ30gN3shnE*u2X3gPeEJ^OKT z(mzM$C9j1L*v{R_kHh?lkah09>|f?j0HbsF)l2k0|`{y4qp0vyVcS5XRk0{1;BL(n$FC2p1n=kpVNk&AVH1;*S)Tf7;mS zJQ|)2uFiX%$q2H1GQ=e|6r>)HE_fz}U?Fvq$a;xFb~ZL_8N?(Ga9@12@+W3L_s=#T z`g3UMUpp9Ld;Ic>CE}0XNU@!jtvUK1AfXxuSw7(XG2);1C+FLP!9{mCWdxkkZo;y} ztfRL_NdLU#K*!yeQ@Z@{s(-2Fr&7=3?&%}Eb~U_g=*H9DO-ZTmP4s_5=6`E@(DryV zI6@cUw+Edk+&VO zJa7hk*}46>|2&P(a4<31l{fqwP3g6+n z>V38HZ=d-xwMV^A_jH0g<(KGJ?F+DD=et`~Fz#-VT_RGR;KtpPAuj78;7DL5Q#mWG z7>9J&mC1FMYz2VQf}bT$5(KrwtiVHRLVn`xTew-IT<5ZXIRNU6R^%yTaGOJS*F}+W z{69V2d9Z!F{ZuG}NqFgSj4}RK-5-$xs8rX1(4=KD*_5`=pW6sql@WO-8IPA=yg`|o z$!M6j{H|QTHt>W8?m$ka;W0F+O&kkIH*;F4^fn`A6To^U%?eiD{;~srI(N4?2mUus zW%~3^2ZFs^iaz`-lJ>lP?#^AGvmjbnDcJ$;@;Qy?r!0K1S#A!M~rTuz@uy@ zuoakr_>WuHww2#|!5>jHEZNAr zr(+f<+U#`v(O^0j*-q4FZc-JZF#1dQA~GtZ3KWz*hrL8<*@iEQD-Ihhwv_3dch{i8@c;ed;&-|O?GkS&dE-;P*f{G837QYKwy7}(`Q7N>>b4ZPr|KJ zKs|;#eX=mD$^iwHCGcxs(=RSGj4QXX-SWIPp0F&ROFHdglP3+k+`JIG`!X7R^s`{u zhg~J(oX8fOcE?|S^y`iGz(=hDo9cH7)HeruPEZ@RU`|FCt8xbttg}7r4&MLN8_&b+ z%p;UemeueEd2+(oKha1Py6xI<%M{&0E23UFdGr3i@b~3jj7ICLz#m+K)9z2Vj2tZ0 zki@_rktoVvg)DAH6UVQ5xJ}O#GD;!|TqRJTmmn)3>y`xa=X1k57h!x2HT#hmMB>5_ z!7WLSq!v$d6wTdy$9hTE*)($pekao~J7!(Lu#n+9O}E+RxqJOv-S0tw8@D_FIv;=t zA&q#&f+Z*s9+O7*q-Z<;xv@d-oRI@P-}dB6{uZ+ZOCSbx ztulj1)ty(};Y)h&>%?7%`Zktt(D`CBGk~S@jEBRN0&%fj%ChTUyamNUrRveND_98J z@wqTcLuAeBEsu1UO2Wv#u}v-Yj`|LQaDO?ukDCO4-aW2e2eAbs-_*`sKxUW}=>1Z| zZE@Mw7#v(6kO_|Y3VUl}J|(`JvSv2#9z4X!-CBAl%X9v2Hk{rw`E|~m@I`9UMBxRq z7FHXu_9Ogz1ZwcM9Yl6r@<|xv*#a-7%2R+lb`Q5{ND-To7Vd&gw3?gGw6|5hd5ww2 z$sr%Id7Sl(KB?+sE#X1HAG`9rB_!B=2hi_m98bJ$iH`>&8;PPy3&;x*h10;=ek=1?fJ_z0f#!RpIVQr}_J*ozIx? zuGv*5dJvd@#iEz|f4upV>sGsgu9OB{WX|+alspRW6ZnJ-WRezdx1!#Soa5zCTp?X;#+h0o5WE8LZ8uySC^SY&37)bt>Ue*i-Cv+jY4}ap zq;Hf^@P|n)CYP5#@6w?qkQjnQTetn@NVbnynEH^r+#jgXZ`xiiU3JUSq@PlD4hUbv za<~R9=&avETYdm3*tjIy-os{%m#KvLjEPz5CxUHlDqE@#49CK|Wph`0*{V-rVSSsumO6jA*b$k)F?-CbSvHLmI-5yLD-u(ONSqiNk0Tf zlxz7dSs^WJIxAR)3%ujS!?zE5r&lkhMm;19(cB^iF`9xL0Q*J1W%Tqo=j7RAS%ocRoCS z{ruj)+@?W-d$uS)k3$~}h!r3;?E;s6SCJ?5<_ghS6tBL7^J_}8KRJO1$nvK&F50Ac&pClGirTVRIMpnl2{1p#HZ}f4IK(Y$)!n%#KNag_nxgz?l-!sglV0 z%EK*goV)|u(i(Y)(VZauqoN3*V1fO+dJdw^Py zYPQ&;peQA4btnY!zx=|D!UQ0z9?(@yto%_fXIODM?srJYd{mOQpgvXSWx5%GX zIB(}{zJ`1#tmJkTjL$nFqAO6~#3dcuOgi5^IXaf8Hz$)Eq`ik7Ag;(m4zj-H&Q$iY(?JXds4>dn}WX0-QhX^ zv9GyV6>O4<{7B^Mdy+vdC`Hc8$j;0pf06>26)nW5<=&5m1I&UP#f;T<5c08SW%|!I z|JWfXYsOe6HG(x6y|~0G0R>Y?Wh0?U`0k%W=oxl+;0sAJUv_X&X9P177_b`gf)C{9 zNe9OIBz!1;?H?R#uAZL>=IO$c8WKZ^h@~g&Rg&(69^fM|K?oS!uRL+=j`C zU`>nH;$inm_(Cp8c2SAUm#!$o=KY)x)=h}G@g>b zdXpKa{w7ngoQ$F}WBzVhOzXl57OfD`#RwmeygdZJf_*Q+iAwwV3=v(_sf}0-GuXI@D{;L%!a}mgbO|gDuQv3i{<}CRjo!LeN2n+3Lu^MhhZx!UUSX*V3;MD;(?;H;`Y?j|pr}I}X0s zMD7LZVVur>Ek9f0?++J--8udgANtw+JYrLUI zfrSK8CuW9Nhc@V^+h4+uwZ)nxn9 zTFC{B#=fB=2W0I~14v%h=C{+)`TGFP9_wpSl85ZM@3#NK8yUEW4Rf)3HXb3_&g;6% zaKQUpVTfM$?3J9$qaHjpf-D|Kf2tq^GiQ(*LbT`b>|eqV6=uRkGF*Yf>UtLxF$8P? zNOa{wgYqpcKsOi7Tun+FSj}X`K7yv>7sOZl$r{U3?TI z&ckR(CPVVaY=v!}CsO=Z@%!O=>taGzNIxpp1kWNvoCEiZXvx>#g9E=}? z*^3bqMJY}AT?86ut1v~k2A)HM>}v?CSG@`A1X9T3-z}X_dkpExJnq?t-ZQA$@$I+Y z%yYjlLchV1s@|RReqpCt$dn_V(@>l`Gql3$8Ta*b>Slw%m{bM)h?0H zg(+l`!ZB^g5~Xm4jK^*byCSuzS;Qw6os?S#Y-X!>4xBjn&U(SNHc>d!C5HNfRqO*W z&x;;_1ksYkKd+s>IK-Pa@ir0iEwowiP8M<_jd6X$?2gR2-tyE{1@o|W&&~VEMmO$; z+;VlgnrwdGbcr;JJ>M7^4-@|!Kv4xH z5Hi>;kB&f=a}_CJ?45; zaFH_q?0?D z+%S&Ylnqu72#;&%~sa{xiK2=BD%9T8odcBuXWbO0j}RUIWbLhH!11*{M9eE zEfsd}z0)E$at#9E;R!B4kf9Ozf>qZY;MI0ekRJxScx{SxFG6O`$lctYAZtyQzL+=_ zCXuuPN-v>#MD#Q`=b|dHR}W=L=Njc=clF+x=fZeg zgU$0}Ly4teS%qxXYEC|o*>(DUP(sW)jM5P{3K42v{6$qFZmq5ORwAl2u2oObP&kfu z2i$*dv;b6#)c~X}@F?$oA&`t{GMeL+^5Mwfc*|oLBr^>*m;!e7@|D(0K_s6?E6~x1 z9(UzHU2>x0G>NF@!}^gRv>ogJi>D5w3ClE9@SQ$8me1wzCxlKzyo0z%R=(j;xvCOI z;eKQ-&odNj9ULLR5okBK3^?{uqED~fZbg>&Zi`XS(B!W|}Zfb5FU@=Nc2)bDWC-0XV z{uYTLX%(ycPaK?y)RO`=dFA40ljd;rN697ensrDOZYMo%r$rosWjaJw5nMCNcB%hY9FChkGPQD-bz|ru6=dRNC=h?;EGd>|Do&Add3gz3^rrI|d185DidH7D+R5oy@m2+zAb9+Vw&uTG^Sb z>Oatal?3Tyu|Ro{U{#XpKrQr4e*+n&sR?=w}Qhw-nqzLVarYqY)HPC8Wt?rjV{F;O4`CUh^jcbhb!+%iX^twQ=KW zf{PopcxW*{;~4Z<2kGMy<|pD3^Ky5?M$W04C8KL$y$q8dKDL?l@Eh>#%h@He{BYl? zddi)Sq~+L@hth7vr*luWLd|!OujQcyiwMSFsfV=>%>q-VGm=3+<&Ep)koYqtb0maz zG%GUYE+XXYsixQ<9xF{SEQ61@A5lxcr18*&c46X%rc|Q%@4lPp?&B&5hq9;2)*{h`_%4Q;wT9S(G$;o%W&r^j03e9e^ z`J%-0yPG{{EOw)T0#NT&C|q6Mg_=Pe;T%G3`fU5l3C0XSk~s=DVLy1*?@#Rs(Ih4NmceD+#pycs*kORg_EZJR=l8K}HLdccppgYNQb;GDX#x#c*Dabx&oXIAc;?gu5IE`N<|7hQ6joM;ZE%wv7=s0_qWnT-t>c>%I&Scv?D=RxBQU=gC24^Rn; z3Cs&w7ql)q>+!3|+*AM1mz?Cd|O&urU#-iL&^_(Og zD;QS7AJ6gD%(6(JA5xUTHPg92};Sf`&Mpdmx)kNYDUrz~9jgTl& z2h^#LqX%7X?RaFmkFrdQRK|2d7^+kgW3yoPm@ewtRZlab&BBh~pe~kkan|~XSd4q@ zhw%sMcnB`XTR&D}faxf=Du_rq=!Y~|KmAgqHW*bKG$8fYGElC7=8|Qxu(=0JZ;nHX zMzq9|^#=lFS(joC#yWA~81@3HK*(htAqT`PLXKXI8(i&@HJ000v?FyG$c+PqhF`Dd z?>X)PGkE4oa#Bb@K!gCbniZ^4AW%wpDpSkR(`F5+8ECgN#QjvFQim>_=!s*es3&vUCDZCdtObEi zp2M*JX)eris!yyh&H}yluQ#7XJ`>y?u>Lp=^@!Ta1}6{Nsm^o zldAG9N&9fF@z1LYzi(JkRH#zgBFh!_E`~WL-h@}WnUZYvj)Rr>Zvj;9+!WfBlT#VA zLOZgy4$|6CmXOX8(k(-f42y#ot=@DvGG`*2AoFrl;>+68V&ihfu4M5&)h!M0O5m<% z7nDs9okB3V$OTFzdJ(6%bP1iJ3Nl3jY!{AsRX1A2P77>ry>n4bW!_{eTFsx$S~jx4 zsuOcqkeB5<`9v%vKI4Cau4^EtBCIPgGlG>6FM+!lsB77Qosb=R-5tqsDLS|<`O_zc zF2>fpC?UzXoKu;jsQ7nEQoMHX&ZoA98I)||v}sxY#wecku^XepL8J1Lq6mx0&9~z> zJauZH*qNm98~ZCeoutJ<5iaC6)h)_Ll&e~_SWtNbvC6ZnTB?VLRYYb(!h2gZ)VP5p z=ivwQ-&)2d%SB2p$EVir(vArB$MFm&*I>rwE(qV!_T~`~9M!@vEjk?U;k{UYoim5u4E2$vqki$marmun*8YXYQoP~*)B8*~QPAv3H+ z{Mf;O@1w1Z+NAQusL7h@^qfr34NjTEOQ4sA0B}o4S{s?pQ&w(+Rk#@kLqAfT+25Ik z;!v%nSCD||%`Djj5#B~cq)_BDY>hAG85SoXMB!$y87r;u>mHOXGQpX@P8>iAp)Q3q z^{340^fJZlPORmpS6sD4?ue?-uJW6qq4cG{{tlY>zRlJhxsWfr)0KuYZz}=3qLAv3^=-hvd zL8dE03oxnG$)mS+OA;w0+^pr^KX&(M2@PfMz}5&(e((#hlkDi6PoSNLXkTx_Iau-=cbq4L5ei9`c+lbQNIX&*QI(s`$ z+`5MTp9Z_%8n&L}g0j|52Tk3oS2W(;J812rrEN&DS20-PgH-Dy~zIVCBG;?o<3^NqXxk1PS-&aWvDV1U%S z%vNeKiu~7@H5?1XOMif06aj1q2k7C3Joy-O-)M$W@sPFLnfOFa!d`JL0!Ij6riF2A zK~`b90sGfJo7* z(YmnR3TuqA{Z=Gpy?YtEU2;49_Y3T3;Kqp#!-H>T6JlsJwUdQ(poCIByJ$gT)UmLY z$09kNOQEm7)~84Perg}X6xO(l+aSr1{fa5Z+nq|NlTu~&CgH{h1yFh-36foe+XRH5 zi`Tnlg6Ly!wDoNI%3YR7W4agF5t%Z~?O7s4fMRjJxeKp`nh7&3gBeZ+&C!%f4yyadlu;CK zWXFKpPU)DJ02eyoOl@x@>VB|M?dT8?ReNqnL37(t$x{FiqAn?L{`y!dRBoU$ zP404tQkdv3c?r@7P^p5$V=Iv)^ogGX82&vkV-y8OJN!m3Oi2@V?|89?T&I%Wrd!!| zZN~{lO64tN@6w9aRNUz*icb+O;+($3&7kpG1pKWv5G6C1Og3J1Dy^x{gX{|nTd4!3 zH6rWPgk9ymJ9P9oEnnx&p1n5YaEr{QiXUND`m#4}(SvUXFCc~z9Du+7)mKDe8PO1` zpZ16VM8@hmj4k*vnU&qMQmdl`LDrAP0llYA~%dj9*XiHUM{yDz83MrakL=6 zns0H7jv4I2Dx>vb^O79lJ21NqnahA$k0DMD3PRKEgwZTq{3Wimx$Mg|BH#_uK&tMa z;?k&haDecc_>=zHI@)XD@>~ib{LO!k+b{RzDqa4NLi*X2_w+o`9$dl{H$H2N!d^gn zOi_ksnnW%@2teGX#AGviuJ|n9SeljYNT(W)( zWGDp&AZ$Gsy0QTTOsLfrWdwy(ULsE5?EqNnD|0vsux)c3!3O+ zOh%uudq5KC6S(qaZ*Vy*NGE6|O8$ZVaAGbgo?#J!QtW%lFDy&w@hhAmsKwLRjQ7?d z@=$_7zOQgk?dkZYcTQTl2q+kxHEAJ}Q4-U9)IvgL5e^zzufjeu`D}=8SR=?D4De~{ zuSPXdmtVrE0Ik9a=n#Ie@wv`bv!XLY{4sfB1Zw~r{B~jT(dQvtza3cVy4no$JR7TC|Sk)Y7Tq zI?&4H>QZy(;_A8x7(tC93Cwl+;+nb9pB!4l1}K_76MH$$i>u1E4E z+pg4|aAWqw$Oyi|9e+qbr!6o2hh^vw><-hixqO}0Lv(bD@K7I@0FH|yh)fSD%ADfk zM#+kmY*My(VZg9>oIbmiYdZKg1*9bs(%#+C7JF#2@~Y zwbGmCAqxsrSLwts6bmklo=T0s=-pXPLlQKQez7)DxpDgzcez@lIb7x-Wfv~ib+RIZOi z%D+05PQEWmk%)#W!_G&02Y+&ON^bD3dsEJLBg`4!HNfzh#=jp6Pg2)r;);A-m(>Iw zV=RZ~4y)LWExa+9AdJFK0b*r#BSFXYa~m$F=QbYE=nV(T%II3sug>4~{QKt=?)A`^)h%muhVm~1vXr_F7V`L{Q4 zz-(q60l}PnQ;f^z5L6WVNOF~;PsC%SwTPG|O-;u6`KPqUq*%~8M@Zbw5eA*j&<;~o zRdERj<@Jm>9+zuDNfd^C(6~L9ItTfRZ8!IsIt!l2xQi`M4W*(qPCG4RxCbI+V7v!N z_;YqdMAX@7&hJ)wTFDuUX4}yyFJc#ufC|Q|UF)bB|FN<4_&z|R;^TGQpfgR|>~S3z zGR;M!`o*M-0TkzEI1%lHB-;cVDV#*}6&jhPxH3v!iF4)Rgp6}pWRl=o&`g`#rKq(y zP8AeYzc@Kx;-+QPYH|_en)#0R4m$0lT{E>phk_)eByhCOY5PAq?SmJ`KKG%t-QLSr z`)yv>D@`{NLo2BDk!2aa$Kh%)r;Te~q)d|BvvN(ewS+|lBhw8`%!u4eOpy{;UQKy4 z#rG^w;etBNPmer4!~h_?bNr6}93{sB#lU zmSyNk#`q3Zh>``6C`AYg6%~!r`GYH1hCV|T+Hbzr34#;m=%n$%+|oA{vMj=qTB@ij z*$d%NsvYehdQKP>N%&L3HD|G~Lot? z=aN{S7J#2W9rwkWW>hg1L5!8vIl(Ni%Ebl6K2#}lcOQtseh24@Ixooxovs&Dxw44K zl%uPF^`z!R5plMOWGE+>B8yminFmevTIuWVCsu@rv07hH5w#&oh(-gnQhRv?N?4Ex zR)X9i{Ca@@AAIlqydb{+qVDQhA}Nyof<0PH2sLEFrOK`k1p>xw=RfY*}xB(9{fH3L?MBz4D6bEy?W0tS4)qq3j!Yh|Wq)RI1I#e^!%<2uNDO)={h)WePii2tZ^$V}jiB=jY zB>&Fqj&7u&I!4VS;$sR?iKTz<%kjOZIE5rgmbr?I9zD@Ts#(n3-&9+McWs+<@L(vR zJ`H9p>3~c~rQK|nj3em}#F3zjEwW{P1BAL&F*XiCs6~0tFj#cwLKC{Kz+{9ED5y$R z68E%qX6J&V1=o%LikPc$f|?s!9&EHBOScyE<%V213K08*ioE(3myy2@GzRz0JbSK$ za;SyQWC_mJ@f26~oziwxAFy4hw#o9ODUZo=;axX6d?r`sx2n|S#gvI8>(=r;E)OV zG-x2=aVDUA2gRXCFsq}N}8p&fZ;pe6RWZa4KkWBcre^0JFMTB6e!E1`bk{LHCE86{`yR?^*e#Qh9M;x4Jobzsae<2U;628erf ztfqthfpY@#IT;i3>hvL(&NUXdt+#f{-;=Ar<&T%jL4pVp37G{G!VHo(I^Peqi&*G3UZPpNVlL=C0*zC zD&EJC(`X1{x@kcrZ0D!h6LMtK7aetp_=I~ed6<&AplD6w@^sK}{7C*OZ{bf9;pjyJ zMQ2ZUaOOik>5blG38f;O8aP-nm8t6dBk^!i;h<#cQOnNh>*F>UTc!A#lQ^n+wOGnp zkz-GA7$CynGeXB&8$Yc&q!3W8KpIntrG}A(DE$=5Q&(iprWX`;+ykyM6ifx?A=^{- z&RrCO#jrU0f{rnpAh1o;Ut#lD25KR)NMJ+a?p`9%j?5hWMw>>MNnxpC*bwJwf-X~b zS_u<8{nOFm>sO2w@L+BGwA1?28qV5Ke7gas7>sO@9A(m$aqMY{?ly|WVBMaGXEXQz zDFO-uKaq7w17&70kU@4JlTctAyQQ@-+-|;P%;DzBliav+Q;RiBGCU2czUj}vPpx4H z(KVhlQC8#(1x6f9{UU&T*S#ge>h;5O{iNS|A{AW{yi<|+W? z0?_U$GErR9AVIbbT9LQW&KBtn+S<7t;r^6rZCfzUA)}h`BIb->$iY)jRVu_Z=dZDM z3EbZRCv2gx8l%amf9)9K*0adrTH|B99K1^yLk)mi0AE95pG-N~KwNclFdVqz?9&VV z3d($v!{?~t=ycxY2y!~q9zo;t*-P2);XZtEx)Jfv7wG6Rc4?u4<6EB7o7qZ;bYk5HJ zEb4}Z^auGyIdq2nxt^vydn8VWi3ZDVrF2@dg+5(3@7$XO{5tIu`RM$`myF(|YKuUV zHRm%+-d%9ZZDSMn4jfW?XHgz-M;}D5Xc*a_Nd9RYm~tCRKfnO;T4KT7Y=6mWR6!CP z?pHV=v8hlIKY{vzduzU#MVIT(Fn%v=Us18Z{;i~@=?)oBhj$EGnJ>Edwn#6z!}!xVt$m-(=olXrEdo z=B?u2lH{8y8H#?HG!*rcOE1hwhAL-8PPL6k*kxb!V=d`na+ka1ne?bVx>7)x2}fY1BE4pQ$`T6Bi>c+W4v|BqX+-bsa`43@KoxtHph_ z)spWc6I*zi>zH7Q!^u+F423JHCE}OM%?{g;VL_Oe5vRt^XL_f#yQq9*eJfMunMNZQGKc1BDsiy8!&cnLQ>4K6ek)La5GWy#ER3`!TI>hNukA8S_Bpgs_1EJ(mC{&7b{7m5mm$;iv9K z(DJB!1yLkDaJI6kvh(sN6fm<9BzLIFO-S!kDmCWZgp}9fmx2`3GVLke`ZV)ZbIb+f zMkZOI^dwK>K1Kw$oEI}n^W^%@$jXTt9@bA3t7^?`mi3>I0Yod6%eYbeJCSePs;bkV z+1?TnA_;o-P-e-yC{;;QugK~&OB&(DRGCIHt(#H*XWn9FR%N(Z?wjyf3E_wD1o<3xh-dILcx$D-eN$2(T2JgIzhIsmL zfw$2|hsiQ>EF-Y(Dj_08E&9NykJJW<1pK>1czldFBsy0VD*PnAT1D4Hz#UK^8&6C?ZjyA`5Cx7`X;_OT0>| zP0TPJs&tRS$rImAM2nS9MuS-K4Cjs7A;gA|)0DZH!0? zG{d0DOX{Z`8c#DT-w1a}3`ZBZWM$Mp_ljMUyB&O_4Wb9IAz%XDYz+qp@(MCw>`y(3 zi%0go*z^U2^i-8+cPaN4VvJ9NY9S1>kJ zAmL9?Vkpp9ZUd2+IwUl-s_4$y^G03qE6)){C4ej^UyBX4w#bk<>!N2QHt~HtU_l3& z>%BLFdpV1Arzi$`vArV%;(vCO0u)!6IFyOq(maz0iLk~&ZWHzXJ^_&=ilw9x0XCw z6~M)==}biccAg~O81?@9wm<4!i1T$U<}%BJf&gK71oNiQNUdO6RAe)$S#%zj=H7zO z?Cp}DNxPM7FiGRB zp8h6|u-*rIpVbVwT=qU+pcx&xhU`l8@B-(~vTbHqjD3GU42+n~9lavnycj|m-kl;fJ*%t6qcy?F`C{^82ZxCRj zh$zaYlP zrTkN}4#6C9Y_K05byoh0=lCVb_0=LyxK9ZPMH!%@&!D0Sp%k`|T}SMc-Es<5nO0D`N@}GVVlUA{1}tMy zo~S)dM@=zzi8_W7TgYr=x{kxDtn$5w2?cIM^J_NC@JEK_Bi&_E?p5Z*s_1woBazKo zgr?85(!w-R3)3v6YPT90zPabsl!zrXl=xYxxwp_ZYaACl{?JD{{Q}|4 znfD2lYO zA{IA={Q}-?hEVo-r^I~4%g`g*_ZidkJsa>Ma!uiov%OS_WIq|Xi1BiVo4H-VP?>k8 zdH-G6M;;I4&}J@3cUtK{rk>}==}oQdhtSm7r@~22?#Ke(SKFV0YD+4r^ucR<`yJZo!^_Gw5AO6Nr3Y*ee4T&V;pbCzjbOibOGUx+#-H75LO zgt3auLvG9CuKKoGsT9Ue4HeTUw~1m8?r7*>7*6k=sn*AG4q&RNirpUoE%GAYM(JS9 zny;S+`8k)4ERlmlVMRSHa> zW$QO<%cSEJ)EOagK$N4d95zne&-8e1BNg~0 zx8h;rDf|7GtX(k9tFnyx06e1%0Q7lgt8!0mITlJgn%Z44;6@;@pa5Flrq%Y~VpG!T z{?1E?$l_x`?x~<42gjyacQbP$%FsMYR9{ z04(=8?u!2j8WzI#LS9wGdh_UG;wMUGb(4J`pv}YAvm_ zHG5jb(g2peoP-rBkXazDN-;YzleAAk>oP)1Ya$iU@}igQjYqapXxH(l(51gTqJ%hb zmxN@TN-yF@perFBhO}iaGfg7Ghl6fVe_?q6$1WPTQaz`uN)PoJ2N!U$o!7%j^x2eZ zpobEvKxqe&8JwPS5GwtW??#N0j0(Eb;?ZvDhLOx=v=N8YNEVG(hYT%0Ho;jh_-S;<0h&}MJ!xzfFKE0;c9F0 zel)y&_nv8kEN}}<84kKvs)7%OgDokRpmk1+{v$+N&t{^j%>sNs9H26NSV?H=godfa zlxo?;qeljGh!D5%1=WKKXq<%>qZBGjnptN8xHS>94vMWk!)Lj>C%*$BX4{9Po(LJqzhXIO;8Xm3p=I4bj7#MCa3t4n zV0K6C&g-KCF4}X%zyHENb`B3Zdk3#&Q9Ius9sabX zSk8u0uNjqRs#R=L+@g}iP1&#W+Yy4WxCMj}WP%%e0L#XKn)cPW_xx&j{uAB_V|m)p zVkEMY%BKBZXZ^(uSN_#x3_!k1!Zao2Xf}xQX>kzdkz{fF-+Wq zP(bVWP5D|E&MxH>uxa}~Brpbj1YzCN;Rm^aHVM9YWA5#8I|Uc=U7Ix>BQ!66W>6H| z!@R6IY`Pk>em|2MlHsJEV-SbRHkd84x9fdyX_1O+%C?#@hv^yb#l4RO>A4#8wtT+- zS?jlvVeKM_8P{Ys$(NzY)Dj9E=bIjn$VD}-h{?akOMvn@MAniiG+CSC)|9c9n3>6w zJ5f8$&>}LLVt@I$?Zl5u*7ukWjl)a)qkc1-gO1&rZO=icF70(}J`N8#kp{!vQF`cz zsH%Tiyu~-;)cAi>%e!QjH&y>TN;o4Y-@9BO&^9+cteEX}_wlu;VVi`En-`9{D@zfI zaEe@IwhfC&AiG$Y3pf$@iFSbCMUzHs|B_0bZZ5Z4l+qGBJb<@is+5_*Sa~AWsGHh* zaU#mklYYGQZ0SirDsUD_Z+<=QzRTtf_4uL>-hMm63zR=#=vEg3sxnw=_hOzy`iJg_ zH)-O)HSM}gtNiT_)!2e(o97c8b9|&V;CUc z-g~_L=-zkFzW8Qzd(|8FCJnqCjGufQ_rJaOelodv^6=q@40&_vBvIZ|}YQbc}uDZ+!n`FpMXJwf+9^TrSf2_TKjPL;Zh3 z7~3Dm7x$ih(ZGM-T=d50qy7zzqh}rXL##^}RC3n_2fXNx5Yf8rUtNsNfqaZa)V~+o zY&UjPqr}l0pwWdS8pjS__6L1<2;h4e-Z198{mnx^_!kOK@8kK^?L}|vri&w9qrtO3 zKJ4_ylkvkpe)F*Ss_KKopL>Hv+OyL2BJF?t@7vz!)Ao;Sbx~sYU~YUg~j{z;r$S$W_2^;PGg;WH}jDlfmiCw&Fv5(Epo7BE&`Z-*|yG`0()+$e8?`JeeuON z@&^b7B=a4x_Y3Jr(#57SOpXJtj^7y4y|MGD@L&$!ttErIW@^iyhyB5^jygB3dyJs} za76D2HU0kI!73nUPMUu{rqxtDwpx|uA~%5lUSc>nfz?0vBjzstIVU`+^p*(ES9q+o zK*h+JF1`n>R1b%maMe*m4v++?`rHnm|GB->ImIbpx$cmv!5To4sVoML+B~W(AOHJn zRJMRWp|$guwq~xViOl6OwIIwUH+d;34GpYRznA~|*Zk+d`JW$pXFv5(fi!-- z2)p>({wmegk<5ZrT82}AwGIp5r{t>gjg*rS#~x}C&{_xD>0J%>Ev9=)^;D2Lwan~L zJ0Y3A+4^U73pcmV$2ivuqK=EpLFBgV%?KZz%c*O1T%ZRX)Q(t)m%3z!PGZkl7Jz3X zFbtGvrx!xl`B;{LkqYQMY-1#D)FFf$_-9y((E680zv}VPEuE!BV-N}yT-`E=v9iQg zkZ@0q$Oqz`8+kDhun)V#(OLfj(K12&=+0h2<{qB?2-N>AW$q3lq?6tc{R=wF5iQ!m zI-Eg#EKS7=31AgAcPoHV?iRd?YJLIR=PbRj$~B4od#pqd zed{q|mZZz(2U%W*=87WzT$aBCuwWs-I-(%%;7piz&zF#cNj>ubTSOzSyW0m`Teh!pskBK?NCL_I5|_s<+FpO+pX{MCP;BnC;uS{tgW3 zQA=^^JP>Mu&Cwp!imCYOR`QhLu%R-dJHL6qaowA|ABOTDikS_fX3W80&yc?NYy`=S zb>eDTX~9rrhrCL;HF^h?#kh#_M7{gco?-Pud;mH5W0<@pFK|K{3czl#rtk%ISbqqY z)G!h+gcPaAE+&tJpj)8_k|Fz`O|=TBe4lu4qBR6B*jBODkWhsmlR-F@p@KrJ+$_}$Qd1y{wP>5nYBLhiYC?Vp-+R^C6ih8Yn0}I9F_P#$tDmn; z|LJ~l<%Rs&h(A#Y+)A;+Jopq|oF8SbUR#QY*Mhk{M! zsoJwF88v!U19G_4Z`(FR2p{r!WPvllDVME#8)hF zq7pQhNYH%d<5YfNCCDb|BN|erdeNVlONfdWBdjjf73UdB)UmmCCxzOv3!(~iz-iC~O|U05ki>WOdDzD4y=sleILg-ngZOQX z-Ol%W$9HV%3YAPtsRM9;b%k4lU~0eID?JKijH8U`&2^HIywVSO;ID9s&GUE{64$NA zDd}1iNoB&d4X5%xxlRIMVE_c+#r)bu$(}~fm}i7IQ#e&T`rO&_cBj&ilS^XsFTGD6 zP!_NeWa4>ufXF1mj=VupNC8G4a=xi$kNVv+M5o9LXbFnw6d@}8&X=MDO8C{pi_ca3 z)@$^PDfPeTk1@O92OJGh@7FvgU{*ZPR#f>kgwyQFMoGs1t(TM@-Co(dOgIK?}qn7beiZ2K^|?I8+b2 zMY6I;A;e&rs1n>8Lv^cCD4%r)$hOx2hwl56Cvbi0pPO%*Uyk31uPmi;Fw_mWP8^un zXTSc_4iQ^;(16weg#RvF4!x=vM2Ud%@QmQ^SfjV)Ef{3508Uv5sN{0mHY{!>z1{9P z;#i+nrIPkvTl;rRCX5UwqtI`ZBb1_b%#erenm96uTB4!5t_&yL2q2hpogTeuz!0cI zd;wFH;1&M%DK@Sv85S+&D4QRe&ni`Z9Y!sHr1K|#MnT~>uugFIAK8daDRXX68qf5R zsDtaTt)sox^ZmAn8P0ERr();?*MTeu-2?dJ)daDwXYwZ<_3SX_>x+n;W_Yh+6#UfS z;2ws~D3WpDlT0jnFhscTq@YrPgSrlLH?9CsN5+S~qk5w*Mq6Qa6JObq$;4If3164E z=?Xp2WG56lKnfp#%@fO?zOKPzj(x zsU6fXsdMoOk=;IZsZYw6k@RzgFdt=9Wm>?j1i@HVR_C>fTD2x=qAFGE$L_}i_>YmQ z1fJL*4+pDC3v;30vBWsngHYvI|0*#WUq@D*A*hq@LUSTBw6Eh3iYn4jMQL8M_|GVdEGkAc&}64+XJ^qJ;WuR@xj3%3be+LxcM3IbZ1Mrh}%$54N9T6p#%|UO(OPOoW;TGeepkJ za757}z@V7q?OC|G;pcw0K^6-G6xp;$@C}z(i3EZX4_c=xdV$<@H zxAzwiIT7$^#sJMe6Z=Ia&YyadBVCLau+mnQHbxM4ENz0qRzdDW2GQ<9UX!&Z%{Di1 zxboj$w~sp-Nh!ShQ@i~6tHX*9c2TJK*x!W0?M1z~9m(zss+oVUu+?Fk)5}WVr%RV+h@^-sR^4xqp}D24HbDwf#c*;rU%N} z+l=km>-I#v4WXkjls-$SCEQ0R$WCU6s&-xt!;l5MfpBHcwiO~yYc-CJBq3!tq%?_eUsYad zCe9s8E3yuD06nxe^acz>%HZoFceRB>BtDJ!sePWJPeKEaip8kkQ{x^Eqdx#e)7axCz(@l zIjAmBppqz+B$u9^Z#3xGi6PAag)@RBkC1PU)c?VS@M9lC!gClEOd_4*8j;U47y3MZ zY3jE~fu&9sl3`L&3@RW?ZebUC70_eKFJ^;N|E-%oE=j~%2rZT=x1kg1T!7PVa9^6K zxcHL*W${`(lg8$ol}J}`q=cq!^q?#XcgaLLzmTihB!dZ{SUPV=8;S3)5QBs*m$3%j zD~jBl%nRZYpu(cVLV(02X*Z;rpU@c3UNP zdG4=v^f<^v_?gh*4s3rMiJqs;Zmi+RE~-W)7L(4#bWZnM&)fSfDy2EqQda5?Z?7d@ zIV(6iILr|7k|0n$)I6?I0gYfeNvaL(CDZV5Bn`6qs(S|Jl38>EL`HcmLp!?nR8Dm_ zuDhS;$h^GjpHGnQFnQkqOXs!#{a6hE84=;~M~W7U*)yT0nuBN?3F|6f2uO)#l>{I?;2GR#H%qS3=}jE z{#2q(p$X7wFKYgFy_S5&%mhJcdzaKFIu3 zsp&A0@MIj1zUoOcr6ab(DbaroN=DdaAx#Im#2L-3wG5(kqAos>E`yn7;MfEJ$gC)0 zghp4#hZC(=C}S=KDat$N-&XgD=cZF8l54HIwWK%P&QsCTOr$?%mA#TpO+3}iURi~g zsM2%UN5K%OhYL694p~d*y$k zR*$dk(!9AC`q#IUe%Ac&eT;qnzW;MpKn93#i+)ZoM<9D3*H5R=9(tp!<8D~>>rZ1T zC&v#aNXqb|SsQA%=T|+Xr-xWu-Gnu|7+zlt&*g}}`xG=*G+<6o z!QX%*xDr*4ESO)}KZhUBgfU!o;?+xLkrr$2v=3e!<7Einu*9?#>LC$GI%9BE3;ShY z5cRw$n`bz>K`tzoD$T^Tr>vYz-O*$2%#KV_#wj$-j43z-YFblM$8qyPgo{^5C8w;# zj|h~`EEk>jh&E)Gr{)-kr+h&F24os3bUkxVinu`wury{`2A6ukL>b z_QMPi*3sMezx2Y{!1yzCs9LVx;!uG0#M+#E{Wj&>>ADqm7l^Q92`4GmC?&>e-B2U! zU*BBy7_;CicqAfb1U-N6<*WVnOC*pT6aTnok}SzTsO&$o@k%#^ z4e=fIpu4e+hdF9Ao)Y3BXUnP@O;{u4zDcp+vQ}?5D%~GxrGMWcZ6VF;Wt{axr@dP-` zXA+q#kB9-t{G^`RTH3bj9P;F_2mlUy@b3feIL{WY{L7Q$81MUdX_a2R9?D==u(W-xF$sHQ53 z&1Mp&QOX2v4O{={3xDW=2aXllj;wmV+0#dxb(YY4!BTnfluA#?`SdwUE zy;t)xKh4-Wn`bzHVv)9dT=Hk85R1G7Qz(??${NRgU{V~<2$&!#Y+Lz9DMc@x5}@?4 z3Q;iqd|G@$tKVJzqPcU-jl)m+8R9kI*J^Z1W0+S-~hnn^doFYxg=<^Lba z^-@P-wP%3dDyLFB&>HM!y1_|c+>oM(IF}j8!5XwSUY-W4At*k<(=4)G|E4xmE!St+ z{We;Z^jU|w10cQfutgVu%GS)8m%e}!;Z7zkH*dNRgT>^W6kdgMCfh=jcHQMuwik6L zZ0+Ic5NP=u%BP!pp(LR16(hyu|0q7I8?j`{d?U|oD z#JD}i$hubcAR>Zq!pI11LM`CVArL~LFP1rjB^YC!3BH8)Asc$drKVHt?>O6wOIX4Xz_xayHy!)9x--3B+Gm}=Imc~GO5Bs9jaN64tz|r;NA#3gum-dHLy|TMaz&D4g@5#Qy0Y2^}-CDSvW4vVPS-h-W^vmI#*?O91e4dDJQLmr#ADqzgtU ztgr&+%#lLrne;|&7C|yuUA~Du-wbb9*2j7YeZ-;oCZS;P`s_+KnO`Qf%Y$dO2U}Zt zV2tkV7-Gm4$9b5hQ$-uTqUlu2;AfrPD24Q=3e%Vh5vQI;;B-YY^Tb-pc!82Y=39b? zVWTW@)YF+QaQYGqz+p7UN|fi-0^Wr#u4IfGU8bG7j$}=+Bw567fdeJ1H@%m>%V2js z)CWE-J>W;AWp8c<1`>?IjOEPEtMBYS36$_@{hG3)ZZ_PEzNCB)Z`gZnA{ZyVN;TWkG4yHDeOF*+w zO5%KrC{ucF2ksE6WPn@@yF0s7^-m1i_0QLIr)mocxhOoWDP=hQ{!V*ujOC2lc7r9m zf#2bh)o}S9?nOnUKvh_rizg9EExz}?^PkY)MXz{ws=p=E66xgX*T$qjx$1p;?*Or5 z9-rT*u(7*eZP;+-<{wUWUbH%`6S*pMH$>#K!c6bGKcg52v}^55BuC?&lwu!2p+*tr z$H=eYk+1Rl;q4WG9!cRQ48+pRs8HPamu>0(?OVI&GXa77U_%a|fQ}14v)?wAolgjn z!XoUSH+E1Z>ZXBI=J`P9CiH?=OdCVq;oe*9?VxxU6x9iFc5VjYiR zXkrI<5T8VO{(-DfooVZL***fNAPGY^f?Kek-}gq<@XA%L#609*T0unJ!T84Z2jxKe z7f%{3a%}?4+T6tfB|wYky^l!9L%r_dVB6mr8!@qW{(jhK{tKLqUxTYP8{3Ud`EmcL zU=hbQOcFRA62uC)_69#IWQ#1w45+^Eq2x9}Y6@V@ABLkV8~~dO*f#=XwvIJ1{}A~E zTv68D!7aRl#xdQv`>1hR2M;ATNMfjy*cH-QlqDP4D{IFSr%?`q>x1 z&fTCXjE53*JGw-GG?w zeX>Ra(M{0w!r-`AC#JRx1l@VUH)|`n3qVm_^o(>hTC*oPA&Q0}_ZLvlO_V}TeFQz0(j6}3U3d_mtA zF2)+!kc*F>u7oy#ZW@9H5@+E`P4JFu!bIc%Q&C4OMZ(?l6ZI~p1KKzg0-^(hsD&;q z9P&X~I>Y}zzyF2eOK=i%i#EDYsy5E}Kj*STtKrZgs3{PSgE*KoTDfc8px1_adG6!Y z@7+GjPsH=Kb;Q+6xtuf#CyHuHogTO-OWQ)7LXSAz7dVeFS1>CWQWLq#Id8dE?6Qkf zwXBN(qP#t9*>!jHlYv-)Z|)<=uYh62^IB(JTrDHKN-^-)l{i&v7TDdZ@emb6R)U+9 zA=@Izl{m^W(^wwuVB)E_bnB3J8to!qb$>X#sm0CM_==4cjYQ_j%}5YEJ;<30XLB_+ zgYePO?mHHTmT=(k;(8os)eLayb-hSPXBfMsXpBs?fpl2_4-V!)t&l$AO%rxTH}4~5 z3F;AljFdus^VL`K+=Qmsl=ptw=>Pg=aBnrP*Al<{)C`8VpxOeeMBK-@C$13Hp{C|<=aOaLXi#pC1)*bF(z7NP}1_z#X^B+ zFgn!!nhhPJ&`SeXf+x|Xleyjal>dFheJHvw%jO|u@{h3E>f)%m*b;JG=W5q&kIAL^#Yx@)R;;|HlmXvb8wa7{4(c`mb# zD#XrIH4jKiK_PmNDIqKsBi107lM0~dm;50*=7;wl-Zk1<(zM(L(@k z&7Mr6n+z>F(*=Dh*HGL5Cn^%~IAfGJ0R%w=`2wPDG^tSAMF8n($a7REn(zjqq3Jms zld*9{@u`b|M52lg&yRRZ-}b$AD)KVZ+ZcE2!vJH*OXMqeBH;fOe9X`m=}P{D)!=18 zl~Jte8F2yJ%mt%C&zh~X!VH(k^p@P3OD+t4%pjvG5_RzUuXe>QQmNoA({dFK#o_a~ z?n1x@k6A>S@j4lCEAgZhp$u#|NbKmdW1u$7ubfq7N|K&P?w*}DGsXiS=ME$BHEgdb z9U}&m9Moy?0@QxZ7KIpTZ7aaLJQf`@Vf-8nsm)6*YB?-$H;Bf7VOQ!`l0O302#av| z0h;0(b!a_Ify+38zX7rt1l+$wmV!9l5)vV+fVWav73k3?+P!E_#iBo%jW(fN19_UD zj3j&US8&^_2SVbi z2?{)D?CkFmuSVM|x}yq{H!PnGXyK#v!@E4HShyWU(Hrm+9b255$5QGDrVf?Tknwx*BNcdV&LqKU% zf-;rd0w}XIE)0|XHoN=v4a`+ZUj^w<0TEKKB|^B*T&n0bcpyKMT`LJIY{3#9It}9` zAvPS`6AbPd9P7k_*lFZpHZjo+Y~8=0;-NuZWULb4-PZnbTOsB_0CCZTSG)~T-k4Yk z(O`boIeM*M)o~41t0$Ddx+ihDO5LGTV7sL+f*rS@1njthb--Spuk6QZ5!E_4DrLLz z4Ux_{=;Fq3jTn;U2RvOC^apD8G2SUJ1l2;El?_9-V7_V7FJ9>|h|feD*WVkS=d4mY}b@whgyq&LroL)0$X=#M2kGsPWD$jPK@ zWlxrDy35BGyUTpx~-{VB?miZtODJt)IWGP{U(UDcv;_ni?&q}#jl>`RHG ziv+L@JX?bcd&|W|aPbPpsNnr(v&$og2r#XbCEEh$iYvGuMu3_OioMf=)PQ+Y6I~_V zNB~s{|Lz$*5*NLzK5o?(%%>rMs`_xAa9_Upu7M^HMI(4O;2PG$Cc%$?J%oGt2CupZ z!Zgq``_gPtxjzsyWkTd2gg1!x*k`&q@t2bXF7gr9Lgxe zQO&&*FHv#l&a5*98Cn`OHT45BfgPTL@q6U&W0Kd`Sen(rPpa2nw1|7nEmf5=6n>A~ z=k66mIk4FX-uSM%_=f0a>1dq&-zy{k=@mJ5eEHr;D1T zzlCi_iBRs<_^d7I;;dxm%p&l5IYjVSvk{rbKgx`^pA4VPV_60`L+>fJy;p9~S|4cjf| z0cmLb^WaI8-Z*c>G100A4Gbq2TerwK95wbX8b`gK`-H10*kfPzhF4okdsCk(Gia`? zW*!V1yiv4=ur4TpC3c5{I;vF%H-6Y`=@#Xg2P#pxc)+@0w!);>y%2SZW2~-5wLo^b z0R{{GO0qC7F0JalCLarmfdpz7CKyw;M!LMHFD2-}okEOnWiQMdv z*8y;thpqRZ$Ei99D`>e(9}YdIQeI^P$*UtAgkQm;3o~CMbW$GMfrm>-R)BBN`ygj3 zv4iVdK!K;QieJqL}R!}kny*8G#knS-brJN_V8A$rcn7-ut(6~$Uv{_#f`)kB1y*cYwBB%sHT!L#|JM3&1_lEHR?|pSAk0dHotaSP3!a%!N3QxHGAzH>L8MC0FoRUEPTYSZ8Hi438`>|6Ijoad znD|^6dW>)Zl|h_-qR?i89)qJe=g-kAazTTgf-}stO`zv|y$UsyfCU%dnH)BPXc`I% z$yx+uQZOZkc_T0qKdA@I^0?r6-g_J2QbdB|mfLeZ#%WIn2caMwn1YQA@ zg^+RiO>bQxGn#w!{Azgqlh~yxiuOTO5g& z0tQj-)g)s`1=%aQDEQ~7&lu1)6TfMzVtFM5)@_^-SlZB|-jzhsQ<5_DdXdYbS|Goh zm_YR=9vX&2;~IBr;?wR$_pHz3m22Th?KCYahf*i4oR?#zMiZ)G;XiKmw?f~I&BrV$ z1=DYX`TP6B!8^1&;K>%(2)DbEU!kOv==j!+U}owH2^O1_ToQ8sJO1~-Z*M==Fe;@R z&)5z`a?5<4qWZ?@0^5lV;`+^*pM!asiMh|0olFT~$oyud(KH%A@I1?{MAUDtZpT}S zu|TXo$_0mCjo##Z8=6KRzK`Bu%t9Q*QHR{B_XJGfiY2;8#jCEc#XL`A$SxK1 z>1Dp;TAD@3VmdHO7kg`k)y^PORlPm~D{S?uz?H0V%}_o0WkZ6njpI*nDSr%zJTrSz zKGIO6#ZrkKz1@4sJHTZK2Xc=z5?CiE-kSA`jspzvPXzCzuo@- zj>|kH<)a$=J0s=t`@c7!{oMGz^K!oq-SeVlPeaTdbXCpQOSKl zY-Qb}^`4+QG*w#1!Wg6h8KqQ#R)VAu*AI3>aZOaL|Fy=kspwdhufe+9kwvXXO9>do|X>_^^Yd?qeiAc<> zde94CTPoGM7L3Emlu-HAZOk2FT^erz%u63Fi+!<&g%B`)g`#miRf5uU8hoe`E_2kB5V zxl{6yW!>)$-c8=uq3gW~9rHN#f~01^g%yNV^;55R6H+NyRuV_VhadYWpHJuQzddS1 zS|8&`8q7MT_?-17pfOd^YPs*~a)YdXImpS<@)|FsCZ-+*t25L1VRnX0-M}Iq?)?Sn zl>K)I8a_PYoojunMaXfy$BacVaVzAa<;1aSj9B4?RQC{+3`K2XOE=OsB6etM5o(jo zT(=KBEzuIsOT^qBhO)tGIfx9pPUSTgMUUW@O2#-B7_+v5s1iGR_ZV(V{3A8?n;M@9 z)zWFdY;Uhthz&kzk>IB>-ndxBl0Jfxu}Dw^7(|H z-|+LZPg}y?_&JGHeL&2`#_ney75i#ynorB z4aD5dlzMajOLQMeKMkc~`S({}@uV*!zki401@28?CcWu@U&etRP3zLRTu^xnYbiyS zz#E}9gjFqf2-#b3MRoF9A>~TgDQV+W>&#+##54+qC+^*?6z*Y=5Ms0rTE>q-_VRJm z2gTIpS}A{1r!e!Ra8M@P?Se6&aLRjpc8gLkw|YK~%*}b`MVJ6xdAp-VoYv~r3mFpu zjttP6+xdXo6%s{=bimA2u7`kHu_`b|B{g9w!Jg=Gn(rqMu8+bx%5FkdWjhJNiNxR~ z;e6sJsc390E%vwRPagSSr|FQgl;V=op>h}R_T^U+u$SKfx|byiKC8en*PevA|70lg;}c{dCtp_)b^D0;I1+e z;^5-h!Q^aip;LA+U;HY3V}+b2NEn^JSjzECMmebELNH}A3mgeR;v)Yu>f+yu0d`f} zRP?nb6T^lw5n$3_hD9y^K&t;^Tb~N_P#=${03WFD3i=0*{lHnwP=m`m{4gBNI@>E# zoSGG%^1ti=Vvv;>JXHuP6@KcK+H7*acMlIwcMcEaCS2Ki6lRb}BGlV(mk#_iJ9Nhe zr5Ff@EQQib;r*KkCNU{f}V5O!1iy{cw0{Tem3mP?({A=(fwZi$K3T z-w|+mIv-vPI?rpe8$?Xxo2UfC{^I8sjZ>WkU+cMgRWpU)xNYk+!8*!t3>YyFi$Ijq zbaZqFEQ+F&h~%aqJF&+5I0*3&*F5SGHid%gM!xB%K}NL%I`wrdPiKa^)k9Uhc6Br$0?0J`G6*vFE;{7Z^O&=?zH-dCn7%ezLE*xE?-cT zx+Np|9{x+({WyDwWIB-{vZ7kG&JIUW^dzNX6;aiKD92I;NN0k^B@|emXpNIWuXiDu z02n!lq<8U$)qq?c8+Q92!4DTfhuyvZc-j68@B!;qb#vkGh7bZ%EsT&={5(-&=lB?b zomwU1VU9P>arX{`&QT!Hk*slq?ik_%?_r7KygBk)*Q$?*%G&_6AnWSyeQe4KJP)X7&1kmYIp&&S^{ zu&+OMf9{4F8`Il+CR?i=-qp_jx!%Td8<93GJ4r`4H2Hs-pI=yQfp9zjoaQb_MgI}p zPSkGnVkpbgF6a6YvucC0{HC(79J9_zvb|bGsYtXnHaGA1civ>Ici7t#1Ova03;cGa zogQ^@?gLv(5#A-ycKyOgGHCe*mw@v?5U>V3wYHimJ70*6r(q80->`KrddCB~%;gQ# zF{uMPe)FduE<)*_zmYfNH!pk0t~(z;B`0L1p8P9*J=Uh>EhP2k4gdFP$elU>+r}F0 z^VqwL(dhFMdA&tJANY$I^$d5*cjP&)GUF9io1s3wHa>|xygg~cg>%z8#s9~eH{afus~4o+R05UI@e?FY zW0<*p;8qQ$Xv}KL;)@&(O$+Ob#iO~Vw~=gyQNL+5OlSAbJ-peai8$MZY$BxIeFC-Q(2#y2_M4 zbdfazhE;#kUxF3T+kpZyBM=j=B!};bUBJeV=5&ok@Sv1U{s)C@b0dJ5FFeWAhE|HJDR;dM~7 z$QMrwoPY9u(dE??si>>JgjOnGz{lkWALf5xhM zHHggY6(0A8x8u#uDVS=fef+Am(|!Og)n+3)AHr3r7xzGTI`vgazMSst0JY?*JEE>z z=tx&WAj3r@vg53C6#BPE`CJk=R`h-H1h7&|(w~VtbH;Hm9E0W!T52`S>438=?I3QV z?A-W77FSxz%{a}sCy(CBK1SS#U8M%Gli8SHn<-=L;4lR?5!ECy<;~c8oN4I&L1XLd z2WnYx;P6#!J_XF!op0wmm#<6KYkd zB4e%KpKh>>50iZYhftCRUK7Wk|KQoABCI$_GGB;lsX-t`fO5jA^=+J)P{3f!qc0T` zk%c-qK0R)~Y8|yYheup571R97i<`GoGxdT3)juH;+@65lUvGNyi(aADSc!hqEs)9` z_&EevI5^@C(4E0GO;0ctX%-EB&?-lk&99nhnpNz`Am%5LX<0vBQUo58X27>b);vx&GUX4$b)ngRX9-EQ(G`@rvQl(UHWt!U$j=_=mvZAGR#Bf#&mSe4IOtfJ5`v1nUNcS=NPy zYyr1-0TQ9xg#Of&m5@dy8=}h;)LvkS?G^XM=^5l_2UOPPFq_X!-W=+oFG;dI#)9l) zld2^Sl3WndoGnx4@$x&CG~%P)WBFJfjiGK=x=o406!;qHPAK9~vz_XEQ*)r45p6K<}5H~tA?FgsX;7JvzpO7rC!J+8nq^Dl~ z#c9ECg^}c^QUE*Lg{n1+248A#f+BQb#?`@6C39*c3?|KlY0aA#fIyDkMAR0dU56i( z>{q2hm5oTr1K^B2lVz2S;Q`BD$l%x{C3k=(3q`Q}Cw@fVm|wk+(3G4ULp5;sJ>+9H zRFERV58X%48jp%PFwcsPE;Oc<&=ed?)+}zXfT|Y{FfK(8ffZ<_j+_wYFyMoJkP?}y zPFK34Bob*+HjgZi!Y%=UkVwNSb!`SEQV_te7oZZ{I2_47z7?YtuU33fx(qc7i zK}{}hT`a^Pp{7HQBFWnT_LZI+8b!ikobQr{y?A5(DlY4nz%{LQBhlIUx5Qsti9X%vf;F>UGAG!t#C1>zhhKk$W{)qFd zG+!Tw!;GO=X}~i*O2M!K)K5q?3M~s&BK*p^Ly)ep{l`2Z{=A0}a!+?ZshOon;HN{v zcqDEbTOd5(+Q}5BnMz_uI$*whWJgNaB}}7?E#;pFhobc%D&{KDMP^#G2HmSq#jJ>Kr$|aB?bj}X$hnl;|w88uyGEqJ4WgVr{ORfo&hk< z3pwKMm6G7XF%}xX&b%r4*uGmDP z`_6wT1Z*GYV5NoH#!BrCvW^l%lpfsj&F-XZI?~s#SWu$3M0Lo-m;pb$5R@-T&w&DH zZ%GhX4Z|j`hW~a4Tg=28y_YI`W&2XnoV<*DD+wm@#P0cfsIk5|&w(o7%H?DVaMknQ zlP1k+gl&l}1|EfgsVZN6r9@H0cJ8NmytcOT2Bs~bf%;g2_)iG>GpfqwPQ>rqN9`Af zJGA9Hr{M?5{^0P3_*nnu)Aqp&YouSe2ln27$=B)Y7l*H(@3&9?{qiF;wqaLg1m}7)nde=9TPx>pw(J^b$sJ_8+Vtt-Auzq|XD=!kB3mrtgydfS@U5L+3 zd+;2mY(#pkE_wxb6_qX2`4z92N<(swpfQQ=5EH-TwT=u-g3tE*qr)E>2nl&&&nP7! zTJhVXcIWlcfll)JhEs8zC;C{*W5r?&lY)deUmgY_5>e7`{mxw z;r`)4&FOBSk3}cNPiD<2uB^bYMqsH&6iH7b%*9>%YwKvQ1!5osL0l<+3!y_|Vo(eV zXm*Q|37PD?KHC4=>GPx3 z&R^P{<)KipE4OzZDC+x{;gORYsk71CaGt2RJTj5651uK+Ii2()k=S zDC318yh&E2RMcr5MRr~OGO%HpX~3n7&&65!gwV(iz!{MbYMj&(LWxlUTOD6c(e7Ef zNHSgnx*iHlm0%zlY8%2K%y znK<7)qpu{)o8grtpR=AQpY?&LZSZ=#*IYZD@~M_j&R<5>$aWmcxIa&eIn06rBc$kh zw%9x}(}XBBsF*0EeO!T|u8;8vwHmGpK_@}HJz)^t8@8@_8q#>r^bmf2p)Y~l&4;|R z*(_mOsm(H!Aj9NJ3kI@qd{EAm=iNu{miqmoUCa|0s&>(_t40vLx~xZqH1v_2^0963 z`dQHaFqBx@2}yLQq`pxzmUxHUn~8d@vUt(Bmga0jmBPti7_n1+V(Y>D!aGnUk{$i4 z(N@rXd3 z>~mUaFXGTqV%qzH%<^k`vO&TQx~*osb01~FWXA~6Nv0-epAgta(^g4plt*@3IS%{* z(l`02eiH4I?WQ^qY%*XBLM72-!}%^YpQy-9?T||Q*mc^1-*m#_pPQbq`j-MR#jPmN zQ@|Htc&A9gf%OENFtzrqG(IgMls>a#FPJon<%poHMi5i6+-bc|C3FISm$4EbJj)CzNlmNdJA;#)D<9*e8N_kH;CWlMMr z+N;Jo7AC`7Kc~X0VltPqlSbmY+YF*UJ-V+^vdj#N^cyX)5Qi$Ah-luC5hM=yyHRy? zDCKk`Y_*6~kW^Ei!5TQV=pH2U!1|=c2Z5+ob=|$$Y%+h4HfnlL*L3<7TO%P0F6`j( z5lRb=>5||yA-Pej>SdC$E7nKx4D;H~Bj1ry z#%z3`WRc8Mrja<_a>sm@P^;NS*%1y=BeY|nqZVwL z+U3ilrU|lISqYn=@u){G!lkAXma6H_GBxBiE|^p_V&wpRA~8R3e7~-a0<|-c7Mb)E zS^Wb>tapc_{o(NDSnf%B-ur=x{}x=|kCiXi!aSR5G8>M^n+0C*$=FKcvoRV$OiAVe8!B}GORwFwLi z=}UGuDJFOxjyF9r@rFlV>xn1-=<(Y!cOe{uJm7l;R7BaY0h6Z23{q=tcqyc=$9vhL z26;Nkx6>UQYgeB%K?M@<^O1kTZyJBTy+-CCG6v2^QkP@Zl#$Pm{$}O_C;e;#mEttx zIV8se*W9YWGoZ2v99aIyH81&C{TPL80IEV#&tnZTNxSkyDo-c_GpQs`r^Mx<1pK@e z4|+n<3}tz}IfDYVYwD+vUzhk)^;jt&G)6`mlB>9mSS9H@UnPEWU!-@zYfrupNf>aD zWl30k<458qQ?TU@Cxz9h(ERN`4*P>mXq;3!rF*hB=i@1ppqPV{b%|1x-&$P_YN^n` z!r`zeZ0MfI&_U*H3JNX{kUJv-YJ~j=p5&m3cn)2Xt&|iQanQqDkfp{7C&Vf10@E$3 zG`^XW1#x}DiD<6WxOd%0opKcUz(6JqOp8(o(CW@)LmEC45E)p|2fr?w%vs#Z&r6+i zN~z8tV=$tlBV%SiOPVwD4g^lyz*r z9D7VHz$QX>WM6r!SqE7HCn*^~`+!+ce1}u7n#iC`sQ4P?n}WNpb%flQx8yxS8j8lT z+q2>Ds@EML4;r=kha+rhY=$nPRzmNs`wc9VAHgeaU3V*EAa{*<)x-O785aH%4b5A4O6 zZS1nR71kchGy`kO;PpTl<_Jy*D}r~76V~3JqM$W2fDP32Y(+j>g&P(8GWbhI6ZWhb zPGJoVTMNCL*Q9{4X!Y0bsL#_yfI$2zoL$D;!&b>yc-g&5DayxIi_U3OB*WU; z1Nb2vFJxpdEDXmwCBmfTkf-P8nKZ9B7M$2SR<#`4bO|E172`G22%UeBuuYcG515j9 zLN=?N<R8UhQ2T8&h9drOF*g68-vIQU)>s zJADE-*CEWUye@zCyWx;$>eNjM4Ix;!g4V#nX;o5Gl2OGk+Cs#A zrUiuIXq>C6VB>$I$9TY!qi-gqH``}W%H*(5lsl;jm9UU!6umZ7AKdeFe$bDiISQD6 zu1|#mXJs6PR-`bic_$e)`=Q`%5nZK_n3@uglqTA#%39Q{oLIw7(n310j1?8PD9up+$u ztKvOGgYXZF%k!N+PvN1@BP`_2?P7Labx23hyMiQ25Au^HL{l%0Q4E`C96_CM2vezx zS>znBQdokFO^GW~uc(s9VLq)@DHrd?VM)^ntiq82vWQYvjdq+Tj8ZnL@6+Vd&g*$O z;)xpk_U*ZphTO#Q%)DAA>aih!&2xleovlDqa50o$*dvl}!7F_rNYDBg7rlXr(D6L^ ziGy*)Prw~*tg3s6aZF9a##PVMPrXmf5emgdi!(N4)b}}P&NG8C!ZD?a zj&w{ORqo3fR3eDzfwS84OeI#J`7jh~-EKbYi{st=ws13aj`j|;jxp>$o+Rc6dWITJ z7l1256uRLtZ$8^@qS%~_x?!tJG++{nn&kK;f5fBQ0T3*muJHJM{}TB{+8R$CP@2TR zWs$dB5z>BtY^SxuV`>p(4zgqhhRYd2CLvXcU(rwbM(X;TH&U|q6XlAZX~uVexvF2{ zug)@5F0Vu-fq)LJ@`1(}By6kpcRT3+_bpDx*=+It4ju6uNGkyjb7vvK{4pz{E0><4 z?eO`Z+dEP|TM9AzS5|MzKa*?5{exF19T`3*nBi6vHQ(4&5m!qo{L{Owx zN38UoTvn|OM*S2ChGe9B(ibZ|cen3@g<7A311h6m3s=F}!&?Cy#1 zM7r7fT9{lY9U_8YV1gixSH(dEvPxApiUycRLBESmQB1%PAVnPFBf*KFQ{r_1SlMyR zyEE__bGx^esjF|fvqJlp9J^tS$e5xI%Muxk4-YR>G3qbJxG@o_@DR|7&>~&JCthfV zLhLaMAau*ZZ&5)KDIZpU!#;S?hpK)%>b}E0b`ctWc9Fd>JKnGjW5;Q^U3c2D%~4j; z0UyEHy&ashbO7U6+N~aFWxq<26{57zzR3@o5?|3-5qf%*T0E6EfHVK+9;e3D4?4x% zjFDEtSnpMRS4_N~S)ty`&o zTWtHVK~}x-esX=Kp93z$#lC*u`?zVGJ;>HaIse32CPI;hVPz+ovF{ArqYOR+gC(Y% z=PDT@UUAFTh9k@c>}!=C&Hv{QTG7@IN8=*j7`i4Rkg|Lkr)J=g<`@$N7&-Kno%L3U z;HjWnkL8}_)&?wUPT1{AUxf4Q2gAXCI=H=7%n-Y1`O`~lqW7}Ark&y7vj5JmjXVA{ zm~=nRp!)vLh>ytfyy{8?XtMR+l1yd$gX;DEMuG5RuJEd%^Lz3Hh}izvJHMSUo0Fey zHnGPcc+Xu|l5F(G=iQs$_50xc%KhzojjgN3 z)5-#+Fu`TGVRBirmQ56gU@&M4+&;Hlrdl(AoDL1#QuPTt8 z_AnI`n7w8m&jv0}Jx7rUyre^b3nWUWJl3I(Tut&%ZG*P_N-3oM;ZA~OJ@o;{=)K+p+<32C>*+Ft$2dQ?| zls7AbFtJ|cHaI4N9FriFu>3&?=y?qD5fq;@8wK^LqXQ&-b*Byw;%XsSoB&Tou8HAj z7#8eFc9R@Q=Hx2enPm=XF%)e{O6?1Z5oI&t87uEcY*QK3d%p9`zT^cL$>gY@@;U|) zRJ=KoNkUYbq<2O95~Z_#Ki9ayBHUY-j2S-~PCA=(lzXQLz*Ah|9V+F^eN1OyK~h{$ zu4giJos36=0O7)_fN$lC3%Z{5UbMcM2}0Gvm=v@F#8;t=fr7p+n^_}|FHgrYtb0&@ zZeW8{QC8Y0Swqk1*e5wCXBX6KR1s0vzk2XOs-`H_;fc5}{R0LsDf;{~9{TdXFRzB( ziGKiA?tiL)@=y9O8;ZR$mBP0fp8bfUt?r3PgwgPZlkuVug+CrW!~ zBx%2A5u~+|{z}O)YY{Yn0C6NmYcoZN_TqCUL)i&#@46|mu#5j6dvD+0){&eG{+~~Q z=yH~nZBdpp+0DwbXDJG@IYW^OL5(w!JPb%e62>IJ0H7sZ$KQRQr>d*Fx=$axkd!R@ zI`{s@;z7Sw*Lzi0SLx6IWK?K>UzrA%^O9 zR0PJ3+ut|gT$3CVtVOu{>x+{qE$KU7yIaXI8y;-jR4-!!sW(jhn2D0~SUTmY%hKH= zexB1YRHe~))_L9k5eb~AF}U)O8i#_fY<)wr0lm5iVe^i zF=WER#=10-0#8Rg5E)%Q zkN5y^(qXh!1g<8BrwcuzoD}mj^2Au3npKGv$z85C8xYY|u#mV3U})Zbt|cyboVXK+ z_LR2$yTSBomVL{3qp=Q`oEH%;n&)7gJW;5?htYK07WOFYIAY?_g7R}p6E;$CiCDr$ z=VPyyC>or+9yjo~!>@dTU~?0m)C{NXYvzWKBnRxpVK-QKB)}9w4tvhpU7ZfPSmjc* zkdCH_>hZ9uNSvL>TvQF2X9Bra{Hop1i*gsZso85BLx-StlNKMBs(9tNZy-1UbVMiz zWncuQ^k5?3LJL^r$S8+1TT@15YECJWWlcT%PlidjLvF+Qdn`=zOUeXh##1aAi;He! z{-(FI(jMWW!>qsK$!1TtYWa zDsCoe<;Or!(Lt@*;U~LwUqDRMSB1JCE?ZI}=BKWrEps7qjx>#Vy$p!r^)9{*O*);9 zh8GtDT8SZn1kxWqZ+>fHfVl6_^f@Krru7x?QPLn6B--0LWwYS9-X*vJd|;*)Z;P+X;6iZ zY)BJZ=EoC1uahJM_L!4QkEIBX<4od7G0OAnL9_;YB=+SjqM08e+STL=eC z84H#zQr6%Z4quk?i^oE>fTLJ~a2XG_;j)_bM?}WC^;6eywfq9=>_A`tLlX8xRbfV{ zDAWJk!~X(DOLeoFxPWX<-fg4uEce;?kG*HRyE4N2R9TU4{RZ!Q3mwi0a)4rE03dhM zgaHg6Z9Jl5>_UVPM7LilEP$4?aR`~%Ac8qgzRlI8fQ52WHxVIej8%=2=n=^Qb^3TP zk|%T(_hxcj8c;!M0R}6(N&thlGK>QAYlJ(}0V>y6HJs6aDhyA&E*p5z$KoP+2B9Ny z*JVjRa{k{6DHl{2q>>TqlB6tWyJ2X&nu~NEqFfv4RwreF$BJRkNGtz`kg~w&V0>>I`U%Bcpu1?kbkYKDXwai?QF5g$(({t{?O+va^e|iCjB^9k;-r=3f zn27dQs9=aV;>RU&(L^@J9I@CHiU~W5BGUZTCz0u<9wAFv63CA5f(K`h=3KM)g0TUF zqrY|!dOQ1jM>~&H;?`IBp!5HHj{kFuOmM0ARPiI7slmk*lyF`wGA~e@&o=X>zIRoW z#wrfCs)|DY1TpX?DSr+vGiL%JrHKHcq52C^l_!f{3P4?dSC!SE!4A?a&WM9sfAELG z2fNi{$*Fg!2+84A_Q9%YEt}Q!c3ex})?f{Q;BwkP>*_qniT)4bI8ZyB^{Oz^I+nDr zKvXN2I23&Y4MTGM!SrM@yqI;cvD|u0o;q#t3vTnlU0q~lw>?>0W5YbU;7PW?jlvr6 zlMjSeawZEAnL=(z2D42uAe2o50z_}jvN57G87Afg!k|r?xssQ?Hl(bxq2nv_fsjds zr_#FX7?qV^1mYyenoKdDW|ALSobv_ce6=*`T;BogT-Z+BCf9Xa)vSigdXbaLJbGb5 zpI48QjxMX{Y5~*(Sn#jl0a0V`W>~?s5ti&j0!tZ5-5ByN8vdpcnQ6?(T~Rr@6f!%X zF0t6>PXE`2G0TlV-GBb~uaPPJCsWhDdj4Yl*7tlTTmO+-e0}@BhI9a?bC*PEWj^=x z3e*kq+JIC^rqn%?vWAeV9T}f}oa0^Xw%&cHaN>kER{?$S2}iBQ^IzggMV9@6Or}MQ zneW%`>m|{hywyQ~U)y2LbvW{e-tg5`UDi+f?~Vt{5oH@tt^yNs`Wu5r35@H)qLnw% ztNpukeiVZzH{qPGz>|X1si{ofae*{YeMMI_{wJzd5_Wa*?6QA~*gnY0%eYAE4UI$1 z0F%!;VJ4oFNnjx`N{L_?1;et6O_@S9XYWB-dWu(dkcmeLKt&RIefq+H>Q_mrWRC+a zw;BqtW~mWt62qn2+!8Xy2=YB7nL)y|+>AgffB;u{)G7$GFOw-zuE(WH!0S19OLODD z);C2){`V!``3c5X2KBVz9Q>Q;N{fy_@mu&RzZ8#5S7XWg=gw|p0%t_P8l8p z&*3|v8%^pmkC(6!#WSip?iir&9Hwln4^TrzLeTG{Qb|ie4Un5wMG>T@@4_WHC$2^Y z5Q`Q7MiOcZ{&^!%gJwZK!Z)I0lnjTrBaf#2i{a4-dEm3i=rr&Pu;+d)aCr@{FyYl$d)kSzLGTksASjg~EyYFRPu1ze3gIy+^5nBEE(qikRZB zTZoC^zyGl#3+VpGA%2#vNVP`(=E^oU%QM;~R5tu(cmJUdXMq=;eJ9q4Vym6K?cHaO zWar_ZNBeu*;qTtz7XH02Z-m7NGwCnY{vfSMrh3xMBH#<0>qpiJ1Y;1q( z(_;45f9RikTTi;Zr(qNtKiknG4F8N9 zIp`ifJJ@5RUUyeEgN=bD$d~xi+2OZ%$c>+XdXZKbdZjFHCO!XG{H+6D!rbJP}na zP`ca|AGn*k2VjHO(LKc7`F6Hzb!+}e#2uaPr(*tv-cF}NH*1hge=;t}+9z8$Tq>s< zXS!v1IgCVPVV zHK%4*1aiU&0#Wglxj~`${U^)j1Z2wEv^Z;d{I#I7qa&aOm=&@(q*PV3%b3IfoI1j@ z9jI<{dSpgdQ9LSse!ecwq*4D21)6#1)_!5V8o_h>fPqJYH=P#;gO_KxsDh+~$H9Es z$U7-T;WF^+@hK|F45u@s-`gla%^}`MF-XDiqcs>kRx$ZJvl#Du?fYQEnafI}l1Aq=cI12LbY+BzpesvAu(nf>}@iJNmVnpx^GVg7joDC#Q`c^4$lYiOTB|w zU@KP4?p+>-44bF1C`7v@mx|KCpAlFxzChP>~?T zOZ})p6_C_72TfbTQ*eO0+><+B$BQwso)TU*Jxc>)VQ8OV{3(b-1XucoSwZrlAa~xG zYz&7X1@M0CpJ}N9GL+!|N`pLSJLl}8)8Fn37W4V0!mf%y>oY{`LoJ(xROB+mlXp_k z2D@UJ8@fcIqRa)5oy5KBJgO5fN!{ydZhEvsRtR;6;ph@YcGPb_ck{ZV<#x|lL9zKK z7@Qiz6?R^p>s9t2rk}I<27o1~OBCgi*MDuGoGz`{`hqRvq0?|xTw>uXAVACXt6|38 z_zA1GIml4@Ek}~T$r%Lw;51dD1&4SVF*Q&>Y-R^PvP1D-gE7d>mH3C;q&^*@7Ax3` zG7i+b-vmdzOYEPb0RAy7kq9S+et5`W}Kq8GD#9#$I+nZ!%T z(x##c33CfBftO&6QJK*nG9|r$KnRt+AOhs3f~Ysvz$-w}z*_Ih zwQP1JWpRGE9>D+Eeb*j?R27D^0=Z`&5q$#N3Pe)fA^%`c%G78sK^rvrzvnK-- zY=9>B@@#l=L-*U(w|lExbGsRZXo=Wgv{Gfyj7rI-JI6fK{^XrrMg;*vk+&>1V z9z5uLi`O$kf%Lh0C7%i1htvsI=;~VDs=z7X^)F2j z{&95>9xMgIN-IoX0Qwt**%074I{bEPuQ@8#R6mW=Vo z5+CJxh&Uo-jKRML@mnNuNnC*Sz8-aVrzniQ({^Xc){1!NJ{9De>t6X5?TBUlda=J0{2dx z{p6@cDo1O|%5FFG%0d;81kA4KBpIxXq}uE?E05UHVtR z{u^2XHQ44d-k025PBfIQ{&jU}QQ~@Z_8b4m@D>e@D`6l z!EX@!u=W}6sOTcxPj)FEzkN46Z9WeZ-nZ0#QYQRREOh!^xC-m9Dcr7EY+w%Wwb6K_ zzr*+1BSg%X9S1ob9AENQdA@Fo5W~g(3W4vzM56QLTOlC7!9q^(+dS&__I4gWhH<&G zcXZh89nueB+*`P;21bf$B1Ya&-CP@9aX_B2(SJUY3IzIq^H8t>DFxVZEJUC^>D{nE zUkF&(kWw-LFSW?uR5es(m9SbmLD!$Z2U+I~VyHmC&O2XQ7lo2QolYX}-YJ_3JbgU_ z8w1BC2D4?KD5%}9^G4-XkO+T?Xie-R0&KdDbwu6kscwAMfU$K`a! zdpU+&Ytz9@(Jp>blLia+OMyI6GQ>Ai6QN6G_8j~jz_(Nk=!K=#z9gUm`eJPYo zIv6u?Ux~TKOq6JdcC7sjrc?al9n>koE+ii;?XDgQLy4Z|s2r{(7d4g;=v}_Wb%l>} zw2M1FR4zSirXZe-ELq}0yS<%W1sk&74j-h} zxp?dyT0mSz*fg!pWu_w@ESklbMs4T9gJl3U5ef0M1uqebMmQEjVWIgYSUcC6^K{P1 zSi0MRM(lEyp7Cu&?LlPf2jyx5Uh8MwL<>xeN&?on4aJ2?a3~*AXNoNnz^D;~%C5OX zpjgU$-ar&GF;rbxdv{g2xF966COpdbRqYOvl2+UT(w$c9D{N8u`4XqD6Gix$IDaww zq$5WsxtF@i3=eFDDD)*df(rLfGF*TNgIqh6hiI2Pjo3cp&I{?<8O#t|j%JzmnL_6P&CB zWh65z+gmT&hSDTYdDra-M2bWoV|C8b!5PO%6j`bx#epuy7aP?UQ^T`393dlu(M=bZ zrpiHVyTWOXVWP=178UfO$A$7Bwkg0XlBuay_zej_GNXnk8yK`R@K9gCz+7r-eipcj zy;euU);28#yX z0_q&U3tZR3j7kVex!|qQ#hO56I8g|^1j^^@>Y?BX=Guc%Nirje8C(&m(GJ*6@aEw6BZ-fLg*Ph5ExspruQ33$yt9bx zP;{qJsqkDV73~S_bgmd+9_Tm$es4mKKMcp0ayL)`K5wT1A6BDc%#g_U>VUfT+;cUx z21E_nu0Xaofl*HRFfnf{QbBnliDceei_6ej8AKr3*cP0_w>ujrgW(zcS=p-Yg5QdzsA}Nt&L_nOQCqzR zrpx9@Wg{(O`^$25=&eg?q>3PQUDSC8v+e$3N1Umh?;nIWs`}3dv^SF%8Rx(*i5}1> zq2-1rK1Cgn_=LJ;N*Sx{JM-K&T&%rs_YXpe9flOI@3VCS-WDT5Rv|z=ENjF{|uuI>fS1vFk+xmzJogPqkR-V>as-E{&&%TDFgnl8>iwZ z(TJD_x~phSgmk2$4~DTfp)DtmlPOIqS)*!1BUlPtAwh?=xf0q|aCHx5J~n*o&mc*Z zuqsvHmr;2?7F`{@`qgO6;xwYXw+V_|^b!+-M&DHbN)Jk*WL2~slNT*v39~wq`iJ+p zYc9!5bkPVm0h?)~INlo;0ND=b=<=1V6W6lUEr7++9*~>%@hY;<)u`w42Rp>8s(DFs ziVBukw<)JWqiBeM#$24Bf26Kr7=<8T4BBZw>V}1pn)OplvF?kGK9@N?LX;yW4B)jh zavZ{}h}mX?L|wG9jV2|9wXP!<9 ze`qiKqrRS1^DxrbQE#t!X|qd{aqH1M}i@0m) zfOaFMgp&pj&RXUBdocqe-a0+)q{Xnl@vY5#b#4SaRnDEuY5T*Y&}s(BGiXrck)gC2 zxq*<##d?zXj38v>NIp2W95;;A>iu>k#KnwM9ff7Tx!fgaOeG@~DIn0oquXvbc3!!q zS#6l}_K3+~(WS?L1WDW8ZPEjCxB!MsTWavioQD;lb3Nv3jLn7$s9^>lwyGK629`96 zNxIm<39P_!ni)Hy0i-jK6+~A^>E&zA>F^2D8X-0O@M#m?iPAQFT22l4^XAEVD%4~` zJj2krB|e?t^k7&Un7)g;|+>%a8L*_h|ds!S3HsNFT2v zbPt7WEJw~RAwpP2{H*74+b!M&pVSjmcPEhLpN?$CHOa<3`RVFT!qIJ3TB_Ui_u=soXYLfB0JjYKnTH>$D;6L{|;d6D{+W_@b@^)v$8A~NZZ?3anpYidKVn7UAy~G1OJ4C3-62mk z^%cO%JO)ekRbp-N<~1a_P82cK4mTwav!d?%%<9hf6qV5Eaj`r1b5Eh!Z7Jwy-2nCY z_k6&|W}2wG8o*;`2lJ*)Yfc|DYN}Ae4H-ZBb!2smq$b@vhQ3Uu;WX+?*};661n?^? zI-YD=cO>JqX!SZS&v@%%x0Sg!2^e@X8uNXpJOyu(E(7>%ZKUPR)4{J2##(L%5okXb zN)a&UmsBjn5z-F{e}uzCd=VKX>P7IR-S|=|Db0iuc-D~^uD>5-_h(g)6M#iC}N2laBqKvCgq%f=F=AZD~A_lVvb$ni2> zfRK8+YDEwlL1A#t8PV!weiE)kaNMt;2)iI7BL(u%$2fc9u#N5=-_qYbE%ubg159;K z3tX>RkF&v#13n%>mAHOR)&i#!8)QS|lg=5bXsDbmV-R<^2vIACa%%dTM#F^V6$Vx02JuRU_G=H}$xucTs6VXfikhi!P&L zwM#M?>l4xqotI&KMmItN*Eth~9Sy+C$zVYmn}f5EICC5nff$PMoc+s=zxFg4@Gq1L zpIiJPItvo}n8*6`>6E7vJmK`m#MY9;H;c+c2 z=c0KvAw$_eV_p@z4df$NRFIOTl?|}i0%z%2w*b3HJUNgk`rA$+u+l$l^uBS80Gu;q=z=ntx&prZxJmSTQpr&RXV02 zhT?Qm-)$MgAks6O@Pgc7iIN=bmqzt8a8<0Hd^LE)eJ^J9I5f=r$W$Q+Zn9^6XLK?~ zZLE`7mv`{_{78I8U>7B)f+T@LIJAam@8BP?$Ar*9SbJKT&H~#Y47789j`oNT|%EQE%KSvGUXK_Umkmc!Gf zU>`qDQTcB)!&50%nL0ePq?+S%IZ7Gz``9fHFQn|AJPC!o$!`V)h5T;F*r|f83vL@x&sCBocu9| z7g68_bSt)I!Z%H2D-%<(ZDo`nvZ^3`(w_a<1uCeEpi=ky1v0So%mw8l#}no{iaWO~ZR0X*P#h^m&WYkK7Hs=VQb2q6PoduE^c6;#$N{ zS#fO)+1(W0oWgL>2QxmCXlit+LYaw$Op~8)Zp1P17J* zHOso4WyRTD(ug(Hx|1jFB#yw0a^DIr5M(lbn2 zo;otUTzO90!b_pk#CCd`2CJdFQMozofCQ0e=sDE@fjs1eQNL=*|}bTYLL^@RV%zdWv8ThX64! z_rDvhJ29>Nzv35}M7-wk^GPl62r%jR#`*dY-l395&GB_MJ{!M5Y3bEdO1TTcB^Py?vzQ(UJB37(52(qZL_aYh z>wY$GD*d0t;F=)PrKG5CMea6KF6~2$ttlH-?K0m+k5t;d$6+&MIHCl z!<#gzQF?%ekJqH$@i<~rb5G0NCs|tDkuJ+U(KjdJCrNCfC&Rv)5?%5_ZQztIOA526 z1JYfF#2*dB*_jju=+Ew^3{vbJ+wy3#@)aMFS9>Q7dlP0^5s=nSz?OIqAiK^pr-us8 zHdjXp-(UO^4|ft#Ythx6dgD1z%|-?^L%)U^AXb7c4O@#4cLQCDsz`sdvkIVgoEGgIZ)F0y3FY_W-_|GFNO{h3Xj3j=^WX z2+y$dLHF?4!JdSiJ-=)?3XnLFPE@8Uj(5>wLhP;8BuYR!8DE~A%7rB=yq!K%MztVz zSa%2IS#0H6r{zmLCWoRRe1J2=?Lz&Q9KbPExQ##>E^SWjgjU1L7k*cb!+TWYngy!j zR26k+o+!J@%_`0lW3h9wu(3B&bSX+CS25^gQ75qm&E2Vnt6R%=)U4-_AHj;nD52ye z#QH@lPFk6Sc%aUuKId?##@XBN)n$&{rb8zS zbQ=4z8S`*ji|4Z5Se+9JkrhOZc8CPOuqJzwXELGQF0^e#836X9TZz6^q)EzDTv`M4 z6_YsT0M6wPi2=ugl~b>7d^DrW^FvXM2=t4Iy?Gp;F3!^Y9<+;^1zx(L^lI}`4AjuU& zgrH0qAVy=qyzdfwi2KS|h|zvyHbf(L8)M%B@@i>@fNZ-;tF&0xOOf@eUp!?N@z>?q}LI#jvy zHF8Y{lRIBe1{Y^Y4XY&?zT)zA{F+F|4{ zvn_9r75O&Sn5gU4!)s9h&|4Ikj55No(Jh^{3)o!l(lZgQxl4`jzSz#Argdi1CQd2Ko|sXd5q*^hU#% zF9(wsJv<+M+Mk?GUwp%xO2d;E^2_wacdv)Dfv`eWgph>0ydwvgYU_Fn%CzYV{%`&F zXS3ni3lotiNM)OLwkF5J*`z;t_tf589!$9gh#*;3XLx>bHqf`+^}|n{i_7D);Ryt$ zwga}pB({(G3ijUM4bMVkQ2%U-_28DlkNp`$t~StBpzCvxU+5bJ^plcPq{2=)+3r0zAfn-CZ&u#rvU_m>kzuS5|>jfa=A8l=RcY239 z9{<(W>QNV&dk0~(@JCzQ!*BUcf*h{=v#s6VcDlQdw4MBOZo8w$2m4Q4WBI$S2asbg ztX2N`rKxw%fpC(r?(j)oJ(G%U*+-E^B|$)$#f72iM!V9glpjQPN_tO94u3(oPf``&oeJ-?W}D=;tKxG8IL8pa_1Ejczl!16%> zv#7UOSHQy`Wm?@&8S+D2_^v-0L7Hu>>k^rhjLHXnlY6Nw6Qq?~<=8|4{H}llwQ73#;0PLu)**VR>8Ek( zHMdr;`Dfu(I~#F#hOUVC;7*vn;LY!G8h6dG)Ow7}L+yZgF}7>BU+orXr~eX)PKOL6 zVd8N5Wd{ue8?y_lIjR6nby;#Tbd}4L21sBxmA%0h7eV$%)Ni|0DZq}`cb$Ji^(O8QF?Ai96kLDT^(RkwjTS{&6t*Z;s!|lHLcub8G#G_}%e>KEjA4`msWeDoXOdAgfK0Xa#N z%0wK#C(cI<7S0FO&;Q=JLr$8}^)JiiR4@MkT&_8haXI|=WAO~BCa49kj?VkDlh+&T|MmBc7t>E}zvyj#@?TTR!7wxaB`pTi z+sv|xH503+MWQdTu_Pyivf73pV9T ztWSW2ti(+x9f`#}Aoo2$iaXG}X~)<7MsRFc&u%JdMKL!6aMapLnw1+{7t4`bW;H8$ zl{sl)4;IeazEhi1#(9c|v1dc%7D=SFqVA^-=0GaTM}Q$N2{0kw!5u_ccP-v3tBWJt1QuXLtDL9Xkg175 zJxC~Q$Sa&;E|F8t_RrvmVz6#W5{KhfNs`k9TIW)V`6G#BjC6(KT_B*uTMRLL#V&4- zljdAjiUiG-*bdy)qzq1+^DUG7UW~(UxUDLIQbVlHpm^Qlz5;2edN^kej}NU2Ow$82 ziV4xn>^2xZNy(-Bv6vLKaCIfvjEaG%D-85}GzkA7c`g-dUdHyI(V?Mf3kt(q?;^=& zT0s9rC{fj5{O20>MZhg!jX&sIB^UH#bQ-PJQ3_EZPzqJ^$i_HNQ1P%(A^mKWQv)AH zf%ce3OR}Y;5RB-+&4Oh%?{cA-$h;}lpvpPylm+H@T4@)G_%jOh3oSQl(fLrCa{kES z^{GhO^9EKc#lPU_TML+z<3zw90Cx+>C6hr6A~Ikv^sL#N0UY?l(cO47ZqNm{$9W)Be-JE`3h2)lP9^Hgm@ ziE{}6(vpHgD)}Cg(t*oHlHMig=S7wsw85w)j^hs?HjzmqP@+@b^Xd4j9elA}jwQ*8 zn$rc+xcO5IP{3Ixox5vMozXbd_KYZjXgWhVi0@4Lvw#zSD8f6L*4>NonDx!e6Ul)M zCKGuGr)7Kw*zi0^Hhy*zsDN!S=+@~DSMUkLQvq*C*QSyosM5`=aN5CQw76>gJA{lJ zb_06~jKyG&tCck39iYk{a823tmh5fWY)fQ$*k#a{TP^aSfgX9 zxk8ZVkhC#ubsp0-nO`bujxG$_1LoJru({ojkYR&aQ*IZ0JCDal)&~~n0_aOJY`8N0 z*$Hh0tHk(t;OW0J?1`{CFlP@jy3~eb*cxcMX@)Hp*hg|B_$mnSpo8B17R3oWTGUdW&+^%T!MAMzi1t2J0xyU!kV-9L}^_qOHl16+dLIq?6C zKkaqDV-HEqjQ^0dOa3L9o&3k%){}1U>6Q+MJk$4X$5C52q!m@@HP_R`!-!r3OA3SN zK0&8$s=8VEkY4x6jy!rpQIJM3hd$R_QO=`wXui4-DKSN(l=~6rB5=I^)C!cFw>#rT z{QQlT_Ktd8B-U;n?jPhJSu*29@K4Z=CM;;iigOxBZ%c04`n%x(H>O`s#^)MqXgRYW z?XojVQ{*dDCp94&&L=;e1(=YJD&;(j9$$7&$I&IBN)IU@^G2kEUJ6@CE8OmQ-?{} znjY7=^@r&#*rCxXQoeZqJ_H66L?4eQ`?LYe!VdoAC<`zh#V`N~7F*G19i_pMU=SCW0-SYn%mt zV4@Zj&Y#<&PdIRCp%UQ;jg&YVTZ(MW#pmlXtBPjWm2j>(!8}`Rg*~P~xa={|q~oXs zd3l8{0Mq(Vac5+U)b}1}FxIBB@A7H}72B zFyP61I>)V0Pkhyg&ZCA>-JE?CHUZ3r>M+K<3&8oQL^rxF*So^O){}BIw5tdDktRh^ zIUZ z3!LCLWLHlp;FTFrvN&OuMU$?SOl2G*yt(49TQi^S`ngs*fs=@s$<&Ap)4ZAE_b3}@ z@F-oXN57rXA+3kt{uW6P{wLgnh!I$w48WDt1Q|^#qG^^FR2>ITgSV*fDH9=dviL!V z@9pZbQ5#XCVb$ogiTy&u&Li3!KEzN=-_IfGcB0C4(2WCs0@z}EAOBeMVXKtrw1$_V zGe@PBnV6H9byIm}8%#92eIuD>4zxbY%+l77ng*Z%AyyCNr{PGFW{70KHY(1VW+-C6 zeBlzrMENM89~bVP5Jt}G)6#kp#Sm-3*{-TY@zO3pPG5s2Kl;?ZZumBUOY%tF!NXSfQJ}qOP5B;FTgyx zJev(sOe7eYQS$hHa<@=WuBcR-lNTE z%ruP@3?T>1wJPsXX|FhKf*;0LDETeMLhg{Mb(ebJ;aLW9*vbOJuYjR1XOI=&sPe%z zX~NUDwagvKtg#T^kl|clGG{%}RnL z^OpCTuPG=_=KY z#&XxF2_kLre~BeqsTM;WqvIVqHfI#5c`2MC_aTU63f=0AQ&5u_4_KS}OZ)(3UL_;F z`A`PF%yZ}^!}YRYVp6PRHio68xkQ(UhFRBg1CXl6eGN8nOSLa$bbxI!)tZl&N|w6D zM177xUPcG_>30Ij+-*yGUT1az?yo3cf>~5ad?w2Rf+4G4Pdw;OS2<7Fw|LSpU^64$ zk6-Y*1xkaB*)A8%4^GjfijVF~bUs1ifKmmXtbR&3MOltNAanVIIRI#B@`2)*HA5SI zFRUWtHKwu!V3M-rz?vEv2He*BW$BobO^tD?%2rV4D(WO~X)+_Li}s6fCc`*?JoZS2 z$MBk-$dM+vPi%%h7WL_;`jN{^aVPtxg^n7e3R-$kdGxzX-% z5JTl!ZvNTOw8ha&ACVw2LEM+z9;WiBaPTdB|v3muE>MCMF9iaPcU?9OW?+$EiA7@+{Ds~t8)#m z15ESNd>qP14&V=|j$BosrmKPH6s1l?C9$Z%7C8=zUc=o zn^x#bOkY{06Rk1U9T|_GT%NoZ*$Jhv!hmQcqymwp{*?_DTsIiUM~<`$hlxy2WQ>02 zlLlUgO6G@K;_h%ZL(qT%UIr)Hz2`fRzw4!=SHRxi_0s%7fh$z~7qkr}5P!}7%xM3J zy<5KbQYta3a5|$Yzm!3C;OnI&vWF;HuX{dGVF}**lfh~28UrobEAfPN<64ndH-f>9 zs6(FMZp-LqD3A3q17z+Vt>%%rF52<%fC8Dw}o|k7S-LdibjiKE-QPz z?Z|V#HuCY_K8=F*-shh~hn(y34!8>z5shuUs}jmE=_lkYj959^&>ZDw_MhP)lB2By zzF2{SS59ToRO%|_oHrT{`tU*U;IYD^*tnEK#!9WOxs1sSjJ!1vZWNLDI+1)0@7TLoGhO}g=ERca{*<#akqW*vM&CoaWozBJ=7Z6ZZe^mwxs%(S?`Vt7e z!8tE+g`WM%r2nof{%rjs$~d+tJ^+4FAt^2V9%J^8+G9g$u$Vw-xFc(&B#$+D43Y4O zL&z6atVb2vNMG74Jl^vR&&J@01L?(|((5&~U-#ufcK)IsPdyz1-LM953Ljx6021-< zN^N&-$Oz8h$H5ugRJ1HAho`?1l(F2qqmQuk*fWl*?lPBQOdF;ks@PaYIpRA5gNZME zDt3=8Dz>%-x8`_+4K>zmz>$uIK7u6nN5rlyVOmap!4_jsEdeLugLB@c*HhwlGDyiV z+;(KhVbMG&=6ZaO?5DUC5(Q}`{>X}`_pS#uY9|RCkoBY_$$iSsKdzzJhY+8=P<6QV zP4f^M=cxb)9VJ1lmmYqahc+Rr=qNp~!jqL~WqGR2<(8ev41|NsUmwKc*5BqWDw7aZ zj4r64F<)(jLiDV%13VX=wv@M0uavFxLWLSzc=06Esr;bT6OOS)K9nk1h z>V-~&w>_S=F-Cw7{`lA^4i%*e?JGfaqCazLvgh1K?n6~)l=BZ=44k%+b z)@>^zV;`arTDZ$3Ya*26HfuSb>3$B^-Aoys+gTDuafpoW-i)p+RI|bN8G=FBSwl%e z@&{+QQ}{jwK@P{4(~YEKIho3Un66wP>BC_i;tIx8HPL{yA=AW?0cxB_U1?XVs8sNV zPYttr-(q@5+#yp&Bb(p|vI;JY3xV7YdywZWwF=Xg@F1Y9?hf^}p{EJPSq?oOrH$*} z9&;mrUN$gcEBFgMO}z|YizcJ85x|EBXLT8K`oMXi3W~M_BmsYcmQDR2CL$y|)`U!4 zADM>GQ8E~0*U450OZhS}-teUc1RGcIOd+r93ytH>xLzDY0i3jm;v{fzIY??P1teMs z4yAOH^&Sri5YFJ54FcF7L5~Me<6KxIPo=$&{&FM}`_v0J{Z#-QkSH+?w*p}eFwHQo zBprdd$f@HKBgq6*X4^2J zkeJX=WgTe*K_$a0G+%}az3?}3D5*X>{Iq<*{`4Dnqw7`9*`)8q>&cCAH(XnQvS6C- zZR;ZGJA}NV;Lkb&D?Jk}!(-ML>lgQl!?EXKjXX=d>tYBZNT)0c-bIHN@`L^jl1abu zgxzn-1MqW%w)_|l2;XH%+C%=Sd0wU}@hF;-LUbx%nHK~8$VeO_z%o{oOJ{Stnc75% zu%`T0bl}nF5T0CcaH7N$_o2MtjQc09h(bH@rU7L885JufC>#KNQnY@GAQPeF)vtKH z@DQo1gi+Z61xA>$!SJMTit=~w{thXXG88V2txqMU>ALx)MZb@H4AZaoJD^>?dqX%H z!T2^|iD9hz`fMU$jD`>1wp`5MY$$F2}m6bJvz7*v?iBq zo&E#NWHf^!V&M&xN@aKkuX2Ei>utM4_%|_Txc3#eXWFSZ4ULH}HVZ><4}0sZds2yb zjmsfh^q12gJst3N+7TUx61W;nUdVr^FSd?>cm0!@G?j1l=9T9Yq)RA7F&e&ni7I(0 zaB@2BG{?lDhX_)5)dl#D_s3eIN?N&#ZV8#99xfrxa(lgyC@g=#w!(Lqk3-y*C#p5$ zCLwYqk-Zz4A}9kCc@D?&sEX80FIv#beLS2@XZs_rW5dV#u?bTGV)5lDU=`#TEjf&3 ze5kb0bYKvQL3WS!gCZd&0-*rUk}?oLq*^?Fert3YJeBP7_Bq~%z<-X!1K^$XqMXWC z?y1(+i`=r|kNvaDfep%rqBK>Y6MX=O6)$ASiG^!|v3c(Sz(!Tt1Sca^GQj3cR5Vp) zOn;N5#oxHCOr^Qnu`zF5BpYPBu>Bo@|H1>ab!UCR7K?*#tTM<`A!)^PJk)gS&FgWLR zzBx<1kHL|FK1EL~!owkFeY_FDC%LTZgj{8ITJ=h5TL|3(1>}|6hnxfYcDx!;^i zmCMrPyKG&ACUIbqBB%5qr!>!I{90FQ;j`7L2y=cJCeD{Cq28bcW|BK_b4gj(&&=+@fkD5-oktcWm7u zwAu%~*LWNlwQ$JHrm{16d@`8^i3L`g8q0&`EbmpG4xp|LbT}H_R4|I5E_4aW;{l!5 z!nx||(O`e7a_AJ1TIW3ItDQypau5JF>$YAHeM}ih=IV$^EYwU{#So7dyoIwKM-tsi z#_%SaW^#ZtMc>#0cz|Q-?w06dU_c+Y@j!pg3yHEqTM!l*?d@jg%(8Vl_xkhi3ALrg zzVFJ8m38J*>GHrCpD)#1A%Ny#S(Wi&dZBRV=+%I^eX{nClHCZg-5|dyvq!GOdK`XS zg|9Tq!c-W`a9Tcc`(DUV`3gzP?J2iOjXB8+@v zHCnmd()@-gMMP`eYa+69=|W&NH%-OwLVX$W4Fpvd$?7%Qyt~8mAszDnmQsh;P?rs! zf|=A3vfq(h96d6j+(sxbuzI--tGRU@VqA>EaA&{=f{3F8i-$=!90 zTMyJZq8q3UHY87MnUINU6TMa0BCuR-$2BH+heYB=b3sWZeBlw;L-G@5APA^WH(~IU zxu4@%(~%Jnhs#jL(?L?lzcu_Rtum7c+X*8=hxxb9JD}XN!L;#scs|3uFRnhty*ubl z{vT90If7#Nf4%bX_rAdR|LVv8DMQ+2A#v|t?-3N|sN|<>ZNro-Vb*H8!;GjMUDnpu z?$y@}g_3k0$+$tp1k)#04`j5sT*9^zd@-FwKuQTC6f{0N4G1D$IvjZm?geVc`7m}= z_Bqo!&=s_dd;-Ox@BXhBv(7Ck|EqovqI%1G$t`{x>~&);Efk40aRo9KN=-jRVZ|Td z6pQPsff<_%c@6rKDQ1T^%9VW23o^Qu>y0P@sW@SU0Ys-KOPUr7K=F4l7zWRyY+&z= zN>fm?0z>l4RG4LFl+HAUv9wiFCqVsa;n$9A;<-0l3j)xc3qU*vVhVCKnn7x&;na&9 z{nxu>6N9%Wg8_m_$bA`}U!Eg^PxWQ|lF!zj;9&y9s^pFZ;n^RKrulcqyq!#)Ya2i5 zzwOFo5->DRbPK0t7tKl!0ukBu78+VS}O5uGra^({EI{_ODaoqv-= zo%O-X;G|fs0Ij_>2$6p+4(5Jb_H9xxAQl-i>Vmb18)ULR3#KjxIu@s7JZp; z$XdcL0kehZ8s`IY*(K)a!Tq=-0c9cbHXs?Ni%?;?OV#V!ysxn_dB9m!y_eG3$v}$pUIBV3b1LoyQuV^TX4>+yd{XO6>L+P(I6@xF5ch3OX35i^E;-X)0*$|ei73BF z=kI=NMFDF=EUwXy86J9jTXR6)%8r*a*K7>58DwN0(>S@;ANmG;<98jx~0loqP!#xZM zWEZKHN+`Jg@lc}m{86bzhm-zrb|cCV-Xo{h^Q+T&kbw#t|F^E_?2Jga-yS~MZP#;t zi}r5dFY`qI$7#-fE|G$3o3ZqvL0XG(9k_TlvU2CbLe6~s;His+DJ8+u_V^b%>H7cr zXVK1*?vu=FB#eu#5nf0i(?B7ghm|c)ors$mBG56~x$d^dc`8cQF>+{O<5$m-x?v|3 zls}HRH%68sX}6tj)l|KreG;R4$&if4-$D79o3KL`<4^P+uB3gN%h8jH=-+tU1)GS2 zYQ)ZTIe48^g%zT37-T9S@QNxs^-Nmd%i%SASE?#<_)j`_@M?fXuF_aEZ7LITtx@Uc zp{J)rkS@@XYf^HhEVl$`h`*Nvj-=Wwy?vXRMD+;UA-zU3`d$D%9Z>{X}Co`B~(3Eh+JLAij(~c97^Lig9)ueVcsL$ zgj~e8KLi7&+m34~&K@2RavT1_q`hECTT?Kr_1@v5oxM^@yU~uZQ|S&yr2T05(_tt; zu+hmzW|P@ie%SDB^Eo9Mq0w7-dGaRMOyC%erbSRM&QE_x=X5-nj$W+K;Ebo`KYPu9 z-$h7rF$kIG#IfnQngy;AsB)1!5}v$T-SN8yBhhmRL-;hVbaAjgQoJtsD`cYL_r4(p zDh~SVGS3h0h}SsfZ`~+0758@qcYs`iihJ3VqhE`HEBxDWPSdEV;JVMPOfi@`o&K!T z-G7`IVof`KKbmo5=Sd!xZx7eXO^1c2Ogwa_Pq1=xXNApwKpuWMI^lJ@8@b}MWGeAK zsud#e_Bc!}m-7BHK$^-c+$1=lbAGr`d0La4R2zcU8q>#OkWGKy#w|mHd{@mRMo{{Kn+0&>a4+Y6%Bgu!yFP&Iwkv`J$@KS z37ASBe>Eyy77!J*(mG3J3|kUal=$6ZL>(SI>j6bJ^3~8%g?d<-Bj1Jb98Qp%RRoCJ zo8zT1A0W7Do^Bm<_YS}9_I8k#u(8IWI6c+!HVC=F0oXc_$jq*MRX#h;a5>p8Cgv)y znK87>kf%HN>>53`a?BgNWg|ZgHbQ5KTpr;+9-&6WU@{mXi;?l&)E_CBep15ee1H_t zlfzIp$CwMeEh}S6KGL@GAq*5MloSg?%A??yJKZ*6amz0<>^oe=y*LACczcrJd3bWP z3=#JgT}=B*UZKPE_4xAaw1ejxaL1ZPQG7U@6&m=#-N#qt1O`rOu-QJLyiEF<*}#EPc1innwN=;rJ+~cdteI4 z3idpYBr8gvW7nzf85yf_lSaoc*imuchi?7wsX>WvH5XlD1~Rin8z7ZmX#=5S*nnKf zFuqyeLOU$(AbBut)zurX4|D}sC@%|7iIYJ#bVF#V@FV9JBUexgm!su26y1 z9kyRi0Y}jE`{%52=dYCD7v^x00cSfhPoZ|Bc=3=FIWw;o3dc<6vG{0tAi^JXF<=me z^i4&;#CgZxO9&G-1bO!emBNd>n>Oxfm$AtQ85NK)6u7G~OF>isOn6uZFYt=T)r-v@ zXrQFPP~>S$VUUqG$e0;lY~U9riMEFy7p#>cTfoO9I{6pGOj5VlC{N=k4mQwao}N+U zb?}A&_#1Ji&eE!baFs?5%Z|V}pj_9Aa&+#5;q<9bc^nsNhszSzD6nRv)A-!`xD<4{ z^9!If2Yv?X#peLa7a1DCVFN)%>IUw(8fkKF3#-sUiv*hcGqQc@y z%;b}jdoizSP3MJgYZc_n^{(|EFLr2wHpRW<#*~$pDCoCC3jSOO&LDsf1WpSlO~TVE z!g-9PC{^xdaLss6trnc`9!g%=7@ClCozT!PU=f?Dxs9CLt;wrPYH>Uu(ACwV2!RyI z-c1gevbzV5vwj5r1Oiey@Yk(_oh>}cQ+}rj)IHjMcCh=mqlX7u+kfdE)|)sJ#A-j- z6eP1U0rtk8^NET)_eMr!hBKC_B1<>y!Qtw97p;O+e7JM?-46D>wf6`O40@;}^#)1) zoFv0iS35kLlCsiPv#_30F-fULMYG+Dx&?j23r@1kxxO8ITw6I;<;rRsfLkIsH`oPo8YiVP$ljIj@43z`b}P z4lP_#LDm5;^#SbJJhfwy>39x#>)___5(bsXGe?GqkHBs6-sxy4R-(I2L`gnP(l8n$ z1nh&I&4+y!J<*U2Th1@2;lQ-oLMXO@*YT;Cd@167z|V5GqYWCh2NiJA)Ik%~NM(wn zi}8iJG&rUi)xIImAj3cIhI-U+L~m)(6Wdmj>(4|lcK1hFVnWdMvX04o6;RT8p2t4h zNIyF?u+lGT~sJ`#R@U*&6B|y`d-KO&jyNEDi}DGYv+hoN* zE??ififkr?p*W|u6AL7>vy0y<_H=HPVk)!uu^VSL7LbeK+vK5H#nvUPJo)>X;`YP@ zYler(P;+;{ug}=^Hg0LLeQ?9J0AD8VaTqm&uJ9II%_J)~E~-;DyT|Orf!3j=jH(idalrBWdU!lU zjX|nd&Ip9w)6J_2yOoGqHQUmv6dEuPp?{5wTfcy-e_!J}kA3pn!|5rub>1H>68gVq zy}2?bxd@BaK@`6cbLD1O%ITvY`}eH3ACP(cycJfzXTANrSQS;SnLkraos>$SW&8wQ zTsM%T=D3SMy%*I~I)T3Gk^_sRsQ%4my-5^VRF-I<2j*DIPs?7`TP5!8PXi)^E_7s~ z@u@mOz1=E*-Jh~X0?y#o)(FpB=&K}w|H!LGAr2A_uQ+$w;5a$z9MS+;NKVkXtH-g) zr=Lb$LZlwZ)2}_^gJ|{9p0Nqy&m1Jy4WWrpNPSsFD7>i{oaDY6EOU;>{Jb`xX!141 zvEL)daYGPXv<{zE=naQLjD@!p^ zxPRTDh3zz*Gk%RO-Petu{F9|W+V>S^vGRHfCtzbhAiZi!m7~F4LKcxZntXS_JGqLR zfXF7!4k}E!)P#0Wq?YC!O<-Gl%pnPw@8?LPmQU70&{hJbzI>%@I(GQYayfMA)UE>>4W7XxGiEkFCDyc-- z;o?*uFOwlB%$ngbFyTd&pHhjWsw!9u*-QKY3zQ=69`X6D!j6ZL$qH9VVp*hE6?sF( zvr*R&SRR?PM~T2&a*{%|p_pO{G}BZTFwLlV$dnl`=gOtD@^2}(li*F-ezG=mbpGun zY%*dZ6zn!n8tw7*$pymGM?oNy%qJOxGyF1{>8sRU^^D_-9MTHbKq}EdckD^Q$P+!$ zWF3SZ`A!mhc5@2J3@iy!N=>^3k#%5JjkLyl8)5$NV~f_PY#PrO3`Z?b8B26<`dKx% zGF7_+&}4eOS$<6(rYm2>!jf7P>g)~rvkfFRVkrhGKt(_sAOi$xTpbClq$xT5VPQxG z6b4*c#uq9s&mkYDQ~<9l=tk}q%e4YKOkS9b&w9{Pr3&nayzZzKxXKkQboERxFD~$y z*gzvH!~c!?hALLn*LY6Jl;R( zZf$?dk5Gtr<=031{ImDn&Y}K*HXq-m$Y`oKaomQ6l7SDjaCL7H00x64^B^N6oVBQN z;=q}{X>7Gr+6hqMaMU9!oO(|ZEQ)tGZLno?D%3;^-mRU-xs=T9jL84Xh05W|N~Q9V zX4qF29KGvN_b8%Oaq-F(+Osm-eI5^^rT_ETnM&J`i*dZG@c9cBT`17DmLSb>CldP-6uQS`@6i++#E`W}s&r(`tpdN{rFbxNct_&O@09;o=j*Wn`(f~%n1Ko-fcw48ZU+S>~YCOsV@8}@S2f7O`uk^4pDzPCWG z#Uw+)0#!{=l9!lbU`(vjPZzY5rf{{_;{bp3^65Oyt)*MIYD1&Ee~dc#C(sIM zN2z+zs4XA34Bm$7o?pz~5vmFz^MJA%2Nm=HxZw8W*LII5eyv#7_*x2t2piIFw3`LX z3^yvhRE*%JpRgh>1*;}gv0XSDT(E6)q!0Z?v&Ih!x~;$};T-v7kpQ6GH7A`)H*?Zm z?6>Wp!9dQAkv^W?8%@+xA&mBkjQG}OdYiqvH5_h$P7cj7n_dAf1A(p&A&wNg)0dsc z>NUXB<#IB zH$cBO(e@S;dQU5c4IB+nD$#*fUh+9QsQIX&tfZ-u=%TNB!np!cEHhKeB2@goxF)i5 zll!ua=cIv%3n68yyZ7km+wMUZ519$XY^s)~d;8z9WrlY;NtH9ygivBAe#QB`wSE-_ zjYa0yP81K?cblY^%fy+h{GBS@Z#4` zjDr@#u6X}Y&sBesJwauS|N(*ju%XtHbL7s4(K7GG9tn};X+_lb{HNZ z*ji=|sKeC)pP=^*tX2trSx1N_sfk6GW^=E9#%B>0@sG%C7xBu9f#0SKdG!^mhRXY8 zP+bEj;jSGEauP8eQ6NW!(p=pklPoEKL@JC27CbGK_6_z@YebifFq3SV5)x0lv&ax< z!X|$%uEML6Hk_kU>Pv>mx%*_HKtts>6nMai%D?a2i9Ev)TE5FV%jbs+N{U)i>QOau zWN&eSm0qq~gVPs+9I6iP-nz>`Tx~4ruU62bj`#W3O#n^TySe@|@F}v?!s}rWGioUh zH#~(Z`_IUY6S%{U1oU(EIhei)2ZTWglET>V1Bw2d-E7?BZfD*+#)@Ob?zrnz8!8 zqWFzfDnQ`+)o_YR=o`cewdRZaIotbty=y)is2r;hiP`0xOop4}XfigeM6mZHY_%9N zNmi7a=F+Dbq%+XkZ%%Z{-2JL5$%d@C)jIM_Kd=uSiSR*ZLRQEFRA zcqs){`~(VIhI<|kcUX@vXZ28b9dr;u5sn)BcB}xxshcP0+cF3bSbS3h3LM;#Zs_|C zkG4f&b`1#2J{2grcg!EJVU8iB#~ekEb&d6vMeY$om|vfuu>Nd<#;pr5-;C%ua7l3c z5C7cVmK$0JTZj7xna)#d|7iai3iP1V2O>G5TP6TV0^Y-`l~sv*Xw#AD#f)RmBiyGm zK6vR5H?fQYaDL3TdF>Ph%P@9=AEhU2o`7L(?ZMHux4reW*L`%P*B+PVDK=*0DZDfY zv5HO5a>8}*Gdzoal|EWr^J4rqND`{ zc5J{oFOM;8HYdV&wx-Yn(l>sRWj5FO;>As_GgOr|Zo9-frH9(Gb*>{SRN6X07rFcO z7`EZ|jWFzmgVh;!5ENHu)d4Fv>%aqhRW#d75L|+FS2lBXu3Z_dlgUNLwLhRHxJCNu z%LytD$5))mNaAm%7w$qS1mQeKc0rk|b95vufOCt|sBYi;_x*QV zosKV1Z|&{xrN7d{L7(v%FT2c)T>9va#QnQjc>N??L*tdalfiU)NVV>}Azq9f3B)!C z7st+lY3ZP4pVCY?o$_kz$#efq2PJlDMn+Zu$wpKW9U8ET6F@DjFMJ|%JRJ-!2FQBg zabl_;2Jea%!i%$3VrTJ4;!>T^l(Xjfl8L#OYMjo4Ej${a9V&3a@L*d^8HY3Wp9Yfo z^vzw52nr)fH8>mhPwfIA$D8g1XeY=~3yX7L-_7v|=s2lp&L}$ldVIS2W(@xE;W9sv zsKz7+j%#drXc5zOhm+LubeSH<1KNr2EMCJ%DZHS=KLYUYfMpTs$H;W!HBpy6p+tMj z&9-s-7Lv4JSoIfQBDD=d1ni%k_BflWk3Np&Hq8^vcE)`tq#=ssuI@+_K;bD-GuHod zVc&d^HKpop18qD0QGx0T-+^D(n%7XUF=C6N2C_2j+d)PzbsckXv~PsE5EFD`4+H9# zomfNebc`1X2goTNk76@NNKO;swB3~XJfOh`JKWgeB0^n(iOW88vfk7ZE1#^jer@s>R}gy+p{Mf&_4TY9R$ zYJs5Gzno2nkfFr*Ig)~4LiNw4&}rp^O{tTZAqK0k8Q?HQX~1J*v_rg12-WV1#L*-D zVn>p;A$|;uD_2CKHDa7OHrEiKJUY;JaU_JN$y<_CCTPI-VrD>PXL6AP?-HD=t0O4G z`R*F>X?WY1dBLc7g{9c>nM3||lymEyuf7(g3}ku=rG^Th|Hgs|<=^1C zv*C&V3gq^GPV+zI`2FvfqoT$13@Vjx@uvU7;4=F%8)I?2g5?&BQI5Enf&U0HK+?2p zH5~m2jnaQP9UNc28jfC$-AC%ckvs5#3#c*EM9T!c4gRNkXXeUe0|JV=az6_` zo{djL+blj$$Nh`S$oyO&O94_Mq2aKg;d=j)uQEb;veRM@dr+9qpwK#@#SlLmFguwR z1_o9WT}o%T8$TY4c+kIpw@Acp5ep&8oI)>jdT2w6HTb+KVP=K+&fx0I!Y_u8CPPz3 zHbzfNR3BH6C2@#CxlQH>#$JEEH5!lJosTbJN`o?{-@^+28QLA)$B+86KIu92*rY3M zGtfS{EQNX6&F%@Bd)+PlBrY>fz+R1ZX|1{i_(@(J$upoE>;Lojqoe14Kl=WEXt}rn z#TTX5s)Tz#)!TOFi%TtcPdx^)LH5Ck4fkEqi; zn$ZBmM@TeXO3B3u>WBgWUC3|Iwb%&)a}#Flp5&Vq1HaLJ{Rr3-54-H+P8WD|Cfbzy zhSeTXHx8ekPR1AFpm19Sd)E!|$H8OB-ThXsNYt5NW zA}s5cBjqo|TWv9mxodG)#`|(;Dfi>4R9RTwcxfiK2zK*$(oGPwN9!dh&vq#XoCtb} zfVI&Fm_RFcaD;q~`m{VA=D&!&%`_hbyoVyH*VnV;*g0LLIm+y(BK$GEUN1wIf&Z}Xo>hggu_2$sPhGtOwZyv7 zM>2ZIw&kWzIwGG|n;#xR@Ol$`4JBo&l_~ZRI76}-uaIRIP&MxFmKmc|q5_5CAYzh# zDk=#;T=>p}AdrXMk-=9{P`g|W)xO-bpIqVG3(oNjdDTJRO25r;PfK$L^k<5V#PAOB zW*j|;aecG?tB$WvBC0qYfAkKA*EeM#z+bZu{P{z*dR#4+V<%0{qk~C#?R`wmjR_28 zIIk-@#KLba1-hDzu!xXkm?^$~onbh%46Cu^W;sVJ@)OB!u5^LVzswbcTCyM$C*hMr z^H7u`K_)~!1r|mC9J%FW(@?QN^K8Z4`@Ro1tt1_<0(6`2+^llI>Fn%8(%`_8c(gsU&f3v&P)sEPl+ckea4|%oi|mE z8QzFeJw!aqc+lW2^3%@VK@A)@X^Hn>XKw~jAsyGHFSpY#8Se^WlMDCUN@ln@k(r%~ z@hi@`D!VFSxH7v+WS5^6vEx1SEOLW(@-xZ~%ZkLkkQCX$V4)NAef45vn_aaWl077v_;pHkIB-JcI${7~9;D;9Um7i2jv3C&>z)LUosC z9uhkc>CFk2(*3P<;={Re!FkhfOtH>bM)CF+noRb%;HtmW;Z`~s7uS}=F5}MT#Fg$_|ovJ7r^*MbAwX-hIM?hbq zTynWIOj&#P&^HSAJ2&H{(oYbCa)X55>q8G}CNGZto5}c6!cUUV^ooBCS;2-^dl6~x zpGyPz#PF`v;TiN#UOWAGE_HSKQw+o#4PQgi=)WSEMT6nD@I?GV;wxN3_SO_wMIu83 z_T1Gx2V5~PDOcWq(v^tepLu-*%a&#!Zcu7TnSz$ncTW3QeMG-x)`m0q^wWx^tUV$d zS6AQvC+8#=i*!H!*f=8(PPj^Tp!{Xc4xGo53^7EH5vzfIrHsK;2WgCW?QD#=4LD4d zV>pC_J>AW(Z(;pl4>G*qmFi*5RZ};zY=ROEZOsZEqJRvA!d+oA-%Ab~e_#``pn$K| zQgAXf7QB>y3kc5pZ+8cySF_iV1mIg3fjMfzUm8rhv?I4a0&d3EmNED8G9A@#+Y)DjVpZj_5P}gH2ps#TG5H&CH)0}~j-q|+0&not33@CVEJS?cuNDZ(C?`?Ffbli9PAIQ>Et>~ACF{?ULj9E6@U-5;`?MuN&+cI2YnOwbolb+#-W@$5~PFl*1u6;-M)*87{H<*g}BShq9F%t!S$PfnuS6K zqd`aBz|dHThNIgMIeFS8e|BIL2{j_7)ZX3r)BP7)|MOg2&Od+u>FpUnyb=H0*!<-7 z|GfCm+jlRA8jIaH=P`!-~Skf|a;2 zW8*%*C-!}BC5YM46m!Y~sO1@Jht-0SLh4);;DbJm~!z^N^T(ysw} zr7GZVS>(Vd;zKRVc5#Ry;uds9L;%)1%-+S&&{}g_!HPhuZ3xgAv%x<(CjJxiDj^1b zWfb{%_|`7ie4sp}|MN%^ng^~he;AsSx#kmPwTb_@5?Map`Hv^vCSCgRj4=H-5w+K( z%x>;kd0%w-h!?2p$$cWrmQMex3CZp8=;aWjt9;z<^>&A&*;Pg4I{Gs*TZ*ifbU^c* zqsNs~08gegu9d}KI`0{{eZ|8mH4K~w&rDJ~{M(L_AbNJf0ppPjrG`R`8PNvhjzh5n(fHeqD zfY1$;(ls?KaxF3Z0m;34J!;2;CW+Xo+kumiGJrT5sQ7?3}0_*dlMe7~R4QI+a~u zk%n{*90_wpK_D6tf9|2=Pxs(p|KJG4f8?pDCFc)3jprz9!7<k90|XQfdbEJKR$(@Wg@#D!G)_%#y1Lg3-I>EOq~WXLB*@GFAuKV<}Fk*g+a z4&7Thbmbn_JWju8xSxYc@Y`Vdf9`#I9R)9A`HQZ5+=PBNL1C)#V(m_vk*lx$V~QS2 z=!4oW3IaDzkONYh(T^6sUrkALr1l zwa%Q|shS2}1g5e`+cZaLio|Mf;TsGYiYf?dHg#`-9=U$^?;D$+-hP4qxxexJ^E>}9 zyhxj$+}D4-xVN1|Y2{15Ek?pC373<> zE{JU~S!gf{lih~wi$26~!%W{UuKm*T944R9OIqiLU_n&C7IUCi{}5dxGL+QoT6`l7 z(_kC+Q(^_QT4bp(Dev4F;egK1`;&L_@7WMK?43K8qv6}5bE+|OEYhpM`OB$D2R{-+N9 z?}1C}{u+rE9T^XIGAJ$)C5P?TpPX(!xa-^flXm^*J9j!eqm#2sknMB~Iu2zaPCC;O zLQBY|yAvkiMj5sE>ee>{lrtNiY;H{^aEol>B}f#P8oy!kuYBsg8_oJ}Z{2O}NS?d} z*T=i*aJt#$)yW>KKk+*9++Gr+!Jak`5eHeWC2k;uh|Ape#f#3H^>>!%4DncOSWxDx z2#+V1XR{&hKgYdIm+Q|fXah-J!8-x-0P@(X4{X}MSeS2X^6HY13^&>4%n3}xdbiU% z2%Gpf@&RI<+Lijo3hgpTc-dgi2q+%2`Dg&AAF5LgViC!CFp?et+2qOx@1`QqykL@D zJeev_F8pQi?#*~|x@>dX$DH;(No|{MJ{yhjMlHOC6JRp4-Ov}?n$z>U*TdOBPCDYt zVgFduJC^IV+aJBUM0_%y+2R9tlY-_aLU5?iq5oK^yVPK5UG3BE)&X%Te`r635u_}svtU7DTx$5Uj+KCowKeF?v|@~aFV5;(gpN9BVfJMB-L|7 zO8pW?Szx^vGh1hd{OKs|7*T2}eXN}?R`nDL8h{lyy!d=&y|F!w_*Fsl5GXF{hgn^7 z&y|7z0{3``=jlc!`>u4jupr7&I?R0d>XyXv9lk`|9%w}qmJ9#t))eosk6*^EOGM1? zz255-W6Yra!5wmmsichN;$A5G4*keF4NhK17070h1I^ZlpdRBTv6uYe(ARoC$a+B{ zKqepAS;Ivjcld!hMNJ< zPTzq;4^DoVr!@zj?|mG8oh1v5CsZ(Ep*ccgdMm?N!;jCuxR)_k!Hr@JXJobv0=wn2 z&+py){Ik!$_+vI)`w`1TO=F?5?M)v7?b6WmfCxtF*MIn8ZTjG@{nc_}`=fB_6_Fd! zemjt68ZgF{iF0b=cPK78hSNYemesCUH-&y+?1idz4*=`W;F|L5T=u}kMlzeglyn?k zU;^Ua@Jyf`!bv{>qB8U1>Z6fnQ<6OmPqk?&q7V< zYY{{b?#jPgxU)ehvC8)bq`&qjLuO{ZKOk)*fIb~eaROp7y}K@$6rtckgfkIka721Z zz3$FzI6DKzcA@D3gMzOiobm&6>#5fD;GdswKiWFndM+o>lYCd+j}h$z=HcbpsiEWm zRy9gK@p4P3wvF^F*imm@qd>&*fK*4_a&WpSV}1X9nBi_Q;|X*RJT7#OyB9+wAUN%h zzu4jhbMJSaN$DSsE2TaV)$?<2den_OVe1Ej^RGJ(?&5!MeT($B@vSfa$rdCCe3x^z zOueJEiW`$JKl6s4nM=7XAKKUOK-QB%1zuNwsBMSb8=SrD{QvB|dw&~8axVP;ehM6g z8&Yf2mb{ys-z#sNKoq!QmLjzTv_2cjhk-~)LQD|~L9VTJ{N2y=AmmTnT2V2Ha)2*M=psaHKX)zULI~da__>&+4sqVlhMm(hiAx|SVACi{cM;C)O)qZ}Rm5G#Iq0&u zh&q07L%4F;lLrr8&1T4%Tn9aP;b+$YhlBmyZUa_uK~Q!jy4jgwyC4?{c~WLOGz1cW zNSGXfBR|&$3%qYD53Z#8;6WnWCBxqckc4&w+2K2pa}^|>I?`w|^6qT*tDl6ug*-wU zo+x7;t%H|i+_5Vk=x0BxQ?B*vzhz&`KIhme9eyo6{`{+-*T7Q7flzLn!bi&nue4xp z2o^0E@gY`jV?B7#ap4t2=*T$}zYxjX3toP62Q6iuh^86ugsYYC{TxganFp`H>{vo{ zJVmY^&iKNy%U7|aEqG+O5b$%Tu?S~<4qNU*IVW^jT*(*sC-lI`SZ{|@Dp~{yFt1}i zQ9!0CNYLY-(oFxvhRLI_PJQ@rd;w%x2V3{friYOKRMs#;)o-XV2)K08z_gK>1Wu5GY&FJzlbE3D6-B^<2fQk5e8Omy zxYNMZfR&;Xw;+b@NMeb^4CRLk+E%7WHWz~D(k97b9wY-lRek03unONkMNkG3dCKEuZd2`N^>%;pbSFEe0!6qEj9zuNurfjC@_?d@B>2&?P5l} znXY9+)TVJh%T~T@0)j+$7LLC@#z;WcWM6Nn>f$PxV!|UZ4Pc6-(Fw-zCR&wiu;9aO zuYsj~5FF@Rxe(p&S2L!YP#va4V-v6MzOI7oNp;h}*y7)jxxJ$Ku%@&#udW$LYfi8+ zLw&Hq6t96llebfpFGCI66>w*0jU;qwK8A{^c+*Vbz$h=6qQrx_O{R_rLcpXx;)0Ok zI<_K#gQ_)Z0Ixc#ZfE+jyKUA@eV7!rnfuh)4lvBywWFPl5t#>9(~Q2r9st zq9G@kp?naBJxy0WcbT9l;!7u3!Isti3m_!FZR1x`77laI5TVPY!8(P@CY|tiUwyqk zko#_4NwZjcS~?M@uwrrxHopSfj@Ibm%m1Li1~`H%zTqKTft!v9c5M#mYxAw`Z|<79 zb&m3I!du7Z?@jR#BD-M;Rvq{5(%f-a%7=fZL;;|KIZ+{axZSVoC?zv4$Z^ltb zTq{jTIj_!0e=nKR`Ut?B%@r9hn?&{+clifq2&%#ZA16cj5=!s@F8{N$?9sOg;eAeGu z34Qlmyr-j&2|@~LrzBy+AY%qOQ(r(`NS{U=7WOxY9ZBWzE}@(OQnis$4!NcddmKVy zOn{~rLu`C383XWDA;EHtaIpp#5zQf4NT*9M!zNP;9gzufXQdyZV^gqWjqzLYWhpR% zE}z_G_5Ih6|4An*lO!m&HUXIXI4i*aeudLA;%z1Rtk4`K^B9_mme~tN6 zP*bR9*@o$CBM5D$a5b{O56Fqp`VKEao0S3=IwkBUXE4XvWZ*Bg#l--WC2YlgLnbLu zaTC4V-&9;gZ9wks)dc(OKI11}ZL)HpzWvI-y#Yk9b(n_NWfdQ2>g(W4KXM-|EY*I) z`AWzZ@Dq3tD{dV!Fl^I4R!)xPN!m+yaDqC$-jQqX8 zO#=g42{CQ_5ZpR@-(@cos&UyWW)v+G&Se;xe|9^lDSJn`;K6LmgJVylck3)ri4FbV zcQn;lU;L_EUI&6(7i&>C0m&Vda>#g}zkmC3h9tfcwOY`ZS@XE;J;+_G?u%aEQl(QL zCvT?6OgcrRl^87g*Zd|KW8AeM#lwcJhJ`&M-v}4837$bl2zMm=`!ks%-<0fe^aE)7 zy*4Pm);F#}hYb|DM8a!mb+RCyy`Xbhaqv2eE9QFpD_a*eRs4osHI!6OAkgXMd$>%H zE%SD4zILJ)H8zRKsZMv3cqU^7kuN3EWoB#aL@N&vBrIv4c%lD86#cE^AHNmc`&{-j z@zZOe8k|mknFtYHDj+}lGL;}#T4n|BI{F;?Vo1>C_dO1xuHbR_mMLGBFhP729G>^y z&#t`F0mZ_Q9Tu%o?-g+FLXHiGhx3h^8bDVa-rgj3M|%}hjy{SoPD_|Gb51-b;}lff zgeO2SQ~vsH9Xpl~M_Sa%Gf^awsRWh6=AwTtn9TaflF}s}UQN#~xA)GYpR$uVOWhIY zZ&3Q0tzlu9mos`We7XZ{Q{ott?Qb@rFfGHzmqF_83m#bKhD#l0*=N+qo6UH8laQ#y z2KZ!=Pmo;g_f?4}-Aa0;u9MYDl962HMQKLE$>q8;x(OuMwaCFAHGQxX4p7I>(q?QA zDpA82G1LGeRCgv?eXz_Jo0)kr>Ig#QurFmdLZm>^BV+?eZR!P1<8}m*qtTLKXoD=D z&hE2=ozdRm!P?Wg3GCR>GrY__Mh*cEzF35LJv5oVLL$`}vrG9e|6(F3?r)JFpX1OK zl2H*(;sXerGfBU~CC@Z+!T~W&W%exQCdEqPDj-nkFHERy$C#<6o}zjenMvR!8{pwm zb_0dXuZb*O=CG&PsB6t(eGJ(R*Y51kX7AQ;i1PZf!~t*_NQkQHC557`+Id8H8^(qu zV5%5SJfUDfV6tI{TwjUp3S+++m%&cwJlKHF&QWe!hf4JETnsj$X(CGc>z^cAqF>?7 z-}pv8GrUq6g*WSARdBissHy4E;a4=Od%MoH1d7<@!4lBgg(7FGUpKxh7S#vtyG{>4P@Om z*BU)9oNNW@B6)PC<`qG%MW`caQO=6hsPEs)o=8b*r~fZpMVxZO-&NzRhLH~cs%8Lq zEhM*qTKKEbcQ#uEHy^Du-H!+KuhT*T(6c8itzt!>H)wtt%w=XOtrS1}gOz4lfpTWcEZgGW$)c6Tk_9+z=diooIn&VX{aTiCVLr zMT18Yru(?}FQM7x`1MWd(XQJCn#PyE`OU9-zY&RR4F)!KiICGh%Ho2uMf~(%f+_ab z+4K~DfBCCuPeF7``X&J*Ym)r5*xlCVBa};;T>LMFh1WUI0Ed&!5wMa)Q7zT6s8HEV z>fALf^|t4KGiVs2B3-bMz5w`LQ4ntaee;%KLp=!!s3BL1{S;}mTgtiZ)};!5Tqbps z=-H3+MK%pEO(K%*8<#j5FmOI$UZkZFDtiVZnx#Sf(_L70Dm9-3(|)>5Bn(;3L}+Be zL@KBub6qKTdKi=aZLi9GYKLO)HwlgoilpMzfw#)xM5R3$Tw&L7^a{k9JpG^H2m6&A z$Wz@FuF>NigvF$6?d0OcFoddclM0JGzL4kmLyuPy}`D`&lmKb~B9cOM&Ls zkm*z(YPxou=+Yah-{B=sWj}X-@<8yZh=c zx?>6uAj0l!%m~%^I`4clRC+^E+BirW+Infu9M|aJre_v(mWwAqrzdk(z}x-?C#vDs zL$M1KF-`4|Hx|euYVSg%%(DaKum-Iz7)6ouYrs<j$R1Q~AD4AvBeS>@NNtVk-YmD@3gzjvxL}Dv<6EAg^&V*cJ73rKO z$wIo^?HuL+(lgczDh>4s^`gU6%2^ zlXqu8AQ4_$jzfiez5`rr*%>SZg7)Siz;kvTlpmzHWZ!9&F{Y0yvw5bkd(~-i4R0ERa2l?-SoSB84`C# zOS!($vAlEjpWSHMhSJjmQmPywuQJ0O)rAIvq`ZyzhbSJt&QxP&wJZY*+d@Pk(-=@dozs3 z!BrlKrTaYYW`e4kmNh~Vxr!lyk%AsH)CHrDVIm(RA8Ttk`Fx{k0`JQCzPCcHyPJT|Tm9_nAbXLM-fnvT>qnj!9)# zj>PMg+{SE#c|wW6c`n>T)!Te=kB5(5$PuI$ID&%Tzmxgjt!N+!Du+0A?uO0ODGqD2a=sH`!&~%3WYlKQEj6zH>%~-Rkxns zd2xYT3wd`T?sR=_puw$>P&slW<+h5lU+(Vi^hefzlybt=O+J`i9!=njyO^8;kaiJ_ z&{@-ZNKS)x-Fu45A1;VG%z1~MQK$6#LhR%!#piDQn=kHghxt$T8Avkwo1_94PDk;scr$j+@+If6BgPFHf zZH9JlsqZ|AHlo<*ST1^e+CLf`j2;h$d&3gfT77vBHR(L2Wix*&3XwU<<$OjAOfH-a z;20>Yy0+(||Co&Ce%;CR&k138l^JDhFBfC*(4{qQ}kF0$> zon6fv5aR^YK5qwB?pjtL>1;j>lrn{+*g1C)?O2M;UYM_!v%bx(a}47e81WwdHtZXh zm|en+BRT=aMG<@OV8i@(II``wpBQA@ugXxAsY!k+=?85lCd~&IV93#dXaa8(ag^aB zw3ppw^6l|>9&q2*q8)*pl2@#YTyrq3N)EsIft`Eg;5GD)X%MeV;$G_M${Z|>?l5SN zYlL>PY_7yV6FJRqo5JN*J?nlDHC6v`y5FV-+x-0cQUG22PVrPY>Uz<~usx8y@dH0*~I?>F+Z& zk(fq4iRTB0_)qQK{$Myf9zE_K_y&JC8uUklqsDV|WUp{f_25s>8siL~^!NACvie$_ z3_F9v-82>?X1S=TR*be~2@KePjtWd5j=Bkp24IQHOE18W<;BCp!~H@3fQx4bY|z{7 z?+*urrh;{yj?t9U)(cLT`d0RKImZD;)n9uD`+EnFT8{@J!$5ue1Aei4cqIMaW+YY& zL|m4`+;~r|@%aeFEkdkPp3U3MUAGRADRsG>q^vRRb)&iHzvNt1iJP+dV0Z*kPR+gd zjYRu4rrX<`uV<2_1I4Ks{PZPGM|@8PCtjk(4ed(oRom%OcAg#W|K<4MQGe%;gOSa$ z;;WgTK=d8s|6%iN7OtZ>+wSvSZCKMOlA|G8Z1-UcRf&MDthJ`jq@k0K1E@-0RPA$a zeN+%6*5QBzxdnELk_tIVG_{Qaai`+VGi_6Zdc+Y$uVOKZzV2Wi8@23GNB2@DHW zH}#po(|tDr43;!VTL2;o?x&!RFt7d<&jhO&kAFU#u~vj~Vmc!ZX6JJCEFmti5|^5I zzS9%B!SNR+gq!POn7Q@OipkWU`l;+sm2VKim6J^wE>0TcleD?3jUdFghNXY zfR_yiDBnz9;`BA9K<@$`Rs5ahY(j_v=jl33L!`f#%1tln6iN#`XMJ_fLW?oSS%kGZ z%cG#mfZ#w-S+?z#_MlQuKnzT6dH~3G3;x!|eRF25jYg&onEJ$fF;JE{(<4l6E z#6K!q8h3zxPk_b@ux9tB%JvT)EuM#cNbWAvadgS~$U1GWdpN%2-lyp+)%tf4M(%q} zhO*A2b#zegp+f)kWQq&>m|cVd5!e~JI|7xyZ6 zvcruTwZ_TC#H6wIbpKhfMETc~y#xQ}-oXx^J{sUZx9btkn3j=6WR)T0hv{T2qwPD) zS4dd1kRb4QdjTMcQj5+H=Ui>#^s&f!)~X+`eqPWLhHk859wFalSTb3mH7XKbU}kB@ z9yTrnpL@Vm6}F%#!4!G$k~W$kK>{`nBx}&j&N_VfuY(;Cq(}WxUBl#bs->( zM&)n`&ZH{E#-vQSaXUCUiTW-!Z1@t1^mNlYKD zGzRS^WMa_=|9UhqcTswtxpRDIj0)2EY&s8`b_FUDLc|n8Dk=N4weWWe z74R<#LH<|7AAgi#LX4d;ElFDRK*-N+_^A<&Q6Wnp^h}+cOb&vS&=)B!1VBzy-+o!B zU);vj5S^P|6pmpibvDG6X`hiri@ zVJV$gZ=ed^48Kdr;Lp}uo0$!Ud1q5{CQ$ZVdX!B0w7J%Y;AOG+0Dl$x&+SXu`Cw$L z>TDmB#2J$XJwg5qasY-LXmRHncx?|Be4?eH+u$D?dI1$hbfPpN6*rm6Hl&zleK*oj zsUH%&tWM_VHp4w_-HOy<4u;BJ=%?9s5Y;#DOG4cesx66PhAclMtu0_r8RvAWexQ4wBLEvs>FT$VM9v*X(1-!Hz{p-B z;)lyWbA^|P^fXWk@)!amR>}{%r&28PN(06@N}NlF87|32!9}X4Vq^zDlO6Oc-Q0%c zPwHvojVi;DOX^jdb`VRH5`v^ST_~RJfAlbJJ+0b zDG0Pbdp$*UzS#Zsa;`uj`-gvEu=^NpF)AST=LZO-hWtI2*bRxND14)ZR{#F*;h9BJ zwEp#9|HWuCwlHBF(@rjN&C?Ia#E-0|#xMf121lzO@_Fno7+4i$DS5I3+#_~so-gWw zLkrK`+IN0EzvKOIr{l{pNbq@@J?#IMd35k!+Zx;4*w;YWo#C*armt?Hol82e zT`4xae1A51giGXkp(cEo%kZ`>p<@%X1dKoH>Hi3Mvr(jl@kyL9J&MQ+M)yPF(i=2!cdVqR{ATw+m?)I>K zi}l6jwkkGbMd;}zqch;-tE75yMZn_7Ze`k%Duzi)Fql@VTt8j}MS`O6SLCHN(C96R3s7J`TO|T`2|2NGm zje}O1bnuj<6iaGaK%(inKn(-Z8`L$NnW23OWd=u36C#4`jnG#)r&U5+!fdqLxPnM+ zI-{V*HuTrVd}Eew(Vs#jSjiDkRKOfBfRpL6TU1V_tWI0&jOr{$@s8PMG)*0A7F;o< zOY->}ayeVNaXwSda-%cW&RMd`i-Q3F_(_UoknA-YU;P<6y#XUEUcXP7S# z-3*9qV3otdiyT>Oe*@ODTTNSKR9P6Altpw=<*rOEKg)pb;v5rW`vjO9+Nu|@zD=(tg5{C#}pZH6uD9z+E z8040;!0Qg6_v_za`E-vI0w%Z2t)UA&XArEon$<2$hdo5a!dNG`(-ULwQ+aXf5T^iu zt19G$j+1F7pemV=!NQ2kO-UGuw-=F|m_pYOT{;O7U4FWh1&wdR33T;$B=@q&4Pk!? z0@SJ~dK&T}{|*8ms-w$yCUa?TfOS!LaL~-!&Y<&K` zT*bwsF_Y}br4{v3Q{)`%M+AV=B^w?99u!v3*QWGL?3fEnS64vXs}-?|n{O!f>8PiN zZSF zQsM-@_XVJby}r!m>9-HswTp%_{bOGIz)g zxf+`){_WZvo|6|UYAIKe+{*E1V0ODzn-7)2;AbZYrP8|G)T@eAvc13V-BZ(gMW3HZ zX7CuKtxwc}N3JQ05k>_;v)K6;)LC=>xh}&Y$`n`&(%(tM8lZC7Xl;bx&|{%;H#-Qr zI?_@v#YoA{d+AGox)vqGTw-}Xs^XUX7vGv_3-d78*n5CStK->&-sa`_CANXeWfH{K z*jX@5F$cJ{7QEQd(N^S{Zfn9$!^UNowx|vpp2?8{_`ssLhqA@p9sqtXq~iy)K{iLA+Fi_@vAg{pl9Vv_>zj!j^aTOOkO)N z;fA8TU3D|W=(|_xz7gNASnIc|dM$T~EfY5tcV)(;GcTCf+98shOQ3oib9sp2>B2%u za`|=%3x%mA-I2|G!m4O7k$;UO8^fkxSXR5BCjtKR#zA^!Yq~= zsdSn0umacdkTp@8)d-D&y(}9&NS^#l<}S4Fw_6PLhO}=KHtqZ7M}Svl`gJvM-GG}@z=N~gDd4svkwvVIYM~l+QfXH3U77d>k_6r52hnk( zrrap0oe}~u4E2LHX3<>h$9ImXNxnO~csV^iooK$n^|PwtaWa@PSn}FHoCXhysz^N^A^HHBgDPw5Ni)XIy!a9`L7{~C)7l9p=n?>KoWK+fXIoH~ zTlO9uK*@X^YnDQMO7;JIiv(WGOjz(vR)MU1e5T{rwuVu$lVS`e_0!G4lK#W2q?>I$ zni=E?HLB^k73d9vwNFTEB}BoU28EKRt4OimDE2XRgSY%d(j)#G=7i-`58JKU&p&a) z1T&*sO;$r2-AHZ|YPD3yzNn$#3XYqU z4#htFQ$qT5I)b*KBs0y$Bg+5qU6nTuyvQC<1hZmz!-If5?}pN)f)-y3(;1 z0_8dBvbwjf*)mXc)fv73JZQ!e!lCeTjt2zM7n_Xs^v}pH<+z9Qg*bl_b&E`m1aj^av1fdHb81HskTTM$8Vrg70x{ZX+vb=SEHBAm24Xi6_DN z8$0)kH`?c*THJ%ULe@Qbpd@(pN8Lf z%EHz%h*r4XoKMgGiehc@DE!7(D42ex&*T@L;PmEY=uCg&+4~6#{^)n%w<=CuN)S>R zINCe-!|ghil+ZMUx(ILW=*6EqBCNa_$*j#AG1*g2|$J z7$4t8>*^%U(`9$gW~?^<5QU#VXaKvC+J-7!TExEf&{3G<4U;hP04-HDn)Qtzz45Z1ZAjs*BBTP!aF0YZgkccL z30p?fAzrdZP&;tjc2e_4-r%23n;h-y5-gHJ`1LU@zMm9@R?dgzTJ zA~p~q6s#@W<}(~d4a(wel8S}%ABe9>uWO!u(!p0g?qutQVvQ`(XI$1YNl`)O%-inm z(@9863ph>UNKqFWMOsbee>XMR0NbDLYbL4v`PI)oRvFXP{`A}YE}QE%)P(3fPBH{joqVCh}@ZrOI&=34Sdxb|8+b)<6S>% z9ACTs1`cg1x445JpDT6L#2;O;RL7mCC*&-!;Lu#&*Cf?$5G8Lgx#Y^r_l#6Jx6Ke5fS^cShh|4e*Kwx8noN?U z4@#TAVx8%Us1m9_YY2pJ28_LyD^qhCu53FNZ1tee;mGPOzF|;4VPt0d7EoiPh1kP( z`Bh%L`V7*cN2XGIhFPSj!{&cIe=+~=GZy%$ehj`JBNY6G|5x_O_!dOQ8SWn5%HGbw zWObH|G}$zn2%di$<4~MwJcaNtdJ4h7E6qul;y|ZN3T~4`P00M^tpX^D&5lZ+h+O+Z zjB0IwIYzM&IZ;nOcR7C=9LLV`RvLW{MF6=rRDR*iCSk<@gW;8Y43ts@nI!M%_6SqYB#t zHtBl_--PpWcqm&5d~m21&H2!xAxLV+N3|d0?B4MyLzJ9yVTM((5JlZK;xKhK(nqd; z%dUC?L_AK8A(PVF+L~l!9Y<0E8~UZ;^v=iAgfh8*%R12_T&>~!Z6Iz%#OIhOd-2~2 z6IHl9fhdK?dqX9uE4;~^b94^VIVT+UCdy7= zNH8YxL4~snQ8~>`Z1q0MHersUXJZoLbRKGX`^qk|b z0JkchB!EzUG+4JnKOc=u-!_-P-5QkW7YRN~gR5KOv1+W)HLQe;kCb)oVgZc|eK~rG ze@(~=GTKCqON6FPu1FWGRlhQ$FJgNfFv|!Jrd$H?5)-cRAwh2*zlfMEjOHVoZjHH< zHxMkUo3^-9>5q+8{iLh1Q>0C}9sNn% zMGFt-R&K0~7;7vS&1pSwWE?Ry<}FzR&2H7x=7z#1KafKg2to)CBl)`bs>oSdZTRN% z-u8V2=jA}y|AGSyjIuu`o&9(;mu{V1T*9B8ehsXwxw_K(&8HIKK)!o7^<=s9ZVrr^j69{|;naY4?@%6ssKx-WFZ|w%K)aE~E|{CC()Rm5k3%ojYvV?FRVro06K8 zc72x%SeVkKbuF=?M0rp~oM$E!C+!sLm5Sl1SSkPXKKz75iQ8Q_Vn0V}?f($yr$V3~ zKRm7$^>FfbdLll!4_d7CL&PuUwlp$?I`?0w>kE}DgjC%Z+UQ?|Q<%908F z5{!U-OhjM*B9R+9s?srxxp#hw0zNqCgsL4k5H@gflU@ zEjg@c`QFUo<{`u|`TfaXCujJGcW{SNJnm6)b>C+TUQio*<^xsi1f`4szj5KE z$1YlDI!5ldFTm|LL|jth4YzIM!QRrD-OMY>5^mU_5))=(cwmM4_Aa+3j$_q=uQ8hF zwvlrxpyFIYU46F++uI>RPr>KhbHM1TroOXZR3RIvo7nZ!CIksbt^(s{PqeD7zJD-}}Ax}{7u zgsdulNytj}&B6?2GW*kIPpsDtmK92&Pz07paGVX|6yWg8AAQ4d+V zYU*m-cjvnH4-~;oDja* zEgVi@yw$D=Xf_enESri4j*CP|)<7xwn0fSW_D({V+x5vYmUx4rsB3?my#E2bcWHf< z>#1zGFZ%zC1_zH+r+e~re?X^<{MCPmDjNMA=yjvx-MxeUK7ahVf5iXn93BjBUE#Ap zw$fs|n; zN;4~%oVI9)SD_*~e#-N&PHGE3Th)IXRg(IYjY4kM-s!&t5XUE%L!KlO14Tpj<*j?X zvUC1||JL7EZsi-|j@BoWw=X9bN0V2`1vp1}5%KYYzf8_g=e_3G5DjJdzvE+U9Oig+ za=Ar$0Mh~P-3Jf+bKaRm(+C-Y`1$DY*~9&T-lD{Gg=#T1a6g`I9MK=kid(pik`P#M z+L0)Po806x5lqUXNgs|uMpam@DaF)J_5R^@G729^es%V}mNSI-z@3B>9^Y zhJ*dx9HuR8g5n`Dx=p#jSkNfOtJNclh$bgFBKEem2AS;Ax1Fob=ubIU$!Q z&=b#FB3qEE2EO-}Nz@=}vkx;_G4H16$@`jU9$lLqHv3l~k%H6Kcz2yr;PM@kYFYwp zYGb$wMo!PIgJ8uR#b;mS>Im*+;}GjLddo8dHfjG!iBktdB$GYuAN5CvM>20*7j`zj zkT_XXY^5|K_zi9a^Y6&b_>K4-&Hg3x%E=3iaiiJmncDWn3vBg^7qkU8UZJGqpRQnb zznT`Ls>zU;P8|F2m9o^t9y1mi6o7X?=Ybn_!rE)8p_~(*;L})S@t440&7S_;W5y2%HM@Fufx3)CXN_T8fL{Xhw zO5xL%zMP>MLoPSd9d~m>+PD*S$NT;}#PD-M6@7o-kvNq~|IhC@ES)d9cAk75V5!@n+fK z)#ZGO12RkOG9qBr#A{05Ts0E=$}kl`er{es>BpIlcles^E~r-BN*tT+_dALz@FrpG}3O z-^0nb8nTGG4YW{IQ-+a8kCJv?XotB)dwkG;G8jIUm~KQZtU;6{PP)-sG%EyQL1Krm z;=~t^dH@g177tsd^F}zi@^kc+|8KtM2xKY_qH#Mh4Cr7}NJ{Q!C zf-o=z!wp~>tQ$hK_$CG-tXQ_E$v`!x!-O8Z?WBp)Ha8_8J5OtY;M3V;e*R+fvL|P% zQ2$7w;<9_-c0u++=6C6J3p``CHaim|etLLqbL$Y}u^z;_dcq@ZPCXP+dpj93IMa7J zMv&yi)8WxqF9hZ1FN6%>Dwh8`exMYAvu*si`m*j=-UZlKbUaskN69YrI=7AwJ)(3z z2X$nDSD2_{E@}HZkyDP85?PbUwIQ=PvKi%xIX-gk-S*f{gQ{4-nzX+{78oiYo+IqY ziqE)TeRA;%nKUeWej@w|RfXUYn*AWTYq&L!2uJJQ>GI7421fa0MBv(!tFy}~>gdbg zDOaEchKI~D_&QF;^uGvIllhJKqQ(+vpFtcuz{jr?o26qY{*3E4&S53=N$XqAnC%dFJ zcZdl)-YT2k!GV<-!x=ysE)Qmt+C==fg@UAd^AZy3AW%8!Wtn_d@~6n;bAnsGc*w*# zl3+lusJDW?<}}-mts^T8Df}Z+7QCvgEu`H9tJHsigc3(V{*Z(Fs&d@Hy~Rv4S3-hZ zaiVG5^Z}4Q`h=8K>qOg`Mdm5Y2Q4bxtaI9;)}iwiYR`fa`!@js{uWP$P{hwV+p(4kW-K+{jDlLzeMd~vI zYa)`yFsi`KPZ`{6J3p-eiFp|YPYC0WRJd`{2f1Fk6Ea%Cy_gL%iK!2$r8(AWnlIn? zrk4`+0w0X$$ojyLamoyilPv7 zi73GR7Bz?|VLHEG#9VVqX!WEMaxv-q>t5q}R)=Iw-86xnhS1~(BD7-OPDFI|P+EHI za!sR{5J*=%`P7pmc`C?ObMEJa=#&gMRgh~)NS94mUC&4W39PTsG)ijbCW7x#`E%Tm zPvL_3$t8^-F6KzNq>@L6J4n6}iKk8_yXJ;%s4ci%bY^_cwvFeNQB?m$$VhHyoVrCDwC649X0#i0#GBZ3_Qefb? ze;gmeUnp9*@O4YmC=dVGBF(syX$4Nf-H-BhWeqlMz0v|@?L6JHBO2E_%wCoHSX#Q+ z$z7I+K0GJkZ9Nz7Ad{j{$ z8Sx^xaBA`QysO7HDRr1Wpw3F1p*XhVuMM#xheShp>StzIDAphcEvF=i6@g{M1OC!ghX2N7N)j9uOHX^Q&&mkq(M#Qz2;{MN)7L9BQj= zu9WSsM@v6Y&i{I4|BYn?&fesJhPLz|l{B0i!uBDfOyUk>)RYT=Lm^V5aq*68anhb&dux_DP>Z zizDv(J~%nnTwdYastemLwrab^>v^L4$HeTZ|Ax~d{R7a(!A}3_aPTPHE}QGRqR>}} z^8otNR({S@>k<68bT+x79VR2?F>+8B6A7*j%tdoin~RGY^5&fvIItch30%zLG7s&6 z@`yr8oG;Q?Qtd_b#E}4}O(+g1a$d}38OJIC6L+e@uVhGDOvVaA{=Fs>=3-e10^u8M z>?E;+A1M5i%B(%tqrTl=ydI@|j@hOQp^`Kpd1=<0RKL>s#kLxXbm`{0v zYJF%b<0vBlGD53OCr7f5!9?3Liehg!K)e_wozwJ+H^NUk&eQls^7fm;<68sqASqe6 zFg-Qb`TX7FWXd$_P(G!C#Yue=81>%HU@}gTtwxnCwwGfBZ}sGWNe(%jn0YY_GYy4> zjW{Qxv%i|I7i$FE3TNt_aaql>!FqZA#x`)tu5{^Q?_A}^(yrFFf4U=lLfPfm-dajx zl$k;}2L5JtnmUg0Y$G!Fsu{@kr=`eYEM)DU>v+)XW;5wa|CS?F<{$ZG9j5}TfXgx- zn*sqMnFMuC=6c!<5(bA5i!X#rXJ1ipNfxvKr4SHrWmhWsDPRRI`GFraIe~ACL1@F3 z-5WvcTZ^I| zmrv$k=k0SMQv3Cz`c&CljQ|lxx!IrD=yZk_HoEX2?G&V~zIbXo#xiOqLQ;d1y1t>r zOtp&cJWtJ{b5S(%rB=^q~u1#B} z-2=_CHEF^LazRIxof>z$0LU|n1RJV+vyc#agEbKBC?XE~?bPO8^F!G3%q z!U5;?>#Alj#a1%C9wV#cbatXP7w<2fFzPn%>4TVfN zD>LWda+)(ca(d24Oz-jN$v%GLzO(V^QoGui0dR(XHVp;_H`}^Swj0{fj^>4V;4G&;{i=>s{1qHsmi{%=ld!#h1v?-< z&J7AxxZCvv7W$l=9=pkImb$!t(jp0K?Zs#bWhz2r-f$9Dz|s^tYtFQy#prh>1b+|! zYI-7F{XSzgis(g6ODTu!gZ+UBxTFQpJEkFJxJ?AvumOR?J@ex)A!2f0BKgRl$+|{FCfc4RkYCM+#18$Hl{}L4U|k z4<6~4_E+}Fqr?6E{*iv5zq8jYnxZfHD|>~q7bt?IFZFl!8Y;wSZzr^s-*_GOYytbX zZJ^B(zxVuJPBDh4bo@X$EH>Sx#K-1|iD+~~;z&B@$AjVCuzRCCBBF|RoC6jmh(~2J z5oN@sHh+w@kF#{FJk$Cc9|j8nRMP1?-I9WNcA~=?zzXT)Cg;S`@vM{p!gb^+kiEt{ zDy_q28@G_w5n2HVyIO%IF@gMWdIc9~QzrYa69fegNR#XIv5!l8W7|tPh$wkvd4s!Yve}VkhZR&uf21qH@jEoC%hNqnl%WM())2#aQJ6-%mtrxCo15kjGI%# zG~ZUIi~=WT@$KCwzl9B;?W58jH0CkR?m`K*(F-j6pb=onUMVIJ4c!q?p2i$deMWoSx$5lT{G^Q?pfdg9a$;d~KWa&;9-D;CqC6a4$?SCzKxqpiifew^tYN zfmhrDi;9iI!j28aZ?twG;6{1PAI@ek$7kVe+jYVIhyBBc*8{xDVv2C*paYSswj)Iq z>74uXI5V2vw>2LtQ<0%ToqYfF^5QPgf3-4o~frrbu!)AP_PW2zu5fs{Ke*X^i@W`QanZw=EUi_mbM zc1?~J>K9yA;p>(!EM?uX`JxN3Erf8E^@CjuXo{;~f=rJc0S9qSxbUIlv)OC8(OXl$ zH{Zd5eR+K0AAzGBpI*Iv=bnMPSntNo#LWrn_|*N>HLf!F@nrH&l;jse_{{f@&um9{ zZ~)zFh?B9~$cKp;e9`5YIZ4v@ z!S#?%#F4iX5EkK0d_GP=<{VI6A1;`QxVq41>;9#Dp^9fVhdZ`Ix03eMR^B5c*Yu-C zshIlZ*X6b=1cJr|LQDHC&ZQh|tInc22?92DtFzoul@G{Ltjee(Cq`R_IpG+sDKFTvu!VxJzE= z{Tq@d5bBaKxdg&`!{08Scm&8Q{VoH@w)Og(Rlp1|q9GWVZ8)i?Gvrs9zd_#aD&VE^ z8AQMEra>qHgNc#b)wpn?w(wEl4>?Pm1~+I}9?;O(L!=DFGWbGXA4@T;t<8V`zc1#$ z`IqPY?SC6@|848;i!YA1zxxc2HvXNNzvNY5^@<#FcsNKr-q)}R-79q3}2kC8!@`V!%whr7I|Igp3D4U&~4p_v2iBHq>=`oDqt)Kz|Iymcy z#05D6fp_!TJ1`i)_VVI=q)*Og2S~#%(H&Bk@H?vl7pG0UkAL8E9LaYNq!Y=Y<#uD^ z-O91LSJT(|GpkyJPQm*z@sWh^(Qg_gs|`q;IAKMzp4R-&6g*fd!dTlEz7c_kb#&dq zj@_k8cQO5No3CFKMigZ5&z|2);RP2m3J2snPB5H^*1DJTH`7;_^s6RlVqjFwbc%~o zZ}7?cFH!n9ex?O4lww7qiT8i;*Ou=qr)+qE#39c5F^s`&S!XrxX74(!#p7AT&L)Ks z{);rVZmSD1im1JHTv&7S8_R(c;U^ zC%jW=r$6#9;&CwqdRux!Vy-&_8I76L3!PbhYM;3fcvE4;$3Vv*96(e|X2*kgYh-*v zD=xjqeGcEgnO_8Q6lFu_@@>e{&V3qLiG+AC*?Fz~iI0vN= z?w9F&cCI_rX#|pA(GU8#e1qi1>B)-yw5~`5(&+dPhoi&e{rD{s_wL0arM@NnXhfy(r;$_GhiT;UlxddSrm!j=y@t~?AMZ(sKt$lJ>-qcJIptvgOIPzs) zH185oFa~*Ar;_JTxMCSlv$*Q&RfMk@Nt7qG=A3NexI3Uc@YESBB_Yus7>5g#zYX=8 z*1l{|8b*T$$6X9MD_3YT5YnHFN&j+g6$C_Y?xcaGoeyEyMgF^YzCXi3pLRa4VZ5b& zder<;H+{TkqBW#Ko1AJZqAPPuW%f$`B74C80PRp#*FO<+&piN#VTB>-VH4lJzI+qk z;#~?Am@KJ>15|C-GeO8ZlZH)sadX^XSRPGk(zX);@i|Q@=o^e7vSb+YeOtId7G4Z_ z%xD;EW_4>>B)J<$Hd1MD<#0I~-dD474-j!f?TVPsMj_^xLZ_4HYkIQF0U$d!Q1pfCz`jd|Pt3WT!}K6jq^*FbzYX5t_QFL*&2eD0lZItFl0!dd7g8 z5yTJ_;HH091_*+0+nG6P4j9tfF=yMC%w6xLsG<~IXCMk;&=he6k`*xa(wnARTV}5I zguauL!se69(coW^E3#v5GbcldVu6&H_7&E)sfDk;fG5tcntK&?*h_AkXNi~0P(>x?q7#0K`<$B;BA8N`#Fsb z9FE9}2FVdA22=SNLc~%@2t&x<JvsEX z_v+?kPLXQTqU5_=Ucho~Uhh~}Oc>hKHTCv(p*Mxp8kGFclQ-xUH})F0N*LP5-k(~y zzjDd2Z6Lfx!N-!)g_munVRBsw-(QmSlbhItMt%<#Y4S+xx@sVibb1Ur-^RCVkB zC4&jYr-7jX6J8@E>|6V#fGC{0B*6_7T0=S(hNT--1uG3oFQ9N+QZ83i{b$->+jK*> zt+TC}qU^6BTX;>Avy&ci5KdRaSPE@44@`~?WK$! z6TiOG+ji_DKWOn`KD|OalJw0|L5kDQHKo$+-*my+Y?3PF^&SV*rc-n0u)jYT?%={} zf1Dz96uhdAx2qnNNq3dZNah~X`xkguR&WzBxog(^Q&xzJdgA~L6vn77X`yg2msyjg zib$2y!)YM^9v&X<5Bdkk2Zy7@00^Uo97CLWxFt9+mobCDr=W;*6m)~PFDJ@Qgf9Ta2C2_;vA-^DoALq0>T)rKHxzrZZ}DoJJGOavo!?!C&;X zSRv|_5(hjKB01{Lw+^%}2%gU=>i;1)V4bLv)vX7pcfms)H4p1%g}Kn*)dBi6hU&n7 zY6s%Ooqq_}W>P8Gv?3{EFSZFehsG^sID@qlGp4)~!R@mbo#_lvsB4myE*6gg^8&7e zHlckc-^J6t;zWr=p)b`d{PGaU8i_kQ7B&}vQDnzq>Ohn4a=_t3w{pSNC@cmH?eUnl8a}v+d zgrE?Xe7^*`B$q3lUaOk9nz&TiitvJmZDarUrq^O6X$zza03lk>9lH${5lbuO+LhG9KIgn{o;O7j zcZ1mOQSxyy6z|x)liAtT+jEqKqY5OxfPlU`@`BT|mfA3JhoY&Fbl#Xm7N(F3n_Za# zF@#5`3hIH|*Mtv?K*L3U%8O_8&Y`y35A{ocIGcg`C|00CkJ=!}JsF=|cJZ}DQO-bu zu4f9dJK@Zo5b>|MYhj9vq(&{n~ZkC)`xyWxFPFEj6-x74wFc9 zq(V7Poo>-{y`!$?=F!6{(tqM08Ix(U3OFco!JKyzU`t6(yxZI?4Db)B;OL&+nucTO zq?Ams-5guGO`XYMYNVLRUY0VZCU!T8#IS~X(VKTCbJkdoH^+X_piZYdImJk|`~Y0= zKkGE`$iP6g^00iB%3kHXvMXwrLQv?L{4~dR8B2I}2wNJa3v;#k`h}Mov)oW6A4VlP zy2e2DlOIulo$OZ9PMbQKjO{|OPPox0+i|vmF4I`ICIFYOAh9nMP;OGTl}qt5LJg_D zzoXJeGc^;OhCl+pOy0^2wE>bat*2aAmW)e93c{Bsvx^Jtm%E+)e1?MfaO7XU8J{Pa z*?Wl$OC6-Vj?G2{y~qbE3rt%YgeB(*Cq`G9naDGkPlc?qo`alf(5_8glM$jtoXl{M zuaPk((|KLt=6Y7~<~V~oOM;}k5ywmBBgzmt7kf1|JIyq5pd6)k!qt9E6{Bax^sVa~ z`)O!kM5e(E;JZnJ3pc?)Y(?iw7v@!%`+g(?yyN)+shU2VoIl!SeA!fy?H2uDO^Z89 zEENPLQMVZ4kX6C%H-#>Z0kBkN)oQwD*x@i7yBo?8Ncy19gM7L~VAkC6M~ zE_H{N;R1L2y|Y5ovLZT*h)}gc+(GG+=n&f8UdbVpddLSM8Z2}PVb3Zit?Fyk4W{K4 zSU{oO>b=#@AtWTz&OEztz2v#JV-RZGQE*{ia$YDcnokzr6Pnp-ZZi|Oy7+_Ah^ZZU z6K%QM^9U^nN_CBGb&N=HeUp^~J6Sddb|>TarWPfDiI>G(oHk;7O>iax&wMx)%l<&~ zN0VBdg~>ul$i|2^giKIGco3tx>Xj(w7aQ2&CMKe&2qpMbiMH_9RFc% zgAXayU3VM4b0$}=z#@$nlIuK0mX`YLI@=$L_3`%ArRQ=+5=_Y}9-BNCW}wzXbSva! z#PG9uo`r>c=_`Ux^GZC4bgNh`#Fp_Hi*l6!M|xfV{*g zmvUA3?Ltl`O%*^yi%qM+LRtF*&W9qOXg+y6g+F>GwIJ8Spo7^kc4ACddh&KkQ`CAD zkjnxteoavw{Ye@3&KFK0>J~0U8`ro4Hv+>0U;$ou8&+h&9Cn-7Q#N8FM=PEUs0^oJ zvq1I5Oui|pzI|gTzQ;(fj`zaHu3C6Nd@qY$nqqA*0IcouhM}Rx+{}>m?+b@};#m7i_=CyoL*Aa915Yx^vl% zc9BRgCmQVuQzB`_&+S z4a6S+-;}F2`Ddm$6?6N%*Bv`hK1SJY=U|w@DmWOey)uno$XNgs78v|EIk~#z-Pk}ovY5kz(cZx`xvfiY3g=U~M4Uec|7UN+|FV$6t)JSXe5+V1Pw`l; zQEyYZOi+X^ZuhCyoI*E$z1~oL?2(8fk~gz4-3ROtWv4oEPCO z&JMHuDCp~F61_DYLrX;#bXE<-cd65G3D6wb_ZS06p2_$Oa@BHhCa3fWWGigc>Tf76 z`~tmj{A4g?gW7hNB3#i|K&IZW!rgif*KFm^Z|hD}Ei=k%(QI~Fj+v`js|+jOs?pJo zu(cr-Np_wc?f=E@beAq~{;T7h>Td+^(j* zZj4jZd06ja@}E~zUR}x?%a|7BqyW_CSj;2z2FuML4>5Kmr}|K~{V4Q8E}!;axizO< zq_SBT*q54x6eAA};4~Tn+4b;YHvsMQhl32&t6+RI*zG^t9|;s`$28NE2Ir^Q^*S~$ zEPtUBSkCZp66DTd82+qa2lzG(Q;tu3i-&~-1F2QT=vl0{$B7zyKs!KJU9=sH6!w}M zDL2N0HaH1CH8KyInBcU0fDkKPmHYTu0Dmb3>UxD19I+35@QY0VNs1vlY^SIVUJjlq zWqOhsAiR)6M#ICC@i__LC2nC9DXj(ct;P)?iSB{!22k7LIC%}nE+rSbil3cJJ#Fd% zPRoqzC2%+^HB7B0j{dc_N5kgZCSD7Y43aYwQr+&fX>Un{@`u+TAW+kQ)GbO1L`M0y z{~~a_Fi-6$8c`cL;T9s$v!D&!j<91~f)xg}Fb=NTMv1}7=0=V(m-;wFP?5hltM5B< zz8pc<*es49rPA^?%EJrD$CkjX!1Za4l-MEB+HOTCPQ!23cT}P8n1BLXSI!zEzQojwbaI#zigMhkUO^0x;9lahiD8 zLx`Jm`~KD)FH;~RWE6c0^49ql>>`nJCIlQi63|d65EzB2 zvaBwL&R|q=btnFrG#yDi_?JCJC);u$?)_DZ1!k`dIKY^m3ixq9*N-)xt$DQ66=B5=R1e{ zhX;+2v_)&QG3}N@IH_c1MQL=65|uDRW6B#+Cgo%SlyvbBQ=Qk2B!Gd+Q>a9F`Tol@ zg1>h-f^6Yu z2Y{N5eS}b2rbgHFHQy||>3AxC2U-&@JQ_kdmivyb$&%s~GqH4Cmoh?NNPD|vOW3+t zJZ{k6dCX^0M-Iw>*d~1N2p(#9tYHk=f3@-GNLU-HK!=8V2mSqhJOhthyD*U|SOpKu z$^=w|zfp9dtAh8qs6NdRnp%b8(9+iQ&Sc7j5De-eod*lTIdfWiu^B*r7bSW}>_)GC zv^2EgbDtti3^zQTPKh^FY4P>=og1v$JQN?qo(a863&?;*&q>is8fkS-QegP5d;71xbeU;aPEb3 zazzSGP_bL$o#+qHTOsqNxeo!1h_c5N9F|Y?z9`w9GU8d`mj$ye5e6e^pzpT9%qt{< zwXQV%+#@gWR!yfo+1e3F`oiV62FL|6q6Obh07|clUS{)D+b0T0^0|o-MF{+MP{J+D zD9gpaZxSW)krXAa#{djK4Gti@Yyk^c3lmowEt35052a||=4TKc7ATt=ob8sXe78{A zXirYg$b+!Ebpe$RZoZ2=0hKlY&HFGmMUAjHSG=X&Rpq-|BGsiDUV@z_l3pHu)fQcTg++QDEC(diXv)>;Mz1x28U^F<|?eAp1{LxW=Z{)vv zbhu-83$pm>fn3WHyAA3=(49(Gzu)k zC0EXR(NR`o1WPJ|ET$vwphy~13+TEFNI(NSwyq&T7YozpkB3qw6+H<~^S071{_7h- z38xErR1JyB#7$+`vO0Ghq%ec%%6V!@I~jKrr%vjp5m97pTKw3|cw%{|z#A72P;pOp z8tCNB#9g52)}su*Fu?e}m=+L1Hvbs(Wyu4{5ECfnV;CxR?8`LM7Iv2UUe3(i>Jl2` z9-73QWF@-4>5J{i%j7(ihzo9p``84tBf=ooT?&+JYS>I{@w9T5-jNqXwn54b6lW!X z&F3?9)gNIom5jI63y?34Qiaa?e3wx?R6JRm>$bLEjprs1C6?>d^y@L*ERs}^Gw!O)up&0wGHF86Qp)ztc^Km9o2T09VJD@$yJ!GtO%Exrk+bTKfPh@+`934)gc{; zG0#0vQ-w8(8+{?)E%VM|PLPqEr??4Mit@Xzm#V?CS!`4%5yjxQYJs*t>CETeZqMW1iFXmuN|3 zH3I$xhsNt}=T*atNzg*1?<1*0{IJ4Gt|!hRu%itX)HijebhV+Hh^FupxMWOxfsEyO zba8n%8z8M_rnjc^or@0W)UjMS2j}p}0y*fW(Qb*@twpMBdzI_$bX*QTg z63e&lhN`2@_rjR>;WG%W?F!F}tFsAiGY|Pb(+LxaHOIA6zD|;lw;R2dY;m5tGM7h% z=%SCORUHr6FbzKs@J{$JGrqGy$akBb*z&WIG@~EbbKXj$KuH|repL&7Go8cyYwi#l z#N1u2wO{$D_dNGLJ4y^+$G)F$4slrKZ(k%T_@cl~JL6wu16;FD5q!9X8+Y$EKF^!GRkyToUqE}x#`d$S4Hn<$d#GoQ{gIkr zWz^3fxB~$WpImZWfz+|h&&X8dj zALFL-H#2&;DJJKlfi5|@TDv2O?#0S+!@{^B7mG%l8GtQzWA$4x;PmVdxTE$SSJILk zeHr#M>kzIt^KnQ1>x?VaJ`$YCxCHd{UsQz00dqYaT*8i)UYj5(3aGHp2o-H<E|WXZ^UN7q*Srdw|V} z!3ZSB2>@Dos+7#P8=w;34;Ea0SqF6*w^i}av{ zO$jY3R95>VTe<9c=7q>lzsQ25KB{%IQOw6rm0d4!!TP)aFtThi70M5uK1l(Pxh7%N zc~+wj?%6w7#OL7|*`e z6fX{)>#k~#d=OIIUIi7tp5xXlcMM=p6W4Q=lAD$}4PfT%R*Ul~QJ{~Ay7;}gMtq~* zR5M(iA}2XYP$3)|eOxI9FnaCs!!_d@eGA64dy)Ejn&7 zR!>o#dhsjEqVWYwVyigM8cVVvUH1Y*7dTkYFH-BU)FxUywY8?gFPQ?Kl7nKbAoG>w zjnCv*To4Q%+EmVhKV==jCdQkOhYJx|$LZJP;LkLT8_iBd?gjVOf zaSjZAOGPk_%80uA*0v+Eg~sxV11||3tNMSp^EsyJX0x1ox>)I($+R2MO(zk)UrMNt$C*jPO< zK}CT&J6TL7a{P-@iX5QPRxUxHPCNdn##?j)1lvutoG=(B5QVFM4pr3_C_K?&rQ2-~ zOKq>yWhULdKYqAQz@!1od8nV#XC9Em)c zx)8ez$NlJUj5S03VuEV5RIe0>i(Uk40DvlNp9V-v-FJ_l| zRgAGZT=Y6Snat;L5?h?R!*CFU5wh@M6?|mzPT9`R$!*A0u}_0H4PTBdpELKf0dKP} zpMS@1kN@01!W)cvap?*v6$55EaNdoi4SB`M)L`LL_J=q;g4l14<+)l?L0Io%@stjf zp*nA;V}srkR+~%8u+JAn`W9Da08nBx1}6fiTm;^clP`pub{hbegL|PfGj3>5fA#NF z0)hiatN5dd7F@R}Q_-o#VwRC!<)v(?Gv=zce?DzPv(!E}$GwsAs%5QD z0kUP)NKsa&!gBO5S%t%@7%;eHOp+{2XF~K8#9hj#+gPFYQ<>Ou5=2d#!EsggH7x-x>~^2>2w~uSDId@iLEdvPQ(eKOnwR|BD#J=&nEt-;@rscM{{)8kSl$IvyD+$8>2iz)ymR7KA8Cp?O~ zjNdmHVrU3AOr0pSqCg8on)II&=NZrVNAi-XAhGSsHU9!2Daq zZ7yo;9=GC-wW%=18Sf|xuyL0FF)*e= zp68}5sRXm+H%150J?wOSc*|N{@lsHH8k|^X@Xl?aAQO~sD%#;=YIzeY1CoDx=f&ln z@UeY?uLXH+9%9qPmjH~i9Spj;!&F5~POn~>YvnAKwPjmg^MUBWrMgSpRit-*J-_2F z9_62uNr_|HU}*)b@k_Kbh+%CzI+uBJ#H?Y1i#HGjviDKzx0BvRB)~?B9nwUGG@o|eO1(ma&Y~}>H#PbDkEfkq|1VpCXBhm#T z&J0?2$hmZiyMfyDZP%5shUwoX7bB@u4gG`_{6tyK#>a~q8_`KyNHMBC6^4^9Pl6|z z=fW6M-lI6A*==GLC<_XCK-Om+g}m>cFmwm4-&wixUp$c%@R%O56_^Xnau z@&1BV(Ap*l$T0DE;o?N5#3!w4P0p5B?3)vYrtFp-yaY`ZCDT{+6qNA`Ku*-%APQV> zALS61M%5crw9L2-L7{yOen)Ii^b}14z>>sKe(4Cte=6!aAhG58hiwsiAe9CHl~Z#L zEs>?#)$dF9Twu%a?l7tb3ebKMHfOglqq3NkkG~Ff2fm~h9*3W-g5k-1WI?S2^6B)IHUMWG4r5B2b}o6PDG+2`*iKJ$W*gIzfT3 zJa2FaxReVlGMsWu)$@g`TR8c2jmT6dbPMq&afRPxtf?0AU5!=61SdyN)J!D@&^^h!N0|68Q-heh`%Fgluk^cIBSq%&p$?4wx3Qh#v|cQoeRG zQYXU#W(#^uvHUr*<%W~KDX&7HT%Zu7X=C1{126@$L>Xxgvxud|tO5(suhu-71dz!1 z-&>9#cQgz-n$L%*Z9Kl5qFElix2SutRsXb=??H;q^Gf`={X%(d#~`>bA*mVX|~bh0jf>M zKed1?1W<4q=q(>t=hOeZnrwwTKi*C*UQbx&&6WUSh%>_PG&cUQQISx1tKJ4BCP}24 z&TY@Zt&JQp6*G2=G}mMzd4h~zmxTCmZ}jaR0s{SmN2Rsl;@4z7sU`Wlw~}&u!m)CC z04K)9@BIB8+8MI_U-#~5U9uH*CR;N!16=;f-c{l0zkRo&zLY6kX{G2mTuPW=%_1_3 z>d@K(ZEQLS07*evM`iN7RmWgRTSkpvme`>EDa zI&D`Jp~2?{IFnJ#Qa zGGhftV!vjG-y)fXJzJB^8f*JFR93^CTO_iGPB%wm+=hf*q_HFsqg)3UHAd-~?TLB^ z$s=0`bFm;41{l3?3EPbYXR&Ojv50#xF#pubaRA0bGo>aI`WffE(wW{ZoQH{`Fy2y-h^d>|GRuy0Kk6I?lte|{Vu z6XwDAQr(76`Zw5u$oK2SnWE#EE~GVtc{4d%&_LB35@u9$gbt_REs2Ij%ln$~He}XD z&d|JTcd0#`sT8q}VLJ5T#b_=6ESpl|kdO;)Pn@s>EL2*dRlY1)e<`ux@|(eZUz zjxjXsmjzo7-ltnnk7Vl(bmx#7R0!mih>MtH{vLa2GCVEc_Igbg*#N}H;gC9w)fpt? zaH#Pk5p}h_^GI9kffb`I0beaozS%Q1X%URv@=JPYe|py6_g9X!e)(kY;Mq_%i5=(s!Z*@TT6l!#t6Qj(2J-Y$i=&^=it96CK_4+G2N%fQV!D>B@sz)0da3kENq`!6&uz* zQb7<+mXeWyz3pQw%862%#tmCLel);64dFV=;1CVoT|>F8_?ZM5o2)soQi9(Q;~?cuKiz*e6jWlM zk!TeCyW8J%IuT<86$=uXWw+y*mZ_4crd2#uSStf_otxN11Pq`y0e{|IUi+}g%@Y%zCc>9lz4!`x!<(f|azz@lHR#wY`$3AHNRHmB4s2V63-O=HZb_MpP3&k%*qA`W?Rf4wC9kpqBB%fA;^~Y=hC}?2W|OI6a#p432rS)tsOW<3 zNJG=7poYR9*1(2T!=!7mxe*|mq(!V z;HL0Ldn`$8ZS?7r`feP1$YU|3PXl{C`|O6X=M&MaI_664&t6YY#%IQ1yXs!^t9S2a z7r1*uG<4?jlS4dT>xhLa`LLf#qlEPQ394V>O2cZ?IoJDoJ+bL8XA0A(z{Eh}4Q2AQ z6J(R5-~n8k#*;jLw9yJ-klWb2nS3-DKJD+|((ytdEV8Z52nXK}Sq5@+RmBf(AXd{m zyn=AWnK0;)F|bjLB+|pG8wf+y^5*J^#sXGo4o0-bhTcZJe>9stxjK0x>Ohd&$tx@B zy_^eywn0IqK9S_=T_K>Qo~#ywVR^`D0lZZF+#dcfkw=TrKcSHKB3raXPUke8O9xu8 zrUmH1>g}byop+-mCWpY)*u_$!P;&+`XA#QED+jTC3~4@x2^ex{&X2$ag`_z^Bj%r0fiK)mWe(w+rLZ__(NG{|80(wtou3v( z0V0-WNSAGmL!A)$QeWt!!EXQA{>YPFq-^O;=vKcKmpcS&HVwYYh+)x=;$~+|eRA5H zS_zu7_pTfOMB<#@n>kMLN=o;yS;sw<0}!PnQk^1YIOrCDqR-%IUMa&c!g*7>S(>tS z%9@G6h2!Sq0RyCv4UkXm=;I=d%CIVKW>!yKDmiShGcDs}npU&N`4#I&iWP`drr2Ac z;d@jF*b6cBlM><@yBJ;}hW6_03Rg#^oRX!ni%$0Q=FV`4odt3PD>$4yl8fv2!Cq){ zcR73HgC0)@2ghKSR?A>uf8<;>6rt0YNUAYje1tMt&yHXSez-tMh16BNniwE43mQ8- z6X_M}4T!rI1yDERr$M?U3!wF%JXF~-kak3mO7-EximO_Oz^!A!DHOfdg!L@RZ zNDKb-OzImWN-f1S$Ka}_&WE8l!K3`a%Gi?32%HGj&n5KGdTse7>NY@73M4b}EHJGP zi#si%P@M{+4z`TJ5I%s{$8X1%CvUbk|NZ|yfAQ|$Ud+GyY~$arQv8SWzpM6sz6U>d zVV|3Q6fWj-sVS_y(Cf~OTlF3T&4mk31SaA=y-5fOXS(^0PJm(BvwT&uTpNCgbuU1bAX4N zP7nx-xPcp|JDyj@$dV^x27Glo05|TqL1_nE&bbwoD<@7C6SLV$DHqJ6Qn4D~AC zWt9qph1WSxS8{L%BE8xZgsLAkvg?HJsv0Dc@t?a%1|kWwAihLNWjmbKkWW%S3?>@T z-~#37-bS}|KBYiY5G)QkQXK)VSE>kw=AqMqZzd*TgL1xpSZl|Lb}%Y7lh&FXbB!H^XCh`&aNbGeitx< z=(GegZU*4R44{8p7wnB5yMre12JW`Yt=ax&?P^NhfQ?HWD#}XO3EK2EVdrz5{B9M? z˯i>Sziiu2!LZ!QTqFU^s#N$1{uSJ$<{QjC74ql~1;oGaT%PA^D zhU#P50ZJE+dl$1GsN?gLIeZjaoJ?M?>W2zUnke}8-R1jzt`oZPbFtIs-`U(duz{xh zg8~eKGI-QafN|2n)UX|w{fb*CY|b&%AZ_cCkSex#yqXP~#Z*{j)w83}b4_r5QhtfH z$p6Yf; z_&uE~H0D5DT?WQe7Dtu4U3PF=!|eRQ16cb!J+eEyIJ~-icZI8Q!}RX1>I+RADwgCP z$`onB-%wEsLKG}8ls$=_mrnafa7&i)!LiF#zhUST)(h*>npiS!D@t;}k1w#WFFN26 z;JL6Hd+VfaiHg@bq#U<*jg3udFllo6hJGSxTY2qUI=o`+mw|?xaV#f~^1^^IdAc36 zB6|+!s6ISPjyeLcR-?uU^C5a|$IW8#fyA6y$Km{;MCB5XZ0`q>o(kJeYw6pHGPvc& zPzI6dgu)!MPFu_eU6Dmba|xjV8fsmR)u(Zz78K@Re&~kxpW4}Ay@gF0K|z&RUHBtb z2h~q492CVxETB=loQI%iP&6W!^jxoFpeb7`^8C2BAmNa)xNh=DQ!7nA+H!*dWGQg# zpvp%b?#W>bLYAAmdQr=tYielHSKTyM(pZ0asW5+>y#HZ#aT>OK883|JmnFmCMnp}G z0YQ!I4jLiBCo{wur;-yBKMHq>A^T&rw-Za`#n-eYZZ$)7P1RJ~oU%Hyjm+5bRlIHa zVjn6nmSuGcn{4a(K+@%w_1eZOFQwsg&!n^1gl+G91$ghp<@@#lZI;dPpg!h9 z*#z>Q>rioe>sgCS!1gY@Z-Z&Ac|I=yK75pe;2LFG+^t3a`dN=gNioIlct;iiVyd+# z4xOW51C23CTz3$OtSLsB;%nkZy1&f z2AI0xI%$b^=28Nclbp{YV{saIcNtQ-Tj7ROlg#&)z#~k@V3Z4`mUCLa2)Eh`;X6pA z4f#Nmx6_l^+3dWdma=N~;ks6%GNy-Q$;j|;Hz`Mjp4{INnUmYi7u)6h9BqT^LrAo4UcqHhe1fTemW==w|y`qAwDa$<^|B;V;-;Wrac>pWnUv#isNZZE`Z4;vDhZn2~eT zE_D^!dZ4d~y#649w;~UkqEZ4z8II6T5z_b*X*nrZW&lX+aSQ!?1BXxGD0c;gGoB*y zC=+8bnZn8mRwnG7jMh2i-Pa73S3b}CH|~N4E#HHEG%_~U_FC@FE|6GUC1=H}+z&&!8T#c=cWRjdf1{!?3LY9TydB{7kG}Xl7v39lP>GiD&MRZf zh5;onvkFLs9l5NTtL-G5&LMc`x=xmx8AV6i9HpL<($TUbq|0UW;!|}r(@PMQWtt?$ z3uXD`K_x-&Qg*vvlZWFtUD`wDtV>%!F=hgUZDz1Q{uSs~LB$pQ~s`Z4JAOvl=8KdZH zaRsbKZvudPr6%p^9rClzpZht4H-sAdgWp6k2|jYef0x#ojN*e?I0rtqc&T2*)_XfW z#~$<2jvjB1)9$DXIGTj;7<4Mt_=KHNMED~-sv3z>PM8SfZv?3dZ8<|Q9i_msE`_@q zm9!*#-$h4#l`VO@*D-E}OZ6~eB=dY!MlAQ#LfE-vW&3rcQ9_&S2fRR6@MbB9qx zp4d>DjgE~|A0ClWhZ$7Zd(}>eLrYGs1aTl*g`;%r0(i)?ctI!wYg{o%MsC<0(9J=| zI(E&lrc7D>!G-6dvTg0`zf0SfklN{wb{;pAkB#26PF(Upj*bIcX7n=fUH;V5oBZWv z!07m32=f_eXyw30kN1Z1{a}BW|6N)!%n&ZCJI9uqSD#}spFcT#^b7?K`SalLK$2h# z8x9VUL&LzBt?n}yuy9IDv3WOTzq;LwC;`EO@Ca%_+6Eds#6H!KGakBx{U!HaB7x9Z z#N)XJ9i;>*6mlrI0STjU98p_Xg^>k>4Ts0FfUI!Gota!@7gx}9`Ukt0FZ5%G17s}? zhl3HP6@6s?kG*&AkMlUrME}pHm@v!<oaI{o7<|SuzBI5giEN0-(G;q>LQ`LvmsO z!^I3lF|xk9k9@6u>|c_Q?g4}sqkp}=S}d{G}DX^&m$P=(+abu_x7w=pEe z*1(TBf~IDC7e& zLo=q>k2wb0g%3Ne51*p9!KW5i0v=m*0*`f!;PDv$9Pr2}0-n6b0zwMLyi1+}F%T@o zHEW4x!q(#b{t^pHoaHoNh6yv%DTJd6$lcnt4479sz}YxY;Ho3m{ZxyYjNC_YTeR|6*nPs~V%TQPYeuSg)} zR^<4E0FD+cd!JF{_L9j4e36Z@+AHlgte4vY@eR<8%6L`+1;B;r71jQ>|GKuu0y?`w zE;QkP2$wg(MT8F1l`yG3Le2#Izu}haM2OW0gc3$^tHR{u8|5t}7j8x}uIfd5!7cG% z1(@m=TbZN|jd}}ogf^Bu@IRj&9Ooh+;d@pm<6Kd#jK5R8jDH_N&5VCn>Sp{Dvl!y< zrccJ7M01HhbP66*^NbCG2AY2c!%^Yhi9UxUyx?i|5|$6w1EcrER(!1krmZb;7#YgcVt> zIa?;GG(bS|wq{h(m3CB3wlwxrSQLg3;yoz)Fz^f|gTd$wE?D83&K6(~S?O(B@bOnS zCd9vQt7U8dU4R}IKi8XE*)H_u26a)c(iP;6!5)u)U^$U~4{>8m*_w=omAW4w@&~)n z)`+u)omitXSgD{vsB$x395HwaGqH#_b%I4h2{57Gy6lm^;~-lb_kNCm==Rms@I7LJ zt=n@SBp50aJ{lowNYQgqG<1IA4-9$H>*z^Tk9nripX0(tIzOj~TBykCYBK46bL|bP z3#%h~FnxbH8~(t9Im6ALjmrtqq0n}UISu#3$Ap_~Gvs2u8{q{kN3d37NdZ_qB*V5c zB&r`THDtv8-n|MUq+Ch}HWr`RkSR3G)5s=Vaj=W=4*(v(_EWg>SI#?qGr2y;6~ECy z;5FbnV%Erz^fB*_*<1kAT_LQfUB>5_Da9jd3 zgRl&Je$_962ygLcS83X0-+&Z(C!^RjCbw_F;IWEt{EmTHq zs)f<_O)M4Ar`SUV>#-~62r6Hote^g!jV(@`*jCV9Ypyj{xJwq+HkER_ty0qPdPLA1 zRQQ#Qx2k+sn`7LxH{^y>1|!bngO#PCpKKN0cGNEv-lHl3wT--R;=Qwa|4@;Gf5w@2 z)naf;s^V6-av59{Wartw%qPb3}WftzUuyDZFLvhpnJ z6H1eBhTo3{O{z>(2hagPH$coMm$HOy(jHIYb`Ue~TA)Wnq$l1%#lJsPy|m0mWh+hg zX*Wcu5|sQE#|VT9moqeGVedxi)$~1FVG(eJiYkSVH=Mb1HKIofVf=_mB@|-Ae#1&2 zHyO3}9^1_pyrfqbkG)-^9>w(~!+vxgl0zdrjKE0pJ1VtuwsVp)=1n$D74 z5{ZnbCoXZ3=ie7f?aU%C)`|33MW&67TO?F3M45`mvmcf95jD~`@R_WnBQMt=rR^%CDs9Z9uh{iq4vkIputxt}nQq|I) z2wjlVL zs}MrOe@VL}Wqe>l5axDUbPzxo;k-Nr7}#!s0_;NSY823O06!}Q+`@tM5`c<@%$g{S zgvVrYj6^QIK&shsPebzC?cFrfu>%)Ob`OZIm6it?&{~fO&J%e9TtADtDLZO32k(>= zgfioOG)1xeu+5|i3)wrHjtf*pS(8^2SA`H6z8}0B&)&d_u^M**)hYZ^m(*L}r&3!7 zWvSrWPi3iOIBalDa|Z5+^AYuExSh6DHCjbaS<00T_kq33U}m29D*){1e!}`kSNFfj zZCxtLDXA^cXg})Q5z4j!hFymU*w^X23e(nk zslMDcx0aE!$|8(mhr7Iyu40>Ag+CXdU7I)iC~IgY+BL)YLo#HU3(ygDo6|EVN$l!j1eEOF9><5xKo z>I8Q4I>!QiUvY4vFB;DUw0cf(p9|W@>EsI0xLNaEpiSgozf1)&tH*)v`hr2v>s_?= z<(J1o%|({BNU{l>4Jc6OmMC@7!E;1IPrw95!`UVjVQj?rwCK^FigWl*jC>XhOHAPj zKSM|ur)^hW?lK|#d{q627o5g;pb5?BO1yh9{2_S_;AkvREyM$gB%2(%Ce=#RsE3aP zVhpKkIm%J=_vz@N(})ZWcptusZDHy8Yv~40zlSU^XEW)WV0fK46jGH2EUQ&TA7kfY zXYq1Z%LuStV9rK2rC#5>7S;-T%g&tqV>QqcuGqNr?pangOI~i#v`(W~t`~F3@hFlQ zGzE60v(HCC2NW)*9Xvx-FQ#uCpw8Hjh-)ayiUarghS)tDOvDWU0Xn4dh>K~zM5bce z^d(QL8c@dS)Ffhc3xkT&w5vY7XJc5u++u223mls3Nw~4F&+OCo66XwW_Yo_>sxzQSL0hzQJ^eC9AcOHSm>!;yR>&4~$29MBrB?aOyQoHr zcY`nQyzU{(6J(CF@yYZnghqESXIHERN7lM%yNY#ryUqbZ*oQ+@Jjh#NT`gBedA%vA zbUx-OLrPiPFB*(MRnyl8FcDELD#CY(Rf)pwBUVdVI8+7Lu!VwIWopi|DIOU=$UpOT zp${XgBC*BOm6J^36+DV@>jGU8@5$&=A8*p1a4Q~T!QdI4vb^S*$U2et17OeP1^ zzCzeZ{z%QH>_jJdAj59nMS>nQp#90ekKP~oEYwP~>!Y(Hky_k$#9DQ@Dm^b@GxFwL zgHdD?!P8BuoYk~wQ+7H`BO@%Q$RJi4-raw6^7ZcF?xTa9;!OJ5?jQUSO^Z^Ojg5*? z@SWr_H<^Nc7rsnf!D$7?S`Jtn%nM;`rnSx<4%{Edp-?Q1ZZLy)X2)bsSvK))lxwSO zbI^N2)D%(+);WDX(lyv2Q;2~HJCUx;Z>;YWHZ8o^Bj=FY5X~n_tYj6i}Isdw-Qv0lNxsuyiS+^ zMv@rO0)B;8aF|}RDzoZmRfTAM&NRizJEr>=fC$Eq0*w$K{Q$S{T!vJXJE-Xb#+z{E zBPK2;r-cqIzcq%I-$U_ORMxU}01E`x^0##dtn+u$bkriAZ%9+!s*eH;X|y>p2Bd9g zcG1fF2nu9pU8}!)T>}S83qyDR9JR2Ump7X`@+q+*s2n*zFMuCCkpLAy z$R8{Nsa?aRcM8-iCTvh zFNXJWo+xGw`1VTc5pmi0KXFKb}s&!r=NUE)Bz zC#@p~+$UIwLs#vjB;%1JCOynTL@#QoJ4rPIQ z{X@r#&Czl;8uGr7stY?>MPwtnuS2*HZ74-?;t95bxjWDzpf%}_)+oStcmEhaQq?fk zs)g<{a&k8-Tdg4Kj5m!`z;UgxXx=jh&+3+rWoSKLPoJhodaAMH*kz!2ZpGFm4%!W@ zW*!-%s6y?4V^6B6OqT>krVrJuvu#gim2anYms5BzQ)x(dwkL8V>M^+nuFs zYLFM;kv@>>!+rHCc- zFZ^bNe4dTWK+w97s^x&d5VMGBX9#|!0ZLn9m+O_zOsO4eK1-A>ek=7R@wswwI1yRQ z{>1W3dQUnM!KT77!OSVMa5I%GvcXvj&e$9ht5bAo^zOz7%bi6uyXo3JQbnc&b|(+Z z(DV^9qeBY62Xd!Oe@sW!!6k9B3IJEIOKMFc<|y7S;V>4>RQVv=(O?`A5PB3`SxBZT zv1wZpqZFN%4MI*oWC*f6pNx4QG6q@BX*_;G$k4+A#ff&yJojMig2Bo9eyX?t(Z_{) zx!}Y*lxMQK=(n^H7^Cb8PgA1JgsvmoRQ`alXf*o4SY?{km98*f7KGNAzDKb)8*Ehu zb+&3AaQQ8n>dID=3J@t$mz0=ET0`k!>?~1OZU#u_FGKs%);=bc9k0t>;`eF3Y$z2>XeUqtq$!;>Z zW%LgT?sEAK^e05@+XcEzWI&G~7wnaf8B9rYm^V1EshBH)2OlXr?A%rRSxpTCL;M=Gl$Y5F#0 z+>P%#n4RbAVr%{e=#&6Eai1%^A&VEuOs$5RYCvi%?G~o1Xr#C)vaDMBfphE1{exV> zwVw6KM$U0L+&9R77~EfJ@G{dxO`S{y0TF*S_%)EJh2f^@bTC|gm$AASp1%o(SJajf za}KuWMlLeuV|!zn#P-{pT419><#S88bP-d8w6m*ddku^4=O&GBX}+vY6lvp19E-9l zsvxG(shylrOOaC1(8%YzlbK0TIFidbsDR%_<$=moQckiA**7-Ub?m0Vk@I+{|4U{1 zuD+fe8t8Jk8*kQZ?7$RY#*}Ns!N_OT-#enuPy{@PTDn~0)qoRyvB|~A+Tsn@&u;NZ zs<{c2aT&*xegJMVhjlUN$l>z3QwXKtljxl_raG5OI@>@6XqR}*m&>ANitv73L-tQa z2yp9Zbw65rn^rza0I&g^eFSPZk9*RcxPU4~m8KUEa0#NGcb%^M)DMP@T?lCN)TlRr4inOrI=E zT9nwLL~1cb;bj(?(WwQ)lMo*?V}rvL;|V3HK_A+mNI0R_w;Tg>W#_h*c!R65VP_01Y15}LoG%OZi-bW*$O7s=Hg@=dtd60OBa^(7##ldK5Jp*x_JW#~Ju zvkYS@9(j}zY6DEJFaqN;3AraAB>(;VSMw6EfiQAq^44<#9eQ$aQgKoxEB^QMFCkq1 zVQ@LT7)dJS;OW;-PnhZ;r71^OFCgzO&xTiLcoz_n%m38Z0jDoSMZJ~MnfipTjQ5qj z5vY$p-?%uYUNBhlT^?j6_TE_Bm^zjRlkX zt4#FJyS@xjIOhxT5;_&4uJsJUa&vkS!(vW?Bd1`?^D%tmx1dd5iZGW10@J9-P_zfc zWV~=Gfc6(QD^N2|ml6bGC#KDW={m2=rifcuV0t4|mS#zXTh3b2aPcdcid%G1-XsiI z>4n!tGbQ#V%t9;6;7&2a$i%i8?4DB*?4B)CIgOP!2r;wPh-;7Ayur=-6%#+*4vMsRAAFchMu{{is-qIsjB#K z*c5B6RPTB;QM1@!2Q{5K)pH>md;dXz3{xn75^P34zt0#TD{cj&uEF!t-e6$bUqhjdboZJn+$O|wa z9^Dq&O|M@fG>`Yat-;4E&wTZEGL1iNpn^DYRg^14^cZI^nT!>eea?6KwvXgBz9;*~ zyN8drcjQUFr=^3$@)oxTI3}6cy}Xs zBDy!TG6zA$0Koh)@7@R2Po=Ywld%f4z~b(&3NZknf*7u+jln&yUh(ntdPdB%= zw(k9wnUkGg`Qy;mnum>jgiWn&%=ljCLrb>bX4j-^e-~ZB_iyKum&0=(_@>So##PB; zj!&F+_)3NqYWO)G$LKfOTNM?85ly%7a-F>ul=}Cbna=^Gfassa|Q|xF%*3oW;0M>Y;eH{6Ze3m zHCSP88zIPcu!k_T^S#FK9p4PfiU?;T+4iWg$0yH@pt5H5ElkySiWZz{tUya-_||-> zoW4|d!zBF+6Ngr)IKx$PD4kx|{2IWc9@*=wTL^sUD0Z;bx|6#`Ob$W#1}=ns_W&0= zk^+_%jp{oW#%_?PMyMu4i<4q>ZGtlpJLV}K4Z7f(!xHcb7&*M~T1W5R(87SLkt%%Z z5Ohqs%FGwx4{3_QpPCzH#Ff;=uVru%7Zn7<;5ib}8XgycyrdW(0@pc3od`yj%>ekM z@M^xFB_@jA$V<@UZ_){%Q$h-((Whjqc2imY|+iuLXUysknQOMN{oT3tCjC2$a zD-fbdh;EpjsV<FhN$doH=|gLG$5&!h*1^OD#7}F7`Qz? z5ZcPdZjQAw%p=`iaCnGw`c|>l&JsLvG13NPxjDL;Sg6qz2uqaK2qQ#OThho~%9b1` z#DLRh9~I!r&GEs?tjtGq4G+>mfd58qdt8zI{k}@WoU9~^TN!iiY&@EDDwEi za8>Lh9<>ZwpYQJ8-jkEY-V9xuB*9YF_4+o}8+(4uA* z4rk7HZf6_KZp@-(Xy{Vj+$pM~1v^a^4xFO`HCMm_s)C4Y81_*`JR1Z?2!NuN(A9d9 zKy+HA`y#hePA9CTfGKf8Fr)%$`dxFP?!F$r?TWX%8JzWrSCUP;S7cUqcM9{v2(S=Q zmhe|j;|)yJ`Z#1Kk+e;rLlUv^ zH8!|NILX-xaF-M@`NY5~?8TNPwV`laxi57fSwt|Qq6H9H1Ir08k27g6{Z~&GACV5l zn=RhZS>{|y+V>lVes@OU5P|4N(4>X_HD`wuPB3}58CrNMkU2c)qPYQ3+gNw23{{bC zJ@6Jd7l6=}=oL~>@v75Z9M5Q6M+ z?NnMPwy&PPymL`H7GrsqM*pQcz*#2%kF2An8uN$hONa^Dt^zjn@f5{m;|414v-_YOx@v579aj1e{S!R-FLLS>7x5B&l($#4lY-sgRR^4nZ%uoM5_i8$F3rY zg%~of1Zr`*D}sPc!*_1?)i6y=!vn-U7vkAaDwc7*H$byA-I_=iz?E?<4SL%cmIhuO zzY0!O;lt916?W@lCL*XBCcmV#r^lW(cK!Bzd^((spdxG1$mRIetHJoL*JH;m8MrINr;7HGy;J)*FA5avv)Tb1c(8R2kAPPOAh9I6PmBDx@A@nX8hxuW! z&J`S4#WhGItO5v~Ce8m|*(2=i%W2~oXW{Y|%gg!Uq6FQ%xV=-r?gP_Nx{~;Gcl*$9 zBs%^h57&iIow|&|q3qH3y`9_JNRCV;p!-JBe0wBG&zp|P(klG!PI2y&D^z|Iq8tC` z2wV~`>WQTX|M{94o)1Ca55k=bk5Wt1f$d8y^H^0YPQ41`FP5?4X-IaA%FwmjQ9 zQP3LFa<)}-DQoM%tbs02oa>130Le@#aE_^(;D=c<{|P+iOFR3$yHp zsBtZF@sMw`;PB>W!Ve3Q;Xx)ymKlJ${Okv>Va(Mm1`{WcY2{2C9n`7SgEPzTm^ji~ z!NYw11s*Nf-cOEGGUyy#VI{Vg8J*(Z!-tlryUr-kb0QMrES!9tb}Jlb>yfJZ>UUW( zOE__8@c&mP(dg+aFe%JwdOpFO65TVE3W2V|hQr7$igl7`Y`#B(xbT4nH(UkKpx`gb zlr?_@z%kd>8XyL2)Q?!p*wx3nOP~Gk!l9*jmMYPpM?MOp2PwDXab_E`fJVz_SlEr( zYk@QY+&x?`j&x#74EYx z6%~*FTdDWL)g)}6`nQx5-jM_ey-^k47%I9546&O9UWMvX3Oxk|isT5X`~YK09_J9T zeU|$!CW+xh(#9l_{qPLPOczZQ`}9v%tgYmqt}?{+ttCvyE24Z1k?R9Ya!;T{aS>el zpg_FeTnw%ejVoqn*S9DZR+|^gz#4CbYHgrd}TXgSoKAv3dO(t)Hg|*1Ha+??2);10c zzmDmVxbFV=;P6IH)JE(mxyeEAn@H|SH@?bvO=_0pboo7mpym%08geL6W65fQ;!s}Z zG1mQ6Z@z-+!zW$CFPXuP+x1Yc0ha{&bTXZe;m;-A0SkreKjfo3QUDu|!V^H_Aa&`rCj=w*OKa!0|;Vx(4!uKnb3uQ zb^nWHaJU#s9lE`U92l}Ly<`X#A6lYvVN&LK5Y7-@YLP1&&GqnGWveQT)V! z;tEz=SB8YqZktJjp$j$rUmXoG3m(`~9FdPEgSNZJ9g$Ul2 zK@8ze`x1#OH9i5fcIzcw3L}U+jI?fPmX!wqFH3?m=~^oQ8ERRAvKI%l z3&}U;lL7D`>YLqBYydN!1AJf85ga#XtFfN?Xw|i7e%gA#ISi+6I-ld*8dWtkC0)q} zNIO5}2)CStshSx22erj@bt3Epw@(l|dWXRJHj? zA7&Rc`Bc?SXh2}L5~Er;3OH4l!EiyXv;IuIy|pHgVkKae8;RY)$0BN`Iqr2OediS! z-i@?C;ciEAVEdEfH{+{V_fTZ+5dvo)2;a-a_?G8HU}hVGve$JZI_~*az8AAQYe+d)}kIc?kuU)O?TEpTwy%j zK4-yL6wdsfW$7$ir#obdo`B@5v=H%JFuWagwic@>`(^!20}0|bQ2Vl8Rmw{n`Mo(5 zY*2nvZal8C6$c4`ki}LLfn}vIeVA%aAS|G#WOiu0BdyM%P#;Kg^Vh1Ya7P~m5rZP` z;C>M2z8#fL6lq$q<~jj4k!sq;wp*((We{vJ_?AbLb3AHurHXk%oAfe5dh#u;@5e#< zh&js&YQ3v9zNR{r#EA%vR4u<06iF-efCFF2Q*T3-A${&dKT9bvKATu-_B>(62e;%H zZXzYbjuU;-GWi#&QvnpDiDe2yIdo-fW#Kg6HH*h2mqtA1b_l^ov}^~Q=e%L5xy|Pm z{dDL&qo0OLj*(ME%njAy26u0rplOvN&7!UQw6+F&h>p+RKIN9s+7%{D5lApaz0->$ zcERz=&P5|emfO7SEo|#ktid zuZ~$5VZ2DE>lI1>1xdD>5*`0q`E^h7Fh|nW;FKQ|(&?i;1Q<3pUU&wKQD*Ef)#7TpC$*?+zIH zOcI@m+3N&pGLeI4#nu9ZEYLnaZ`k0HEUoJcwE836TYf&Y&s@CvpdT~Za(#M>X!m62 z+2P)wPQE(a-ud_4yi_}|%9mImZ6tnSNJ>sJS5gd8P4Od0lO75(5OIKMjzwf!# z@X6z)nu;@gsg~y2ll7B079F;-wRly5;x!?Z!!GQhR2Aw?WlvXzp4)K0TznzF%j-=V zbN(s0fXp@L04faE3=2iftj-7<4=lNbPYFF+T5*7X(2ISlYe$z_+8|hd z>EkkrOsO-jVp#CfJpC>%t$C@F}j(etuiJUu_YVZE?!9dH#hi;N3Wezz>op+h(;7lmhs1}Ib1V>N<^ALAdW=!T_Y*vHKhtILkA zvW??{&AIPZe-w`*e_qComgZZn@NEUjoIoVD$lqhQ=IGsccKT+8aObLln7e#UUZRP= zNx_`?Aybcl{@hWNL>J&$B}0#4gt>1#nG_YrjLQ#E7Ao0!cPe0yW}p)#H7r^>J1FwO z@BTY}X5EkNa|G5%-1r97L55*;;r#mI5^vJ{3SvsK`W5Q5#@TBJ#K9iWe3hx$iwF40 zB0zQ--^%mb+<|ga&L^MU+}2R`qus~b&-RXU%o>kwh5^*wkk(kireZ#kIj8++;h}1T z#@9q}L=d?^_TSR^DV4Ko%v^hypsuH~y~$is$P>1+0ZnX0a+?f94_LWZ$$M~QHcw}u zHPrhz8>JAWPKu^CwrH+WpqVVvy_Y!Br8{C}ZY4_}50v13?LAzuy^Y#9DZB%@Gj9_s z$6freIj-CX-k;1QedDHPMZ!Le>_Cl{RdW|ce$;VFGS#!8DD{I`0AwXxcq!7$Df$b} zL$afg=y^4{7$_oQL{&C&4S807e;*%*zGqu#14~VNUKq(HG+`dv$K3Vv2-}PEy41Pq9o7~ zMN5oBtp+%aylh&^-F&I{epq!uua3w|tr7stfq0WIP;F*XQ}Sl$I0{J_cBj4%DI>7k z(eMC^;8GHq@D<8GvA|Y~ua(M83EMZNJ&5!^kxl2g8`mquKv~e@bWKGd1HzffJP_=FdGbAwAww# zHcC#r48C%!B(ek^F>L@Ct?W!TXi*q8+G9PCz3W>0uzm~s5}ORCkB-;{K93hVNZSAUS&umO>5H(Zs{@oRv7>tZk8pYHW#Iq>Lt!< z(m14neDY~KX-Md3xUWD@@3;(p_ky^Th&^n{D!QPyXj311nUHG@DQJZ0m?K`fgg8yL ztUP_ut>%Xy6P!Z!ML@$|*vvV1BQ&xvAwZ(GfU>|$*ZVBQ>PkIJ&b%b=Prg=1!HgU# zbo}?UgLKlItWci16PI}#b0ea2f|@4nRzX3_-*LNqV;=KS-!XM9b5{&b!G~UKOdHa1 z9Zn?pWL}PhR>HD5PtB3IOVU6BGf*JyJfIAJlhH!M$Y@Lji(DpknS)ig%T3b4m20H^ za#bbSFFv3J+V65gf{@KJLQW+__oYJLQB3hFd@^^E47 zt5YxWnwX538i9p1%)s4?x3l*HG5f$D)yCaBFWw>^} zHrf89;Ib;f3r}+!-?q=s-60t8O>A?DxuMwLap?+9v!*sL5Pm}SsHZS z%zrJpC}WAV=2$EWb?;tv_LHo;AtNAgY9aLT##@=Edhxa_UQ#X~AypFpJlU)I&I)AQkUI(TwP z#qPMM5{)deQiu){ATVoCmR1JwA)xTyzlVplh3q;iAXo_O+Cm{pP z@u zLKVI|+lP$D8)|kCdgU#oEQvaV$rA;@nrzsZG72Jxsji6JW@V*L2^q@V917lnxD9Me zXs{f;;DP0*j&X~6t>2F)*VE23aB-Se;*}efrccFblG@s9C8~i_GB~A!P-BlG&SCjU5UW%EXt zjSz!e3Yu4Prn6Og6&7az=>(aPVd_<5Nxo_$2=7mQQp~Sv_bGuQhW%Ee0~%5p{khMA zFRRHUGI-Z`IeQp3jPnPzXw&k$7VUi0px!mPo(+f!frBMl3VFq|cOyKtAq~m#C_P9| z>!HT(`S;_gxkyQ0a`G}1Ad!XZqMYGk-#B(9)no9Lhz8MKq}kUK{QPav5bcij*$mi(5>Pw?m35N(xd8h!2e`h|oZg z^RyeNBsf#G;i24oZ1z6DS#aP6wfBnBup|Z>sw-KFf5y0@$2xb5$Q6;VSW#@mw6MRa z+#u=Sy4=VBsU-&);G#UB8%mC1@>OL=?%a?bkRNuCMnHXNTk2C`%!WpFGp?4$F0l%} z(5P+bdT)!bEy5X@ZADchZzQ9PjI$cX*ugBNYHT6{mKr=~SVPUookfo15!7|{OLPQ0 zo?PwXp{&1Q<^4r|1uMODBcFn#*}8L*LUJ?}v^apN4rwr_h)8M%A+o6Y?%aV?NbJye z#i4}5SAr$4PkH#?~v)VOokEkq_mK&2WD*=Tr#6XwA~beO%b$Rvera(r)3&0M+M-AU7}_ zN?1BOb^~HWqf3;E`EV>sg9q^b*MkAMvSgbtCSXw~PevLKb>-~wz&xUTBM5@g=Xo4F z3kp<*r1`Q|&fJsls!E)0Y5S@U0Y(4=spji|i^2@`ej}vI*m7|oqL5`9YDK&oN<83p z(N2`^8(>|ry$FS6@hw@EYvWsIgt_<@f%qZOEdcgbu}z)7F$PlOo3TrAJ+F;xFI8K+ zGo0Q&j}uWWym^WEUYEfoagc#957|24SP9X3d(TC(0(u`3%Z#Z_7b~obI9l9jq~kv9 zN>nG_p!GP}ts<8a+?u$xnU##yuquIJEv)MFo{Lq+x&&$;5~&=LH|AT8Q!SqLON?yn z!pC>3366|$J$ZbSI7BiTo=u0ZC39BCjJMSExn%y%th4bYQWS@0>t|xX3P8p&ZEC-T=u;qJwqTjQ=F(baG!wQri99HfNjXn>@G`^csB4{6)zl-he1Nk`haB+K)Z3oI^n=zp#tIiHaKeh0*89)AAWIIw=*I zk5!77%E{sh0J-O**|t1Hv#OEc9wNsYS~vVx~q6Q~NM_a6G9E{`8aSF`a5>WXjJ6h^t-xfush-r|QJ)W)}n5?~%God6v}mMT#g&Jpfl}H$}J?A2>bYH;OYsE#x&`)4OOCh zRp``i1ty`GU7b8^jm1J}*=_3#i*)IJ*6^(%<&(=J7#5eWZ_XhIz-*hHpdb$Hv*&+) z@#4jIFYf;M<>vF@{r}v)|Nou5_~Bn(-GA}Jt5@IIFQ451AK}N3?ujusUnjjQ_TLCk zfD!w|%!45^LXs)zpSIy>`ux-H1~AV3;3=}W#C4Qd;%a;yqp7H@gC~9p>u4!9-zwy; zM_nULp!OTtUxW%hEtjv`UJWsUrs`m6x9Ivk5bK{E`E?7MVBrgrQMUtBON8zl2VwcTph#p}WnXkNMNCf$`81O3Gxk z$cpP}i&V)lewtR6jZ6wb6fQDD+Kqr@la&3-iXeLjN7ZWvYYxOK$3?BXIkTqA%35(W zv;=lVMRzXzVz<>mxEcr`@{%+*!huFIe6N1sw{J%$`v-^O~&t3G_l= z(49))^b~S(95sQxw%gY>yNC@nT`-H;Qtzv`oRZ9ZBV{Mqd zGpcBwDk-;b`6nJ?(=Nq6;)p;YQMyQ>`ATJOkxf+fcsx4TIoVNe4U>{Q0?$ds6m@4k zSa03e`sw3S5n+=T*RK_Hl-je&DYSXvX>@2hB16*HMFbK?X42F`5|?XjM(ypiAUIJ1 zbI!~8)8ty~1P~|hJoxCNJ4ktZ5C6T5Db86`4XDkK_EP_NHMx9!#Qx=K9b`wd;Z^Yl zc(rob{s~MuJblRu>spEkSPNvM>q?3Tnug{A&W4boY;1Ty?4 zjm=r5-lpF}9TH(E(3PS?oSS&zL59o^59sM<4HotqU_8bFyn>??$LWI^_SHHI9U5nk zv2g56_5Z34zA9?sDwDzqo+LFtrC?Fn`mwc%1T^p zeMIqT0URN(4w7Wkeskl0|9Nxs%ZD%i`X&BXY7f2GgrR@$yN_Pn`|EQU{4ZeY!>WJr z{Ka?Q{p#MmkM3;_wm!P|<^LX2JQ{)_Hc6ck^B}(QncfpKj*dpy5pK85rpBbqX!l=X z+E>@`0y3k~u~co#qo6&IgLUfYZl^JbhaArF93?yyT#|LcWO&Wy^=m2F@dI6)KTp~Jug&c@)6*qY1#*~#IS8o;EwcHeYSEmG^GCp%nV{?M1&p)d% zvKV6vCli|TT%sPqtb(iiUlbWJ6@6gEVNpPw>&xkAwpsnC!KTGtzXg^A{2aYGBLJaz zvzK%nVnyr5^GQ0l?N8d#`?n!e#b#OLR7yr!(@6wV>G8Auo#Q75`!t(c;ViI`59~g2 z&YBDmk-FjTtuIk1Skqgc_C;ox`@)Yskr@P8yv6kS#&~)%v~&vS?POBj2#pY0(4G6D zfguLi7wq9s?#4BR*=;Utxvb?_^US0owr>$#PA>2JR-mPFkApL0{jk6!IKF@C=DT!s zL0=KrkGmQw!wR+CEDs~{f(3b0u4{meZ#;N_03zH@VEDF2aqcuW#BpnsL*tTgG zR0RSa!k(UYcBYK;{%XAB7xaztiV=X*qQep?O?R$)25TUUpEhOS$NIaFuJ89r&PWtV z(aG6vTo=+)KZ@W6>xOY-0c`Yfnzb2yLd~J8f<|2Z)iRHhJHp8tB=f&m0#5F6d^~a^ z=^{XvGra75I)j<7KF$(VAWTcxgGh1EZ_jbaXA6~s0t!o1%rB>slK~3KYYAGA%^yT4 z;oDUS?#?YcUuX|fagN(mlHH0!ulypnr**7$1cYO`b%in=0&Bpy++JtkpTGv^ZAY~IGNjJSIOq%OohyoENzZhMu*U5e?;@+L?k0z%(ir-SC znabiKH4du$t;PnUr%m$h;Bfx1nqGF{D=;2DyeqbdgNBG5sa?!%#z58hgN$MPQ?OTq z0b(~EpX~n6XWM(^OA;ZlAJutS|61i!iZw${CQIm(6Rj9PBe5}Wj}Zz{PiSOQpQL7; z^26efuGhxjG`3OvqA`y0CyRB&A2rw!f7$*DaM<2Cj=v#Hf^^d3KgHh^F7X!zQx1;* z^mI4=h@eXT)12p!m%i+Rb^L^ieq`-_cn3gECRFr0B zdUu*7Ekry9l5D%r=nL19xh~9JuaLDPPt*ciaxA3K)>4IAc{u`#u913=f@Qov)Uc-W z0kzg-1|K;HU#K&AP-1w`qeMk@;YjYllf%NnQe@0|pTcnx`240MLIN(m+G zh`p(GiAZve5iqF07u0S_<8G8|u z#59@;lbkAv4*S5TuygyU5d-l1Xj;=`F2U8us9qDAZ07=O3ePnXv~^* zvWE~ps996&chuEsV)OPCW6SJ?NSz_!T1xnMf*l@o_~Vn~ov%exd(8hu`9u2;3-|G# zpsYR1?*9}2<})ZU8}BX&cyD|$rpMtkJWy|0dTw_;mJ4V2X6~fvkoO+I0?pavt?{xI+Ow*Y+Du=L&mAX^uiN1n8(hruu3GhYuJ;MEDyrq7Lch6`YJNI?f7ECHI zbN>~}Vk(`6Zc|)!x}3cN+j}#f-v7d^W0jrIgt`pY%|;Akjr-`7*YzwTUPrQLhLmfn z@KT`wkEBP8puU<|Yo&665~Dg_?^vqk30|^Q0M8dZN!egh8dNs$@;TPOv5WYauYvx6 zb0|nOzDL|U zQwDiqpZluQXN9K&hj|P^QMO2eH~_=X4Wq=z1;#j}fw5Gev)JSbXOvMa7u-_Ed-YzC z7)zFHVwS!I1^mR9J=Cyr*ipN^g$p<%Omel8g8{ERv-HIn(gBRXHeRuybm3{_?Ndk4 zTp5~n1DzbqT|@ zu(6z71SIJRTt&3`kTzJeG|Y}NHK4)^uaaRusgZ>|0ak=*eOvE-0rdV?cGAaRd8HZKIZ1CWo6*eS zlsA4TK&|pcY(C07&m6ZjoHf!&_;l9jbUZx&Mw49h;xzMJbTI6Etc!ASs!)p909nEr}VXuhZR040FF<;-{)(SRS7JnswQz zA9jZbCFr8#D-`NT%=S=cpD}gPb5N*C6vuy=ODipV;<~G>9q2p^(iJxb5MW8wj&788 zYY+l8>dcMw+VEj+hOM^Kcw#Z!qCDH&k?Ly7DkVb64Na(6fzAO6{qlc#s%?gfY6uA~ zgm9(Lx+2z>ZJQX64mu#(mU6!sJz)cGs?K|moHKwKE`vp2yuNC>3?^2+ZgW88m)PRFm6r@%EOXoD>$iL*yqddG~b z2JV+U2A#e_DiXaScTD|!F3^_(M8A9vh0jJWzciwrp`YllAxgj~=Ci}y$Xw$zb@T20 zgMEwP3m%7&;~vA$jct-~#mo0D80JlUxO@EUaDUll{^`l?-lLTopFBQ1_(r@6!SNFD zLXJ`OeFM7yU^==OBdRHiRa6Liv*`k87P^2cgB zWHm-=l}x=UuuQKEFH~%F12vEMR;Wb{KpKIPVHV*BcBCPu3l`kl5Z9x-n3dK*uVii_ zAuJ4CUXS=MLL6B#_VLO8X|)u@vna zYveP_X^PgWuu{F1Oz#q-1hvYp>iWDZGskc6c*VRLA>d_kQaJ}*O@#=Bi5yhr`74LH z==Z7LPM~P>&e{_9swq4+em|4Nck_rwKb(%1239E4|v&dii?H3gE;-wCaxCV`|<&uPwlzP|Ay~gH3%wDT)zJ<=1UM8 zUP#FAc2QBIBvNl({3@Ul7zH4tVL!tLh`9ofFfriU^)BotxKg|g_)fOrMrnTPx%kbx zr1vjte&RGTy(xkQyHi%`(~?Vc*STY^{lX@`l|{+@)6SBbnzb!a97};z72%&F4;JVy zxg^;!piB->%`OH%v&F;k96cKz@??oIoNKTr-3H7fk(@`NhF{YTmYV<=jsI+@;~`;6 z`E?J$_;JBUj}(5F~?9` z)fz^+4KJQ#(|gEPUIQd@vzg+Qp zW24m8$+x?QN4ODr^5l`B-C~)B%tP)TXi2UQ4*G+d*nA9=f8q8izTuCbNBGHVy0T9= zGsukCz<+BjO4h||zF47r!aw5|Ck*>)f9@fq>HAest1!>#pUt_s^gmx<-u-V|Dlz5e z{?-fpzk9sC|Kjdn|J%JRPd6b@@2NyxS*CLJ=8kniTUulSt3B~=c+Q^-QC#RZSOR#Z ze9fO6m;eoc&VlZOC@pyqzwq(#^hsXh)VxA|ay+($wSe5Fwt zkiL50g|H_Ql>5XFz6ATGEBMwpX+mx5%IO=E|Hg7ulFJB#IaC}HzR+I_NHfx<75;{l z6|qk)d!Rg?{k9<*qWuBhD^x2#W}L*&xB$qwrZo0thzl{S+Y~aNZLxs;e?U$v+?0zE zR4%Bg8Kk$=di3KeEjbP4XP*?{FqDU%iBf(Lg9S>0w-e^nL=QjNLc1uCMQ$rbB+-8h zil_`snv@5&-I5cwJA#hjs_!DPOXC8QTYr(DJF1^jf;Dzi;Q9vZRdGp6Ea(!kiZxb4 zHz#rcT^Af+Z$v$6eXccOn0^6@?;pz>&3mj9JN5 z-?0YQzx^jZ1R$80X6MXkNWz?4_E*GdELYGt|IUF_o}Z$G5Q?DqoJcGFLT|dnph50< z448e5yf~g2$cv{B&WY3PRNmQ;f;`wHO$N=NLgJe5vDgwU4b)?$YPRwGI|WPn9w*ch z2@+ud^Cmw<#WKE066Y6Pqd9PDz4X{Gkt%+ZvB&O;&!FX*e4Nhqu9aNl{_9-t+$TUM z|EPy+&XSJNf{ed^`2_!$Ff&0!v5TjGBZUug&PiB<0$k++^f-Yjn)lF{grzTDvw#@W zxYGBqBj`tb7AKr`ZkE^j>U@INbNUC-?+b@{IhmaIE|nig!^=6dNOw*$7wn(S2RojQ zKnCTUS*$^rrwccAq)E7EYW0m=E+|v26vSDk=m!7g*ONCq2vd2%8b{%bI`r({aA6>+ zR5ruC!AEo{fTyX_mL?|3>8_JYfx`?qua?1zE;6~Uk_weHPzP?xERg7J=F(;49TY4h z=ki6GwquMeW0!wdBsOH1@Mag@!nO#YdEXTY=e1D$6ErTCdIa7C)nY4efTthD`@D?H z+zUXll!8c4Gd}}j4VAp&c;ToO!5|D@@ajvg5fNMEB@?pg`Wi>h2S{%NO4a3>X3HF+ zFRpo>A+|FQ07$H`!exG@A;mH&tb&g{N2`(3+a{%w0+eP;NItv#%jM+VrN)#qB`6%} z2dzPPOW=|`)E-~~@d_y6#Jv(;`GM?t3YGP*$^B&%$wfjh6m%mv94LqE;fR z&{4^x#sz->Hc zh5OeRVz}|y^#^Z|VE6XDbCjmq^Bi~!@s40BcIKao_HLT5h1B@~=x5`(^ap@4hA z@mA6SG2wFb?uqz@*xwJhf?sPT$oS{193t??7BH6?R=rl=iAx2y4{N+ji$uZiS|-_) z@c$Pmp420Q1+dJF#D;k$obIVOv(0f9eLt&Mx%F^Q)Kn^uroC)B+ z?z2=S#E`nSJ1b=7XH__(m0g>tf=8*TaJaZ)VQ?&kfivBZMRLgf$v1p!g`SGcz+yKn z*~biu497t29(V3YTugciOT-oNvk6?{%)k&|<{+DDGvrRaV_YguqWi@Or>{PzTpY4{ z6ZCkU4smC6@`?k3^g5f_!DrtPgoUbe?1yI}uMxL$4}rcPsuC<rsKmGN^(;xSKy7%Cka;jd8 zo_%#SNH!APhgv582C+z=*G^I?z(BQ3P_kb3^3lnjy{r?PoVSTOM48CeLsMBkk+@`4 z>cUEY3VJ%_O_k}TkM1oKR%^0F93m(DgNeAxq@Z?1haT`EPb}T&p1K^3&PHdlhLR@w znTlv)W`{*~7005XHJ6-?1SE<9Wh#1`k3r%kX*UAAZQ2lS-+gykPzFO9%g4XyScRPU zonpJVS$R5q@JgekIT|LNpNl`17tel`Ivb%SR0wL9skQXp!e#TL^FOe^q|bsi+q7Et zM5al4Y)^q5SvU3R)}%L8Xq&P#oP>zA8!NO0I7N2!tDp)Xz}b~M##(&qqB4}9I+}@1 zhNeM>Z4GAVXc{84*rYUyo*YoQr9&kdDm<;LkcuuAHMppvL#wi5EhyBMUM@@=-AO}5 z*z-fHu1U3vt1s8|e7^oESd)kO+@6>#6yycq{oARi&D@eU>k+X$m-Rq4FW@|A5v+lX zymR?ZK<*o{olEEy%d(v?=dE)c0`hOlbpnT4z%>Adg=X|z9#&D(Ewi00?tdA~#B`O! zEdv%6Oz;-0-oJCM^9!l-zhv#$CzljMJ8JFRUU97I1-HJ(0<3@r>tDrePOl&<{OND~ zT0m=Iq8Fx`DUh#GVNSOc2FH@ZHm9s;U9^Hem`3GS!Y5UHn1nF|eM5$tSJD>;(>j6#V=>NdR`M78Zux@0 zxov&$ZjbasN1|Byz{R_{uyyO6Vp>E3ybWz-dlBFFRII$Yx@|7#OH#;31a}df7mEw- zHqT{l#a)tyAb@W=%~P+QzhjG< zIt7xocgg*neH=Mvu{Y^Nyz@_k7qdHLmjQ|``!1}5=Kupzq802)N4B8r7|z3;9JeV( zyp1P-iK<}^?1VzsP%aT$*rX> zI!^*G=#Z|@X_c|~zHe7PJ~fDRivLxUSlEKsZrU}L!!$J?SO^XeWVq9LKE^Hc-t@5u zeBki&gm(0%k>#3-MP0!U8eeqzf|2DHt6sNR_pNYqA0q>XNslVqM=7Ia$3h}k2fM;5 zGlnt(l2UWya&r^T!okuNaN=wY({k{{bUz++!J5Vq+T5R9{_)LtHWFKmFsdNXi%DTd z!=kwS5}Sy1TFm zAm1NZqi6<)9x_N%Au~*kJpz};`1Tpv%XP1!6MqaBzwFy{+}sjrc83g~TMv`-0>E!e z%=3jvKOQ3s6-V?`kDcu1SHBWRyh=5p5LYtN{xCqgWsnn_hA*)j=E8W%HI*uZ8BR1- zAA`g}9ld!4$W+?34g)eYoejB&t}^03w1&q`*<0fPWbpCuWuszSO2G_35nxMZp@sec z!u^SQyl-pQjs4#4cCCu|vRk%v*}UQ8>-P%Yje`!y`p;9<{t69|!uvfQr)Hc6dLOTe zpjPzcG6r7Ee=OLD@ccEOk4rQIh4?cMT8yO0JyhMlO{_T5SV{v-Z7mJX;2lGCUqsnFvSu;FHcRihf*{^-SHK{{@MIA$Kuk@$63$=x@>^m;bKw$_Q zdYW$%`|yCmCGC(TX1l1;P(3Y5Lp?#_kS_G z`ip)0M}C8p`#;yH2UmUj65l%BkYcew@oEKn0IIrC@+AS(JOl>A@oKv!WZ)0keyLnk z<4a6RuV&MAFBw(S_ZKfG=OSoz3}$}tB6V&D5CGqy$M__AQ&Ii`00tiu6H_XTwjz83 zE_V&y8eK7v)zjLQ1f=*@h->c2cB;&Vtem3Yld}S+l=M;dNY#v364sU+cy+PadWk|& ztqSEjD9AV+-Evf!*2)2dRrOqe>-sq65xnA!=S>^Wmpm&RBWbL^P!}|HEfS2%8H$Zb z8_J&uzXp_Z1BtXSaEg||5(+pUmY9td; z&k--(!-eKg++R-MV55xX1W+{3k>kc9I>SqFHTliB<%+VlUL4qLI%Hs<0Bs4e+s*aO z_Drv^)zc?6FL&Ar(8d6=BPao|gyzPE`bWajJKWgkFHT1mFS$e^JKXIvkL*IHS{^scAmt%37^eQU>XD?drn;{=sg%uXiRN^c1Wbu<#i}0X7x&y~_!yO^Hafq8p9&el+E91uJizhq-*i>%?K&44yy1{uBmF z+CgmMqdU;m-{WBn8C^G5sEXd;3*lLeBWLKY6xyH(L#LLwmE z@`_jCXK%3hVzoV}pL3G! zF32qNx?}ifxnZOd;y0F?43Q*i@trMtW_em3`pG2b+v_UWo%g)a0}wbKzJ{H(P4Qa1 z@=T@r7m~c7n`cJW&T?!VcWrL&ndQ>{~gU+WBtoC2(a% z-iu&m|HzyK@*8psGx4tl)0_3v+>{Cqp2KqJ;Am-@(vlm1T%j6%%t%Z_!4m2$>?$f* zwkysQ!*8^j|0}!a60cWOUW9PInfv^L=_pd!$^<({xpSq#RHtZNJI4n>*;fy_E@etj zJxE2(so>X(6epj!QkxFmj!;EGR439$A8AC7!ve~v6AF@s?xPE z`T?E9o!8*IE&X+yH%lk9be( z=ixOTAkj)h-tu(v_WjlP^&2fTroU3-lPDxKy6*j?1xyaQV6Bugi=2n)J<%lcaLhKI z9*+Lc_4o?$EL-74|^SkU%b4u)j*c4`f@IOABm`bLwH57)lfr>9ACy_ie!-LDJ zvL#$mO&)eII_b%>oJA;(J>nqJgEJdj*QZk3GbJ$SGGV7|QE{e~xa)G1ChvDt**r&Yq^sRCX*U z>HgQ~thnIhuV@MF3Mw_|D?4chs&HLZ*ecqR&!Jc_Wo6 z*j9$%XWj8uj{H3oglZPAjcW;FmtH2kon2hhH{1li`OuhK48&ZuN$A~RpV^axzYH*L zKL6zY|M>35-~4oM^M3m0mxIl6u`f2azuF)C%fAdh`PbhJ{`DTk0|!7@Jl?(o8t?36R3K$x$!5HX^stK zT6uu2jU_;PGpzdwP-o5dvgU0Pu~MxKeiW(c4&mxpn8l5pN9Ne|o|Cw7)pH3xhatO8 zmtDHD@LDPV1JD<`f{oo3GP1a)j0t92l9aImR64a39}wPGwbjdIn5Cm6dEs;bcPtTW z?0foVa(&L!Ch@f?Ab5Jt;Av`FL2(yI3*q28g~7wMUHkI{OM^C|8~b=r%isb$2UlmP zH-?F`9L8!ilWRF^@E7Ie5(&7&@)4#z-Z)~xXMsPk-%3KLa)x9CeztBdfH!N5HTy~t zgSeWqy0+KGDdbO|rwe>|q_e0g-9MB2EXuUba#GifN*WOO5A-c%Y(Ss$QJ49f;rDoW zz`a|8*+dFV4xx3vd-GmsBR^tb4qTK1Iy;9~wUn^QuuW_s0}$G$vjrEie^}Xu?P4+EFuT)+Ka@FT9w4eVUWL%_+2Mnls8al%f^x6zY-Oz#}#^$*k7I) zx}4s_sr+*Ob7CZZ1|X{$-(k5-uYguUz2x(NbRyin7w}4ZLu>39JcQ6rR zhZZx!^WMi_A0GUXx83ryQT&U0$K!9fgaU7$&1(F~7moe7n&&MD{~lrOsAo-UxXUtx zX{E6;&&_?xw3gq3Z3R=agaeIn0B50dv*W=jcH4g`BMqFlqUg83`^U7Abc7TktrLLP zGt9F@xdX1?{=`%5z^&A6$o(uSfL!VveMNt0xM5TBRHK1lhpF3HCLqg zkca7Fh03Sq;>raSYpZcy-3<|K(wqWuGjnONd6Dh*5CQDzNu}-Sk@zL5%@Es*C8G32 z0Z&b(rHz<_FTTWHg!p#*@X7X9d%KDi)Pfq=kTMxaeAI5JSEsZ0IUENP({Syh!U#F? zj1n?ui3$pD z`S1#!8R;a9QVo)Lm)=N0L-_At;DP)22}5PZl^#1KxtbIXkD@)bWN*7tk$#ga zXF9l`N8WaLY1HZCn_M&$}~KOYu(AD^RSnXgZ z!UMqZ&T3x&3pCc%)jN+c_o&Svs|t%q{Fd-!;J zXE**RRa)W??$n6CX{natm%}IDZXXvTNwt=;&B5{R&hhS}_@kC`iNAPBm-yQbOS{A$ zpvLAu;cp3iO*ajuW@nK=D`&~Ws4j)%GhD6?$nm11pn@39B^Ud?B7{k_+DKZFP{8p? zM2WDf#E6BtxNpyHvBBdFWWB--Fn#dw!AE4oD+GNU)giJi^9`dVRYe8@@h7DrkUYM% zf^g~{!EjiLYAdk8h}XVikf-6Hq$Ki^V9feah`M!sXBcfC%C7*E#BCSagLe3$EFT5GTK0N@{kT}}e@M;(L zG^V>ng3G^!cbJiJTv)1RE{?m$=N-GKSryzY%U5qOPN^E1A%Jf@QwsAjB#9%Dp)ApW zr9YO$Z=cc-QPGja{vr$otuio<+*biB=CDSl{2(Y2(+JJu3Gl%p>J#E&TFKqeuycZ} zMA}|iIK@H;h0)U9jnPCol-;7?m81nTg?E#H+a(ZxO1NjGB47*g-GFlxr!De5N0W2D zMhiMCl5m+{0%~ytwn5ZjHl*fnyqEov)zgt}hi|gW`YyBvP0GveA%A^E2H}W_)yu%E zu!!!htfb1^Do zS38sQ>kCP+Z_de&a(^6mLXOa!3ZD3B6;n%;j=T{0O9f`nkz~Reg8&;0y`%+R$*?h3 zMA>R3fce+Msc_8s$h!!p-EqmUQrP833VS&wfGHhf)hU7nJj%YBc3|~fY!nfYs8&z>uLi%y$hEGKp4D{DlG7RkreMVZ72HcJW8rzS!yd`Pu9bjqAirOlo18b@msw5H#$QD z5Kml(x+jy}`Iw0?DvL92nIML_4J*r@Iy-+K3Q56j`to`PC4@Dnw7|y-Vy-%V;G(R8 zi1NLJkjR}-0nOSCrB08M37j<(KV6iW~Df|{zNQ0evTqPvO%{B`CY`;j$k=H#y-!u(+o+6JEQmOF6=>kxMEz zH!9c?Lg_teUnl8HwmS z^A)5#QlUUD)|7* zQMFPA{>xYA_Q*nro_tTwAdiCJs>!uE&&?RloYUo6c&`7&h-Pmz8_jY1!)R{>Z7pC< zMnzg^6LeDQiJ@9gopb3<8X=}eB&?&B3vbhTpuv<`p}k6Zt5ZtSGKDL&5zU+=nmzo! zPRvPiz$Lqw1EwZvT9vlYa7N{s#01I;$bc zEo|p=TtkLxnJ-X=&D`2X_9w}UQ0~KZVrBBgu|8fQl1z?MiU2myaUV8Fr}BsmXXE$z zZw=FRWXd^BxJ0ZeBTH=4gD@g1b*j|j9`g5=fUsWcE}|0)F{RiW&?P`wcH+pg_T8aJ zqnFpO)ye+!>!&9y#wd3rMprN7zf=8By9M(zr!V-w?e9C1FoK+KNc-vF4@Zy!vqd*B z`by?({Naf1wxzOXa+v)l_cX5XF#6=_P*QhvCl4PYt7P|w(djkPSI$TLwz=^iQ*Z@| zrr*_nuF^&Hi7*lHl7UsRD&uJOJIOe>DS6d-Uv3%~3y!{=;lYrf*c3;*6b^`J*VS7mWAc$^8c}?u7m??hNj1g}H`TuUYU-my7-*01>gQ z3xweBPOfKfuj!t`&hS7yz7i@(P?o6IrhU&cfDqv7PF~z;q8~$H_8c*0yQFZ}e4S@#J;rr=B6tq=~-==#0SzQPYinSHcI=IBz z5pT7jus+TQCb9bi3X)w8&yOdQ!sav1um(506bryF$`*!-`5DBB>i&6R| z@txuK!=uxy@mp%4e@FZW1h*6`p$rf{k~-XoTYxBum3KBG{R*$J@lkT(&fxwf-uiw$ z;eSci=VKI>hBp*{iV%fA8vmSLU!V&0`@wxB()*xV;Pv3-WbeuT?#ao+lat-U!-K<< zlfiwIIl#lVQ{ev`u5tHbN{8!W=3%TvTzQ`fGgaOqKj78wAD3V;Hrann#+RELFD~he z)@=aXKjE4sQfnn{SfkzMoyS8!gbtqXCx0PO{*VxGKn(ntEF6q(@D6#q&uytNgN>8v zuh{8#`WVnHFvIEF^DzUDFq9=_J#n;+heRIdQ=TE2KI0J-WTc}n8)c5wX$R|CW}xoH zrh&(F*p;z2Wq*7&;5L}n4;Og;eRMTNZS&vV`E=`(J70eB51(IMLpvGG2Kab6efYz4 z{JT4EX0x{sA3S*X?%meAUvEvWUO)KklTSW<@V~y;D7D|rw;7cTjvK!Jy_yu?BuV(j0r*9_s{yYB)elpV$_7CzX6Ldf? zT&=(>n`7DgbW7%!y%OBO>{q|L^KYZe5z3TqVKG~e##1SabHs@bP@xHnzVpDqvwWAW zT`ci2!%PNRnQ}V9p^sB%;21gXgNxDdaypQU zTxyBnw_KwM3mwm$CIsh;p?lP%6sk9GL4{IR5Z>1Q3Q0 zEK%_{APNCEEF4Fkr&sW?T+PNrF9I4>hu=)jY9#&57T8eg)m(o<$mSlv7X~Pg3SvAR z0!81AVQGQD!Nw7425TDeiQ(Dgs=Y;LGT0JiEY^WDAfKIXJ>!@=7}6Kl+BMLwy)FH9 z4(Lw-!*dS5d2hj4+XP!X+T-n1f8cTyT%QYI~u7BTqT zCpW>l+~jdh|Jk!9SzCmWF0=c~poG@8u^Hnzc|l-V;PGdzRdYSLA;G4LN^n~eWO!&R z55vjGK>I*7XYj_}9~77mz!!fz45GALh6uI?P{ve@THT-#_zQUr40P5?2_>|q%6lLq zOL+&5ZhilQj|oZL6%~%K=ugkDRgDV*^TYZ>0m% zH0fP?oG_KtCSRSP=CSSbQel2ERB(CnIX3#`^r*uYH_x?uh`Jc_k=P!1UFEF`m zHxPBoT&@b>G)0y!>SKkk9BRoDO93*#{GLgoSkfo?6D{&%CRY6sv@^auV&S7rt{|9r zG!fI2x^in>nu!xmlSg29MvJhxn1@&Ze0CzY+03&|d_=g|a|616u_30wdmkE`XQL4u znlqUdW3*rCDO*Vj9xvFZrK)>OoOTzY?eH+W3lEZ*4RYo!79uW~*tzM2VXNqW{Og}j zPM-hyb$7*0f)HpeEV{8`ThdWJFD{j9cBmABpLJ3a5h96dj^E7 z+1hyc5NXjFg7hDkE|%T0x}TGe1dL`0j6|_CN9CvKtr=~-p`hym1e_Sj-WLg}i23&K z>VsJYYUT?sU_}SlGfL@2yoe}?(N?%v9%aOiDu!(qyjomL4qlHraF0b%Ft_SKRyh=Md%6o0vDHV4>Sm0>r41B{!kl;E@7Z4M9^bT<%agSI;x1z_G};lszpb7ZPaP zo@%IN3q!qW63~`gD29h?5pFiFXkt@WUzcjzBPEiRg1c%p_8-Xp_BXpnPjM5Shcf?k zK5?-7AzgwA%J`xVgwk(m&?QbI4bt}K40;XTg$L)z&vSzig&9e%Eel@j;N;L@pCk=G zEq&bsoIheZ$o2W9Xr;HoE$OSQ)p*f~k0rm~LwdoTcr#9VJDCECs9b^7M<Qmcgrj7d77=-}YJ@h%p@OR6!avst`qzlMIGwF6b+_bnK9*M_cxgp<&9|zYW{{Z5s1kFi z>Az&4Lu#%@`=0G{yDd_AzBc2W$3f?SO({Rnr0O;f-q5D2sMT*@A;PvHVGUYXM{<1f zG@KO?&N#tB=shpM1+_x=8@(8V3si78BjZS9p0W>@P}r6nTVMR~+ntND4BlF8oTTK; zCk9EuWqycMT5!~des@=oMM^8URAI@GmVnXUpX^&bl%y=_@1{2$pTtrq`7gaImCa77 zESTlVV;l7`huhsd+SR}LFaO2c@V6&uN0g8d$@V4CS%YX5--nmvu5Z%`9otCI$sZqRir2$nd^J;^N9 z0<8ks#H;Urk<`xP69vrfKHg?1#^3i04@9XxD4xT}zoCp#xY@BqMHBTm?eFGliU%4fUiU({rt8V>t&+K@~ zXTCz}&tH%a);(q2l}Oc6;ADo;xZ;vdEDW9xPO(zTy`fI{?*8%DyGKus8pKuhZWU-& zd`-mme=V+-Y=1Fa;0*|>16g#CHTYzKr3L)XsidVQ3D4s~vW!alOPt$mY>`?La_L$$ zfwd5;BBqz3(B9{4H93`gl5&TMJmg&zwC4(p>hwix~L&IG?Vh0Y+k&jsOIPf zjlc+L*xm-N{6)8Bo_a(nK4=2#XSbWddjHeUKzMU=SS33XcRnOo^t(H_Epz`Ji{Rct z>gf435}STgW}zW9Qv&8liZ1gpKim3r@YQgNd_ zok5Z-!Sq06t#J-nVopG%%~`MMvu673Hb#b_CmwZ6&ZF0oPNrv<;~xflj|ZEa@YQH^ zc2E6Ku)Mi;rjj-%_gpq{qi*e?^RD!m#$+hO#b6dND=#Ni$tLW>djq!BOiG}BamjtL zCI9d92lY6bgcj3N8#}}fG`9sgVw21J`LR;G95K2=1|Di1rxun;wfDHWSwQ+T%L>IV zxn)$&BEU-U)4xZ4N5E;)a!MkcT#RR&?$y=g!j6H=7+F0IWggI?$$5zn?JXZ!@qr1f zpKbk`Y5JYCYb*#^iIP{nkL*_@WDb!MbajR!#(I)35%;cMBPmwK;~u7ySG-)*ZIZV0 z>1UrHYt|Bzr`l5&5Rz>%9kaL*$(i9Xr@_C*F25Bln-&ewDkbZ(eyrr@0xA$$!Z5`R!Q*+6@#2yz@q{b9<7}=h( zENMUxl2Ai|90IgPv0N;O1S!NM!4RY+X2#ExJV{<4SIMj7Cf~OXeZmHKkmPYvll*^7 zZS38>di6T>>U98W&#<**3gAqTr`xuAI5_^nu=%3-N{D2SC2E29(GkE#=Pq=V*c-gT znCS2+-f8>)ULk|a^t5T0?6@UlBRIRgZwKvXrreF5S_FPH`QW`yyNYxhNi zfL{{q9>H$(&LKed56=;IAWvm6H`yhvzbuO-&L?5BXrrdPH5=u!k5T+y4b}#v|Ec6Q zrcj5-|Cw0;H=E3))6X&$-GGY9L{wkCuqd^r2{-aFgVx~+wjOf44JOIf(oEoG$<$&> zSIFS-J8A5Jjx@;y_Wj0#N=rPDTXHoX)iYHk86$nk<`NfVe4ILTvx10_4>Uy?$rzMS#@@C z0+U9vRg-ab5DYUs95S%mO&{D&Y`l1Z17XT2vtLf@_Ft4rwwl8z`=wMoy8XbHCyH*$_x@FMUKH{b|9@NS@G(!6EH&lLjj> zk4L$-b9BN*#W#vkXdS(UG6aBF!yp*d)zRRBCwug$5(xp5Q@Wz?tvy^SK?!1+sv;Xz zXCDz`pfToEN{SEhhmlQ%z8Qj~0)<&l3Gj$;=>e{TCFDP~W=Uef#xtuDZ^l;|l?3}} z83*4QkQwI$Lx^z22Cz>pW(Fn>kvwyL@YVqm!wg-xBoYz&e)uCYwq(iJVzX=;N*Nn) zJW!UBvXOSD96^KGG5`=LFJR~ojMBl?pNM_Gy$@2~%u1p>M3bZ;@IrO?aUY{k4<|8f zx8Hy<_Cy53l;O^nqo)w~-R||i;;!R>cXs(#T*)aiHmL-Jeu#fDmTWKLN?yJlvc@kT zh{FiqKy2}1oU4A`f3Yq?3|J=JUN|ZSZ)mMe5Ead=BH1D2IOFhVtSF>68RG!-c6bpe z%xIArV}uAPVm=<{2ZSP#EZK0);Jj}d@?i4VCNKrd3SSb?&6lq<4!&IL`D z(vn3#@E47Yphb{F>M5WkOMr|dMKrh+%OPYrSW00K0Z89Mx+;?EAcY8jigFS%lEHsC z2SPN2lhbi!4jNg{R}6Buw6C}plP8ht6zRuI0>!2rVB;k#VZaJ{a^QXghwlWDf^Qj- zkF{QCfZpKn9cnFbANS!LyQu!<90_v!BV-~J5(=TnCsNup@QkI348S`lNLRxOqM3E} zZX88NAd=u~s1>^*QVbb^Hd%PICR5~wl2Ru|nMn}ReNKVu$5JAjOoZ4$p zKM(J+2;_#UOpD|}^}?(dG2ndDj5LJ{c=HmWP|!4;t=QTU&#p|$t#$d!%p9Iz)Y@>N zJA98+UTmM?fc1Yd`;Oq?5z03$D>WR0z{tYzE%9dKwq6#x*J6BXS$vVsRu9L!KlrGL zkV6%IEd3Bt9bz!(2~v?7%X~_z!VBdBJQoGgDO$@I60+!dvK`e5nsZ+8DAG_X z7Cd353pWK)LhbDmqkRD2DKUHzO3YsjHl>r6kra;i$^-$2CP=U~tY}2BP%MPAIB)2_ zfjUIm>nAb;>Sh!o^`X6@{;o?tBq|v#tio8!O7Yp7@m}g*Bwja6?8}JJEY@X>pg3Km z2YNQ&7It`dNY4eJ&!{akg)-r04mCLWg;gDw*O*I;veeYd#$Sg$C_a&7=LoiMsySTL z)iu~X9b<=rvy1u-%m-QpiHegX_||56l+^$bLhejM#V?^b<6 zis@l6aRi7p|j65m~|} z8y+wL@2=zviLQ-YRyU9mhXPw8wQDG&nm=Hp+91_H(*tUwFIi4{6uESa8r$Jq$pgD> z=R}w=WFjmT+on-RBnC5;%#7jBDg{6t11V~Q=tVIYm1l$)S42yT9>It_whPylSbhKp zdsKold&}(pQf7ZUnvBd<>NJoNAe1rFh3KTgwMdO5Mxl~G?J|H#H#tft=F`B3DdlHB zvaWp^?LG2va1jNt$jdny zPZTZ)mhXmUOCb?#SO_rpm}jrD3JK#|iQ@n^Tglm=gdYrArI!lPx=C zoIrCI-`w$m)gqoM7-aL2)ZCd-vvYy(?dU1zlteHeNg}OTijXFSaVSD*+8hjaL){rb zUx$oNj6fC66uo?|hTyd9g2zkmulB)U@+JsY+yaTMALe$O#c0$&wu-l$$5mbO_2o3= zd~4?7Dy_wt+~qG%8vfUO;!~dVcPHx6WqBEY7xCHOl3C)_@S&;$=DkY7vD>TuR>X#sJ=CT@~opTj0h zWyW=`$Lg5bch7t}2nQW7MN1-7OgV$q^1EJAy?-aWUb{7$?dDb>SgXIZro*H1jb4$) zbGWZr#>2#VZ~TAe7!%Mz%ZCP^9h|06Mf-m4s%D53VM!NMdNg)pP&!W1y?|spFdt9V z_-}fy6|qc9O*!k$@a)}C-4#c*TUTco~rcpO$?O-Hc;e@t`&yBQ(2{RIi3_RC^2iUAa`Sgy^~Yy zlsJc7Cisi~w*-F`{hdkNO5vA*h-9!F>m*NsEY4V8{FHhLI|Rop%0BQoN5`=&&JmF8 zU9J1bcWct<8W4T#L$Y@Tv=16zR=8KjVRsjT94S46Llx09_Bi+|Z_+ebb6`M0V* z_<6byCQa}KeJY}Oqal*MSS)LL9s_4;kD*jtZ4gCQ8a=-Qyl=+cWZKBXxkLQEI3>!R zNREsLjjvMO>6outIGvTYxh&{N50JRSP}_(eCRez-_-MW&jnq-|IURC=PF!Rp*2%n~ zBj442NY(;sXHqTPeC|b2Ctflwu8RI<1_RmS|DT3w`rU1iU~h)Be&^^HWcb4$I68PM z2L^Hp?LxaUqUiLJEP)t7m=e@+3t7hyg*)Bhy zQm-)UhMqq<;&{E@WYK{7Lh4YSogyfrhX}M?BB7K#eeBTzMBg&~~#Ypiu4sB$28K9%1WI&ZG%x#ZjV$FcI`4DeK$Pw9SM;Ht>W zkE}i-uxQwl<7VQcO?>F#Wgk8_-^?tj^C9yH8@}d0c-JZ?qByTxH$$i=kgVK>$prB1 zNa0udnOI_Z^sm_Iw}=DbCWY@AFgyN1)%@vj@0|CGeBp5P1L~Q-9gpE>-lrq_bc`P< zUBp2Fyg(MXa}z{`_5mJ>#LtUcnDY1oS0{zf-Oz|Hel#d6Au$$XhkC z;JRaJHy05KR~b#bWqcb5qY$YRM+!o@21vs3X&c2$*T>_N#8jI(YwZ9x|9G9zU(^Zn z=N73pJ$3nHwgh(#P<}CKbdGs`DxY)x!V2F|mm?Nf?%-KQ1QwKbkpM+n%*7$Yi*X_R zb_nq;IS)P^9IR6TZgmRkdYjW|PP*eWLEX*8_dR%!5gKzi8Tx+L5dON_IsW`c-O^i%Xn808TJt!2w0wW zqrBuo6zkVyyPyV2(QccLsZJjAP^TfnuF>>T4g5>I zYo3b_n4Z@8r>H;gV2spbwz0<|tY@?xFkSjxdk zqbJDxJ5Su)j~KpcKBCu;kjy@mU2v&!eigX zy&)owaB}sq=SgyTNHZlkvdj)p+!Xh?L|61bFu2LyE*3;<1&9};C^6IGWppsa;}+zm zxPTqskEi~+%WLw07zIRTVu)PFb3$vKc*uQo5NXoCh!+!jZ)+6ewoWm{d4JZvBGqN(`_k0L`@KL$qkMls%JYL7^iBIldb`2xrQ?mCzMU6D=|i#^JFBkzbIPjcMI=M z2PcwLlzkIln7ujhyqQBcHpUy@Rvi&%%n40eCxo43QbbHmel7a7Qc@aGdP!4DD4N40M z6pQ=l=fVewxP9`Z!teaQZyqjar9S%xg>m8+K@H$De*L6c!he=3G{MCvOZZeqrWN38 z6pKJw!^Ehi`W{bRO&Oxhy=)~|NCFi=z&{74Po69e@c)YyJWk$p_#YAaCj$G|SB6|W zRHZ$i7SIPW?EyBwCs-#SY#}I-@51zBNyr6kH z9;5&D2M|#@m7J$$@`O!y`D7ok@1Bep5(JTijU>dYY<|nXWq^bn6U@ZBdLrXT+`$)v z_Xv8i{K@_2uX~7b32T3?VyAchCM;>=c=)=-e39mg09*Up z>hy2@cVqqTmHsAU{L{+9PnYke$Ro)*wpMMi$6UI`-+j;;**U9R3+y7Wz-dH>EnGTj zUAp>ftnlXa>Va2M9m47b$gzGBL-*@xSFq~s_hd0RFn!8kvX4mHaEQaV;e~=q)swI6 z1kIHYTNaM#{s(t;`H6W%7I8wjw^BWUu?DSrdT{^N*OmRY@Rtu#k;usKazOK74vi2O z=ELhQ90!=@WrWy%{Xme<;WRkWK4mfTa7qhY2g}u+-$v4+yOV*N19YyeetRcd5z#Jm z!dnjyY)n6pA9d5Nw91=vmKFjOV1-&N_1qNqk9hg?g+@LiGbO-^C$MCvxHL0A zmsttr7D^0Hq{HZk2=I0G%*Os6sT1;Q^HWp{3@GA#OS>9g9hNH*#Pxa}-uL!}esY`C zH)(mwask#=keU~<0$C@;tOZNm3q6apnYUC0QTHbv{+emcRJKgpU3IumC^iD_r=}jcGt~F{#bz9B8{@&|1yRG&HyGfug z0h+*k;$~mgvSu{#tw?&)pb9OH6uUoco}Fr$;!qzq>GkDklKQyTyuiPbipg?M%>Itr z8$&~m@HWDmhW=1u6T>q(P@d^nNgKwp{&IrMv~G6%qGI{(8DDWnr13)ml`Juo#GL}7 zc1WxFH6I8%ZBX6!8?Ws9UBE3Mv>#c^cOE=>8RKN3pL3zHlys;GZ1AU3(V`87)eVJ$ zjHFI^IWjwSPJbm$Q6k8`hXI4Jj=x-(O#Lp~EI&C-!0SM&n2$&Ug%x}IJ1?Ji`r3O; z0Etc8+>{8HUhexamp^+(KCJFS3*eR~Z4k8R1Wk%%N@ZSB9N~aZNAH>W(4Nzmk%Dlj zt74ll>-ZxJmLYAS0&`ZC{yh@kA7c*2N8lu^L&WVsx#5caHN76TwVRQYKl*IuU{6RS zY~)R`rO3og}?`XDb7%+g{)Amkd&L-WZQ1=v3A1ckIjxw#eE9o7}6_O=I~E z(7=12eFWYHpCe>Eg>xFXD}MD&ldFo9aj!cY%ljjiGN1H2|V1e&nVXTe}&0ha@V9yX>Zq7z%t~ zWTu@&D4!v|vpwSs5gFoncePz$O4P;8R1yeOB&tMh-$1NN&}0kMsSi+&@eH0<9-pwf z5pWaM$c+TbMl^C95B&G%pA+(I(d^k`#Bte*Q$oGc7(R8Fg0lw_&v#Pv?deeN*F;ue zNl>z?V{2Z8*D}Kb6|n>`LlPt;0u4UfJeai?VJul?V0$u8Kqr@ywZd>xNfw<8uiPp$ zb03M|?Eel(o*|&~WQNU;y~BD_2{|>33o9xX$AdP(j8pVH1oqNt5)3At*RmE*4uN-H z6I=M`K*83AAXfq=?XsoX@2h|5U^@P?x0iER7~LiIB^z&tY9;)N0Bd^VOE zwF7k5ys5yvhJ3+(sFd`;<;VxNe=wrDE0mScQE z!DK9%2~83)C@4Eb!7?NyD$$KwA}at#@+>*I&L(7ewMO3O(^BM@XSWiUg&hb-4Py^Q zMo(hbpKRRZ1e_Tp_EMd`Nq1CikQ9utHFX%Y(Y{G7n{2epxHGHv6(cwXm9l49&y4(d zZQkmRbM7K%x&2WdMCU9rQ_(JggB%hOl!@*cr&#U-4BzBc>u1uac?K|pN=a=E4kE^t za591pfOP(O`!?ao7LgbkqC{PYX7rHpAhbmS9WZ3a@ve3;vEz8w{F7Rn{|kL*WxM>U zhmSHXOHXVvLFQiji))p_*vvakn=zTFpkz04yatM9EsVG}S60Zc4*L z8Qccl$m)L3C25s|pnPUUQz>7qLO95A%t`#{8x>fnX%=* zV}WKf`M{4dff#K9a}hd-=GzK_!CGDU5+K&ZU;rUrhgWq)P=y;fl8S{6dZR|1$*VO~ zI^RP7beNpM{nIvea9q^@4<5dmSv?nZWXn`^+zbgBWzf~zIxXd)Y(X)wkJ%$94p2#8QbEyH2 z3>+1}a;VO#4$rpJ6Le2|f(Qe4+gmPmq$;vs>Y!aDK3>pbl#=pOUe^QZQuku=T5^y4 zHeSNMhCk=+gv^+Qs($DVMYsJ@RTBax->eorfXn85^AuWwZ7k#Clj z_SX8V@V>})x~+pxjnnX0gOW%)>Y$-IN}(!o#Wv^R3?ND*M<#R$(aEWzCoXQC&I06$~@2pqV|({=bUgZyLhRg zYN~{6Cu;h)*XYeuzw$N)kS^c)V2K>!cRz|ymSv$)t~RX+V@s6yWpa1%Xz*Se&OEB_ zKfF@x6jZKI5nO{i&$c$UH$O-)OWW)O2&DF&A(Bro3j8^wh?j@CKM?S_m=-m^9p`MkZU-;Ppq*{9F5<6$b*y|hEe?a_B3~)saERq-mAS$R%LynN7%194IA#KbwII-8VkP|iCZHIc zCVH|})5Z>s^8R?dHXNQLC&!;)>PwD*pjj==8(TghJ@IC77s5PqBR8@DN#(%n-Nb(KjOBfT0{Zj(Vl8eknwk7I?(W-DZm35)q6@Q>GM_-MuV9X{%#KjNcs-! z7IdGCPq0CyHB}cX33l&p>*ycC=rnD+#>!sS|QY#JnR-skf{d2a+DiT;~#RjC+>c+BbPHV z$uVAv`)&kwwc|nnjqFty^pkz)Q9ttWl4cvgtp*Kz`AnUzuKOkv(H6oyvyAjIPr`0a z*!~J>-d4lz<|a8)Ap*GymkT4CTq02N&;?|Mu_Poopju=>ViMG{oR307Te3RT*uJ8- zDg?vubHyILhw{Idahpmq;fI~!do~?gUMf8-&2vVF4fbHLn1M)hEZB<5O#TuOg(Efgq>%+F+u&q-M5>Av$tUk zWnP;mTu5>{J0bbbPKJm3mIqP7j71ab@aEa+$#`O)1NCA`VwtaBgL;XfyL>ZR(xe+O z9lzPxS?g@=?BJsl$jGnn+`$)g(A_1!?BiC{_rhLmEZu1|`2PmB6%A07%_8cOGtGe< z>P!o1&K*x_VfHY30Nx$qvh#IVtZ%Ajm9BIDkQ^}wn%j@hkE85-I2-KSkJHz}-S=$x zj3$-#jd!m2_97Z8KB}-O?H0UTucE_?_B`kaKiXBN?BY4A=ZBrYyHefzQn!4HcSs8= zGT4GI|LFex86Wl031A{*^cQ%NCgM{(JcJ+OQT3bAWM^-5>J-!f;Eg3@V4h8asgQk; zGODk{i6Hqly_~T1F8zVSaK^KwxV2IN6OARI=^8*Xa3`m`I`0)n#>ONg+x4`r&`~2gY9`kQzd85OF*uW| zZa?Pfo3hEp3Kt|ABcGI`@miCP^<^6_6AZDMM1ojWBC9ceu$H-(N6-tkk4Ei;7Z~~5nrHl z3POZPg8dXcN;)n+cp7~wV@)c&i0ZI$M8TZV6#3Kyx@|JwLzCNb7~vMG7?M857hF>bxEMGkbhR09ntay^ z7J{ZR!byo^#&B8xwTGmW^qH&)Tk1AN3d18y&%A71DRQy2_|L!1>OT7VoG!37{qt|Nt~o3cBrt_ouxFI{ zj8MXcf6tf6%t64+8JN6h&Z<(*-~`?aMy`qqpvcAdBgE^2cx~vYMnJNhn?RhR1m)4P z{2%EhetZD`vwshbOf3xtnF#>6D*`ZCP9)Owtn-HvlTl56BG3iC8cj94XRM#evv3w+ zJ?3}Pu;6v5d%65sOC7p^8D0D!v&7jekx;f5``~BqfQuufT=r-epw9#eSCf-7_6pPL z8c7VgM1kUR`692C0_M^s%3>&*bcHeqoa(Z0>+*ZmHKyd7IxtFd3`=aeN{AY&j=--% z5i)lTVI_>kVSZw7njJqE!OA?qA$CXux!Zi9nXo%MjiuLqPWk$44gd>OJ;q{FV4T+Y zss_x&tcYj5*^{dUZi)#IBuUc-dcB`+xs_y>&LG|TVcdIY&-o3TJf^YKK z1PU2vzaLRYY++#wh3H`Jj8K}E4ZT=$lTo4YDNfKimOT&g#A?|>1s$OBFS4;W#GA+`Gz(*6`JQs|;$q219gobvSXhEjjH84hz|VL3p+ z1W0d$Is*+EV;T@lnBc+z!6MnE#|i` zWV*?|xb6@e2nPp$7aqi6S?V?fIy%PKacaIJd%@P-ykZxs8K1(PHMnqZ7MqmgW(`kK zmR33sAF&~|qUdbms{o*&KdqoI8#Ed3pS>d)7*&B)hPxyy`cz14C~b_?J|!*buK?oh zKkxLa-p14ZOI)2)_D|Gc@??)54JkaS*bu6HmPM&D|7`<-@grRsEB>)UG* zZh`@-?nb{_@4P@F`&!lCzzq;4wa*sfXVu2j>P362^&F!#S3B#S{wo3GX{X=iTu(7s zv%>uk0#UXZT(Y^nwTbJ{3d>qp>-1Xd&CZMV8j4VMF=N&KmiI)x=eScUR=M%A+ukDR z*%DXVfKhIrWTNgXj7jeSR}=qg0dW9t9l~U@-Rkg<_Mh88L38WXijCQ8|7ja9;m2yN z`J(x(-CJ0`1S8lI1aY)q5M-dCx4qiyclz7?cJ*vyV@>efYj1tqX|;O~7jOrRCr>L} z1Fv9)ep4pK5WrOLA%R%k?x83L-h$hH%0+ZkTNe4vqjvc{_0ezx9u)<&HVLbJh9UUry+ zgLol8_KZVv+L!1Sx&Z>gyrc<0rGIvM3r?`WFE+C3Jgu5*-(rk4e;Hff>lm2`%39A2 q-HnBR?@s>v-*$dDe|P>5|M?%g{r@@m_4 Date: Sat, 23 Mar 2019 07:46:41 +0000 Subject: [PATCH 15/58] Update ZoneSettings.php Fixed variable length --- src/Endpoints/ZoneSettings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Endpoints/ZoneSettings.php b/src/Endpoints/ZoneSettings.php index 03c66d9..a32b84f 100644 --- a/src/Endpoints/ZoneSettings.php +++ b/src/Endpoints/ZoneSettings.php @@ -89,7 +89,7 @@ class ZoneSettings implements API return false; } - public function updateMinifySetting($zoneID, $html, $css, $js) + public function updateMinifySetting($zoneID, $html, $css, $javascript) { $return = $this->adapter->patch( 'zones/' . $zoneID . '/settings/minify', @@ -97,7 +97,7 @@ class ZoneSettings implements API 'value' => [ 'html' => $html, 'css' => $css, - 'js' => $js, + 'js' => $javascript, ], ] ); From 3cfeedbe4dbaaea8efd38ac4e4d740a44fc977a7 Mon Sep 17 00:00:00 2001 From: Martijn Smidt Date: Mon, 13 May 2019 15:22:20 +0200 Subject: [PATCH 16/58] Added loadbalancers class and tests --- src/Configurations/LoadBalancer.php | 178 ++++++++++++++++++ src/Endpoints/LoadBalancers.php | 149 +++++++++++++++ tests/Configurations/LoadBalancerTest.php | 57 ++++++ tests/Endpoints/LoadBalancersTest.php | 128 +++++++++++++ .../Endpoints/createLoadBalancer.json | 46 +++++ .../Endpoints/deleteLoadBalancer.json | 8 + .../Endpoints/getLoadBalancerDetails.json | 46 +++++ .../Fixtures/Endpoints/listLoadbalancers.json | 54 ++++++ .../Endpoints/updateLoadBalancer.json | 46 +++++ 9 files changed, 712 insertions(+) create mode 100644 src/Configurations/LoadBalancer.php create mode 100644 src/Endpoints/LoadBalancers.php create mode 100644 tests/Configurations/LoadBalancerTest.php create mode 100644 tests/Endpoints/LoadBalancersTest.php create mode 100644 tests/Fixtures/Endpoints/createLoadBalancer.json create mode 100644 tests/Fixtures/Endpoints/deleteLoadBalancer.json create mode 100644 tests/Fixtures/Endpoints/getLoadBalancerDetails.json create mode 100644 tests/Fixtures/Endpoints/listLoadbalancers.json create mode 100644 tests/Fixtures/Endpoints/updateLoadBalancer.json diff --git a/src/Configurations/LoadBalancer.php b/src/Configurations/LoadBalancer.php new file mode 100644 index 0000000..150a88d --- /dev/null +++ b/src/Configurations/LoadBalancer.php @@ -0,0 +1,178 @@ + + * User: HemeraOne + * Date: 13/05/2019 + */ + +namespace Cloudflare\API\Configurations; + +class LoadBalancer implements Configurations +{ + private $configs = []; + + public function __construct(string $name, array $defaultPools, string $fallbackPool) + { + $this->setName($name); + $this->setDefaultPools($defaultPools); + $this->setFallbackPool($fallbackPool); + } + + public function setName(string $name) + { + $this->configs['name'] = $name; + } + + public function getName():string + { + return $this->configs['name'] ?? ''; + } + + public function setDefaultPools(array $default_pools) + { + $this->configs['default_pools'] = $default_pools; + } + + public function getDefaultPools():array + { + return $this->configs['default_pools'] ?? []; + } + + public function setFallbackPool(string $fallbackPool) + { + $this->configs['fallback_pools'] = $fallbackPool; + } + + public function getFallbackPool():string + { + return $this->configs['fallback_pools'] ?? ''; + } + + public function setSteeringPolicy(string $steeringPolicy = '') + { + $allowedOptions = ['off', 'geo', 'random', 'dynamic_latency', '']; + if (!in_array($steeringPolicy, $allowedOptions)) { + throw new ConfigurationsException('Given steering policy value is not a valid option, valid options are: ' . implode(', ', $allowedOptions)); + } + + $this->configs['steering_policy'] = $steeringPolicy; + } + + public function getSteeringPolicy():string + { + return $this->configs['steering_policy'] ?? ''; + } + + public function enable() + { + $this->configs['enabled'] = true; + } + + public function isEnabled():bool + { + return $this->configs['enabled'] ?? true; + } + + public function disable() + { + $this->configs['enabled'] = false; + } + + public function isDisabled():bool + { + return !$this->configs['enabled'] ?? false; + } + + public function setEnabled(bool $enabled = true) + { + $this->configs['enabled'] = $enabled; + } + + public function getEnabled(bool $enabled = true):bool + { + return $this->configs['enabled'] ?? true; + } + + public function setPopPools(array $popPools) + { + $this->configs['pop_pools'] = $popPools; + } + + public function getPopPools():array + { + return $this->configs['pop_pools'] ?? []; + } + + public function setTtl(int $ttl) + { + $this->configs['ttl'] = $ttl; + } + + public function getTtl():int + { + return $this->configs['ttl'] ?? 30; + } + + public function setRegionPools(array $regionPools) + { + $this->configs['region_pools'] = $regionPools; + } + + public function getRegionPools():array + { + return $this->configs['region_pools'] ?? []; + } + + public function setSessionAffinity(string $sessionAffinity = '') + { + $allowedOptions = ['none', 'cookie', 'ip_cookie', '']; + if (!in_array($sessionAffinity, $allowedOptions)) { + throw new ConfigurationsException('Given session affinity value is not a valid option, valid options are: ' . implode(', ', $allowedOptions)); + } + $this->configs['session_affinity'] = $sessionAffinity; + } + + public function getSessionAffinity():string + { + return $this->configs['session_affinity'] ?? ''; + } + + public function setDescription(string $description = '') + { + $this->configs['description'] = $description; + } + + public function getDescription():string + { + return $this->configs['description'] ?? ''; + } + + public function setProxied(bool $proxied = true) + { + $this->configs['proxied'] = $proxied; + } + + public function isProxied():bool + { + return $this->configs['proxied'] ?? true; + } + + public function setSessionAffinityTtl(int $sessionAffinityTtl = 82800) + { + if ($sessionAffinityTtl > 604800 || $sessionAffinityTtl < 1800) { + throw new ConfigurationsException('The value of session affinity ttl must be between 1800 and 604800'); + } + + $this->configs['session_affinity_ttl'] = $sessionAffinityTtl; + } + + public function getSessionAffinityTtl():int + { + return $this->configs['session_affinity_ttl'] ?? 82800; + } + + public function getArray(): array + { + return $this->configs; + } +} diff --git a/src/Endpoints/LoadBalancers.php b/src/Endpoints/LoadBalancers.php new file mode 100644 index 0000000..0ed43ab --- /dev/null +++ b/src/Endpoints/LoadBalancers.php @@ -0,0 +1,149 @@ + + * User: HemeraOne + * Date: 13/05/2019 + */ + +namespace Cloudflare\API\Endpoints; + +use Cloudflare\API\Adapter\Adapter; +use Cloudflare\API\Configurations\ConfigurationsException; +use Cloudflare\API\Configurations\LoadBalancer; +use Cloudflare\API\Traits\BodyAccessorTrait; + +class LoadBalancers implements API +{ + use BodyAccessorTrait; + + private $adapter; + + public function __construct(Adapter $adapter) + { + $this->adapter = $adapter; + } + + /** + * @param string $zoneID + * @return mixed + */ + public function listLoadBalancers(string $zoneID) + { + $loadBalancers = $this->adapter->get('zones/' . $zoneID . '/load_balancers'); + $this->body = json_decode($loadBalancers->getBody()); + + return $this->body->result; + } + + /** + * @param string $zoneID + * @param string $loadBalancerID + * @return mixed + */ + public function getLoadBalancerDetails(string $zoneID, string $loadBalancerID) + { + $loadBalancer = $this->adapter->get('zones/' . $zoneID . '/load_balancers/' . $loadBalancerID); + $this->body = json_decode($loadBalancer->getBody()); + return $this->body->result; + } + + /** + * @param string $zoneID + * @param string $loadBalancerID + * @return LoadBalancer + * @throws ConfigurationsException + */ + public function getLoadBalancerConfiguration(string $zoneID, string $loadBalancerID) + { + $loadBalancer = $this->getLoadBalancerDetails($zoneID, $loadBalancerID); + + $loadBalancerConfiguration = new LoadBalancer($loadBalancer->name, $loadBalancer->default_pools, $loadBalancer->fallback_pool); + $loadBalancerConfiguration->setSteeringPolicy($loadBalancer->steering_policy); + $loadBalancerConfiguration->setEnabled($loadBalancer->enabled); + + if (is_array($loadBalancer->pop_pools)) { + $loadBalancerConfiguration->setPopPools($loadBalancer->pop_pools); + } + + if (isset($loadBalancer->ttl)) { + $loadBalancerConfiguration->setTtl($loadBalancer->ttl); + } + + if (is_array($loadBalancer->region_pools)) { + $loadBalancerConfiguration->setRegionPools($loadBalancer->region_pools); + } + $loadBalancerConfiguration->setSessionAffinity($loadBalancer->session_affinity); + $loadBalancerConfiguration->setDescription($loadBalancer->description); + $loadBalancerConfiguration->setProxied($loadBalancer->proxied); + + if (isset($loadBalancer->session_affinity_ttl)) { + $loadBalancerConfiguration->setSessionAffinityTtl($loadBalancer->session_affinity_ttl); + } + + return $loadBalancerConfiguration; + } + + /** + * @param string $zoneID + * @param string $loadBalancerID + * @param LoadBalancer $loadBalancerConfiguration + * @return bool + */ + public function updateLoadBalancer( + string $zoneID, + string $loadBalancerID, + LoadBalancer $loadBalancerConfiguration + ): bool { + $options = $loadBalancerConfiguration->getArray(); + + $query = $this->adapter->patch('zones/' . $zoneID . '/load_balancers/' . $loadBalancerID, $options); + + $this->body = json_decode($query->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + /** + * @param string $zoneID + * @param LoadBalancer $loadBalancerConfiguration + * @return bool + */ + public function createLoadBalancer( + string $zoneID, + LoadBalancer $loadBalancerConfiguration + ): bool { + $options = $loadBalancerConfiguration->getArray(); + + $query = $this->adapter->post('zones/' . $zoneID . '/load_balancers', $options); + + $this->body = json_decode($query->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + /** + * @param string $zoneID + * @param string $loadBalancerID + * @return bool + */ + public function deleteLoadBalancer(string $zoneID, string $loadBalancerID): bool + { + $loadBalancer = $this->adapter->delete('zones/' . $zoneID . '/load_balancers/' . $loadBalancerID); + + $this->body = json_decode($loadBalancer->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } +} diff --git a/tests/Configurations/LoadBalancerTest.php b/tests/Configurations/LoadBalancerTest.php new file mode 100644 index 0000000..e726cd8 --- /dev/null +++ b/tests/Configurations/LoadBalancerTest.php @@ -0,0 +1,57 @@ + + * User: HemeraOne + * Date: 13/05/2019 + */ + +use Cloudflare\API\Configurations\ConfigurationsException; +use Cloudflare\API\Configurations\LoadBalancer; + +class LoadBalancerTest extends TestCase +{ + /** + * @dataProvider testArgumentsDataProvider + */ + public function testArguments($setFunction, $arguments, $getFunction, $invalid) + { + $lb = new LoadBalancer('bous', [], 'bogus'); + foreach ($arguments as $argument) { + if ($invalid) { + try { + $lb->{$setFunction}($argument); + } catch (ConfigurationsException $e) { + $this->assertNotEquals($argument, $lb->{$getFunction}()); + } + } else { + $lb->{$setFunction}($argument); + $this->assertEquals($argument, $lb->{$getFunction}()); + } + + } + } + + public function testArgumentsDataProvider() + { + return [ + 'steeringPolicy arguments valid' => [ + 'setSteeringPolicy', ['off', 'geo', 'random', 'dynamic_latency', ''], 'getSteeringPolicy', false + ], + 'sessionAffinity arguments valid' => [ + 'setSessionAffinity', ['none', 'cookie', 'ip_cookie', ''], 'getSessionAffinity', false + ], + 'sessionAffinityTtl arguments valid' => [ + 'setSessionAffinityTtl', [3600], 'getSessionAffinityTtl', false + ], + 'steeringPolicy arguments invalid' => [ + 'setSteeringPolicy', ['invalid'], 'getSteeringPolicy', true + ], + 'sessionAffinity arguments invalid' => [ + 'setSessionAffinity', ['invalid'], 'getSessionAffinity', true + ], + 'sessionAffinityTtl arguments invalid' => [ + 'setSessionAffinityTtl', [1337], 'getSessionAffinityTtl', true + ], + ]; + } +} diff --git a/tests/Endpoints/LoadBalancersTest.php b/tests/Endpoints/LoadBalancersTest.php new file mode 100644 index 0000000..a0a87b2 --- /dev/null +++ b/tests/Endpoints/LoadBalancersTest.php @@ -0,0 +1,128 @@ + + * User: HemeraOne + * Date: 13/05/2019 + */ + +class LoadBalancersTest extends TestCase +{ + public function testCreateLoadBalancer() + { + $pools = [ + '17b5962d775c646f3f9725cbc7a53df4', + '9290f38c5d07c2e2f4df57b1f61d4196', + '00920f38ce07c2e2f4df50b1f61d4194' + ]; + + $lbConfiguration = new LoadBalancer('www.example.com', $pools, '17b5962d775c646f3f9725cbc7a53df4'); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/createLoadBalancer.json'); + + $mock = $this->getMockBuilder(Adapter::class)->getMock(); + $mock->method('post')->willReturn($response); + + $mock->expects($this->once()) + ->method('post') + ->with( + $this->equalTo('zones/699d98642c564d2e855e9661899b7252/load_balancers'), + $lbConfiguration->getArray() + ); + + $loadBalancers = new LoadBalancers($mock); + $result = $loadBalancers->createLoadBalancer('699d98642c564d2e855e9661899b7252', $lbConfiguration); + + $this->assertTrue($result); + $this->assertEquals('699d98642c564d2e855e9661899b7252', $loadBalancers->getBody()->result->id); + } + + public function testListLoadBalancer() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/listLoadBalancers.json'); + + $mock = $this->getMockBuilder(Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/699d98642c564d2e855e9661899b7252/load_balancers') + ); + + $loadBalancers = new LoadBalancers($mock); + $loadBalancers->listLoadBalancers('699d98642c564d2e855e9661899b7252'); + $this->assertEquals('699d98642c564d2e855e9661899b7252', $loadBalancers->getBody()->result[0]->id); + } + + public function testGetLoadBalancerDetails() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getLoadBalancerDetails.json'); + + $mock = $this->getMockBuilder(Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/699d98642c564d2e855e9661899b7252/load_balancers/699d98642c564d2e855e9661899b7252') + ); + + $loadBalancers = new LoadBalancers($mock); + $loadBalancers->getLoadBalancerDetails('699d98642c564d2e855e9661899b7252', '699d98642c564d2e855e9661899b7252'); + $this->assertEquals('699d98642c564d2e855e9661899b7252', $loadBalancers->getBody()->result->id); + } + + public function testUpdateLoadBalancer() + { + $pools = [ + '17b5962d775c646f3f9725cbc7a53df4', + '9290f38c5d07c2e2f4df57b1f61d4196', + '00920f38ce07c2e2f4df50b1f61d4194' + ]; + + $lbConfiguration = new LoadBalancer('www.example.com', $pools, '17b5962d775c646f3f9725cbc7a53df4'); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateLoadBalancer.json'); + + $mock = $this->getMockBuilder(Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/699d98642c564d2e855e9661899b7252/load_balancers/699d98642c564d2e855e9661899b7252'), + $this->equalTo($lbConfiguration->getArray()) + ); + + $loadBalancers = new LoadBalancers($mock); + $result = $loadBalancers->updateLoadBalancer('699d98642c564d2e855e9661899b7252', '699d98642c564d2e855e9661899b7252', $lbConfiguration); + + $this->assertTrue($result); + $this->assertEquals('699d98642c564d2e855e9661899b7252', $loadBalancers->getBody()->result->id); + } + + public function testDeleteLoadBalancer() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteLoadBalancer.json'); + + $mock = $this->getMockBuilder(Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('zones/699d98642c564d2e855e9661899b7252/load_balancers/699d98642c564d2e855e9661899b7252') + ); + + $loadBalancers = new LoadBalancers($mock); + $result = $loadBalancers->deleteLoadBalancer('699d98642c564d2e855e9661899b7252', '699d98642c564d2e855e9661899b7252'); + + $this->assertTrue($result); + $this->assertEquals('699d98642c564d2e855e9661899b7252', $loadBalancers->getBody()->result->id); + } +} diff --git a/tests/Fixtures/Endpoints/createLoadBalancer.json b/tests/Fixtures/Endpoints/createLoadBalancer.json new file mode 100644 index 0000000..3316cdd --- /dev/null +++ b/tests/Fixtures/Endpoints/createLoadBalancer.json @@ -0,0 +1,46 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "699d98642c564d2e855e9661899b7252", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "description": "Load Balancer for www.example.com", + "name": "www.example.com", + "enabled": true, + "ttl": 30, + "fallback_pool": "17b5962d775c646f3f9725cbc7a53df4", + "default_pools": [ + "17b5962d775c646f3f9725cbc7a53df4", + "9290f38c5d07c2e2f4df57b1f61d4196", + "00920f38ce07c2e2f4df50b1f61d4194" + ], + "region_pools": { + "WNAM": [ + "de90f38ced07c2e2f4df50b1f61d4194", + "9290f38c5d07c2e2f4df57b1f61d4196" + ], + "ENAM": [ + "00920f38ce07c2e2f4df50b1f61d4194" + ] + }, + "pop_pools": { + "LAX": [ + "de90f38ced07c2e2f4df50b1f61d4194", + "9290f38c5d07c2e2f4df57b1f61d4196" + ], + "LHR": [ + "abd90f38ced07c2e2f4df50b1f61d4194", + "f9138c5d07c2e2f4df57b1f61d4196" + ], + "SJC": [ + "00920f38ce07c2e2f4df50b1f61d4194" + ] + }, + "proxied": true, + "steering_policy": "dynamic_latency", + "session_affinity": "cookie", + "session_affinity_ttl": 5000 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/deleteLoadBalancer.json b/tests/Fixtures/Endpoints/deleteLoadBalancer.json new file mode 100644 index 0000000..7744044 --- /dev/null +++ b/tests/Fixtures/Endpoints/deleteLoadBalancer.json @@ -0,0 +1,8 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "699d98642c564d2e855e9661899b7252" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getLoadBalancerDetails.json b/tests/Fixtures/Endpoints/getLoadBalancerDetails.json new file mode 100644 index 0000000..3316cdd --- /dev/null +++ b/tests/Fixtures/Endpoints/getLoadBalancerDetails.json @@ -0,0 +1,46 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "699d98642c564d2e855e9661899b7252", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "description": "Load Balancer for www.example.com", + "name": "www.example.com", + "enabled": true, + "ttl": 30, + "fallback_pool": "17b5962d775c646f3f9725cbc7a53df4", + "default_pools": [ + "17b5962d775c646f3f9725cbc7a53df4", + "9290f38c5d07c2e2f4df57b1f61d4196", + "00920f38ce07c2e2f4df50b1f61d4194" + ], + "region_pools": { + "WNAM": [ + "de90f38ced07c2e2f4df50b1f61d4194", + "9290f38c5d07c2e2f4df57b1f61d4196" + ], + "ENAM": [ + "00920f38ce07c2e2f4df50b1f61d4194" + ] + }, + "pop_pools": { + "LAX": [ + "de90f38ced07c2e2f4df50b1f61d4194", + "9290f38c5d07c2e2f4df57b1f61d4196" + ], + "LHR": [ + "abd90f38ced07c2e2f4df50b1f61d4194", + "f9138c5d07c2e2f4df57b1f61d4196" + ], + "SJC": [ + "00920f38ce07c2e2f4df50b1f61d4194" + ] + }, + "proxied": true, + "steering_policy": "dynamic_latency", + "session_affinity": "cookie", + "session_affinity_ttl": 5000 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/listLoadbalancers.json b/tests/Fixtures/Endpoints/listLoadbalancers.json new file mode 100644 index 0000000..47a3b12 --- /dev/null +++ b/tests/Fixtures/Endpoints/listLoadbalancers.json @@ -0,0 +1,54 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": [ + { + "id": "699d98642c564d2e855e9661899b7252", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "description": "Load Balancer for www.example.com", + "name": "www.example.com", + "enabled": true, + "ttl": 30, + "fallback_pool": "17b5962d775c646f3f9725cbc7a53df4", + "default_pools": [ + "17b5962d775c646f3f9725cbc7a53df4", + "9290f38c5d07c2e2f4df57b1f61d4196", + "00920f38ce07c2e2f4df50b1f61d4194" + ], + "region_pools": { + "WNAM": [ + "de90f38ced07c2e2f4df50b1f61d4194", + "9290f38c5d07c2e2f4df57b1f61d4196" + ], + "ENAM": [ + "00920f38ce07c2e2f4df50b1f61d4194" + ] + }, + "pop_pools": { + "LAX": [ + "de90f38ced07c2e2f4df50b1f61d4194", + "9290f38c5d07c2e2f4df57b1f61d4196" + ], + "LHR": [ + "abd90f38ced07c2e2f4df50b1f61d4194", + "f9138c5d07c2e2f4df57b1f61d4196" + ], + "SJC": [ + "00920f38ce07c2e2f4df50b1f61d4194" + ] + }, + "proxied": true, + "steering_policy": "dynamic_latency", + "session_affinity": "cookie", + "session_affinity_ttl": 5000 + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateLoadBalancer.json b/tests/Fixtures/Endpoints/updateLoadBalancer.json new file mode 100644 index 0000000..3316cdd --- /dev/null +++ b/tests/Fixtures/Endpoints/updateLoadBalancer.json @@ -0,0 +1,46 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "699d98642c564d2e855e9661899b7252", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "description": "Load Balancer for www.example.com", + "name": "www.example.com", + "enabled": true, + "ttl": 30, + "fallback_pool": "17b5962d775c646f3f9725cbc7a53df4", + "default_pools": [ + "17b5962d775c646f3f9725cbc7a53df4", + "9290f38c5d07c2e2f4df57b1f61d4196", + "00920f38ce07c2e2f4df50b1f61d4194" + ], + "region_pools": { + "WNAM": [ + "de90f38ced07c2e2f4df50b1f61d4194", + "9290f38c5d07c2e2f4df57b1f61d4196" + ], + "ENAM": [ + "00920f38ce07c2e2f4df50b1f61d4194" + ] + }, + "pop_pools": { + "LAX": [ + "de90f38ced07c2e2f4df50b1f61d4194", + "9290f38c5d07c2e2f4df57b1f61d4196" + ], + "LHR": [ + "abd90f38ced07c2e2f4df50b1f61d4194", + "f9138c5d07c2e2f4df57b1f61d4196" + ], + "SJC": [ + "00920f38ce07c2e2f4df50b1f61d4194" + ] + }, + "proxied": true, + "steering_policy": "dynamic_latency", + "session_affinity": "cookie", + "session_affinity_ttl": 5000 + } +} \ No newline at end of file From 99c174bcb3b3d24f59a03d9bb5135dccee40c8a4 Mon Sep 17 00:00:00 2001 From: Martijn Smidt Date: Mon, 13 May 2019 16:49:32 +0200 Subject: [PATCH 17/58] Added pools class and tests Small changes in loadbalancer configuration --- src/Configurations/LoadBalancer.php | 20 +-- src/Configurations/Pool.php | 111 +++++++++++++ src/Endpoints/LoadBalancers.php | 44 ++--- src/Endpoints/Pools.php | 152 ++++++++++++++++++ tests/Configurations/LoadBalancerTest.php | 15 +- tests/Configurations/PoolTest.php | 53 ++++++ tests/Endpoints/LoadBalancersTest.php | 4 +- tests/Endpoints/PoolsTest.php | 133 +++++++++++++++ tests/Fixtures/Endpoints/createPool.json | 28 ++++ tests/Fixtures/Endpoints/deletePool.json | 8 + tests/Fixtures/Endpoints/getPoolDetails.json | 28 ++++ ...dbalancers.json => listLoadBalancers.json} | 0 tests/Fixtures/Endpoints/listPools.json | 36 +++++ tests/Fixtures/Endpoints/updatePool.json | 28 ++++ 14 files changed, 622 insertions(+), 38 deletions(-) create mode 100644 src/Configurations/Pool.php create mode 100644 src/Endpoints/Pools.php create mode 100644 tests/Configurations/PoolTest.php create mode 100644 tests/Endpoints/PoolsTest.php create mode 100644 tests/Fixtures/Endpoints/createPool.json create mode 100644 tests/Fixtures/Endpoints/deletePool.json create mode 100644 tests/Fixtures/Endpoints/getPoolDetails.json rename tests/Fixtures/Endpoints/{listLoadbalancers.json => listLoadBalancers.json} (100%) create mode 100644 tests/Fixtures/Endpoints/listPools.json create mode 100644 tests/Fixtures/Endpoints/updatePool.json diff --git a/src/Configurations/LoadBalancer.php b/src/Configurations/LoadBalancer.php index 150a88d..70b2da1 100644 --- a/src/Configurations/LoadBalancer.php +++ b/src/Configurations/LoadBalancer.php @@ -28,9 +28,9 @@ class LoadBalancer implements Configurations return $this->configs['name'] ?? ''; } - public function setDefaultPools(array $default_pools) + public function setDefaultPools(array $defaultPools) { - $this->configs['default_pools'] = $default_pools; + $this->configs['default_pools'] = $defaultPools; } public function getDefaultPools():array @@ -83,12 +83,7 @@ class LoadBalancer implements Configurations return !$this->configs['enabled'] ?? false; } - public function setEnabled(bool $enabled = true) - { - $this->configs['enabled'] = $enabled; - } - - public function getEnabled(bool $enabled = true):bool + public function getEnabled():bool { return $this->configs['enabled'] ?? true; } @@ -147,9 +142,14 @@ class LoadBalancer implements Configurations return $this->configs['description'] ?? ''; } - public function setProxied(bool $proxied = true) + public function enableProxied() { - $this->configs['proxied'] = $proxied; + $this->configs['proxied'] = true; + } + + public function disableProxied() + { + $this->configs['proxied'] = false; } public function isProxied():bool diff --git a/src/Configurations/Pool.php b/src/Configurations/Pool.php new file mode 100644 index 0000000..f28347b --- /dev/null +++ b/src/Configurations/Pool.php @@ -0,0 +1,111 @@ + + * User: HemeraOne + * Date: 13/05/2019 + */ + +namespace Cloudflare\API\Configurations; + +class Pool implements Configurations +{ + private $configs = []; + + public function __construct(string $name, array $origins) + { + $this->setName($name); + $this->setOrigins($origins); + } + + public function setName(string $name) + { + $this->configs['name'] = $name; + } + + public function getName():string + { + return $this->configs['name'] ?? ''; + } + + public function setOrigins(array $origins) + { + foreach ($origins as $origin) { + if (!isset($origin['name'])) { + throw new ConfigurationsException('name is required for origin'); + } + if (!isset($origin['address'])) { + throw new ConfigurationsException('address is required for origin'); + } + } + $this->configs['origins'] = $origins; + } + + public function getOrigins():array + { + return $this->configs['origins'] ?? []; + } + + public function setDescription(string $description = '') + { + $this->configs['description'] = $description; + } + + public function getDescription():string + { + return $this->configs['description'] ?? ''; + } + + public function enable() + { + $this->configs['enabled'] = true; + } + + public function isEnabled():bool + { + return $this->configs['enabled'] ?? true; + } + + public function disable() + { + $this->configs['enabled'] = false; + } + + public function isDisabled():bool + { + return !$this->configs['enabled'] ?? false; + } + + public function getEnabled():bool + { + return $this->configs['enabled'] ?? true; + } + + public function setMonitor(string $monitor) + { + $this->configs['monitor'] = $monitor; + } + + public function getMonitor():string + { + return $this->configs['monitor'] ?? ''; + } + + public function setNotificationEmail(string $email) + { + if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { + throw new ConfigurationsException('Invalid notification email given'); + } + + $this->configs['notification_email'] = $email; + } + + public function getNotificationEmail():string + { + return $this->configs['notification_email'] ?? ''; + } + + public function getArray(): array + { + return $this->configs; + } +} diff --git a/src/Endpoints/LoadBalancers.php b/src/Endpoints/LoadBalancers.php index 0ed43ab..7813d31 100644 --- a/src/Endpoints/LoadBalancers.php +++ b/src/Endpoints/LoadBalancers.php @@ -57,46 +57,54 @@ class LoadBalancers implements API { $loadBalancer = $this->getLoadBalancerDetails($zoneID, $loadBalancerID); - $loadBalancerConfiguration = new LoadBalancer($loadBalancer->name, $loadBalancer->default_pools, $loadBalancer->fallback_pool); - $loadBalancerConfiguration->setSteeringPolicy($loadBalancer->steering_policy); - $loadBalancerConfiguration->setEnabled($loadBalancer->enabled); + $lbConfiguration = new LoadBalancer($loadBalancer->name, $loadBalancer->default_pools, $loadBalancer->fallback_pool); + $lbConfiguration->setSteeringPolicy($loadBalancer->steering_policy); + if ($loadBalancer->enabled === true) { + $lbConfiguration->enable(); + } elseif ($loadBalancer->enabled === false) { + $lbConfiguration->disable(); + } if (is_array($loadBalancer->pop_pools)) { - $loadBalancerConfiguration->setPopPools($loadBalancer->pop_pools); + $lbConfiguration->setPopPools($loadBalancer->pop_pools); } if (isset($loadBalancer->ttl)) { - $loadBalancerConfiguration->setTtl($loadBalancer->ttl); + $lbConfiguration->setTtl($loadBalancer->ttl); } if (is_array($loadBalancer->region_pools)) { - $loadBalancerConfiguration->setRegionPools($loadBalancer->region_pools); + $lbConfiguration->setRegionPools($loadBalancer->region_pools); + } + $lbConfiguration->setSessionAffinity($loadBalancer->session_affinity); + $lbConfiguration->setDescription($loadBalancer->description); + if ($loadBalancer->proxied === true) { + $lbConfiguration->enableProxied(); + } elseif ($loadBalancer->proxied === false) { + $lbConfiguration->disableProxied(); } - $loadBalancerConfiguration->setSessionAffinity($loadBalancer->session_affinity); - $loadBalancerConfiguration->setDescription($loadBalancer->description); - $loadBalancerConfiguration->setProxied($loadBalancer->proxied); if (isset($loadBalancer->session_affinity_ttl)) { - $loadBalancerConfiguration->setSessionAffinityTtl($loadBalancer->session_affinity_ttl); + $lbConfiguration->setSessionAffinityTtl($loadBalancer->session_affinity_ttl); } - return $loadBalancerConfiguration; + return $lbConfiguration; } /** * @param string $zoneID * @param string $loadBalancerID - * @param LoadBalancer $loadBalancerConfiguration + * @param LoadBalancer $lbConfiguration * @return bool */ public function updateLoadBalancer( string $zoneID, string $loadBalancerID, - LoadBalancer $loadBalancerConfiguration + LoadBalancer $lbConfiguration ): bool { - $options = $loadBalancerConfiguration->getArray(); + $options = $lbConfiguration->getArray(); - $query = $this->adapter->patch('zones/' . $zoneID . '/load_balancers/' . $loadBalancerID, $options); + $query = $this->adapter->put('zones/' . $zoneID . '/load_balancers/' . $loadBalancerID, $options); $this->body = json_decode($query->getBody()); @@ -109,14 +117,14 @@ class LoadBalancers implements API /** * @param string $zoneID - * @param LoadBalancer $loadBalancerConfiguration + * @param LoadBalancer $lbConfiguration * @return bool */ public function createLoadBalancer( string $zoneID, - LoadBalancer $loadBalancerConfiguration + LoadBalancer $lbConfiguration ): bool { - $options = $loadBalancerConfiguration->getArray(); + $options = $lbConfiguration->getArray(); $query = $this->adapter->post('zones/' . $zoneID . '/load_balancers', $options); diff --git a/src/Endpoints/Pools.php b/src/Endpoints/Pools.php new file mode 100644 index 0000000..4a4f193 --- /dev/null +++ b/src/Endpoints/Pools.php @@ -0,0 +1,152 @@ + + * User: HemeraOne + * Date: 13/05/2019 + */ + +namespace Cloudflare\API\Endpoints; + +use Cloudflare\API\Adapter\Adapter; +use Cloudflare\API\Configurations\ConfigurationsException; +use Cloudflare\API\Configurations\Pool; +use Cloudflare\API\Traits\BodyAccessorTrait; + +class Pools implements API +{ + use BodyAccessorTrait; + + private $adapter; + + public function __construct(Adapter $adapter) + { + $this->adapter = $adapter; + } + + /** + * @param string $accountID + * @return mixed + */ + public function listPools(string $accountID) + { + $pools = $this->adapter->get('accounts/' . $accountID . '/load_balancers/pools'); + $this->body = json_decode($pools->getBody()); + + return $this->body->result; + } + + /** + * @param string $accountID + * @param string $poolID + * @return mixed + */ + public function getPoolDetails(string $accountID, string $poolID) + { + $pool = $this->adapter->get('accounts/' . $accountID . '/load_balancers/pools/' . $poolID); + $this->body = json_decode($pool->getBody()); + return $this->body->result; + } + + /** + * @param string $accountID + * @param string $poolID + * @return mixed + */ + public function getPoolHealthDetails(string $accountID, string $poolID) + { + $pool = $this->adapter->get('accounts/' . $accountID . '/load_balancers/pools/' . $poolID . '/health'); + $this->body = json_decode($pool->getBody()); + return $this->body->result; + } + + /** + * @param string $accountID + * @param string $poolID + * @return Pool + * @throws ConfigurationsException + */ + public function getPoolConfiguration(string $accountID, string $poolID) + { + $pool = $this->getPoolDetails($accountID, $poolID); + + $origins = []; + foreach ($pool->origins as $origin) { + $origins[] = (array)$origin; + } + $poolConfiguration = new Pool($pool->name, $origins); + $poolConfiguration->setDescription($pool->description); + if ($pool->enabled === true) { + $poolConfiguration->enable(); + } elseif ($pool->enabled === false) { + $poolConfiguration->disable(); + } + $poolConfiguration->setMonitor($pool->monitor); + $poolConfiguration->setNotificationEmail($pool->notification_email); + + return $poolConfiguration; + } + + /** + * @param string $accountID + * @param string $poolID + * @param Pool $poolConfiguration + * @return bool + */ + public function updatePool( + string $accountID, + string $poolID, + Pool $poolConfiguration + ): bool { + $options = $poolConfiguration->getArray(); + + $query = $this->adapter->put('accounts/' . $accountID . '/load_balancers/pools/' . $poolID, $options); + + $this->body = json_decode($query->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + /** + * @param string $accountID + * @param Pool $poolConfiguration + * @return bool + */ + public function createPool( + string $accountID, + Pool $poolConfiguration + ): bool { + $options = $poolConfiguration->getArray(); + + $query = $this->adapter->post('accounts/' . $accountID . '/load_balancers/pools', $options); + + $this->body = json_decode($query->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } + + /** + * @param string $accountID + * @param string $poolID + * @return bool + */ + public function deletePool(string $accountID, string $poolID): bool + { + $pool = $this->adapter->delete('accounts/' . $accountID . '/load_balancers/pools/' . $poolID); + + $this->body = json_decode($pool->getBody()); + + if (isset($this->body->result->id)) { + return true; + } + + return false; + } +} diff --git a/tests/Configurations/LoadBalancerTest.php b/tests/Configurations/LoadBalancerTest.php index e726cd8..96b3d1e 100644 --- a/tests/Configurations/LoadBalancerTest.php +++ b/tests/Configurations/LoadBalancerTest.php @@ -15,19 +15,18 @@ class LoadBalancerTest extends TestCase */ public function testArguments($setFunction, $arguments, $getFunction, $invalid) { - $lb = new LoadBalancer('bous', [], 'bogus'); + $loadBalancer = new LoadBalancer('bogus', [], 'bogus'); foreach ($arguments as $argument) { - if ($invalid) { + if ($invalid === true) { try { - $lb->{$setFunction}($argument); + $loadBalancer->{$setFunction}($argument); } catch (ConfigurationsException $e) { - $this->assertNotEquals($argument, $lb->{$getFunction}()); + $this->assertNotEquals($argument, $loadBalancer->{$getFunction}()); } - } else { - $lb->{$setFunction}($argument); - $this->assertEquals($argument, $lb->{$getFunction}()); + } elseif ($invalid === false) { + $loadBalancer->{$setFunction}($argument); + $this->assertEquals($argument, $loadBalancer->{$getFunction}()); } - } } diff --git a/tests/Configurations/PoolTest.php b/tests/Configurations/PoolTest.php new file mode 100644 index 0000000..204b392 --- /dev/null +++ b/tests/Configurations/PoolTest.php @@ -0,0 +1,53 @@ + + * User: HemeraOne + * Date: 13/05/2019 + */ + +use Cloudflare\API\Configurations\ConfigurationsException; +use Cloudflare\API\Configurations\Pool; + +class PoolTest extends TestCase +{ + /** + * @dataProvider testArgumentsDataProvider + */ + public function testArguments($setFunction, $arguments, $getFunction, $invalid) + { + $pool = new Pool('bogus', []); + foreach ($arguments as $argument) { + if ($invalid) { + try { + $pool->{$setFunction}($argument); + } catch (ConfigurationsException $e) { + $this->assertNotEquals($argument, $pool->{$getFunction}()); + } + } elseif ($invalid === false) { + $pool->{$setFunction}($argument); + $this->assertEquals($argument, $pool->{$getFunction}()); + } + } + } + + public function testArgumentsDataProvider() + { + return [ + 'origins arguments valid' => [ + 'setOrigins', [[['name' => 'test', 'address' => 'server1.example.com']]], 'getOrigins', false + ], + 'setNotificationEmail arguments valid' => [ + 'setNotificationEmail', ['user@example.com'], 'getNotificationEmail', false + ], + 'origins arguments invalid no address' => [ + 'setOrigins', [['name' => 'test']], 'getOrigins', true + ], + 'origins arguments invalid no name' => [ + 'setOrigins', [['address' => 'server1.example.com']], 'getOrigins', true + ], + 'setNotificationEmail arguments invalid' => [ + 'setNotificationEmail', ['userexample.com'], 'getNotificationEmail', true + ] + ]; + } +} diff --git a/tests/Endpoints/LoadBalancersTest.php b/tests/Endpoints/LoadBalancersTest.php index a0a87b2..93418d4 100644 --- a/tests/Endpoints/LoadBalancersTest.php +++ b/tests/Endpoints/LoadBalancersTest.php @@ -90,10 +90,10 @@ class LoadBalancersTest extends TestCase $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateLoadBalancer.json'); $mock = $this->getMockBuilder(Adapter::class)->getMock(); - $mock->method('patch')->willReturn($response); + $mock->method('put')->willReturn($response); $mock->expects($this->once()) - ->method('patch') + ->method('put') ->with( $this->equalTo('zones/699d98642c564d2e855e9661899b7252/load_balancers/699d98642c564d2e855e9661899b7252'), $this->equalTo($lbConfiguration->getArray()) diff --git a/tests/Endpoints/PoolsTest.php b/tests/Endpoints/PoolsTest.php new file mode 100644 index 0000000..9846f48 --- /dev/null +++ b/tests/Endpoints/PoolsTest.php @@ -0,0 +1,133 @@ + + * User: HemeraOne + * Date: 13/05/2019 + */ + +class PoolsTest extends TestCase +{ + public function testCreatePool() + { + $origins = [ + [ + 'name' => 'app-server-1', + 'address' => '0.0.0.0', + 'enabled' => true, + 'weight' => 0.56 + ] + ]; + + $poolConfiguration = new \Cloudflare\API\Configurations\Pool('primary-dc-1', $origins); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/createPool.json'); + + $mock = $this->getMockBuilder(Adapter::class)->getMock(); + $mock->method('post')->willReturn($response); + + $mock->expects($this->once()) + ->method('post') + ->with( + $this->equalTo('accounts/01a7362d577a6c3019a474fd6f485823/load_balancers/pools'), + $poolConfiguration->getArray() + ); + + $pools = new Pools($mock); + $result = $pools->createPool('01a7362d577a6c3019a474fd6f485823', $poolConfiguration); + + $this->assertTrue($result); + $this->assertEquals('17b5962d775c646f3f9725cbc7a53df4', $pools->getBody()->result->id); + } + + public function testListPools() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/listPools.json'); + + $mock = $this->getMockBuilder(Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('accounts/01a7362d577a6c3019a474fd6f485823/load_balancers/pools') + ); + + $pools = new Pools($mock); + $pools->listPools('01a7362d577a6c3019a474fd6f485823'); + $this->assertEquals('17b5962d775c646f3f9725cbc7a53df4', $pools->getBody()->result[0]->id); + } + + public function testGetPoolDetails() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getPoolDetails.json'); + + $mock = $this->getMockBuilder(Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('accounts/01a7362d577a6c3019a474fd6f485823/load_balancers/pools/17b5962d775c646f3f9725cbc7a53df4') + ); + + $pools = new Pools($mock); + $pools->getPoolDetails('01a7362d577a6c3019a474fd6f485823', '17b5962d775c646f3f9725cbc7a53df4'); + $this->assertEquals('17b5962d775c646f3f9725cbc7a53df4', $pools->getBody()->result->id); + } + + public function testUpdatePool() + { + $origins = [ + [ + 'name' => 'app-server-1', + 'address' => '0.0.0.0', + 'enabled' => true, + 'weight' => 0.56 + ] + ]; + + $poolConfiguration = new \Cloudflare\API\Configurations\Pool('primary-dc-1', $origins); + + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updatePool.json'); + + $mock = $this->getMockBuilder(Adapter::class)->getMock(); + $mock->method('put')->willReturn($response); + + $mock->expects($this->once()) + ->method('put') + ->with( + $this->equalTo('accounts/01a7362d577a6c3019a474fd6f485823/load_balancers/pools/17b5962d775c646f3f9725cbc7a53df4'), + $this->equalTo($poolConfiguration->getArray()) + ); + + $pools = new Pools($mock); + $result = $pools->updatePool('01a7362d577a6c3019a474fd6f485823', '17b5962d775c646f3f9725cbc7a53df4', $poolConfiguration); + + $this->assertTrue($result); + $this->assertEquals('17b5962d775c646f3f9725cbc7a53df4', $pools->getBody()->result->id); + } + + public function testDeletePool() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deletePool.json'); + + $mock = $this->getMockBuilder(Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('accounts/01a7362d577a6c3019a474fd6f485823/load_balancers/pools/17b5962d775c646f3f9725cbc7a53df4') + ); + + $pools = new Pools($mock); + $result = $pools->deletePool('01a7362d577a6c3019a474fd6f485823', '17b5962d775c646f3f9725cbc7a53df4'); + + $this->assertTrue($result); + $this->assertEquals('17b5962d775c646f3f9725cbc7a53df4', $pools->getBody()->result->id); + } +} diff --git a/tests/Fixtures/Endpoints/createPool.json b/tests/Fixtures/Endpoints/createPool.json new file mode 100644 index 0000000..e1397a1 --- /dev/null +++ b/tests/Fixtures/Endpoints/createPool.json @@ -0,0 +1,28 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "17b5962d775c646f3f9725cbc7a53df4", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "description": "Primary data center - Provider XYZ", + "name": "primary-dc-1", + "enabled": true, + "minimum_origins": 2, + "monitor": "f1aba936b94213e5b8dca0c0dbf1f9cc", + "check_regions": [ + "WEU", + "ENAM" + ], + "origins": [ + { + "name": "app-server-1", + "address": "0.0.0.0", + "enabled": true, + "weight": 0.56 + } + ], + "notification_email": "someone@example.com" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/deletePool.json b/tests/Fixtures/Endpoints/deletePool.json new file mode 100644 index 0000000..96c4395 --- /dev/null +++ b/tests/Fixtures/Endpoints/deletePool.json @@ -0,0 +1,8 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "17b5962d775c646f3f9725cbc7a53df4" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getPoolDetails.json b/tests/Fixtures/Endpoints/getPoolDetails.json new file mode 100644 index 0000000..e1397a1 --- /dev/null +++ b/tests/Fixtures/Endpoints/getPoolDetails.json @@ -0,0 +1,28 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "17b5962d775c646f3f9725cbc7a53df4", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "description": "Primary data center - Provider XYZ", + "name": "primary-dc-1", + "enabled": true, + "minimum_origins": 2, + "monitor": "f1aba936b94213e5b8dca0c0dbf1f9cc", + "check_regions": [ + "WEU", + "ENAM" + ], + "origins": [ + { + "name": "app-server-1", + "address": "0.0.0.0", + "enabled": true, + "weight": 0.56 + } + ], + "notification_email": "someone@example.com" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/listLoadbalancers.json b/tests/Fixtures/Endpoints/listLoadBalancers.json similarity index 100% rename from tests/Fixtures/Endpoints/listLoadbalancers.json rename to tests/Fixtures/Endpoints/listLoadBalancers.json diff --git a/tests/Fixtures/Endpoints/listPools.json b/tests/Fixtures/Endpoints/listPools.json new file mode 100644 index 0000000..2c7a471 --- /dev/null +++ b/tests/Fixtures/Endpoints/listPools.json @@ -0,0 +1,36 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": [ + { + "id": "17b5962d775c646f3f9725cbc7a53df4", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "description": "Primary data center - Provider XYZ", + "name": "primary-dc-1", + "enabled": true, + "minimum_origins": 2, + "monitor": "f1aba936b94213e5b8dca0c0dbf1f9cc", + "check_regions": [ + "WEU", + "ENAM" + ], + "origins": [ + { + "name": "app-server-1", + "address": "0.0.0.0", + "enabled": true, + "weight": 0.56 + } + ], + "notification_email": "someone@example.com" + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "count": 1, + "total_count": 2000 + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updatePool.json b/tests/Fixtures/Endpoints/updatePool.json new file mode 100644 index 0000000..e1397a1 --- /dev/null +++ b/tests/Fixtures/Endpoints/updatePool.json @@ -0,0 +1,28 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "17b5962d775c646f3f9725cbc7a53df4", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "description": "Primary data center - Provider XYZ", + "name": "primary-dc-1", + "enabled": true, + "minimum_origins": 2, + "monitor": "f1aba936b94213e5b8dca0c0dbf1f9cc", + "check_regions": [ + "WEU", + "ENAM" + ], + "origins": [ + { + "name": "app-server-1", + "address": "0.0.0.0", + "enabled": true, + "weight": 0.56 + } + ], + "notification_email": "someone@example.com" + } +} \ No newline at end of file From 6a29d75001da6208ae94e90fbaad5d0136190ef8 Mon Sep 17 00:00:00 2001 From: easelify Date: Fri, 17 May 2019 20:18:22 +0800 Subject: [PATCH 18/58] Fix updatePageRule() method --- src/Endpoints/PageRules.php | 4 ++-- tests/Endpoints/PageRulesTest.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Endpoints/PageRules.php b/src/Endpoints/PageRules.php index 3e56007..df0290f 100644 --- a/src/Endpoints/PageRules.php +++ b/src/Endpoints/PageRules.php @@ -111,6 +111,7 @@ class PageRules implements API public function updatePageRule( string $zoneID, + string $ruleID, PageRulesTargets $target = null, PageRulesActions $actions = null, bool $active = null, @@ -134,8 +135,7 @@ class PageRules implements API $options['priority'] = $priority; } - - $query = $this->adapter->patch('zones/' . $zoneID . '/pagerules', $options); + $query = $this->adapter->patch('zones/' . $zoneID . '/pagerules/' . $ruleID, $options); $this->body = json_decode($query->getBody()); diff --git a/tests/Endpoints/PageRulesTest.php b/tests/Endpoints/PageRulesTest.php index f2813fd..f16815a 100644 --- a/tests/Endpoints/PageRulesTest.php +++ b/tests/Endpoints/PageRulesTest.php @@ -49,7 +49,7 @@ class PageRulesTest extends TestCase ->method('get') ->with( $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/pagerules'), - $this->equalTo([ + $this->equalTo([ 'status' => 'active', 'order' => 'status', 'direction' => 'desc', @@ -94,7 +94,7 @@ class PageRulesTest extends TestCase $mock->expects($this->once()) ->method('patch') ->with( - $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/pagerules'), + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/pagerules/9a7806061c88ada191ed06f989cc3dac'), $this->equalTo([ 'targets' => $target->getArray(), 'actions' => $action->getArray(), @@ -104,7 +104,7 @@ class PageRulesTest extends TestCase ); $pageRules = new \Cloudflare\API\Endpoints\PageRules($mock); - $result = $pageRules->updatePageRule('023e105f4ecef8ad9ca31a8372d0c353', $target, $action, true, 1); + $result = $pageRules->updatePageRule('023e105f4ecef8ad9ca31a8372d0c353', '9a7806061c88ada191ed06f989cc3dac', $target, $action, true, 1); $this->assertTrue($result); $this->assertEquals('9a7806061c88ada191ed06f989cc3dac', $pageRules->getBody()->result->id); From b46a2f80f5e3e5539d918747d21000f9653dfa2f Mon Sep 17 00:00:00 2001 From: Michael Markoski Date: Tue, 21 May 2019 16:02:08 -0500 Subject: [PATCH 19/58] add new methods --- src/Endpoints/Crypto.php | 229 +++++++++++++++++++++++++++++++++++++++ src/Endpoints/TLS.php | 62 +++-------- 2 files changed, 245 insertions(+), 46 deletions(-) create mode 100644 src/Endpoints/Crypto.php diff --git a/src/Endpoints/Crypto.php b/src/Endpoints/Crypto.php new file mode 100644 index 0000000..43ae35a --- /dev/null +++ b/src/Endpoints/Crypto.php @@ -0,0 +1,229 @@ +adapter = $adapter; + } + + /** + * Get the SSL setting for the zone + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getSSLSetting($zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/ssl' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result->value; + } + + return false; + } + + /** + * Get SSL Verification Info for a Zone + * + * @param string $zoneID The ID of the zone + * @return array|false + */ + public function getSSLVerificationStatus($zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/ssl/verification' + ); + $body = json_decode($return->getBody()); + + if ($body->result) { + return $body->result; + } + + return false; + } + + /** + * Get the Opportunistic Encryption feature for a zone. + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getOpportunisticEncryptionSetting($zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/opportunistic_encryption' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result->value; + } + + return false; + } + + /** + * Get the Onion Routing feature for a zone. + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getOnionRoutingSetting($zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/opportunistic_onion' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result; + } + + return false; + } + + public function getHTTPSRedirectSetting($zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/always_use_https' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result->value; + } + + return false; + } + + public function getHTTPSRewritesSetting($zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/automatic_https_rewrites' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result->value; + } + + return false; + } + + /** + * Update the SSL setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateSSLSetting($zoneID, $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/ssl', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + + /** + * Update the HTTPS Redirect setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateHTTPSRedirectSetting($zoneID, $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/always_use_https', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + + /** + * Update the HTTPS Rewrite setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateHTTPSRewritesSetting($zoneID, $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/automatic_https_rewrites', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + + public function updateOpportunisticEncryptionSetting($zoneID, $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/opportunistic_encryption', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } + + public function updateOnionRoutingSetting($zoneID, $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/opportunistic_onion', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return true; + } + + return false; + } +} diff --git a/src/Endpoints/TLS.php b/src/Endpoints/TLS.php index 46c960e..9e98295 100644 --- a/src/Endpoints/TLS.php +++ b/src/Endpoints/TLS.php @@ -19,6 +19,20 @@ class TLS implements API $this->adapter = $adapter; } + public function getTLSClientAuth($zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/tls_client_auth' + ); + $body = json_decode($return->getBody()); + + if ($body->success) { + return $body->result->value; + } + + return false; + } + public function enableTLS13($zoneID) { $return = $this->adapter->patch( @@ -67,38 +81,10 @@ class TLS implements API return false; } - public function getHTTPSRedirectSetting($zoneID) - { - $return = $this->adapter->get( - 'zones/' . $zoneID . '/settings/always_use_https' - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return $body->result->value; - } - - return false; - } - - public function getHTTPSRewritesSetting($zoneID) - { - $return = $this->adapter->get( - 'zones/' . $zoneID . '/settings/automatic_https_rewrites' - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return $body->result->value; - } - - return false; - } - - public function updateHTTPSRedirectStatus($zoneID, $value) + public function updateTLSClientAuth($zoneID, $value) { $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/always_use_https', + 'zones/' . $zoneID . '/settings/tls_client_auth', [ 'value' => $value, ] @@ -112,20 +98,4 @@ class TLS implements API return false; } - public function updateHTTPSRewritesStatus($zoneID, $value) - { - $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/automatic_https_rewrites', - [ - 'value' => $value, - ] - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return true; - } - - return false; - } } From b81c67ddc58e43fec78c306b2cbe599a23baa144 Mon Sep 17 00:00:00 2001 From: Michael Markoski Date: Tue, 21 May 2019 16:20:56 -0500 Subject: [PATCH 20/58] add php docs for methods --- src/Endpoints/Crypto.php | 36 +++++++++++++-------------------- src/Endpoints/TLS.php | 43 ++++++++++++++++++++++++++++++---------- 2 files changed, 46 insertions(+), 33 deletions(-) diff --git a/src/Endpoints/Crypto.php b/src/Endpoints/Crypto.php index 43ae35a..d8077a7 100644 --- a/src/Endpoints/Crypto.php +++ b/src/Endpoints/Crypto.php @@ -25,11 +25,9 @@ class Crypto implements API 'zones/' . $zoneID . '/settings/ssl' ); $body = json_decode($return->getBody()); - if ($body->success) { return $body->result->value; } - return false; } @@ -45,11 +43,9 @@ class Crypto implements API 'zones/' . $zoneID . '/ssl/verification' ); $body = json_decode($return->getBody()); - if ($body->result) { return $body->result; } - return false; } @@ -65,11 +61,9 @@ class Crypto implements API 'zones/' . $zoneID . '/settings/opportunistic_encryption' ); $body = json_decode($return->getBody()); - if ($body->success) { return $body->result->value; } - return false; } @@ -85,11 +79,9 @@ class Crypto implements API 'zones/' . $zoneID . '/settings/opportunistic_onion' ); $body = json_decode($return->getBody()); - if ($body->success) { return $body->result; } - return false; } @@ -99,11 +91,9 @@ class Crypto implements API 'zones/' . $zoneID . '/settings/always_use_https' ); $body = json_decode($return->getBody()); - if ($body->success) { return $body->result->value; } - return false; } @@ -113,11 +103,9 @@ class Crypto implements API 'zones/' . $zoneID . '/settings/automatic_https_rewrites' ); $body = json_decode($return->getBody()); - if ($body->success) { return $body->result->value; } - return false; } @@ -137,11 +125,9 @@ class Crypto implements API ] ); $body = json_decode($return->getBody()); - if ($body->success) { return true; } - return false; } @@ -161,11 +147,9 @@ class Crypto implements API ] ); $body = json_decode($return->getBody()); - if ($body->success) { return true; } - return false; } @@ -185,14 +169,19 @@ class Crypto implements API ] ); $body = json_decode($return->getBody()); - if ($body->success) { return true; } - return false; } + /** + * Update the Oppurtunistic Encryption setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ public function updateOpportunisticEncryptionSetting($zoneID, $value) { $return = $this->adapter->patch( @@ -202,14 +191,19 @@ class Crypto implements API ] ); $body = json_decode($return->getBody()); - if ($body->success) { return true; } - return false; } + /** + * Update the Onion Routing setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ public function updateOnionRoutingSetting($zoneID, $value) { $return = $this->adapter->patch( @@ -219,11 +213,9 @@ class Crypto implements API ] ); $body = json_decode($return->getBody()); - if ($body->success) { return true; } - return false; } } diff --git a/src/Endpoints/TLS.php b/src/Endpoints/TLS.php index 9e98295..6b8bc1f 100644 --- a/src/Endpoints/TLS.php +++ b/src/Endpoints/TLS.php @@ -19,20 +19,30 @@ class TLS implements API $this->adapter = $adapter; } + /** + * Get the TLS Client Auth setting for the zone + * + * @param string $zoneID The ID of the zone + * @return string|false + */ public function getTLSClientAuth($zoneID) { $return = $this->adapter->get( 'zones/' . $zoneID . '/settings/tls_client_auth' ); $body = json_decode($return->getBody()); - if ($body->success) { return $body->result->value; } - return false; } + /** + * Enable TLS 1.3 for the zone + * + * @param string $zoneID The ID of the zone + * @return bool + */ public function enableTLS13($zoneID) { $return = $this->adapter->patch( @@ -40,14 +50,18 @@ class TLS implements API ['value' => 'on'] ); $body = json_decode($return->getBody()); - if ($body->success) { return true; } - return false; } + /** + * Disable TLS 1.3 for the zone + * + * @param string $zoneID The ID of the zone + * @return bool + */ public function disableTLS13($zoneID) { $return = $this->adapter->patch( @@ -55,15 +69,19 @@ class TLS implements API ['value' => 'off'] ); $body = json_decode($return->getBody()); - if ($body->success) { return true; } - return false; } - + /** + * Update the minimum TLS version setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $minimumVersion The version to update to + * @return bool + */ public function changeMinimumTLSVersion($zoneID, $minimumVersion) { $return = $this->adapter->patch( @@ -73,14 +91,19 @@ class TLS implements API ] ); $body = json_decode($return->getBody()); - if ($body->success) { return true; } - return false; } + /** + * Update the TLS Client Auth setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ public function updateTLSClientAuth($zoneID, $value) { $return = $this->adapter->patch( @@ -90,11 +113,9 @@ class TLS implements API ] ); $body = json_decode($return->getBody()); - if ($body->success) { return true; } - return false; } From ecb23ccc4465b34ff0c321c5a7c5cf3a3d672c83 Mon Sep 17 00:00:00 2001 From: Michael Markoski Date: Tue, 21 May 2019 17:14:17 -0500 Subject: [PATCH 21/58] add test class --- tests/Endpoints/CryptoTest.php | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 tests/Endpoints/CryptoTest.php diff --git a/tests/Endpoints/CryptoTest.php b/tests/Endpoints/CryptoTest.php new file mode 100644 index 0000000..747d8a7 --- /dev/null +++ b/tests/Endpoints/CryptoTest.php @@ -0,0 +1,6 @@ + Date: Wed, 22 May 2019 10:28:13 -0500 Subject: [PATCH 22/58] work on crypto tests --- src/Endpoints/Crypto.php | 2 +- tests/Endpoints/CryptoTest.php | 66 ++++++++++++++++++- tests/Fixtures/Endpoints/getSSLSetting.json | 11 ++++ .../Endpoints/getSSLVerificationStatus.json | 16 +++++ .../Fixtures/Endpoints/updateSSLSetting.json | 11 ++++ 5 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 tests/Fixtures/Endpoints/getSSLSetting.json create mode 100644 tests/Fixtures/Endpoints/getSSLVerificationStatus.json create mode 100644 tests/Fixtures/Endpoints/updateSSLSetting.json diff --git a/src/Endpoints/Crypto.php b/src/Endpoints/Crypto.php index d8077a7..faf30c1 100644 --- a/src/Endpoints/Crypto.php +++ b/src/Endpoints/Crypto.php @@ -44,7 +44,7 @@ class Crypto implements API ); $body = json_decode($return->getBody()); if ($body->result) { - return $body->result; + return $body; } return false; } diff --git a/tests/Endpoints/CryptoTest.php b/tests/Endpoints/CryptoTest.php index 747d8a7..84c0110 100644 --- a/tests/Endpoints/CryptoTest.php +++ b/tests/Endpoints/CryptoTest.php @@ -2,5 +2,69 @@ class CryptoTest extends TestCase { - + public function testGetSSLSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getSSLSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/ssl') + ); + + $zoneSSLSetting = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $zoneSSLSetting->getSSLSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals('off', $result); + } + + public function testGetSSLVerificationStatus() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getSSLVerificationStatus.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/ssl/verification') + ); + + $zoneVerificationStatus = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $zoneVerificationStatus->getSSLVerificationStatus('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertEquals('active', $result->result{0}->certificate_status); + } + + + + + + + public function testUpdateSSLSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateSSLSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/ssl'), + $this->equalTo(['value' => 'full']) + ); + + $zoneSSLSetting = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $zoneSSLSetting->updateSSLSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'full'); + + $this->assertTrue($result); + } + + } diff --git a/tests/Fixtures/Endpoints/getSSLSetting.json b/tests/Fixtures/Endpoints/getSSLSetting.json new file mode 100644 index 0000000..43fa3ee --- /dev/null +++ b/tests/Fixtures/Endpoints/getSSLSetting.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "ssl", + "value": "off", + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getSSLVerificationStatus.json b/tests/Fixtures/Endpoints/getSSLVerificationStatus.json new file mode 100644 index 0000000..5e2a4f3 --- /dev/null +++ b/tests/Fixtures/Endpoints/getSSLVerificationStatus.json @@ -0,0 +1,16 @@ +{ + "result": [ + { + "certificate_status": "active", + "verification_type": "cname", + "verification_status": true, + "verification_info": { + "record_name": "b3b90cfedd89a3e487d3e383c56c4267.example.com", + "record_target": "6979be7e4cfc9e5c603e31df7efac9cc60fee82d.comodoca.com" + }, + "brand_check": false, + "validation_method": "txt", + "cert_pack_uuid": "a77f8bd7-3b47-46b4-a6f1-75cf98109948" + } + ] +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateSSLSetting.json b/tests/Fixtures/Endpoints/updateSSLSetting.json new file mode 100644 index 0000000..43fa3ee --- /dev/null +++ b/tests/Fixtures/Endpoints/updateSSLSetting.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "ssl", + "value": "off", + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file From fb9d75d94a043b815187a19998b4d953cfae4a78 Mon Sep 17 00:00:00 2001 From: Michael Markoski Date: Tue, 21 May 2019 16:02:08 -0500 Subject: [PATCH 23/58] Add Crypto endpoints to crypto.php, update TLS.php add php docs for methods add test class work on crypto tests add tls tests finish crypto tests update doc returns add type to parameter --- src/Endpoints/Crypto.php | 233 ++++++++++++++++++ src/Endpoints/TLS.php | 109 ++++---- tests/Endpoints/CryptoTest.php | 220 +++++++++++++++++ tests/Endpoints/TLSTest.php | 51 +++- .../Endpoints/getHTTPSRedirectSetting.json | 6 + .../Endpoints/getHTTPSRewritesSetting.json | 6 + .../Endpoints/getOnionRoutingSetting.json | 6 + .../getOpportunisticEncryptionSetting.json | 11 + tests/Fixtures/Endpoints/getSSLSetting.json | 11 + .../Endpoints/getSSLVerificationStatus.json | 16 ++ .../Fixtures/Endpoints/getTLSClientAuth.json | 11 + .../Endpoints/updateHTTPSRedirectSetting.json | 6 + .../Endpoints/updateHTTPSRewritesSetting.json | 6 + .../Endpoints/updateOnionRoutingSetting.json | 6 + .../updateOpportunisticEncryptionSetting.json | 11 + .../Fixtures/Endpoints/updateSSLSetting.json | 11 + .../Endpoints/updateTLSClientAuth.json | 11 + 17 files changed, 666 insertions(+), 65 deletions(-) create mode 100644 src/Endpoints/Crypto.php create mode 100644 tests/Endpoints/CryptoTest.php create mode 100644 tests/Fixtures/Endpoints/getHTTPSRedirectSetting.json create mode 100644 tests/Fixtures/Endpoints/getHTTPSRewritesSetting.json create mode 100644 tests/Fixtures/Endpoints/getOnionRoutingSetting.json create mode 100644 tests/Fixtures/Endpoints/getOpportunisticEncryptionSetting.json create mode 100644 tests/Fixtures/Endpoints/getSSLSetting.json create mode 100644 tests/Fixtures/Endpoints/getSSLVerificationStatus.json create mode 100644 tests/Fixtures/Endpoints/getTLSClientAuth.json create mode 100644 tests/Fixtures/Endpoints/updateHTTPSRedirectSetting.json create mode 100644 tests/Fixtures/Endpoints/updateHTTPSRewritesSetting.json create mode 100644 tests/Fixtures/Endpoints/updateOnionRoutingSetting.json create mode 100644 tests/Fixtures/Endpoints/updateOpportunisticEncryptionSetting.json create mode 100644 tests/Fixtures/Endpoints/updateSSLSetting.json create mode 100644 tests/Fixtures/Endpoints/updateTLSClientAuth.json diff --git a/src/Endpoints/Crypto.php b/src/Endpoints/Crypto.php new file mode 100644 index 0000000..a5a03f3 --- /dev/null +++ b/src/Endpoints/Crypto.php @@ -0,0 +1,233 @@ +adapter = $adapter; + } + + /** + * Get the SSL setting for the zone + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getSSLSetting(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/ssl' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body->result->value; + } + return false; + } + + /** + * Get SSL Verification Info for a Zone + * + * @param string $zoneID The ID of the zone + * @return array|false + */ + public function getSSLVerificationStatus(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/ssl/verification' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body; + } + return false; + } + + /** + * Get the Opportunistic Encryption feature for a zone. + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getOpportunisticEncryptionSetting(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/opportunistic_encryption' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body->result->value; + } + return false; + } + + /** + * Get the Onion Routing feature for a zone. + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getOnionRoutingSetting(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/opportunistic_onion' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body->result; + } + return false; + } + + /** + * Get the HTTPS Redirect setting for the zone + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getHTTPSRedirectSetting(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/always_use_https' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body->result; + } + return false; + } + + /** + * Get the HTTPS Rewrite setting for the zone + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getHTTPSRewritesSetting(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/automatic_https_rewrites' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body->result; + } + return false; + } + + /** + * Update the SSL setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateSSLSetting(string $zoneID, string $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/ssl', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + if (isset($body->success) && $body->success == true) { + return true; + } + return false; + } + + /** + * Update the HTTPS Redirect setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateHTTPSRedirectSetting(string $zoneID, string $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/always_use_https', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + if (isset($body->success) && $body->success == true) { + return true; + } + return false; + } + + /** + * Update the HTTPS Rewrite setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateHTTPSRewritesSetting(string $zoneID, string $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/automatic_https_rewrites', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + if (isset($body->success) && $body->success == true) { + return true; + } + return false; + } + + /** + * Update the Oppurtunistic Encryption setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateOpportunisticEncryptionSetting(string $zoneID, string $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/opportunistic_encryption', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + if (isset($body->success) && $body->success == true) { + return true; + } + return false; + } + + /** + * Update the Onion Routing setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateOnionRoutingSetting(string $zoneID, string $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/opportunistic_onion', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + if (isset($body->success) && $body->success == true) { + return true; + } + return false; + } +} diff --git a/src/Endpoints/TLS.php b/src/Endpoints/TLS.php index 46c960e..b6ca671 100644 --- a/src/Endpoints/TLS.php +++ b/src/Endpoints/TLS.php @@ -19,6 +19,30 @@ class TLS implements API $this->adapter = $adapter; } + /** + * Get the TLS Client Auth setting for the zone + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getTLSClientAuth($zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/tls_client_auth' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body->result->value; + } + return false; + } + + /** + * Enable TLS 1.3 for the zone + * + * @param string $zoneID The ID of the zone + * @return bool + */ public function enableTLS13($zoneID) { $return = $this->adapter->patch( @@ -26,14 +50,18 @@ class TLS implements API ['value' => 'on'] ); $body = json_decode($return->getBody()); - - if ($body->success) { + if (isset($body->success) && $body->success == true) { return true; } - return false; } + /** + * Disable TLS 1.3 for the zone + * + * @param string $zoneID The ID of the zone + * @return bool + */ public function disableTLS13($zoneID) { $return = $this->adapter->patch( @@ -41,15 +69,19 @@ class TLS implements API ['value' => 'off'] ); $body = json_decode($return->getBody()); - - if ($body->success) { + if (isset($body->success) && $body->success == true) { return true; } - return false; } - + /** + * Update the minimum TLS version setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $minimumVersion The version to update to + * @return bool + */ public function changeMinimumTLSVersion($zoneID, $minimumVersion) { $return = $this->adapter->patch( @@ -59,73 +91,32 @@ class TLS implements API ] ); $body = json_decode($return->getBody()); - - if ($body->success) { + if (isset($body->success) && $body->success == true) { return true; } - return false; } - public function getHTTPSRedirectSetting($zoneID) - { - $return = $this->adapter->get( - 'zones/' . $zoneID . '/settings/always_use_https' - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return $body->result->value; - } - - return false; - } - - public function getHTTPSRewritesSetting($zoneID) - { - $return = $this->adapter->get( - 'zones/' . $zoneID . '/settings/automatic_https_rewrites' - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return $body->result->value; - } - - return false; - } - - public function updateHTTPSRedirectStatus($zoneID, $value) + /** + * Update the TLS Client Auth setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateTLSClientAuth($zoneID, $value) { $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/always_use_https', + 'zones/' . $zoneID . '/settings/tls_client_auth', [ 'value' => $value, ] ); $body = json_decode($return->getBody()); - - if ($body->success) { + if (isset($body->success) && $body->success == true) { return true; } - return false; } - public function updateHTTPSRewritesStatus($zoneID, $value) - { - $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/automatic_https_rewrites', - [ - 'value' => $value, - ] - ); - $body = json_decode($return->getBody()); - - if ($body->success) { - return true; - } - - return false; - } } diff --git a/tests/Endpoints/CryptoTest.php b/tests/Endpoints/CryptoTest.php new file mode 100644 index 0000000..5019308 --- /dev/null +++ b/tests/Endpoints/CryptoTest.php @@ -0,0 +1,220 @@ +getPsr7JsonResponseForFixture('Endpoints/getSSLSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/ssl') + ); + + $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $cryptoMock->getSSLSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals('off', $result); + } + + public function testGetSSLVerificationStatus() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getSSLVerificationStatus.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/ssl/verification') + ); + + $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $cryptoMock->getSSLVerificationStatus('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertEquals('active', $result->result{0}->certificate_status); + } + + public function testGetOpportunisticEncryptionSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getOpportunisticEncryptionSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/opportunistic_encryption') + ); + + $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $cryptoMock->getOpportunisticEncryptionSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals('off', $result); + } + + public function testGetOnionRoutingSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getOnionRoutingSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/opportunistic_onion') + ); + + $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $cryptoMock->getOnionRoutingSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals('off', $result); + } + + public function testGetHTTPSRedirectSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getHTTPSRedirectSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/always_use_https') + ); + + $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $cryptoMock->getHTTPSRedirectSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals('off', $result); + } + + public function testGetHTTPSRewritesSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getHTTPSRewritesSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/automatic_https_rewrites') + ); + + $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $cryptoMock->getHTTPSRewritesSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals('off', $result); + } + + public function testUpdateSSLSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateSSLSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/ssl'), + $this->equalTo(['value' => 'full']) + ); + + $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $cryptoMock->updateSSLSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'full'); + + $this->assertTrue($result); + } + + public function testUpdateHTTPSRedirectSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateHTTPSRedirectSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/always_use_https'), + $this->equalTo(['value' => 'off']) + ); + + $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $cryptoMock->updateHTTPSRedirectSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'off'); + + $this->assertTrue($result); + } + + public function testUpdateHTTPSRewritesSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateHTTPSRewritesSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/automatic_https_rewrites'), + $this->equalTo(['value' => 'off']) + ); + + $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $cryptoMock->updateHTTPSRewritesSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'off'); + + $this->assertTrue($result); + } + + public function testUpdateOpportunisticEncryptionSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateOpportunisticEncryptionSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/opportunistic_encryption'), + $this->equalTo(['value' => 'off']) + ); + + $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $cryptoMock->updateOpportunisticEncryptionSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'off'); + + $this->assertTrue($result); + } + + public function testUpdateOnionRoutingSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateOnionRoutingSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/opportunistic_onion'), + $this->equalTo(['value' => 'off']) + ); + + $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); + $result = $cryptoMock->updateOnionRoutingSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'off'); + + $this->assertTrue($result); + } + +} diff --git a/tests/Endpoints/TLSTest.php b/tests/Endpoints/TLSTest.php index d17aabb..cf0018c 100644 --- a/tests/Endpoints/TLSTest.php +++ b/tests/Endpoints/TLSTest.php @@ -9,6 +9,25 @@ class TLSTest extends TestCase { + public function testGetTLSClientAuth() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getTLSClientAuth.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/tls_client_auth') + ); + + $tlsMock = new \Cloudflare\API\Endpoints\TLS($mock); + $result = $tlsMock->getTLSClientAuth('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals('off', $result); + } + public function testEnableTLS13() { $response = $this->getPsr7JsonResponseForFixture('Endpoints/enableTLS13.json'); @@ -23,8 +42,8 @@ class TLSTest extends TestCase $this->equalTo(['value' => 'on']) ); - $zoneTLSSettings = new \Cloudflare\API\Endpoints\TLS($mock); - $result = $zoneTLSSettings->enableTLS13('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', true); + $tlsMock = new \Cloudflare\API\Endpoints\TLS($mock); + $result = $tlsMock->enableTLS13('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', true); $this->assertTrue($result); } @@ -43,8 +62,8 @@ class TLSTest extends TestCase $this->equalTo(['value' => 'off']) ); - $zoneTLSSettings = new \Cloudflare\API\Endpoints\TLS($mock); - $result = $zoneTLSSettings->disableTLS13('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', true); + $tlsMock = new \Cloudflare\API\Endpoints\TLS($mock); + $result = $tlsMock->disableTLS13('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', true); $this->assertTrue($result); } @@ -63,8 +82,28 @@ class TLSTest extends TestCase $this->equalTo(['value' => '1.1']) ); - $zoneTLSSettings = new \Cloudflare\API\Endpoints\TLS($mock); - $result = $zoneTLSSettings->changeMinimumTLSVersion('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', '1.1'); + $tlsMock = new \Cloudflare\API\Endpoints\TLS($mock); + $result = $tlsMock->changeMinimumTLSVersion('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', '1.1'); + + $this->assertTrue($result); + } + + public function testUpdateTLSClientAuth() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateTLSClientAuth.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/tls_client_auth'), + $this->equalTo(['value' => 'off']) + ); + + $tlsMock = new \Cloudflare\API\Endpoints\TLS($mock); + $result = $tlsMock->updateTLSClientAuth('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'off'); $this->assertTrue($result); } diff --git a/tests/Fixtures/Endpoints/getHTTPSRedirectSetting.json b/tests/Fixtures/Endpoints/getHTTPSRedirectSetting.json new file mode 100644 index 0000000..878457d --- /dev/null +++ b/tests/Fixtures/Endpoints/getHTTPSRedirectSetting.json @@ -0,0 +1,6 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": "off" +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getHTTPSRewritesSetting.json b/tests/Fixtures/Endpoints/getHTTPSRewritesSetting.json new file mode 100644 index 0000000..878457d --- /dev/null +++ b/tests/Fixtures/Endpoints/getHTTPSRewritesSetting.json @@ -0,0 +1,6 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": "off" +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getOnionRoutingSetting.json b/tests/Fixtures/Endpoints/getOnionRoutingSetting.json new file mode 100644 index 0000000..878457d --- /dev/null +++ b/tests/Fixtures/Endpoints/getOnionRoutingSetting.json @@ -0,0 +1,6 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": "off" +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getOpportunisticEncryptionSetting.json b/tests/Fixtures/Endpoints/getOpportunisticEncryptionSetting.json new file mode 100644 index 0000000..b5df0a4 --- /dev/null +++ b/tests/Fixtures/Endpoints/getOpportunisticEncryptionSetting.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "opportunistic_encryption", + "value": "off", + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getSSLSetting.json b/tests/Fixtures/Endpoints/getSSLSetting.json new file mode 100644 index 0000000..43fa3ee --- /dev/null +++ b/tests/Fixtures/Endpoints/getSSLSetting.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "ssl", + "value": "off", + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getSSLVerificationStatus.json b/tests/Fixtures/Endpoints/getSSLVerificationStatus.json new file mode 100644 index 0000000..5e2a4f3 --- /dev/null +++ b/tests/Fixtures/Endpoints/getSSLVerificationStatus.json @@ -0,0 +1,16 @@ +{ + "result": [ + { + "certificate_status": "active", + "verification_type": "cname", + "verification_status": true, + "verification_info": { + "record_name": "b3b90cfedd89a3e487d3e383c56c4267.example.com", + "record_target": "6979be7e4cfc9e5c603e31df7efac9cc60fee82d.comodoca.com" + }, + "brand_check": false, + "validation_method": "txt", + "cert_pack_uuid": "a77f8bd7-3b47-46b4-a6f1-75cf98109948" + } + ] +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getTLSClientAuth.json b/tests/Fixtures/Endpoints/getTLSClientAuth.json new file mode 100644 index 0000000..fac9fa5 --- /dev/null +++ b/tests/Fixtures/Endpoints/getTLSClientAuth.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "tls_client_auth", + "value": "off", + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateHTTPSRedirectSetting.json b/tests/Fixtures/Endpoints/updateHTTPSRedirectSetting.json new file mode 100644 index 0000000..878457d --- /dev/null +++ b/tests/Fixtures/Endpoints/updateHTTPSRedirectSetting.json @@ -0,0 +1,6 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": "off" +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateHTTPSRewritesSetting.json b/tests/Fixtures/Endpoints/updateHTTPSRewritesSetting.json new file mode 100644 index 0000000..878457d --- /dev/null +++ b/tests/Fixtures/Endpoints/updateHTTPSRewritesSetting.json @@ -0,0 +1,6 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": "off" +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateOnionRoutingSetting.json b/tests/Fixtures/Endpoints/updateOnionRoutingSetting.json new file mode 100644 index 0000000..878457d --- /dev/null +++ b/tests/Fixtures/Endpoints/updateOnionRoutingSetting.json @@ -0,0 +1,6 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": "off" +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateOpportunisticEncryptionSetting.json b/tests/Fixtures/Endpoints/updateOpportunisticEncryptionSetting.json new file mode 100644 index 0000000..e8077c9 --- /dev/null +++ b/tests/Fixtures/Endpoints/updateOpportunisticEncryptionSetting.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "opportunistic_encryption", + "value": "on", + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateSSLSetting.json b/tests/Fixtures/Endpoints/updateSSLSetting.json new file mode 100644 index 0000000..43fa3ee --- /dev/null +++ b/tests/Fixtures/Endpoints/updateSSLSetting.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "ssl", + "value": "off", + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateTLSClientAuth.json b/tests/Fixtures/Endpoints/updateTLSClientAuth.json new file mode 100644 index 0000000..fac9fa5 --- /dev/null +++ b/tests/Fixtures/Endpoints/updateTLSClientAuth.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "tls_client_auth", + "value": "off", + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file From 79ca15c066f8278b902b4f6afe9547647be4230d Mon Sep 17 00:00:00 2001 From: Michael Markoski Date: Sat, 25 May 2019 14:59:29 -0500 Subject: [PATCH 24/58] split methods to another class to pass CI test --- src/Endpoints/Crypto.php | 138 ----------------------------- src/Endpoints/SSL.php | 154 +++++++++++++++++++++++++++++++++ tests/Endpoints/CryptoTest.php | 136 ----------------------------- tests/Endpoints/SSLTest.php | 142 ++++++++++++++++++++++++++++++ 4 files changed, 296 insertions(+), 274 deletions(-) create mode 100644 src/Endpoints/SSL.php create mode 100644 tests/Endpoints/SSLTest.php diff --git a/src/Endpoints/Crypto.php b/src/Endpoints/Crypto.php index a5a03f3..94df3bb 100644 --- a/src/Endpoints/Crypto.php +++ b/src/Endpoints/Crypto.php @@ -13,42 +13,6 @@ class Crypto implements API $this->adapter = $adapter; } - /** - * Get the SSL setting for the zone - * - * @param string $zoneID The ID of the zone - * @return string|false - */ - public function getSSLSetting(string $zoneID) - { - $return = $this->adapter->get( - 'zones/' . $zoneID . '/settings/ssl' - ); - $body = json_decode($return->getBody()); - if (isset($body->result)) { - return $body->result->value; - } - return false; - } - - /** - * Get SSL Verification Info for a Zone - * - * @param string $zoneID The ID of the zone - * @return array|false - */ - public function getSSLVerificationStatus(string $zoneID) - { - $return = $this->adapter->get( - 'zones/' . $zoneID . '/ssl/verification' - ); - $body = json_decode($return->getBody()); - if (isset($body->result)) { - return $body; - } - return false; - } - /** * Get the Opportunistic Encryption feature for a zone. * @@ -85,108 +49,6 @@ class Crypto implements API return false; } - /** - * Get the HTTPS Redirect setting for the zone - * - * @param string $zoneID The ID of the zone - * @return string|false - */ - public function getHTTPSRedirectSetting(string $zoneID) - { - $return = $this->adapter->get( - 'zones/' . $zoneID . '/settings/always_use_https' - ); - $body = json_decode($return->getBody()); - if (isset($body->result)) { - return $body->result; - } - return false; - } - - /** - * Get the HTTPS Rewrite setting for the zone - * - * @param string $zoneID The ID of the zone - * @return string|false - */ - public function getHTTPSRewritesSetting(string $zoneID) - { - $return = $this->adapter->get( - 'zones/' . $zoneID . '/settings/automatic_https_rewrites' - ); - $body = json_decode($return->getBody()); - if (isset($body->result)) { - return $body->result; - } - return false; - } - - /** - * Update the SSL setting for the zone - * - * @param string $zoneID The ID of the zone - * @param string $value The value of the zone setting - * @return bool - */ - public function updateSSLSetting(string $zoneID, string $value) - { - $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/ssl', - [ - 'value' => $value, - ] - ); - $body = json_decode($return->getBody()); - if (isset($body->success) && $body->success == true) { - return true; - } - return false; - } - - /** - * Update the HTTPS Redirect setting for the zone - * - * @param string $zoneID The ID of the zone - * @param string $value The value of the zone setting - * @return bool - */ - public function updateHTTPSRedirectSetting(string $zoneID, string $value) - { - $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/always_use_https', - [ - 'value' => $value, - ] - ); - $body = json_decode($return->getBody()); - if (isset($body->success) && $body->success == true) { - return true; - } - return false; - } - - /** - * Update the HTTPS Rewrite setting for the zone - * - * @param string $zoneID The ID of the zone - * @param string $value The value of the zone setting - * @return bool - */ - public function updateHTTPSRewritesSetting(string $zoneID, string $value) - { - $return = $this->adapter->patch( - 'zones/' . $zoneID . '/settings/automatic_https_rewrites', - [ - 'value' => $value, - ] - ); - $body = json_decode($return->getBody()); - if (isset($body->success) && $body->success == true) { - return true; - } - return false; - } - /** * Update the Oppurtunistic Encryption setting for the zone * diff --git a/src/Endpoints/SSL.php b/src/Endpoints/SSL.php new file mode 100644 index 0000000..50d56b3 --- /dev/null +++ b/src/Endpoints/SSL.php @@ -0,0 +1,154 @@ +adapter = $adapter; + } + + /** + * Get the SSL setting for the zone + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getSSLSetting(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/ssl' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body->result->value; + } + return false; + } + + /** + * Get SSL Verification Info for a Zone + * + * @param string $zoneID The ID of the zone + * @return array|false + */ + public function getSSLVerificationStatus(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/ssl/verification' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body; + } + return false; + } + + /** + * Get the HTTPS Redirect setting for the zone + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getHTTPSRedirectSetting(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/always_use_https' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body->result; + } + return false; + } + + /** + * Get the HTTPS Rewrite setting for the zone + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getHTTPSRewritesSetting(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/automatic_https_rewrites' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body->result; + } + return false; + } + + /** + * Update the SSL setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateSSLSetting(string $zoneID, string $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/ssl', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + if (isset($body->success) && $body->success == true) { + return true; + } + return false; + } + + /** + * Update the HTTPS Redirect setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateHTTPSRedirectSetting(string $zoneID, string $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/always_use_https', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + if (isset($body->success) && $body->success == true) { + return true; + } + return false; + } + + /** + * Update the HTTPS Rewrite setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateHTTPSRewritesSetting(string $zoneID, string $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/automatic_https_rewrites', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + if (isset($body->success) && $body->success == true) { + return true; + } + return false; + } + +} diff --git a/tests/Endpoints/CryptoTest.php b/tests/Endpoints/CryptoTest.php index 5019308..a798dc1 100644 --- a/tests/Endpoints/CryptoTest.php +++ b/tests/Endpoints/CryptoTest.php @@ -2,44 +2,6 @@ class CryptoTest extends TestCase { - public function testGetSSLSetting() - { - $response = $this->getPsr7JsonResponseForFixture('Endpoints/getSSLSetting.json'); - - $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); - $mock->method('get')->willReturn($response); - - $mock->expects($this->once()) - ->method('get') - ->with( - $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/ssl') - ); - - $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); - $result = $cryptoMock->getSSLSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); - - $this->assertEquals('off', $result); - } - - public function testGetSSLVerificationStatus() - { - $response = $this->getPsr7JsonResponseForFixture('Endpoints/getSSLVerificationStatus.json'); - - $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); - $mock->method('get')->willReturn($response); - - $mock->expects($this->once()) - ->method('get') - ->with( - $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/ssl/verification') - ); - - $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); - $result = $cryptoMock->getSSLVerificationStatus('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); - - $this->assertObjectHasAttribute('result', $result); - $this->assertEquals('active', $result->result{0}->certificate_status); - } public function testGetOpportunisticEncryptionSetting() { @@ -79,104 +41,6 @@ class CryptoTest extends TestCase $this->assertEquals('off', $result); } - public function testGetHTTPSRedirectSetting() - { - $response = $this->getPsr7JsonResponseForFixture('Endpoints/getHTTPSRedirectSetting.json'); - - $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); - $mock->method('get')->willReturn($response); - - $mock->expects($this->once()) - ->method('get') - ->with( - $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/always_use_https') - ); - - $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); - $result = $cryptoMock->getHTTPSRedirectSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); - - $this->assertEquals('off', $result); - } - - public function testGetHTTPSRewritesSetting() - { - $response = $this->getPsr7JsonResponseForFixture('Endpoints/getHTTPSRewritesSetting.json'); - - $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); - $mock->method('get')->willReturn($response); - - $mock->expects($this->once()) - ->method('get') - ->with( - $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/automatic_https_rewrites') - ); - - $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); - $result = $cryptoMock->getHTTPSRewritesSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); - - $this->assertEquals('off', $result); - } - - public function testUpdateSSLSetting() - { - $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateSSLSetting.json'); - - $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); - $mock->method('patch')->willReturn($response); - - $mock->expects($this->once()) - ->method('patch') - ->with( - $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/ssl'), - $this->equalTo(['value' => 'full']) - ); - - $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); - $result = $cryptoMock->updateSSLSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'full'); - - $this->assertTrue($result); - } - - public function testUpdateHTTPSRedirectSetting() - { - $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateHTTPSRedirectSetting.json'); - - $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); - $mock->method('patch')->willReturn($response); - - $mock->expects($this->once()) - ->method('patch') - ->with( - $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/always_use_https'), - $this->equalTo(['value' => 'off']) - ); - - $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); - $result = $cryptoMock->updateHTTPSRedirectSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'off'); - - $this->assertTrue($result); - } - - public function testUpdateHTTPSRewritesSetting() - { - $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateHTTPSRewritesSetting.json'); - - $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); - $mock->method('patch')->willReturn($response); - - $mock->expects($this->once()) - ->method('patch') - ->with( - $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/automatic_https_rewrites'), - $this->equalTo(['value' => 'off']) - ); - - $cryptoMock = new \Cloudflare\API\Endpoints\Crypto($mock); - $result = $cryptoMock->updateHTTPSRewritesSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'off'); - - $this->assertTrue($result); - } - public function testUpdateOpportunisticEncryptionSetting() { $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateOpportunisticEncryptionSetting.json'); diff --git a/tests/Endpoints/SSLTest.php b/tests/Endpoints/SSLTest.php new file mode 100644 index 0000000..2f0ca62 --- /dev/null +++ b/tests/Endpoints/SSLTest.php @@ -0,0 +1,142 @@ +getPsr7JsonResponseForFixture('Endpoints/getSSLSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/ssl') + ); + + $sslMock = new \Cloudflare\API\Endpoints\SSL($mock); + $result = $sslMock->getSSLSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals('off', $result); + } + + public function testGetSSLVerificationStatus() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getSSLVerificationStatus.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/ssl/verification') + ); + + $sslMock = new \Cloudflare\API\Endpoints\SSL($mock); + $result = $sslMock->getSSLVerificationStatus('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertObjectHasAttribute('result', $result); + $this->assertEquals('active', $result->result{0}->certificate_status); + } + + public function testGetHTTPSRedirectSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getHTTPSRedirectSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/always_use_https') + ); + + $sslMock = new \Cloudflare\API\Endpoints\SSL($mock); + $result = $sslMock->getHTTPSRedirectSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals('off', $result); + } + + public function testGetHTTPSRewritesSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getHTTPSRewritesSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/automatic_https_rewrites') + ); + + $sslMock = new \Cloudflare\API\Endpoints\SSL($mock); + $result = $sslMock->getHTTPSRewritesSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals('off', $result); + } + + public function testUpdateSSLSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateSSLSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/ssl'), + $this->equalTo(['value' => 'full']) + ); + + $sslMock = new \Cloudflare\API\Endpoints\SSL($mock); + $result = $sslMock->updateSSLSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'full'); + + $this->assertTrue($result); + } + + public function testUpdateHTTPSRedirectSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateHTTPSRedirectSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/always_use_https'), + $this->equalTo(['value' => 'off']) + ); + + $sslMock = new \Cloudflare\API\Endpoints\SSL($mock); + $result = $sslMock->updateHTTPSRedirectSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'off'); + + $this->assertTrue($result); + } + + public function testUpdateHTTPSRewritesSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateHTTPSRewritesSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/automatic_https_rewrites'), + $this->equalTo(['value' => 'off']) + ); + + $sslMock = new \Cloudflare\API\Endpoints\SSL($mock); + $result = $sslMock->updateHTTPSRewritesSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'off'); + + $this->assertTrue($result); + } + +} From 1764856f5b420990f6991221705bdfdc75d3f34d Mon Sep 17 00:00:00 2001 From: Michael Markoski Date: Sat, 25 May 2019 15:25:53 -0500 Subject: [PATCH 25/58] remove whitespace after doc return --- src/Endpoints/Crypto.php | 8 ++++---- src/Endpoints/SSL.php | 14 +++++++------- src/Endpoints/TLS.php | 8 ++++---- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Endpoints/Crypto.php b/src/Endpoints/Crypto.php index 94df3bb..e785c54 100644 --- a/src/Endpoints/Crypto.php +++ b/src/Endpoints/Crypto.php @@ -17,7 +17,7 @@ class Crypto implements API * Get the Opportunistic Encryption feature for a zone. * * @param string $zoneID The ID of the zone - * @return string|false + * @return string|false */ public function getOpportunisticEncryptionSetting(string $zoneID) { @@ -35,7 +35,7 @@ class Crypto implements API * Get the Onion Routing feature for a zone. * * @param string $zoneID The ID of the zone - * @return string|false + * @return string|false */ public function getOnionRoutingSetting(string $zoneID) { @@ -54,7 +54,7 @@ class Crypto implements API * * @param string $zoneID The ID of the zone * @param string $value The value of the zone setting - * @return bool + * @return bool */ public function updateOpportunisticEncryptionSetting(string $zoneID, string $value) { @@ -76,7 +76,7 @@ class Crypto implements API * * @param string $zoneID The ID of the zone * @param string $value The value of the zone setting - * @return bool + * @return bool */ public function updateOnionRoutingSetting(string $zoneID, string $value) { diff --git a/src/Endpoints/SSL.php b/src/Endpoints/SSL.php index 50d56b3..ae3c859 100644 --- a/src/Endpoints/SSL.php +++ b/src/Endpoints/SSL.php @@ -17,7 +17,7 @@ class SSL implements API * Get the SSL setting for the zone * * @param string $zoneID The ID of the zone - * @return string|false + * @return string|false */ public function getSSLSetting(string $zoneID) { @@ -35,7 +35,7 @@ class SSL implements API * Get SSL Verification Info for a Zone * * @param string $zoneID The ID of the zone - * @return array|false + * @return array|false */ public function getSSLVerificationStatus(string $zoneID) { @@ -53,7 +53,7 @@ class SSL implements API * Get the HTTPS Redirect setting for the zone * * @param string $zoneID The ID of the zone - * @return string|false + * @return string|false */ public function getHTTPSRedirectSetting(string $zoneID) { @@ -71,7 +71,7 @@ class SSL implements API * Get the HTTPS Rewrite setting for the zone * * @param string $zoneID The ID of the zone - * @return string|false + * @return string|false */ public function getHTTPSRewritesSetting(string $zoneID) { @@ -90,7 +90,7 @@ class SSL implements API * * @param string $zoneID The ID of the zone * @param string $value The value of the zone setting - * @return bool + * @return bool */ public function updateSSLSetting(string $zoneID, string $value) { @@ -112,7 +112,7 @@ class SSL implements API * * @param string $zoneID The ID of the zone * @param string $value The value of the zone setting - * @return bool + * @return bool */ public function updateHTTPSRedirectSetting(string $zoneID, string $value) { @@ -134,7 +134,7 @@ class SSL implements API * * @param string $zoneID The ID of the zone * @param string $value The value of the zone setting - * @return bool + * @return bool */ public function updateHTTPSRewritesSetting(string $zoneID, string $value) { diff --git a/src/Endpoints/TLS.php b/src/Endpoints/TLS.php index b6ca671..ec08ed2 100644 --- a/src/Endpoints/TLS.php +++ b/src/Endpoints/TLS.php @@ -41,7 +41,7 @@ class TLS implements API * Enable TLS 1.3 for the zone * * @param string $zoneID The ID of the zone - * @return bool + * @return bool */ public function enableTLS13($zoneID) { @@ -60,7 +60,7 @@ class TLS implements API * Disable TLS 1.3 for the zone * * @param string $zoneID The ID of the zone - * @return bool + * @return bool */ public function disableTLS13($zoneID) { @@ -80,7 +80,7 @@ class TLS implements API * * @param string $zoneID The ID of the zone * @param string $minimumVersion The version to update to - * @return bool + * @return bool */ public function changeMinimumTLSVersion($zoneID, $minimumVersion) { @@ -102,7 +102,7 @@ class TLS implements API * * @param string $zoneID The ID of the zone * @param string $value The value of the zone setting - * @return bool + * @return bool */ public function updateTLSClientAuth($zoneID, $value) { From c44a26fa35952fbd5099988434cf2689ecc9ccd7 Mon Sep 17 00:00:00 2001 From: Michael Markoski Date: Sat, 25 May 2019 15:29:12 -0500 Subject: [PATCH 26/58] remove whitespace at class end --- src/Endpoints/Crypto.php | 2 +- src/Endpoints/SSL.php | 3 +-- src/Endpoints/TLS.php | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Endpoints/Crypto.php b/src/Endpoints/Crypto.php index e785c54..7c85e2a 100644 --- a/src/Endpoints/Crypto.php +++ b/src/Endpoints/Crypto.php @@ -92,4 +92,4 @@ class Crypto implements API } return false; } -} +} \ No newline at end of file diff --git a/src/Endpoints/SSL.php b/src/Endpoints/SSL.php index ae3c859..53f6c0f 100644 --- a/src/Endpoints/SSL.php +++ b/src/Endpoints/SSL.php @@ -150,5 +150,4 @@ class SSL implements API } return false; } - -} +} \ No newline at end of file diff --git a/src/Endpoints/TLS.php b/src/Endpoints/TLS.php index ec08ed2..16e5137 100644 --- a/src/Endpoints/TLS.php +++ b/src/Endpoints/TLS.php @@ -118,5 +118,4 @@ class TLS implements API } return false; } - -} +} \ No newline at end of file From 45834c070993128d034d29cda029eebf70d37357 Mon Sep 17 00:00:00 2001 From: Michael Markoski Date: Sat, 25 May 2019 15:32:04 -0500 Subject: [PATCH 27/58] add new line after class --- src/Endpoints/Crypto.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Endpoints/Crypto.php b/src/Endpoints/Crypto.php index 7c85e2a..e785c54 100644 --- a/src/Endpoints/Crypto.php +++ b/src/Endpoints/Crypto.php @@ -92,4 +92,4 @@ class Crypto implements API } return false; } -} \ No newline at end of file +} From 21b3f20fb1a39109ca7b8d74789c3b70212c0644 Mon Sep 17 00:00:00 2001 From: Michael Markoski Date: Sat, 25 May 2019 15:32:18 -0500 Subject: [PATCH 28/58] add new line after class --- src/Endpoints/SSL.php | 2 +- src/Endpoints/TLS.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Endpoints/SSL.php b/src/Endpoints/SSL.php index 53f6c0f..fea524b 100644 --- a/src/Endpoints/SSL.php +++ b/src/Endpoints/SSL.php @@ -150,4 +150,4 @@ class SSL implements API } return false; } -} \ No newline at end of file +} diff --git a/src/Endpoints/TLS.php b/src/Endpoints/TLS.php index 16e5137..8519896 100644 --- a/src/Endpoints/TLS.php +++ b/src/Endpoints/TLS.php @@ -118,4 +118,4 @@ class TLS implements API } return false; } -} \ No newline at end of file +} From 31453d81840d2c8a5009b3b78908fa7b36c6479a Mon Sep 17 00:00:00 2001 From: Michael Markoski Date: Sat, 25 May 2019 15:36:29 -0500 Subject: [PATCH 29/58] remove new line --- tests/Endpoints/CryptoTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Endpoints/CryptoTest.php b/tests/Endpoints/CryptoTest.php index a798dc1..39dbe5e 100644 --- a/tests/Endpoints/CryptoTest.php +++ b/tests/Endpoints/CryptoTest.php @@ -2,7 +2,6 @@ class CryptoTest extends TestCase { - public function testGetOpportunisticEncryptionSetting() { $response = $this->getPsr7JsonResponseForFixture('Endpoints/getOpportunisticEncryptionSetting.json'); From 5f57b871aa5893b918ebe2e9a52b4eefe3b8bff3 Mon Sep 17 00:00:00 2001 From: Michael Markoski Date: Sat, 25 May 2019 15:37:34 -0500 Subject: [PATCH 30/58] remove new lines --- tests/Endpoints/CryptoTest.php | 1 - tests/Endpoints/SSLTest.php | 1 - 2 files changed, 2 deletions(-) diff --git a/tests/Endpoints/CryptoTest.php b/tests/Endpoints/CryptoTest.php index 39dbe5e..6f617fd 100644 --- a/tests/Endpoints/CryptoTest.php +++ b/tests/Endpoints/CryptoTest.php @@ -79,5 +79,4 @@ class CryptoTest extends TestCase $this->assertTrue($result); } - } diff --git a/tests/Endpoints/SSLTest.php b/tests/Endpoints/SSLTest.php index 2f0ca62..b29a97e 100644 --- a/tests/Endpoints/SSLTest.php +++ b/tests/Endpoints/SSLTest.php @@ -138,5 +138,4 @@ class SSLTest extends TestCase $this->assertTrue($result); } - } From 7a7e6dc364aa885eb3ce59964164b515d0c17720 Mon Sep 17 00:00:00 2001 From: Michael Markoski Date: Sat, 25 May 2019 15:39:30 -0500 Subject: [PATCH 31/58] move array over --- tests/Endpoints/UARulesTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Endpoints/UARulesTest.php b/tests/Endpoints/UARulesTest.php index fec94b5..8406745 100644 --- a/tests/Endpoints/UARulesTest.php +++ b/tests/Endpoints/UARulesTest.php @@ -19,10 +19,10 @@ class UARulesTest extends TestCase ->method('get') ->with( $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/ua_rules'), - $this->equalTo([ - 'page' => 1, - 'per_page' => 20 - ]) + $this->equalTo([ + 'page' => 1, + 'per_page' => 20 + ]) ); $zones = new \Cloudflare\API\Endpoints\UARules($mock); From 246925dec239b578722dbc68f8f29fbd6769a8b8 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 May 2019 22:10:36 -0500 Subject: [PATCH 32/58] add get dns record id method, test --- src/Endpoints/DNS.php | 9 +++++++ tests/Endpoints/DNSTest.php | 19 +++++++++++++++ tests/Fixtures/Endpoints/getRecordId.json | 29 +++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 tests/Fixtures/Endpoints/getRecordId.json diff --git a/src/Endpoints/DNS.php b/src/Endpoints/DNS.php index d06116f..65dc4a4 100644 --- a/src/Endpoints/DNS.php +++ b/src/Endpoints/DNS.php @@ -125,6 +125,15 @@ class DNS implements API return $this->body->result; } + public function getRecordID(string $zoneID, string $type = '', string $name = ''): string + { + $records = $this->listRecords($zoneID, $type, $name); + if (isset($records->result{0}->id)) { + return $records->result{0}->id; + } + return false; + } + public function updateRecordDetails(string $zoneID, string $recordID, array $details): \stdClass { $response = $this->adapter->put('zones/' . $zoneID . '/dns_records/' . $recordID, $details); diff --git a/tests/Endpoints/DNSTest.php b/tests/Endpoints/DNSTest.php index 11c21fa..27f6030 100644 --- a/tests/Endpoints/DNSTest.php +++ b/tests/Endpoints/DNSTest.php @@ -86,6 +86,25 @@ class DNSTest extends TestCase $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $dns->getBody()->result->id); } + public function testGetRecordID() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getRecordId.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records') + ); + + $dns = new \Cloudflare\API\Endpoints\DNS($mock); + $result = $dns->getRecordID('023e105f4ecef8ad9ca31a8372d0c353', 'A', 'example.com'); + + $this->assertEquals('372e67954025e0ba6aaa6d586b9e0b59', $result); + } + public function testUpdateDNSRecord() { $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateDNSRecord.json'); diff --git a/tests/Fixtures/Endpoints/getRecordId.json b/tests/Fixtures/Endpoints/getRecordId.json new file mode 100644 index 0000000..63f92c6 --- /dev/null +++ b/tests/Fixtures/Endpoints/getRecordId.json @@ -0,0 +1,29 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": [ + { + "id": "372e67954025e0ba6aaa6d586b9e0b59", + "type": "A", + "name": "example.com", + "content": "198.51.100.4", + "proxiable": true, + "proxied": false, + "ttl": {}, + "locked": false, + "zone_id": "023e105f4ecef8ad9ca31a8372d0c353", + "zone_name": "example.com", + "created_on": "2014-01-01T05:20:00.12345Z", + "modified_on": "2014-01-01T05:20:00.12345Z", + "data": {} + } + ], + "result_info": { + "page": 1, + "per_page": 20, + "total_pages": 1, + "count": 1, + "total_count": 1 + } +} \ No newline at end of file From ed06650390bad2bb78ad8d683958fa1f66564063 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 May 2019 22:14:00 -0500 Subject: [PATCH 33/58] move array over --- tests/Endpoints/UARulesTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Endpoints/UARulesTest.php b/tests/Endpoints/UARulesTest.php index fec94b5..8406745 100644 --- a/tests/Endpoints/UARulesTest.php +++ b/tests/Endpoints/UARulesTest.php @@ -19,10 +19,10 @@ class UARulesTest extends TestCase ->method('get') ->with( $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/ua_rules'), - $this->equalTo([ - 'page' => 1, - 'per_page' => 20 - ]) + $this->equalTo([ + 'page' => 1, + 'per_page' => 20 + ]) ); $zones = new \Cloudflare\API\Endpoints\UARules($mock); From 598ba5c1d1b586d6c06bd5d9172db5811ca427e8 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 May 2019 22:53:56 -0500 Subject: [PATCH 34/58] add firewall settings endpoints, tests --- src/Endpoints/FirewallSettings.php | 135 ++++++++++++++++++ tests/Endpoints/FirewallSettingsTest.php | 121 ++++++++++++++++ tests/Endpoints/UARulesTest.php | 8 +- .../getBrowserIntegrityCheckSetting.json | 11 ++ .../Endpoints/getChallengeTTLSetting.json | 11 ++ .../Endpoints/getSecurityLevelSetting.json | 11 ++ .../updateBrowserIntegrityCheckSetting.json | 11 ++ .../Endpoints/updateChallengeTTLSetting.json | 11 ++ .../Endpoints/updateSecurityLevelSetting.json | 11 ++ 9 files changed, 326 insertions(+), 4 deletions(-) create mode 100644 src/Endpoints/FirewallSettings.php create mode 100644 tests/Endpoints/FirewallSettingsTest.php create mode 100644 tests/Fixtures/Endpoints/getBrowserIntegrityCheckSetting.json create mode 100644 tests/Fixtures/Endpoints/getChallengeTTLSetting.json create mode 100644 tests/Fixtures/Endpoints/getSecurityLevelSetting.json create mode 100644 tests/Fixtures/Endpoints/updateBrowserIntegrityCheckSetting.json create mode 100644 tests/Fixtures/Endpoints/updateChallengeTTLSetting.json create mode 100644 tests/Fixtures/Endpoints/updateSecurityLevelSetting.json diff --git a/src/Endpoints/FirewallSettings.php b/src/Endpoints/FirewallSettings.php new file mode 100644 index 0000000..5bd9735 --- /dev/null +++ b/src/Endpoints/FirewallSettings.php @@ -0,0 +1,135 @@ +adapter = $adapter; + } + + /** + * Get the Security Level feature for a zone. + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getSecurityLevelSetting(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/security_level' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body->result->value; + } + return false; + } + + /** + * Get the Challenge TTL feature for a zone. + * + * @param string $zoneID The ID of the zone + * @return integer|false + */ + public function getChallengeTTLSetting(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/challenge_ttl' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body->result->value; + } + return false; + } + + /** + * Get the Browser Integrity Check feature for a zone. + * + * @param string $zoneID The ID of the zone + * @return string|false + */ + public function getBrowserIntegrityCheckSetting(string $zoneID) + { + $return = $this->adapter->get( + 'zones/' . $zoneID . '/settings/browser_check' + ); + $body = json_decode($return->getBody()); + if (isset($body->result)) { + return $body->result->value; + } + return false; + } + + /** + * Update the Security Level setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateSecurityLevelSetting(string $zoneID, string $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/security_level', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + if (isset($body->success) && $body->success == true) { + return true; + } + return false; + } + + /** + * Update the Challenge TTL setting for the zone + * + * @param string $zoneID The ID of the zone + * @param integer $value The value of the zone setting + * @return bool + */ + public function updateChallengeTTLSetting(string $zoneID, integer $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/challenge_ttl', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + if (isset($body->success) && $body->success == true) { + return true; + } + return false; + } + + /** + * Update the Browser Integrity Check setting for the zone + * + * @param string $zoneID The ID of the zone + * @param string $value The value of the zone setting + * @return bool + */ + public function updateBrowserIntegrityCheckSetting(string $zoneID, string $value) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/settings/browser_check', + [ + 'value' => $value, + ] + ); + $body = json_decode($return->getBody()); + if (isset($body->success) && $body->success == true) { + return true; + } + return false; + } +} diff --git a/tests/Endpoints/FirewallSettingsTest.php b/tests/Endpoints/FirewallSettingsTest.php new file mode 100644 index 0000000..fc99562 --- /dev/null +++ b/tests/Endpoints/FirewallSettingsTest.php @@ -0,0 +1,121 @@ +getPsr7JsonResponseForFixture('Endpoints/getSecurityLevelSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/security_level') + ); + + $firewallSettingsMock = new \Cloudflare\API\Endpoints\FirewallSettings($mock); + $result = $firewallSettingsMock->getSecurityLevelSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals('medium', $result); + } + + public function testGetChallengeTTLSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getChallengeTTLSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/challenge_ttl') + ); + + $firewallSettingsMock = new \Cloudflare\API\Endpoints\FirewallSettings($mock); + $result = $firewallSettingsMock->getChallengeTTLSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals(1800, $result); + } + + public function testGetBrowserIntegrityCheckSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/getBrowserIntegrityCheckSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('get')->willReturn($response); + + $mock->expects($this->once()) + ->method('get') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/browser_check') + ); + + $firewallSettingsMock = new \Cloudflare\API\Endpoints\FirewallSettings($mock); + $result = $firewallSettingsMock->getBrowserIntegrityCheckSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41'); + + $this->assertEquals('on', $result); + } + + public function testUpdateSecurityLevelSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateSecurityLevelSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/opportunistic_encryption'), + $this->equalTo(['value' => 'medium']) + ); + + $firewallSettingsMock = new \Cloudflare\API\Endpoints\FirewallSettings($mock); + $result = $firewallSettingsMock->updateSecurityLevelSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'medium'); + + $this->assertTrue($result); + } + + public function testUpdateChallengeTTLSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateChallengeTTLSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/challenge_ttl'), + $this->equalTo(['value' => 1800]) + ); + + $firewallSettingsMock = new \Cloudflare\API\Endpoints\FirewallSettings($mock); + $result = $firewallSettingsMock->updateChallengeTTLSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 1800); + + $this->assertTrue($result); + } + + public function testUpdateBrowserIntegrityCheckSetting() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateBrowserIntegrityCheckSetting.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/browser_check'), + $this->equalTo(['value' => 'on']) + ); + + $firewallSettingsMock = new \Cloudflare\API\Endpoints\FirewallSettings($mock); + $result = $firewallSettingsMock->updateBrowserIntegrityCheckSetting('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'on'); + + $this->assertTrue($result); + } +} diff --git a/tests/Endpoints/UARulesTest.php b/tests/Endpoints/UARulesTest.php index fec94b5..8406745 100644 --- a/tests/Endpoints/UARulesTest.php +++ b/tests/Endpoints/UARulesTest.php @@ -19,10 +19,10 @@ class UARulesTest extends TestCase ->method('get') ->with( $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/firewall/ua_rules'), - $this->equalTo([ - 'page' => 1, - 'per_page' => 20 - ]) + $this->equalTo([ + 'page' => 1, + 'per_page' => 20 + ]) ); $zones = new \Cloudflare\API\Endpoints\UARules($mock); diff --git a/tests/Fixtures/Endpoints/getBrowserIntegrityCheckSetting.json b/tests/Fixtures/Endpoints/getBrowserIntegrityCheckSetting.json new file mode 100644 index 0000000..cdfe4ee --- /dev/null +++ b/tests/Fixtures/Endpoints/getBrowserIntegrityCheckSetting.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "browser_check", + "value": "on", + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getChallengeTTLSetting.json b/tests/Fixtures/Endpoints/getChallengeTTLSetting.json new file mode 100644 index 0000000..ee6edf1 --- /dev/null +++ b/tests/Fixtures/Endpoints/getChallengeTTLSetting.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "challenge_ttl", + "value": 1800, + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/getSecurityLevelSetting.json b/tests/Fixtures/Endpoints/getSecurityLevelSetting.json new file mode 100644 index 0000000..bbbf241 --- /dev/null +++ b/tests/Fixtures/Endpoints/getSecurityLevelSetting.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "security_level", + "value": "medium", + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateBrowserIntegrityCheckSetting.json b/tests/Fixtures/Endpoints/updateBrowserIntegrityCheckSetting.json new file mode 100644 index 0000000..cdfe4ee --- /dev/null +++ b/tests/Fixtures/Endpoints/updateBrowserIntegrityCheckSetting.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "browser_check", + "value": "on", + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateChallengeTTLSetting.json b/tests/Fixtures/Endpoints/updateChallengeTTLSetting.json new file mode 100644 index 0000000..ee6edf1 --- /dev/null +++ b/tests/Fixtures/Endpoints/updateChallengeTTLSetting.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "challenge_ttl", + "value": 1800, + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file diff --git a/tests/Fixtures/Endpoints/updateSecurityLevelSetting.json b/tests/Fixtures/Endpoints/updateSecurityLevelSetting.json new file mode 100644 index 0000000..bbbf241 --- /dev/null +++ b/tests/Fixtures/Endpoints/updateSecurityLevelSetting.json @@ -0,0 +1,11 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "security_level", + "value": "medium", + "editable": true, + "modified_on": "2014-01-01T05:20:00.12345Z" + } +} \ No newline at end of file From bd10d7f833ae2e902913bfb0a9f547b255c191d6 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 May 2019 22:58:10 -0500 Subject: [PATCH 35/58] fix security endpoint --- tests/Endpoints/FirewallSettingsTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Endpoints/FirewallSettingsTest.php b/tests/Endpoints/FirewallSettingsTest.php index fc99562..b8bc289 100644 --- a/tests/Endpoints/FirewallSettingsTest.php +++ b/tests/Endpoints/FirewallSettingsTest.php @@ -69,7 +69,7 @@ class FirewallSettingsTest extends TestCase $mock->expects($this->once()) ->method('patch') ->with( - $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/opportunistic_encryption'), + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/settings/security_level'), $this->equalTo(['value' => 'medium']) ); From 7343b7cc461d93141eba7b46c4844601cce0e538 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 May 2019 23:02:40 -0500 Subject: [PATCH 36/58] change param type --- src/Endpoints/FirewallSettings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Endpoints/FirewallSettings.php b/src/Endpoints/FirewallSettings.php index 5bd9735..36e49fd 100644 --- a/src/Endpoints/FirewallSettings.php +++ b/src/Endpoints/FirewallSettings.php @@ -93,10 +93,10 @@ class FirewallSettings implements API * Update the Challenge TTL setting for the zone * * @param string $zoneID The ID of the zone - * @param integer $value The value of the zone setting + * @param int $value The value of the zone setting * @return bool */ - public function updateChallengeTTLSetting(string $zoneID, integer $value) + public function updateChallengeTTLSetting(string $zoneID, int $value) { $return = $this->adapter->patch( 'zones/' . $zoneID . '/settings/challenge_ttl', From 1724b66147066b3d8016ff0917c80f9a75b16f63 Mon Sep 17 00:00:00 2001 From: Martijn Smidt Date: Mon, 3 Jun 2019 11:23:27 +0200 Subject: [PATCH 37/58] Added check_regions for pool configuration --- src/Configurations/Pool.php | 10 ++++++++++ src/Endpoints/Pools.php | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/Configurations/Pool.php b/src/Configurations/Pool.php index f28347b..7b45d41 100644 --- a/src/Configurations/Pool.php +++ b/src/Configurations/Pool.php @@ -90,6 +90,16 @@ class Pool implements Configurations return $this->configs['monitor'] ?? ''; } + public function setCheckRegions(array $checkRegions) + { + $this->configs['check_regions'] = $checkRegions; + } + + public function getCheckRegions():array + { + return $this->configs['check_regions'] ?? []; + } + public function setNotificationEmail(string $email) { if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { diff --git a/src/Endpoints/Pools.php b/src/Endpoints/Pools.php index 4a4f193..f6ceb59 100644 --- a/src/Endpoints/Pools.php +++ b/src/Endpoints/Pools.php @@ -83,6 +83,10 @@ class Pools implements API $poolConfiguration->setMonitor($pool->monitor); $poolConfiguration->setNotificationEmail($pool->notification_email); + if (is_array($pool->check_regions)) { + $poolConfiguration->setCheckRegions($pool->check_regions); + } + return $poolConfiguration; } From 90a9f51fd6f49743bd2d09a2923869331ef2fb5f Mon Sep 17 00:00:00 2001 From: Junade Date: Fri, 7 Jun 2019 16:34:28 +0100 Subject: [PATCH 38/58] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index a0f52fe..87a6d08 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,9 @@ Each API call is provided via a similarly named function within various classes - [x] [Railgun](https://www.cloudflare.com/railgun/) administration - [ ] [Keyless SSL](https://blog.cloudflare.com/keyless-ssl-the-nitty-gritty-technical-details/) - [ ] [Origin CA](https://blog.cloudflare.com/universal-ssl-encryption-all-the-way-to-the-origin-for-free/) +- [x] Crypto +- [ ] Load Balancers +- [ ] Firewall Settings Note that this repository is currently under development, additional classes and endpoints being actively added. From 9b9738910d927031fe34924261f4d76a63fcd322 Mon Sep 17 00:00:00 2001 From: Junade Date: Fri, 7 Jun 2019 16:34:38 +0100 Subject: [PATCH 39/58] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 87a6d08..1794b7f 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,8 @@ Each API call is provided via a similarly named function within various classes - [ ] [Keyless SSL](https://blog.cloudflare.com/keyless-ssl-the-nitty-gritty-technical-details/) - [ ] [Origin CA](https://blog.cloudflare.com/universal-ssl-encryption-all-the-way-to-the-origin-for-free/) - [x] Crypto -- [ ] Load Balancers -- [ ] Firewall Settings +- [x] Load Balancers +- [x] Firewall Settings Note that this repository is currently under development, additional classes and endpoints being actively added. From 1e2b630964074596f83b12ad3dba29dc92ee8eed Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Tue, 23 Jul 2019 13:34:58 +0700 Subject: [PATCH 40/58] Add Delete Zone Method --- src/Endpoints/Zones.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Endpoints/Zones.php b/src/Endpoints/Zones.php index 7330a27..c1338e4 100644 --- a/src/Endpoints/Zones.php +++ b/src/Endpoints/Zones.php @@ -233,4 +233,18 @@ class Zones implements API return false; } + + /** + * Delete Zone + */ + public function deleteZone(string $identifier): bool + { + $user = $this->adapter->delete('zones/' . $identifier); + $this->body = json_decode($user->getBody()); + if (isset($this->body->result->id)) { + return true; + } + + return false; + } } From 956174048407d87a394f7d8589eee68e4f86f7f2 Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Tue, 23 Jul 2019 13:39:40 +0700 Subject: [PATCH 41/58] Create deleteTest.json For testing deleteZone method --- tests/Fixtures/Endpoints/deleteTest.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 tests/Fixtures/Endpoints/deleteTest.json diff --git a/tests/Fixtures/Endpoints/deleteTest.json b/tests/Fixtures/Endpoints/deleteTest.json new file mode 100644 index 0000000..2951fe4 --- /dev/null +++ b/tests/Fixtures/Endpoints/deleteTest.json @@ -0,0 +1,8 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "9a7806061c88ada191ed06f989cc3dac" + } +} From cb24d2c77fced76849778d29667d9ae7acb38e97 Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Tue, 23 Jul 2019 13:42:06 +0700 Subject: [PATCH 42/58] Add deleteZone test --- tests/Endpoints/ZonesTest.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/Endpoints/ZonesTest.php b/tests/Endpoints/ZonesTest.php index f6b75fc..7db28ea 100644 --- a/tests/Endpoints/ZonesTest.php +++ b/tests/Endpoints/ZonesTest.php @@ -262,4 +262,24 @@ class ZonesTest extends TestCase $this->assertTrue($result); $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result->id); } + + public function testDeleteTest() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteTest.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353') + ); + + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $result = $zones->deleteZone('023e105f4ecef8ad9ca31a8372d0c353'); + + $this->assertTrue($result); + $this->assertEquals('9a7806061c88ada191ed06f989cc3dac', $zones->getBody()->result->id); + } } From 440492e41c8930c42eac648d4f4f7c1a3fbaa71b Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Tue, 23 Jul 2019 15:07:16 +0700 Subject: [PATCH 43/58] Rename deleteTest.json to deleteZoneTest.json --- tests/Fixtures/Endpoints/{deleteTest.json => deleteZoneTest.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/Fixtures/Endpoints/{deleteTest.json => deleteZoneTest.json} (100%) diff --git a/tests/Fixtures/Endpoints/deleteTest.json b/tests/Fixtures/Endpoints/deleteZoneTest.json similarity index 100% rename from tests/Fixtures/Endpoints/deleteTest.json rename to tests/Fixtures/Endpoints/deleteZoneTest.json From 818e6e4505f5fec4b5d1c99a1812d85fc8f3ad84 Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Tue, 23 Jul 2019 15:07:58 +0700 Subject: [PATCH 44/58] Update method testDeleteTest --- tests/Endpoints/ZonesTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Endpoints/ZonesTest.php b/tests/Endpoints/ZonesTest.php index 7db28ea..6468d37 100644 --- a/tests/Endpoints/ZonesTest.php +++ b/tests/Endpoints/ZonesTest.php @@ -265,7 +265,7 @@ class ZonesTest extends TestCase public function testDeleteTest() { - $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteTest.json'); + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteZoneTest.json'); $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); $mock->method('delete')->willReturn($response); From c525cef45cbc0a72048709e37c93d540f9431643 Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Wed, 24 Jul 2019 09:12:59 +0700 Subject: [PATCH 45/58] Refactor ZonesTest Refactoring ZonesTest to keep number of public methods under 10 --- tests/Endpoints/ZonesTest.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/Endpoints/ZonesTest.php b/tests/Endpoints/ZonesTest.php index 6468d37..6eee929 100644 --- a/tests/Endpoints/ZonesTest.php +++ b/tests/Endpoints/ZonesTest.php @@ -8,7 +8,7 @@ */ class ZonesTest extends TestCase { - public function testAddZone() + private function testAddZone() { $response = $this->getPsr7JsonResponseForFixture('Endpoints/addZone.json'); @@ -69,7 +69,7 @@ class ZonesTest extends TestCase $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result->id); } - public function testListZones() + private function testListZones() { $response = $this->getPsr7JsonResponseForFixture('Endpoints/listZones.json'); @@ -263,9 +263,9 @@ class ZonesTest extends TestCase $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result->id); } - public function testDeleteTest() + private function testDeleteTest() { - $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteZoneTest.json'); + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteTest.json'); $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); $mock->method('delete')->willReturn($response); @@ -282,4 +282,10 @@ class ZonesTest extends TestCase $this->assertTrue($result); $this->assertEquals('9a7806061c88ada191ed06f989cc3dac', $zones->getBody()->result->id); } + + public function testAddListDeleteZone(){ + $this->testAddZone(); + $this->testListZones(); + $this->testDeleteTest(); + } } From 4cb9eb228ef722aaa9356cf94ef158e5e38dd46d Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Wed, 24 Jul 2019 09:21:06 +0700 Subject: [PATCH 46/58] Rollback ZonesTest.php --- tests/Endpoints/ZonesTest.php | 31 +++---------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/tests/Endpoints/ZonesTest.php b/tests/Endpoints/ZonesTest.php index 6eee929..3342564 100644 --- a/tests/Endpoints/ZonesTest.php +++ b/tests/Endpoints/ZonesTest.php @@ -8,7 +8,7 @@ */ class ZonesTest extends TestCase { - private function testAddZone() + public function testAddZone() { $response = $this->getPsr7JsonResponseForFixture('Endpoints/addZone.json'); @@ -69,7 +69,7 @@ class ZonesTest extends TestCase $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result->id); } - private function testListZones() + public function testListZones() { $response = $this->getPsr7JsonResponseForFixture('Endpoints/listZones.json'); @@ -262,30 +262,5 @@ class ZonesTest extends TestCase $this->assertTrue($result); $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result->id); } - - private function testDeleteTest() - { - $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteTest.json'); - - $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); - $mock->method('delete')->willReturn($response); - - $mock->expects($this->once()) - ->method('delete') - ->with( - $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353') - ); - - $zones = new \Cloudflare\API\Endpoints\Zones($mock); - $result = $zones->deleteZone('023e105f4ecef8ad9ca31a8372d0c353'); - - $this->assertTrue($result); - $this->assertEquals('9a7806061c88ada191ed06f989cc3dac', $zones->getBody()->result->id); - } - - public function testAddListDeleteZone(){ - $this->testAddZone(); - $this->testListZones(); - $this->testDeleteTest(); - } + } From 274517553c4eaf4eca86b7592beb6f68bbfde845 Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Wed, 24 Jul 2019 09:22:27 +0700 Subject: [PATCH 47/58] Create ZoneDeleteTest.php --- tests/Endpoints/ZoneDeleteTest.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 tests/Endpoints/ZoneDeleteTest.php diff --git a/tests/Endpoints/ZoneDeleteTest.php b/tests/Endpoints/ZoneDeleteTest.php new file mode 100644 index 0000000..aa0ff2f --- /dev/null +++ b/tests/Endpoints/ZoneDeleteTest.php @@ -0,0 +1,19 @@ +getPsr7JsonResponseForFixture('Endpoints/deleteTest.json'); + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('delete')->willReturn($response); + $mock->expects($this->once()) + ->method('delete') + ->with( + $this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353') + ); + $zones = new \Cloudflare\API\Endpoints\Zones($mock); + $result = $zones->deleteZone('023e105f4ecef8ad9ca31a8372d0c353'); + $this->assertTrue($result); + $this->assertEquals('9a7806061c88ada191ed06f989cc3dac', $zones->getBody()->result->id); + } +} From 8e279f22173e54dbc820bb99dbb3dbbddb3d5fbd Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Wed, 24 Jul 2019 09:27:07 +0700 Subject: [PATCH 48/58] Update ZoneDeleteTest.php --- tests/Endpoints/ZoneDeleteTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Endpoints/ZoneDeleteTest.php b/tests/Endpoints/ZoneDeleteTest.php index aa0ff2f..0495c43 100644 --- a/tests/Endpoints/ZoneDeleteTest.php +++ b/tests/Endpoints/ZoneDeleteTest.php @@ -3,7 +3,7 @@ class ZoneDeleteTest extends TestCase { public function testDeleteTest() { - $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteTest.json'); + $response = $this->getPsr7JsonResponseForFixture('Endpoints/deleteZoneTest.json'); $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); $mock->method('delete')->willReturn($response); $mock->expects($this->once()) From 28e1378506b78b5049af45da0a3f2808e8bc8beb Mon Sep 17 00:00:00 2001 From: Jens Beltofte Date: Mon, 9 Sep 2019 20:56:06 +0200 Subject: [PATCH 49/58] Add retry option to getSSLVerificationStatus() --- src/Endpoints/SSL.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Endpoints/SSL.php b/src/Endpoints/SSL.php index fea524b..9b50c8b 100644 --- a/src/Endpoints/SSL.php +++ b/src/Endpoints/SSL.php @@ -35,13 +35,18 @@ class SSL implements API * Get SSL Verification Info for a Zone * * @param string $zoneID The ID of the zone + * @param bool $retry Immediately retry SSL Verification * @return array|false */ - public function getSSLVerificationStatus(string $zoneID) + public function getSSLVerificationStatus(string $zoneID, bool $retry = false) { $return = $this->adapter->get( - 'zones/' . $zoneID . '/ssl/verification' + 'zones/' . $zoneID . '/ssl/verification', + [ + 'retry' => $retry + ] ); + $body = json_decode($return->getBody()); if (isset($body->result)) { return $body; From 647705b8520140556ed072b8a1737a968096a127 Mon Sep 17 00:00:00 2001 From: Jens Beltofte Date: Mon, 9 Sep 2019 21:13:04 +0200 Subject: [PATCH 50/58] Adding comment to suppress boolean argument warning --- src/Endpoints/SSL.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Endpoints/SSL.php b/src/Endpoints/SSL.php index 9b50c8b..683b0d7 100644 --- a/src/Endpoints/SSL.php +++ b/src/Endpoints/SSL.php @@ -32,6 +32,8 @@ class SSL implements API } /** + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) + * * Get SSL Verification Info for a Zone * * @param string $zoneID The ID of the zone From fd17c57b6231bfc719376a20297896165d1580c0 Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Thu, 12 Sep 2019 14:36:55 +0700 Subject: [PATCH 51/58] Remove tab character Line 249 --- src/Endpoints/Zones.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Endpoints/Zones.php b/src/Endpoints/Zones.php index c1338e4..03773c2 100644 --- a/src/Endpoints/Zones.php +++ b/src/Endpoints/Zones.php @@ -246,5 +246,5 @@ class Zones implements API } return false; - } + } } From 171c6689afc21787fb7ebe62eecf0688bec44143 Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Thu, 12 Sep 2019 14:38:28 +0700 Subject: [PATCH 52/58] Remove trailing space line 20 From 469d66e92aa1304d272059fd4d5976e28fa2b884 Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Thu, 12 Sep 2019 14:38:58 +0700 Subject: [PATCH 53/58] Remove trailing space line 18 --- tests/Endpoints/ZoneDeleteTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Endpoints/ZoneDeleteTest.php b/tests/Endpoints/ZoneDeleteTest.php index 0495c43..5ffd4e1 100644 --- a/tests/Endpoints/ZoneDeleteTest.php +++ b/tests/Endpoints/ZoneDeleteTest.php @@ -15,5 +15,5 @@ class ZoneDeleteTest extends TestCase $result = $zones->deleteZone('023e105f4ecef8ad9ca31a8372d0c353'); $this->assertTrue($result); $this->assertEquals('9a7806061c88ada191ed06f989cc3dac', $zones->getBody()->result->id); - } + } } From 56b760bb066d99d3ee86f2a0df1dee3f82409c0c Mon Sep 17 00:00:00 2001 From: "Benedict E. Pranata" Date: Thu, 12 Sep 2019 14:39:52 +0700 Subject: [PATCH 54/58] Remove new line line 265 --- tests/Endpoints/ZonesTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Endpoints/ZonesTest.php b/tests/Endpoints/ZonesTest.php index 3342564..f6b75fc 100644 --- a/tests/Endpoints/ZonesTest.php +++ b/tests/Endpoints/ZonesTest.php @@ -262,5 +262,4 @@ class ZonesTest extends TestCase $this->assertTrue($result); $this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zones->getBody()->result->id); } - } From 58ba140930f71fdd42462944e8aeec9de3abae5b Mon Sep 17 00:00:00 2001 From: Jens Beltofte Date: Thu, 12 Sep 2019 14:50:24 +0200 Subject: [PATCH 55/58] Add method to change SSL certificate pack validation method --- src/Endpoints/SSL.php | 23 +++++++++++++++++++ tests/Endpoints/SSLTest.php | 20 ++++++++++++++++ ...ateSSLCertificatePackValidationMethod.json | 6 +++++ 3 files changed, 49 insertions(+) create mode 100644 tests/Fixtures/Endpoints/updateSSLCertificatePackValidationMethod.json diff --git a/src/Endpoints/SSL.php b/src/Endpoints/SSL.php index fea524b..d1dea20 100644 --- a/src/Endpoints/SSL.php +++ b/src/Endpoints/SSL.php @@ -150,4 +150,27 @@ class SSL implements API } return false; } + + /** + * Update the SSL certificate pack validation method + * + * @param string $zoneID The ID of the zone + * @param string $certPackUUID The certificate pack UUID + * @param string $validationMethod The verification method + * @return bool + */ + public function updateSSLCertificatePackValidationMethod(string $zoneID, string $certPackUUID, string $validationMethod) + { + $return = $this->adapter->patch( + 'zones/' . $zoneID . '/ssl/verification/' . $certPackUUID, + [ + 'validation_method' => $validationMethod, + ] + ); + $body = json_decode($return->getBody()); + if (isset($body->success) && $body->success == true) { + return true; + } + return false; + } } diff --git a/tests/Endpoints/SSLTest.php b/tests/Endpoints/SSLTest.php index b29a97e..bfbaf66 100644 --- a/tests/Endpoints/SSLTest.php +++ b/tests/Endpoints/SSLTest.php @@ -138,4 +138,24 @@ class SSLTest extends TestCase $this->assertTrue($result); } + + public function testUpdateSSLCertificatePackValidationMethod() + { + $response = $this->getPsr7JsonResponseForFixture('Endpoints/updateSSLCertificatePackValidationMethod.json'); + + $mock = $this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock(); + $mock->method('patch')->willReturn($response); + + $mock->expects($this->once()) + ->method('patch') + ->with( + $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/ssl/verification/a77f8bd7-3b47-46b4-a6f1-75cf98109948'), + $this->equalTo(['validation_method' => 'cname']) + ); + + $sslMock = new \Cloudflare\API\Endpoints\SSL($mock); + $result = $sslMock->updateSSLCertificatePackValidationMethod('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'a77f8bd7-3b47-46b4-a6f1-75cf98109948', 'cname'); + + $this->assertTrue($result); + } } diff --git a/tests/Fixtures/Endpoints/updateSSLCertificatePackValidationMethod.json b/tests/Fixtures/Endpoints/updateSSLCertificatePackValidationMethod.json new file mode 100644 index 0000000..878457d --- /dev/null +++ b/tests/Fixtures/Endpoints/updateSSLCertificatePackValidationMethod.json @@ -0,0 +1,6 @@ +{ + "success": true, + "errors": [], + "messages": [], + "result": "off" +} \ No newline at end of file From 1211b644e024ada87e3bf491c0712fca4cffb50a Mon Sep 17 00:00:00 2001 From: Jens Beltofte Date: Thu, 12 Sep 2019 15:10:22 +0200 Subject: [PATCH 56/58] Change validation method to txt as in the CF API documentation + change response json file --- tests/Endpoints/SSLTest.php | 4 ++-- .../Endpoints/updateSSLCertificatePackValidationMethod.json | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/Endpoints/SSLTest.php b/tests/Endpoints/SSLTest.php index bfbaf66..1f0fc53 100644 --- a/tests/Endpoints/SSLTest.php +++ b/tests/Endpoints/SSLTest.php @@ -150,11 +150,11 @@ class SSLTest extends TestCase ->method('patch') ->with( $this->equalTo('zones/c2547eb745079dac9320b638f5e225cf483cc5cfdda41/ssl/verification/a77f8bd7-3b47-46b4-a6f1-75cf98109948'), - $this->equalTo(['validation_method' => 'cname']) + $this->equalTo(['validation_method' => 'txt']) ); $sslMock = new \Cloudflare\API\Endpoints\SSL($mock); - $result = $sslMock->updateSSLCertificatePackValidationMethod('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'a77f8bd7-3b47-46b4-a6f1-75cf98109948', 'cname'); + $result = $sslMock->updateSSLCertificatePackValidationMethod('c2547eb745079dac9320b638f5e225cf483cc5cfdda41', 'a77f8bd7-3b47-46b4-a6f1-75cf98109948', 'txt'); $this->assertTrue($result); } diff --git a/tests/Fixtures/Endpoints/updateSSLCertificatePackValidationMethod.json b/tests/Fixtures/Endpoints/updateSSLCertificatePackValidationMethod.json index 878457d..5e2d5e2 100644 --- a/tests/Fixtures/Endpoints/updateSSLCertificatePackValidationMethod.json +++ b/tests/Fixtures/Endpoints/updateSSLCertificatePackValidationMethod.json @@ -2,5 +2,8 @@ "success": true, "errors": [], "messages": [], - "result": "off" + "result": { + "validation_method": "txt", + "status": "pending_validation" + } } \ No newline at end of file From 2ba05a3ba5b769224036c91beee118b6a91bed1e Mon Sep 17 00:00:00 2001 From: indeed-a-genius Date: Tue, 17 Sep 2019 14:29:22 +0200 Subject: [PATCH 57/58] Incorrect listPageRules() conditions for optional parameters --- src/Endpoints/PageRules.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Endpoints/PageRules.php b/src/Endpoints/PageRules.php index df0290f..c8480f4 100644 --- a/src/Endpoints/PageRules.php +++ b/src/Endpoints/PageRules.php @@ -73,19 +73,19 @@ class PageRules implements API string $direction = null, string $match = null ): array { - if ($status === null && !in_array($status, ['active', 'disabled'])) { + if ($status != null && !in_array($status, ['active', 'disabled'])) { throw new EndpointException('Page Rules can only be listed by status of active or disabled.'); } - if ($order === null && !in_array($order, ['status', 'priority'])) { + if ($order != null && !in_array($order, ['status', 'priority'])) { throw new EndpointException('Page Rules can only be ordered by status or priority.'); } - if ($direction === null && !in_array($direction, ['asc', 'desc'])) { + if ($direction != null && !in_array($direction, ['asc', 'desc'])) { throw new EndpointException('Direction of Page Rule ordering can only be asc or desc.'); } - if ($match === null && !in_array($match, ['all', 'any'])) { + if ($match != null && !in_array($match, ['all', 'any'])) { throw new EndpointException('Match can only be any or all.'); } From 639be12f7a7898f061dd5817f3948aeae15e1b80 Mon Sep 17 00:00:00 2001 From: Samuel Melrose Date: Wed, 18 Sep 2019 14:38:32 +0000 Subject: [PATCH 58/58] Fix PageRulesActions: setResolveOverride,setHostHeaderOverride --- src/Configurations/PageRulesActions.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) mode change 100644 => 100755 src/Configurations/PageRulesActions.php diff --git a/src/Configurations/PageRulesActions.php b/src/Configurations/PageRulesActions.php old mode 100644 new mode 100755 index 072a207..359d3c7 --- a/src/Configurations/PageRulesActions.php +++ b/src/Configurations/PageRulesActions.php @@ -140,10 +140,10 @@ class PageRulesActions implements Configurations ]); } - public function setHostHeaderOverride(bool $active) + public function setHostHeaderOverride(string $value) { $this->addConfigurationOption('host_header_override', [ - 'value' => $this->getBoolAsOnOrOff($active) + 'value' => $value ]); } @@ -198,7 +198,7 @@ class PageRulesActions implements Configurations ]); } - public function setResolveOverride(bool $value) + public function setResolveOverride(string $value) { $this->addConfigurationOption('resolve_override', [ 'value' => $value