├── .gitignore ├── phpunit.xml ├── composer.json ├── .github └── workflows │ └── main.yml ├── tests ├── CheckerTest.php ├── WhoisHandlerTest.php └── IntegrationTest.php ├── src ├── Checker.php ├── WhoisHandler.php ├── Whois.php ├── AvailabilityDetector.php └── dist.whois.json ├── README.md └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | .idea 3 | .phpunit.result.cache 4 | .github 5 | test_domain.php 6 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | tests 5 | 6 | 7 | 8 | 9 | src/ 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "monovm/whois-php", 3 | "description": "This PHP package enables developers to retrieve domain registration information and check domain availability via socket protocol. It's a useful tool for web developers and domain name registrars.", 4 | "type": "library", 5 | "keywords": [ 6 | "whois", 7 | "php" 8 | ], 9 | "license": "MIT", 10 | "autoload": { 11 | "psr-4": { 12 | "MonoVM\\WhoisPhp\\": "src/" 13 | } 14 | }, 15 | "authors": [ 16 | { 17 | "name": "MonoVM", 18 | "email": "dev@monovm.com" 19 | } 20 | ], 21 | "require": { 22 | "php": ">=7.4", 23 | "ext-json": "*" 24 | }, 25 | "require-dev": { 26 | "phpunit/phpunit": "^9.0", 27 | "squizlabs/php_codesniffer": "^3.7" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build Workflow 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | branches: 9 | - main 10 | 11 | jobs: 12 | test: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout code 16 | uses: actions/checkout@v3.3.0 17 | 18 | - name: Set up PHP 19 | uses: shivammathur/setup-php@v2 20 | with: 21 | php-version: "7.4" 22 | coverage: "pcov" 23 | extensions: mbstring, pcov 24 | 25 | - name: Install dependencies 26 | run: composer install --prefer-dist --no-interaction 27 | 28 | - name: PHP Code Sniffer - Fix 29 | run: vendor/bin/phpcbf --standard=PSR12 src/ 30 | 31 | - name: PHP Code Sniffer 32 | run: vendor/bin/phpcs --standard=PSR12 src/ 33 | 34 | - name: Run Tests 35 | run: vendor/bin/phpunit tests/ 36 | -------------------------------------------------------------------------------- /tests/CheckerTest.php: -------------------------------------------------------------------------------- 1 | assertArrayHasKey('monovm.com', Checker::whois('monovm.com'), 'No whois result for monovm.com'); 12 | } 13 | 14 | public function testSingleDomainWhoisWithInvalidTLD() 15 | { 16 | $this->assertEquals('invalid', Checker::whois('monovm.aninvalidtld')['monovm.aninvalidtld'], 'Invalid status for invalid tld'); 17 | } 18 | 19 | public function testSingleDomainWhoisWithoutTLD() 20 | { 21 | $result = Checker::whois('monovm', ['popularTLDs' => ['.info', '.net']]); 22 | $this->assertArrayHasKey('monovm.net', $result, 'No whois result for monovm.net'); 23 | } 24 | 25 | public function testMultipleDomainsWhois() 26 | { 27 | $domains = ['monovm.com', 'google.com', 'bing']; 28 | $result = Checker::whois($domains); 29 | $this->assertGreaterThanOrEqual(count($domains), count(array_keys($result)), 'Group whois results count should at least be equal to domains count'); 30 | } 31 | } -------------------------------------------------------------------------------- /src/Checker.php: -------------------------------------------------------------------------------- 1 | parts = [ 14 | 'sld' => array_shift($parts), 15 | 'tld' => count($parts) ? '.' . $parts[0] : null 16 | ]; 17 | 18 | if (isset($options['popularTLDs']) && is_array($options['popularTLDs'])) { 19 | $this->popularTLDs = array_map(function ($tld) { 20 | if (strpos($tld, '.') === 0) { 21 | return $tld; 22 | } 23 | return '.' . $tld; 24 | }, $options['popularTLDs']); 25 | } 26 | 27 | parent::__construct(); 28 | } 29 | 30 | 31 | /** 32 | * Run whois lookup for domain(s). 33 | * 34 | * @param string|array $domains Domain or array of domains to lookup, TLD is optional for each domain. 35 | * @param array $options Options for WhoisGroup Class, 36 | ** you can set your own custom popularTLDs to lookup if tld is not provided in domain string. 37 | ** (eg: ["popularTLDs"=>[".info",".net"]]) 38 | * 39 | * @return array An associative array with domain as key and status as value. 40 | */ 41 | public static function whois($domains, array $options = []): array 42 | { 43 | 44 | if (is_string($domains)) { 45 | $domains = [$domains]; 46 | } 47 | 48 | $results = []; 49 | array_map(function ($domain) use (&$results, $options) { 50 | $results = array_merge($results, (new self($domain, $options))->doLookup()); 51 | }, $domains); 52 | 53 | return $results; 54 | } 55 | 56 | /** 57 | * Performs lookup for a domain by it parts. 58 | * 59 | * @return array An associative array with domain as key and status as value. 60 | */ 61 | public function doLookup(): array 62 | { 63 | $parts = $this->parts; 64 | 65 | $tldsToLoop = $parts['tld'] ? [$parts['tld']] : $this->popularTLDs; 66 | $results = []; 67 | foreach ($tldsToLoop as $tld) { 68 | if (!parent::canLookup($tld)) { 69 | $results[$this->getDomainNameFromParts($parts)] = 'invalid'; 70 | continue; 71 | } 72 | 73 | $parts['tld'] = $tld; 74 | $lookup = parent::lookup($parts); 75 | $results[$this->getDomainNameFromParts($parts)] = isset($lookup['result']) ? $lookup['result'] : 'unknown'; 76 | } 77 | 78 | return $results; 79 | } 80 | 81 | /** 82 | * Get full domain name from array of sld and tld. 83 | * 84 | * @param array $parts An array containing domain parts (eg: ["sld"=>"monovm","tld"=>".com"]). 85 | * @return string Full domain name. (eg: monovm.com) 86 | */ 87 | private function getDomainNameFromParts(array $parts): string 88 | { 89 | return $parts['sld'] . $parts['tld']; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /tests/WhoisHandlerTest.php: -------------------------------------------------------------------------------- 1 | assertEquals('.com', $whoisHandler->getTld()); 12 | } 13 | 14 | public function testGetSld() 15 | { 16 | $whoisHandler = WhoisHandler::whois('example.com'); 17 | $this->assertEquals('example', $whoisHandler->getSld()); 18 | } 19 | 20 | public function testIsAvailable() 21 | { 22 | $whoisHandler = WhoisHandler::whois('example.com'); 23 | $this->assertFalse($whoisHandler->isAvailable()); 24 | } 25 | 26 | public function testIsValid() 27 | { 28 | $whoisHandler = WhoisHandler::whois('example.com'); 29 | $this->assertTrue($whoisHandler->isValid()); 30 | } 31 | 32 | public function testGetWhoisMessage() 33 | { 34 | $whoisHandler = WhoisHandler::whois('example.com'); 35 | $this->assertStringContainsString('Domain Name: EXAMPLE.COM', $whoisHandler->getWhoisMessage()); 36 | } 37 | 38 | public function testGetAvailabilityDetails() 39 | { 40 | $whoisHandler = WhoisHandler::whois('example.com'); 41 | $details = $whoisHandler->getAvailabilityDetails(); 42 | 43 | $this->assertArrayHasKey('original_library_result', $details); 44 | $this->assertArrayHasKey('contains_availability_keywords', $details); 45 | $this->assertArrayHasKey('is_response_too_short', $details); 46 | $this->assertArrayHasKey('contains_no_match_patterns', $details); 47 | $this->assertArrayHasKey('tld_specific_patterns', $details); 48 | $this->assertArrayHasKey('domain_status_indicators', $details); 49 | $this->assertArrayHasKey('final_availability', $details); 50 | $this->assertArrayHasKey('whois_message_length', $details); 51 | $this->assertArrayHasKey('whois_message_preview', $details); 52 | 53 | $this->assertIsBool($details['original_library_result']); 54 | $this->assertIsBool($details['contains_availability_keywords']); 55 | $this->assertIsBool($details['is_response_too_short']); 56 | $this->assertIsBool($details['contains_no_match_patterns']); 57 | $this->assertIsBool($details['tld_specific_patterns']); 58 | $this->assertIsBool($details['domain_status_indicators']); 59 | $this->assertIsBool($details['final_availability']); 60 | $this->assertIsInt($details['whois_message_length']); 61 | $this->assertIsString($details['whois_message_preview']); 62 | } 63 | 64 | public function testEnhancedAvailabilityDetection() 65 | { 66 | // Test with a very likely available domain 67 | $availableDomain = 'thisisaveryunusualdomain' . time() . '.com'; 68 | $whoisHandler = WhoisHandler::whois($availableDomain); 69 | 70 | // The enhanced detection should catch availability even if original library doesn't 71 | $details = $whoisHandler->getAvailabilityDetails(); 72 | 73 | // At least one detection method should trigger for an available domain 74 | $detectionMethods = [ 75 | $details['contains_availability_keywords'], 76 | $details['is_response_too_short'], 77 | $details['contains_no_match_patterns'], 78 | $details['tld_specific_patterns'], 79 | $details['domain_status_indicators'] 80 | ]; 81 | 82 | $this->assertTrue( 83 | in_array(true, $detectionMethods), 84 | 'At least one enhanced detection method should work for available domains' 85 | ); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/WhoisHandler.php: -------------------------------------------------------------------------------- 1 | sld = $domainParts[0]; 21 | $this->tld = '.' . $domainParts[1]; 22 | 23 | $whois = new Whois(); 24 | 25 | if ($whois->canLookup($this->tld)) { 26 | $result = $whois->lookup(['sld' => $this->sld, 'tld' => $this->tld]); 27 | if ($result === false || !is_array($result)) { 28 | $this->whoisMessage = 'WHOIS lookup failed for ' . $domain; 29 | $this->isValid = false; 30 | } elseif (isset($result['result']) && $result['result'] === 'error') { 31 | $this->whoisMessage = $result['errordetail'] ?? 'WHOIS lookup error for ' . $domain; 32 | $this->isValid = false; 33 | } elseif ($result['result'] == 'available' && !isset($result['whois'])) { 34 | $this->whoisMessage = $domain . ' is available for registration.'; 35 | $this->isAvailable = true; 36 | } else { 37 | $this->whoisMessage = $result['whois'] ?? 'No WHOIS information available.'; 38 | } 39 | } else { 40 | $this->whoisMessage = 41 | 'Unable to lookup whois information for ' . $domain; 42 | $this->isValid = false; 43 | } 44 | } 45 | } 46 | 47 | /** 48 | * Starts the whois operation. 49 | */ 50 | public static function whois(string $domain): WhoisHandler 51 | { 52 | return new self($domain); 53 | } 54 | 55 | /** 56 | * Returns Top-Level Domain. 57 | */ 58 | public function getTld(): string 59 | { 60 | return $this->tld; 61 | } 62 | 63 | /** 64 | * Returns Second-Level Domain. 65 | */ 66 | public function getSld(): string 67 | { 68 | return $this->sld; 69 | } 70 | 71 | /** 72 | * Determines if the domain is available for registration using multiple detection methods. 73 | */ 74 | public function isAvailable(): bool 75 | { 76 | // If the lookup is not valid (TLD not supported, error, etc.), domain availability is unknown 77 | if (!$this->isValid) { 78 | return false; 79 | } 80 | // Use enhanced availability detection 81 | return $this->isDomainAvailableEnhanced(); 82 | } 83 | 84 | /** 85 | * Determines if the domain can be looked up. 86 | */ 87 | public function isValid(): bool 88 | { 89 | return $this->isValid; 90 | } 91 | 92 | /** 93 | * Returns the whois server message. 94 | */ 95 | public function getWhoisMessage(): string 96 | { 97 | return $this->whoisMessage; 98 | } 99 | 100 | /** 101 | * Enhanced domain availability detection using multiple methods 102 | */ 103 | private function isDomainAvailableEnhanced(): bool 104 | { 105 | try { 106 | return AvailabilityDetector::isAvailable($this->whoisMessage, $this->tld, $this->isAvailable); 107 | } catch (\Exception $e) { 108 | // If TLD is not supported, mark as invalid and unavailable 109 | $this->isValid = false; 110 | return false; 111 | } 112 | } 113 | 114 | /** 115 | * Get detailed availability information for debugging 116 | */ 117 | public function getAvailabilityDetails(): array 118 | { 119 | try { 120 | return AvailabilityDetector::getAvailabilityDetails($this->whoisMessage, $this->tld, $this->isAvailable); 121 | } catch (\Exception $e) { 122 | // Return details with unsupported TLD information 123 | return [ 124 | 'original_library_result' => $this->isAvailable, 125 | 'contains_unsupported_tld_messages' => true, 126 | 'contains_unavailability_indicators' => false, 127 | 'contains_registration_indicators' => false, 128 | 'contains_availability_keywords' => false, 129 | 'is_response_too_short' => false, 130 | 'contains_no_match_patterns' => false, 131 | 'tld_specific_patterns' => false, 132 | 'domain_status_indicators' => false, 133 | 'final_availability' => 'unsupported_tld', 134 | 'whois_message_length' => strlen($this->whoisMessage), 135 | 'whois_message_preview' => substr($this->whoisMessage, 0, 200) . (strlen($this->whoisMessage) > 200 ? '...' : ''), 136 | 'error_message' => $e->getMessage(), 137 | ]; 138 | } 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /src/Whois.php: -------------------------------------------------------------------------------- 1 | load(); 16 | } 17 | 18 | protected function load() 19 | { 20 | $path = __DIR__ . '/dist.whois.json'; 21 | $overridePath = __DIR__ . '/whois.json'; 22 | $this->definitions = array_merge( 23 | $this->parseFile($path), 24 | $this->parseFile($overridePath), 25 | ); 26 | } 27 | 28 | protected function parseFile($path) 29 | { 30 | $return = []; 31 | if (file_exists($path)) { 32 | $definitions = file_get_contents($path); 33 | if ($definitions = @json_decode($definitions, true)) { 34 | foreach ($definitions as $definition) { 35 | $extensions = explode(',', $definition['extensions']); 36 | unset($definition['extensions']); 37 | foreach ($extensions as $extension) { 38 | $return[$extension] = $definition; 39 | } 40 | } 41 | } else { 42 | throw new Exception('dist.whois.json file not found!'); 43 | } 44 | } 45 | 46 | return $return; 47 | } 48 | 49 | public function getSocketPrefix() 50 | { 51 | return $this->socketPrefix; 52 | } 53 | 54 | public function canLookup($tld) 55 | { 56 | return array_key_exists($tld, $this->definitions); 57 | } 58 | 59 | public function getFromDefinitions($tld, $key) 60 | { 61 | return isset($this->definitions[$tld][$key]) 62 | ? $this->definitions[$tld][$key] 63 | : ''; 64 | } 65 | 66 | protected function getUri($tld) 67 | { 68 | if ($this->canLookup($tld)) { 69 | $uri = $this->getFromDefinitions($tld, 'uri'); 70 | if (empty($uri)) { 71 | throw new Exception('Uri not defined for whois service'); 72 | } 73 | 74 | return $uri; 75 | } 76 | throw new Exception('Whois server not known for ' . $tld); 77 | } 78 | 79 | protected function isSocketLookup($tld) 80 | { 81 | if ($this->canLookup($tld)) { 82 | $uri = $this->getUri($tld); 83 | 84 | return substr($uri, 0, strlen($this->getSocketPrefix())) == 85 | $this->getSocketPrefix(); 86 | } 87 | throw new Exception('Whois server not known for ' . $tld); 88 | } 89 | 90 | protected function getAvailableMatchString($tld) 91 | { 92 | if ($this->canLookup($tld)) { 93 | return $this->getFromDefinitions($tld, 'available'); 94 | } 95 | throw new Exception('Whois server not known for ' . $tld); 96 | } 97 | 98 | protected function getPremiumMatchString($tld) 99 | { 100 | if ($this->canLookup($tld)) { 101 | return $this->getFromDefinitions($tld, 'premium'); 102 | } 103 | throw new Exception('Whois server not known for ' . $tld); 104 | } 105 | 106 | protected function httpWhoisLookup($domain, $uri) 107 | { 108 | $url = $uri . $domain; 109 | $ch = curl_init(); 110 | curl_setopt($ch, CURLOPT_URL, $url); 111 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); 112 | curl_setopt($ch, CURLOPT_TIMEOUT, 60); 113 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 114 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 115 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 116 | $data = curl_exec($ch); 117 | if (curl_error($ch)) { 118 | curl_close($ch); 119 | throw new Exception( 120 | 'Error: ' . curl_errno($ch) . ' - ' . curl_error($ch), 121 | ); 122 | } 123 | curl_close($ch); 124 | 125 | return $data; 126 | } 127 | 128 | protected function socketWhoisLookup($domain, $server, $port) 129 | { 130 | $fp = @fsockopen($server, $port, $errorNumber, $errorMessage, 10); 131 | if ($fp === false) { 132 | throw new Exception( 133 | 'Error: ' . $errorNumber . ' - ' . $errorMessage, 134 | ); 135 | } 136 | @fwrite($fp, $domain . "\r\n"); 137 | @stream_set_timeout($fp, 10); 138 | $data = ''; 139 | while (!@feof($fp)) { 140 | $data .= @fread($fp, 4096); 141 | } 142 | @fclose($fp); 143 | 144 | return $data; 145 | } 146 | 147 | public function lookup($parts) 148 | { 149 | $sld = $parts['sld']; 150 | $tld = $parts['tld']; 151 | 152 | try { 153 | $uri = $this->getUri($tld); 154 | $availableMatchString = $this->getAvailableMatchString($tld); 155 | $premiumMatchString = $this->getPremiumMatchString($tld); 156 | $isSocketLookup = $this->isSocketLookup($tld); 157 | } catch (Exception $e) { 158 | return false; 159 | } 160 | $domain = $sld . $tld; 161 | 162 | try { 163 | if ($isSocketLookup) { 164 | $uri = substr($uri, strlen($this->getSocketPrefix())); 165 | $port = 43; 166 | if (strpos($uri, ':')) { 167 | $port = explode(':', $uri, 2); 168 | [$uri, $port] = $port; 169 | } 170 | $lookupResult = $this->socketWhoisLookup( 171 | $domain, 172 | $uri, 173 | $port, 174 | ); 175 | } else { 176 | $lookupResult = $this->httpWhoisLookup($domain, $uri); 177 | } 178 | } catch (\Exception $e) { 179 | $results = []; 180 | $results['result'] = 'error'; 181 | $results['errordetail'] = $e->getMessage(); 182 | 183 | return $results; 184 | } 185 | $lookupResult = ' ---' . $lookupResult; 186 | $results = []; 187 | 188 | // First check using original logic for backward compatibility 189 | $originalAvailable = strpos(strtolower($lookupResult), strtolower($availableMatchString)) !== false; 190 | $isPremium = $premiumMatchString && strpos(strtolower($lookupResult), strtolower($premiumMatchString)) !== false; 191 | 192 | // Use enhanced detection for better accuracy 193 | try { 194 | $enhancedAvailable = AvailabilityDetector::isAvailable($lookupResult, $tld, $originalAvailable); 195 | } catch (\Exception $e) { 196 | // If TLD is not supported, return error result 197 | $results['result'] = 'error'; 198 | $results['errordetail'] = $e->getMessage(); 199 | return $results; 200 | } 201 | 202 | if ($enhancedAvailable) { 203 | $results['result'] = 'available'; 204 | } else if ($isPremium) { 205 | $results['result'] = 'premium'; 206 | } else { 207 | $results['result'] = 'unavailable'; 208 | if ($isSocketLookup) { 209 | $results['whois'] = nl2br(htmlentities($lookupResult)); 210 | } else { 211 | $results['whois'] = nl2br( 212 | htmlentities(strip_tags($lookupResult)), 213 | ); 214 | } 215 | } 216 | 217 | return $results; 218 | } 219 | } 220 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # :zap: Simple and Fast Domain Whois Lookup in PHP :zap: 2 | 3 | Simple and Fast Domain Whois Lookup in PHP 4 | 5 | This PHP whois package enables developers to retrieve domain registration information and check domain availability via socket 6 | protocol. It's a useful tool for web developers and domain name registrars. 7 | 8 | based on WHMCS domain Whois class. 9 | 10 | ## :scroll: Installation 11 | 12 | You can install the whois package via composer: 13 | 14 | ```bash 15 | composer require monovm/whois-php 16 | ``` 17 | 18 | ## :arrow_forward: Checker class 19 | 20 | You can use this class to check one or multiple domains availability. 21 | 22 | ## :mortar_board: Usage/Examples 23 | 24 | ```PHP 25 | use MonoVM\WhoisPhp\Checker; 26 | 27 | // Single Domain whois 28 | $result1 = Checker::whois('monovm.com'); 29 | 30 | // Single Domain whois without specifying TLD 31 | $result2 = Checker::whois('monovm'); 32 | 33 | // Multiple domains whois 34 | $result3 = Checker::whois(['monovm','google.com','bing']); 35 | ``` 36 | 37 | - ### Response 38 | 39 | An associative array with domains as keys and status as values. 40 | Current statuses: available, unavailable, premium 41 | 42 | ```code 43 | $result1: ['monovm.com'=>'unavailable'] 44 | $result2: ['monovm.com'=>'unavailable','monovm.net'=>'unavailable','monovm.org'=>'unavailable','monovm.info'=>'unavailable'] 45 | $result3: [ 46 | 'monovm.com'=>'premium', 47 | 'monovm.net'=>'unavailable', 48 | 'monovm.org'=>'unavailable', 49 | 'monovm.info'=>'unavailable', 50 | 'google.com'=>'premium', 51 | 'bing.com'=>'unavailable', 52 | 'bing.net'=>'unavailable', 53 | 'bing.org'=>'available', 54 | 'bing.info'=>'unavailable' 55 | ] 56 | ``` 57 | 58 | ### :fire: popularTLDs Configuration 59 | 60 | When TLD is not specified in the domain string (eg:monovm instead of monovm.com), Checker class will automatically 61 | lookup a list of popular TLDs for the entered name. 62 | 63 | You can customize this list by passing an options array as second parameter of whois method. 64 | 65 | ```PHP 66 | use MonoVM\WhoisPhp\Checker; 67 | 68 | $result = Checker::whois('monovm', ['popularTLDs' => ['.com', '.net', '.org', '.info']]); 69 | ``` 70 | 71 | 72 | 73 | ## :arrow_forward: WhoisHandler class 74 | 75 | ## :mortar_board: Usage/Examples 76 | 77 | ```PHP 78 | use MonoVM\WhoisPhp\WhoisHandler; 79 | 80 | $whoisHandler = WhoisHandler::whois('monovm.com'); 81 | ``` 82 | 83 | #### Available methods: 84 | 85 | **After initiating the handler method you will have access to the following methods:** 86 | 87 | | Method | Description | 88 | |---------------|------------------------------------------------------------------------------------------------------------------| 89 | | `isAvailable` | Returns true if the domain is available for registration (uses enhanced detection) | 90 | | `isValid` | Returns true if the domain can be looked up | 91 | | `getWhoisMessage` | Returns the whois server message as a string including availability, validation or the domain whois information | 92 | | `getTld` | Returns the top level domain of the entered domain as a string | 93 | | `getSld` | Returns the second level domain of the entered domain as a string | 94 | | `getAvailabilityDetails` | Returns detailed information about how availability was determined (debug method) | 95 | 96 | :green_circle: `isAvailable()` method uses enhanced detection with multiple methods to accurately determine domain availability. It combines the original library's built-in check with additional detection methods including: 97 | 98 | - **Availability keywords detection**: Searches for phrases like "no match", "not found", "available", etc. 99 | - **Response length analysis**: Short responses often indicate availability 100 | - **Pattern matching**: Uses regex patterns to identify availability indicators 101 | - **TLD-specific patterns**: Different TLDs use different availability messages 102 | - **Domain status indicators**: Checks for explicit status fields 103 | - **Registration field analysis**: Absence of registration details may indicate availability 104 | 105 | ```PHP 106 | $available = $whoisHandler->isAvailable(); 107 | ``` 108 | 109 | :green_circle: `isValid()` method checks whether the entered domain name is valid and can be looked up or not. 110 | 111 | ```PHP 112 | $valid = $whoisHandler->isValid(); 113 | ``` 114 | 115 | :green_circle: The `getWhoisMessage()` method is used to retrieve the WHOIS information of a domain. This method returns 116 | a string that includes the WHOIS server message, which may contain information about the availability and validation of 117 | the domain, as well as its WHOIS information. 118 | 119 | ```PHP 120 | $message = $whoisHandler->getWhoisMessage(); 121 | ``` 122 | 123 | :green_circle: `getTld()` method is used to extract the top level domain (TLD) of a given domain. For example, if the 124 | domain name passed to the handler is "monovm.com", the method will return "com" as the TLD. Similarly, if the domain 125 | name is "monovm.co.uk", the method will return "co.uk" as the TLD. 126 | 127 | ```PHP 128 | $tld = $whoisHandler->getTld(); 129 | ``` 130 | 131 | :green_circle: `getSld()` method returns the second level domain of the entered domain as a string. The second level 132 | domain is the part of the domain name that comes before the top level domain, and it is typically the main part of the 133 | domain that identifies the website or organization. For example, in the domain name "monovm.com", the second level 134 | domain is "monovm". 135 | 136 | ```PHP 137 | $sld = $whoisHandler->getSld(); 138 | ``` 139 | 140 | :green_circle: `getAvailabilityDetails()` method provides detailed debugging information about how the domain availability was determined. This method returns an array containing the results of each detection method: 141 | 142 | ```PHP 143 | $details = $whoisHandler->getAvailabilityDetails(); 144 | 145 | // Example output: 146 | // Array 147 | // ( 148 | // [original_library_result] => false 149 | // [contains_availability_keywords] => true 150 | // [is_response_too_short] => false 151 | // [contains_no_match_patterns] => true 152 | // [tld_specific_patterns] => false 153 | // [domain_status_indicators] => false 154 | // [final_availability] => true 155 | // [whois_message_length] => 1234 156 | // [whois_message_preview] => "No match for domain example123.com..." 157 | // ) 158 | ``` 159 | 160 | ## :sparkles: Enhanced Availability Detection 161 | 162 | The enhanced availability detection system uses 6 different methods to ensure accurate results: 163 | 164 | 1. **Original Library Check**: Uses the built-in whois server response analysis 165 | 2. **Keyword Detection**: Searches for over 40 availability-related keywords in multiple languages 166 | 3. **Response Length Analysis**: Analyzes response size and meaningful content lines 167 | 4. **Pattern Matching**: Uses regex patterns to identify availability indicators 168 | 5. **TLD-Specific Patterns**: Applies specialized patterns for different TLDs (.com, .uk, .de, etc.) 169 | 6. **Status Indicators**: Checks for explicit domain status fields and registration data presence 170 | 171 | This multi-layered approach significantly improves accuracy across different WHOIS servers and TLD registries. 172 | 173 | ## :globe_with_meridians: Whois Server List 174 | ### Almost all TLDs are supported. 175 | 176 | ## :globe_with_meridians: Contributing 177 | If you want to add support for new TLD, extend functionality or correct a bug, feel free to create a new pull request at Github's repository 178 | 179 | ## :balance_scale: License 180 | 181 | [MIT](https://choosealicense.com/licenses/mit/) 182 | 183 | ## :computer: Support 184 | 185 | For support, email dev@monovm.com. 186 | 187 | [MonoVM.com](https://monovm.com) 188 | 189 | ![Logo](https://monovm.com/site-assets/images/logo-monovm.svg) 190 | 191 | -------------------------------------------------------------------------------- /tests/IntegrationTest.php: -------------------------------------------------------------------------------- 1 | assertTrue(AvailabilityDetector::isAvailable($availableMessage, '.com')); 15 | 16 | // Use a more realistic unavailable message with registration details 17 | $unavailableMessage = "Domain Name: EXAMPLE.COM\n" . 18 | "Registrar: Example Registrar Inc.\n" . 19 | "Registrar WHOIS Server: whois.example.com\n" . 20 | "Registrar URL: http://www.example.com\n" . 21 | "Updated Date: 2023-01-01T00:00:00Z\n" . 22 | "Creation Date: 2020-01-01T00:00:00Z\n" . 23 | "Registry Expiry Date: 2025-01-01T00:00:00Z\n" . 24 | "Registrant Name: Example Organization\n" . 25 | "Name Server: NS1.EXAMPLE.COM\n" . 26 | "Name Server: NS2.EXAMPLE.COM\n" . 27 | "DNSSEC: unsigned"; 28 | $this->assertFalse(AvailabilityDetector::isAvailable($unavailableMessage, '.com')); 29 | } 30 | 31 | public function testWhoisHandlerIntegration() 32 | { 33 | // Test with a likely available domain 34 | $timestamp = time(); 35 | $testDomain = "very-unusual-test-domain-{$timestamp}.com"; 36 | 37 | $whoisHandler = WhoisHandler::whois($testDomain); 38 | $details = $whoisHandler->getAvailabilityDetails(); 39 | 40 | // Should have all the expected keys 41 | $expectedKeys = [ 42 | 'original_library_result', 43 | 'contains_availability_keywords', 44 | 'is_response_too_short', 45 | 'contains_no_match_patterns', 46 | 'tld_specific_patterns', 47 | 'domain_status_indicators', 48 | 'final_availability', 49 | 'whois_message_length', 50 | 'whois_message_preview' 51 | ]; 52 | 53 | foreach ($expectedKeys as $key) { 54 | $this->assertArrayHasKey($key, $details); 55 | } 56 | 57 | // For a very unusual domain, enhanced detection should work 58 | $this->assertTrue($details['final_availability']); 59 | } 60 | 61 | public function testCheckerIntegration() 62 | { 63 | // Test with multiple domains using Checker class 64 | $timestamp = time(); 65 | $testDomains = [ 66 | "unusual-test-domain-{$timestamp}.com", 67 | "another-test-domain-{$timestamp}.net" 68 | ]; 69 | 70 | $results = Checker::whois($testDomains); 71 | 72 | // Should return results for both domains 73 | $this->assertCount(2, $results); 74 | 75 | foreach ($testDomains as $domain) { 76 | $this->assertArrayHasKey($domain, $results); 77 | // Should be either 'available' or 'unavailable' (enhanced detection should work) 78 | $this->assertContains($results[$domain], ['available', 'unavailable', 'premium']); 79 | } 80 | } 81 | 82 | public function testCheckerWithoutTLD() 83 | { 84 | // Test Checker with domain without TLD (should check popular TLDs) 85 | $timestamp = time(); 86 | $domainBase = "unusual-test-{$timestamp}"; 87 | 88 | $results = Checker::whois($domainBase); 89 | 90 | // Should return multiple results for popular TLDs 91 | $this->assertGreaterThan(1, count($results)); 92 | 93 | // Should include .com, .net, .org, .info 94 | $expectedDomains = [ 95 | $domainBase . '.com', 96 | $domainBase . '.net', 97 | $domainBase . '.org', 98 | $domainBase . '.info' 99 | ]; 100 | 101 | foreach ($expectedDomains as $expectedDomain) { 102 | $this->assertArrayHasKey($expectedDomain, $results); 103 | } 104 | } 105 | 106 | public function testRegisteredDomainDetection() 107 | { 108 | // Test with a known registered domain 109 | $whoisHandler = WhoisHandler::whois('example.com'); 110 | $this->assertFalse($whoisHandler->isAvailable()); 111 | 112 | $checker = Checker::whois(['example.com']); 113 | $this->assertEquals('unavailable', $checker['example.com']); 114 | } 115 | 116 | public function testEnhancedDetectionAccuracy() 117 | { 118 | // Test that enhanced detection is more accurate than original 119 | $timestamp = time(); 120 | $testDomain = "this-should-be-available-{$timestamp}.com"; 121 | 122 | $whoisHandler = WhoisHandler::whois($testDomain); 123 | $details = $whoisHandler->getAvailabilityDetails(); 124 | 125 | // At least one enhanced detection method should trigger for available domain 126 | $enhancedMethods = [ 127 | $details['contains_availability_keywords'], 128 | $details['is_response_too_short'], 129 | $details['contains_no_match_patterns'], 130 | $details['tld_specific_patterns'], 131 | $details['domain_status_indicators'] 132 | ]; 133 | 134 | $this->assertTrue( 135 | in_array(true, $enhancedMethods), 136 | 'Enhanced detection should identify available domain using at least one method' 137 | ); 138 | } 139 | 140 | public function testBackwardCompatibility() 141 | { 142 | // Test that the integration doesn't break existing functionality 143 | 144 | // WhoisHandler basic methods should still work 145 | $whoisHandler = WhoisHandler::whois('example.com'); 146 | $this->assertIsString($whoisHandler->getTld()); 147 | $this->assertIsString($whoisHandler->getSld()); 148 | $this->assertIsBool($whoisHandler->isValid()); 149 | $this->assertIsBool($whoisHandler->isAvailable()); 150 | $this->assertIsString($whoisHandler->getWhoisMessage()); 151 | 152 | // Checker should still work 153 | $results = Checker::whois('example.com'); 154 | $this->assertIsArray($results); 155 | $this->assertArrayHasKey('example.com', $results); 156 | 157 | // Should return known status values 158 | $this->assertContains($results['example.com'], ['available', 'unavailable', 'premium', 'invalid']); 159 | } 160 | 161 | public function testUnsupportedTldDetection() 162 | { 163 | // Test various unsupported TLD messages 164 | $unsupportedMessages = [ 165 | 'TLD is not supported', 166 | 'The domain extension .test is not supported by this WHOIS server', 167 | 'Whois server not known for .example', 168 | 'No WHOIS server available for this TLD', 169 | 'Unsupported domain extension: .internal', 170 | 'Extension not supported', 171 | 'WHOIS SERVER NOT KNOWN', 172 | ]; 173 | 174 | foreach ($unsupportedMessages as $message) { 175 | // Should throw exception when detecting unsupported TLD 176 | try { 177 | AvailabilityDetector::isAvailable($message, '.test', false); 178 | $this->fail('Expected exception for unsupported TLD message: ' . $message); 179 | } catch (\Exception $e) { 180 | $this->assertEquals('TLD is not supported by the WHOIS server', $e->getMessage()); 181 | } 182 | } 183 | 184 | // Test that normal messages don't trigger unsupported TLD detection 185 | $normalMessages = [ 186 | 'This is a very short response', 187 | 'google.com is available for registration.', 188 | 'Domain not found', 189 | 'No match for domain', 190 | ]; 191 | 192 | foreach ($normalMessages as $message) { 193 | // Should not throw exception for normal messages 194 | try { 195 | $result = AvailabilityDetector::isAvailable($message, '.com', false); 196 | $this->assertTrue(true, 'Normal message should not throw exception'); 197 | } catch (\Exception $e) { 198 | $this->fail('Normal message should not throw unsupported TLD exception: ' . $e->getMessage()); 199 | } 200 | } 201 | 202 | // Test getAvailabilityDetails with unsupported TLD 203 | $details = AvailabilityDetector::getAvailabilityDetails('TLD is not supported', '.test', false); 204 | $this->assertTrue($details['contains_unsupported_tld_messages'], 'Should detect unsupported TLD messages'); 205 | $this->assertEquals('unsupported_tld', $details['final_availability'], 'Final availability should be unsupported_tld'); 206 | } 207 | 208 | public function testRedemptionPeriodDetection() 209 | { 210 | // Test redemption period detection for .de domain 211 | $redemptionResponse = " ---Domain: elitefollow.de
\nStatus: redemptionPeriod
"; 212 | 213 | $isAvailable = AvailabilityDetector::isAvailable($redemptionResponse, '.de', false); 214 | $this->assertFalse($isAvailable, 'Domain in redemption period should be detected as unavailable'); 215 | 216 | $details = AvailabilityDetector::getAvailabilityDetails($redemptionResponse, '.de', false); 217 | $this->assertTrue($details['contains_unavailability_indicators'], 'Should detect redemptionPeriod as unavailability indicator'); 218 | $this->assertFalse($details['final_availability'], 'Final result should be unavailable for redemption period domain'); 219 | 220 | // Test other domain status that should be unavailable 221 | $statusesToTest = [ 222 | 'Status: redemptionPeriod', 223 | 'Status: redemption period', 224 | 'Status: redemption', 225 | 'Status: pendingDelete', 226 | 'Status: pending delete', 227 | 'Status: serverHold', 228 | 'Status: server hold', 229 | ]; 230 | 231 | foreach ($statusesToTest as $status) { 232 | $response = " ---Domain: test.de
\n$status
"; 233 | $isAvailable = AvailabilityDetector::isAvailable($response, '.de', false); 234 | $this->assertFalse($isAvailable, "Domain with '$status' should be detected as unavailable"); 235 | } 236 | 237 | // Test that normal registered status also works 238 | $registeredResponse = " ---Domain: test.de
\nStatus: connect
"; 239 | $isAvailable = AvailabilityDetector::isAvailable($registeredResponse, '.de', false); 240 | $this->assertFalse($isAvailable, 'Domain with Status: connect should be detected as unavailable'); 241 | } 242 | 243 | public function testServerBusyAndRateLimitDetection() 244 | { 245 | // Test server busy and rate limit messages 246 | $serverErrorMessages = [ 247 | 'Server is busy now, please try again later.', 248 | 'Server busy, try again later', 249 | 'Please try again later', 250 | 'Service temporarily unavailable', 251 | 'Rate limit exceeded', 252 | 'Too many requests', 253 | 'Quota exceeded', 254 | 'Connection timed out', 255 | 'Request timeout', 256 | ]; 257 | 258 | foreach ($serverErrorMessages as $message) { 259 | try { 260 | AvailabilityDetector::isAvailable($message, '.shop', false); 261 | $this->fail("Expected exception for server error message: $message"); 262 | } catch (\Exception $e) { 263 | // Should throw an exception 264 | $this->assertStringContainsString('unavailable', strtolower($e->getMessage()), 265 | "Exception message should indicate unavailability for: $message"); 266 | } 267 | } 268 | 269 | // Test that proper WHOIS responses still work 270 | $validRegisteredResponse = "Domain Name: GOLDOZI.SHOP\nRegistrar: PDR Ltd.\nCreation Date: 2019-05-26\nName Server: AV1.7HOSTIR.COM"; 271 | $isAvailable = AvailabilityDetector::isAvailable($validRegisteredResponse, '.shop', false); 272 | $this->assertFalse($isAvailable, 'Valid registered domain response should be detected as unavailable'); 273 | 274 | $validAvailableResponse = "DOMAIN NOT FOUND"; 275 | $isAvailable = AvailabilityDetector::isAvailable($validAvailableResponse, '.shop', false); 276 | $this->assertTrue($isAvailable, 'Valid available domain response should be detected as available'); 277 | } 278 | } 279 | -------------------------------------------------------------------------------- /src/AvailabilityDetector.php: -------------------------------------------------------------------------------- 1 | $originalResult, 84 | 'contains_unsupported_tld_messages' => $containsUnsupportedTld, 85 | 'contains_unavailability_indicators' => self::containsUnavailabilityIndicators($whoisMessage, $tld), 86 | 'contains_registration_indicators' => self::containsRegistrationIndicators($whoisMessage, $tld), 87 | 'contains_availability_keywords' => self::containsAvailabilityKeywords($whoisMessage), 88 | 'is_response_too_short' => self::isResponseTooShort($whoisMessage), 89 | 'contains_no_match_patterns' => self::containsNoMatchPatterns($whoisMessage), 90 | 'tld_specific_patterns' => !empty($tld) ? self::checkTldSpecificPatterns($whoisMessage, $tld) : false, 91 | 'domain_status_indicators' => self::checkDomainStatusIndicators($whoisMessage), 92 | 'final_availability' => $containsUnsupportedTld ? 'unsupported_tld' : self::isAvailable($whoisMessage, $tld, $originalResult), 93 | 'whois_message_length' => strlen($whoisMessage), 94 | 'whois_message_preview' => substr($whoisMessage, 0, 200) . (strlen($whoisMessage) > 200 ? '...' : ''), 95 | ]; 96 | } 97 | 98 | /** 99 | * Check for keywords that indicate domain availability 100 | */ 101 | private static function containsAvailabilityKeywords(string $whoisMessage): bool 102 | { 103 | $availabilityKeywords = [ 104 | 'no match', 105 | 'not found', 106 | 'no data found', 107 | 'no entries found', 108 | 'available for registration', 109 | 'domain status: available', 110 | 'no matching record', 111 | 'not registered', 112 | 'free', 113 | 'no object found', 114 | 'no such domain', 115 | 'object does not exist', 116 | 'nothing found', 117 | 'no domain', 118 | 'domain not found', 119 | 'status: available', 120 | 'registration status: available', 121 | 'status:\tavailable', 122 | 'status:\t\tavailable', 123 | 'status: free', 124 | 'is free', 125 | 'domain name not known', 126 | 'domain has not been registered', 127 | 'domain name has not been registered', 128 | 'is available for purchase', 129 | 'no se encontro el objeto', 130 | 'object_not_found', 131 | 'el dominio no se encuentra registrado', 132 | 'domain is available', 133 | 'domain does not exist', 134 | 'does not exist in database', 135 | 'was not found', 136 | 'not exist', 137 | 'no está registrado', 138 | 'is available for registration', 139 | 'not registered', 140 | 'no entries found', 141 | 'not found...', 142 | ]; 143 | 144 | // Filter out comment lines and informational text 145 | $lines = explode("\n", $whoisMessage); 146 | $relevantLines = []; 147 | 148 | foreach ($lines as $line) { 149 | $line = trim($line); 150 | // Skip comment lines, empty lines, and informational lines 151 | if (empty($line) || 152 | str_starts_with($line, '%') || 153 | str_starts_with($line, '#') || 154 | str_starts_with($line, ';') || 155 | str_starts_with($line, '>>>') || 156 | str_starts_with($line, '---') || 157 | stripos($line, 'available on web at') !== false || 158 | stripos($line, 'find the terms and conditions') !== false) { 159 | continue; 160 | } 161 | $relevantLines[] = $line; 162 | } 163 | 164 | $filteredMessage = strtolower(implode(' ', $relevantLines)); 165 | 166 | foreach ($availabilityKeywords as $keyword) { 167 | if (strpos($filteredMessage, strtolower($keyword)) !== false) { 168 | return true; 169 | } 170 | } 171 | 172 | return false; 173 | } 174 | 175 | /** 176 | * Check for unsupported TLD or server error messages (highest priority) 177 | * This includes rate limiting, server busy, timeouts, etc. 178 | */ 179 | private static function containsUnsupportedTldMessages(string $whoisMessage): bool 180 | { 181 | $lowerMessage = strtolower($whoisMessage); 182 | 183 | // Common patterns for unsupported TLD messages and server errors 184 | $unsupportedPatterns = [ 185 | 'tld is not supported', 186 | 'tld not supported', 187 | 'extension not supported', 188 | 'domain extension not supported', 189 | 'unsupported tld', 190 | 'unsupported domain extension', 191 | 'this tld is not supported', 192 | 'the tld is not supported', 193 | 'whois server not known', 194 | 'no whois server', 195 | 'whois service not available', 196 | 'not supported by this whois server', 197 | 'extension is not supported', 198 | 'domain type not supported', 199 | 'tld not available', 200 | 'extension not available', 201 | 'no server found for', 202 | 'server not found for', 203 | 'whois not available for', 204 | 'no whois available for', 205 | 'server is busy', 206 | 'server busy', 207 | 'please try again later', 208 | 'try again later', 209 | 'service temporarily unavailable', 210 | 'temporarily unavailable', 211 | 'rate limit exceeded', 212 | 'too many requests', 213 | 'quota exceeded', 214 | 'connection timed out', 215 | 'connection timeout', 216 | 'request timeout', 217 | 'timeout', 218 | ]; 219 | 220 | foreach ($unsupportedPatterns as $pattern) { 221 | if (strpos($lowerMessage, $pattern) !== false) { 222 | return true; 223 | } 224 | } 225 | 226 | // Check for regex patterns 227 | $unsupportedRegexPatterns = [ 228 | '/tld\s+(?:is\s+)?not\s+supported/i', 229 | '/extension\s+(?:is\s+)?not\s+supported/i', 230 | '/unsupported\s+(?:tld|extension|domain)/i', 231 | '/no\s+whois\s+(?:server|service)\s+(?:available|found)/i', 232 | '/whois\s+(?:server\s+)?not\s+(?:known|available|found)/i', 233 | '/(?:server|service)\s+not\s+(?:available|found)\s+for/i', 234 | ]; 235 | 236 | foreach ($unsupportedRegexPatterns as $pattern) { 237 | if (preg_match($pattern, $whoisMessage)) { 238 | return true; 239 | } 240 | } 241 | 242 | return false; 243 | } 244 | 245 | /** 246 | * Check for explicit UNAVAILABILITY indicators (high priority) 247 | */ 248 | private static function containsUnavailabilityIndicators(string $whoisMessage, string $tld = ''): bool 249 | { 250 | $lowerMessage = strtolower($whoisMessage); 251 | 252 | // TLD-specific unavailability patterns (highest priority) 253 | $tldUnavailabilityPatterns = [ 254 | '.com.au' => ['/---not available/i', '/---not found/i', '/not available/i', '/domain not available/i'], 255 | '.au' => ['/---not available/i', '/---not found/i', '/not available/i', '/domain not available/i'], 256 | '.uk' => ['/this domain has been registered/i', '/registered/i'], 257 | '.de' => ['/status:\s*connect/i', '/status:\s*registered/i', '/status:\s*active/i', '/status:\s*redemptionPeriod/i', '/status:\s*redemption/i'], 258 | '.it' => ['/status:\s*active/i', '/status:\s*registered/i'], 259 | '.fr' => ['/status:\s*active/i', '/status:\s*registered/i'], 260 | '.ca' => ['/domain registered/i', '/status:\s*registered/i'], 261 | '.nl' => ['/status:\s*active/i', '/status:\s*in use/i'], 262 | '.be' => ['/status:\s*registered/i', '/status:\s*allocated/i'], 263 | '.eu' => ['/status:\s*registered/i'], 264 | '.ch' => ['/status:\s*registered/i'], 265 | '.li' => ['/status:\s*registered/i'], 266 | '.at' => ['/status:\s*registered/i'], 267 | '.dk' => ['/status:\s*active/i'], 268 | '.no' => ['/status:\s*active/i'], 269 | '.se' => ['/status:\s*active/i'], 270 | '.fi' => ['/status:\s*registered/i'], 271 | '.pt' => ['/status:\s*active/i'], 272 | '.es' => ['/status:\s*registered/i'], 273 | '.mx' => ['/status:\s*registered/i'], 274 | '.ar' => ['/status:\s*registered/i'], 275 | '.br' => ['/status:\s*registered/i'], 276 | '.cl' => ['/status:\s*registered/i'], 277 | '.pe' => ['/status:\s*registered/i'], 278 | '.co' => ['/status:\s*registered/i'], 279 | '.ve' => ['/status:\s*registered/i'], 280 | '.ec' => ['/status:\s*registered/i'], 281 | '.uy' => ['/status:\s*registered/i'], 282 | '.py' => ['/status:\s*registered/i'], 283 | '.bo' => ['/status:\s*registered/i'], 284 | '.hn' => ['/status:\s*registered/i'], 285 | '.ni' => ['/status:\s*registered/i'], 286 | '.cr' => ['/status:\s*registered/i'], 287 | '.gt' => ['/status:\s*registered/i'], 288 | '.sv' => ['/status:\s*registered/i'], 289 | '.pa' => ['/status:\s*registered/i'], 290 | '.do' => ['/status:\s*registered/i'], 291 | '.pr' => ['/status:\s*registered/i'], 292 | '.cu' => ['/status:\s*registered/i'], 293 | '.tt' => ['/status:\s*registered/i'], 294 | '.gy' => ['/status:\s*registered/i'], 295 | '.sr' => ['/status:\s*registered/i'], 296 | '.jm' => ['/status:\s*registered/i'], 297 | '.bb' => ['/status:\s*registered/i'], 298 | '.lc' => ['/status:\s*registered/i'], 299 | '.gd' => ['/status:\s*registered/i'], 300 | '.vc' => ['/status:\s*registered/i'], 301 | '.dm' => ['/status:\s*registered/i'], 302 | '.ag' => ['/status:\s*registered/i'], 303 | '.kn' => ['/status:\s*registered/i'], 304 | '.ai' => ['/status:\s*registered/i'], 305 | '.ms' => ['/status:\s*registered/i'], 306 | '.tc' => ['/status:\s*registered/i'], 307 | '.vg' => ['/status:\s*registered/i'], 308 | '.fk' => ['/status:\s*registered/i'], 309 | '.gs' => ['/status:\s*registered/i'], 310 | '.sh' => ['/status:\s*registered/i'], 311 | '.pn' => ['/status:\s*registered/i'], 312 | '.ki' => ['/status:\s*registered/i'], 313 | '.nr' => ['/status:\s*registered/i'], 314 | '.tv' => ['/status:\s*registered/i'], 315 | '.ws' => ['/status:\s*registered/i'], 316 | '.cc' => ['/status:\s*registered/i'], 317 | '.cx' => ['/status:\s*registered/i'], 318 | '.hm' => ['/status:\s*registered/i'], 319 | '.nf' => ['/status:\s*registered/i'], 320 | '.sj' => ['/status:\s*registered/i'], 321 | '.bv' => ['/status:\s*registered/i'], 322 | '.tf' => ['/status:\s*registered/i'], 323 | '.pm' => ['/status:\s*registered/i'], 324 | '.wf' => ['/status:\s*registered/i'], 325 | '.yt' => ['/status:\s*registered/i'], 326 | '.re' => ['/status:\s*registered/i'], 327 | '.mq' => ['/status:\s*registered/i'], 328 | '.gp' => ['/status:\s*registered/i'], 329 | '.gf' => ['/status:\s*registered/i'], 330 | '.pf' => ['/status:\s*registered/i'], 331 | '.nc' => ['/status:\s*registered/i'], 332 | '.vu' => ['/status:\s*registered/i'], 333 | '.tk' => ['/status:\s*registered/i'], 334 | '.to' => ['/status:\s*registered/i'], 335 | '.ws' => ['/status:\s*registered/i'], 336 | '.cc' => ['/status:\s*registered/i'], 337 | '.as' => ['/status:\s*registered/i'], 338 | '.ki' => ['/status:\s*registered/i'], 339 | '.fm' => ['/status:\s*registered/i'], 340 | '.nr' => ['/status:\s*registered/i'], 341 | '.pw' => ['/status:\s*registered/i'], 342 | '.cf' => ['/status:\s*registered/i'], 343 | '.ml' => ['/status:\s*registered/i'], 344 | '.ga' => ['/status:\s*registered/i'], 345 | '.gq' => ['/status:\s*registered/i'], 346 | '.cm' => ['/status:\s*registered/i'], 347 | '.bi' => ['/status:\s*registered/i'], 348 | '.ne' => ['/status:\s*registered/i'], 349 | '.cd' => ['/status:\s*registered/i'], 350 | '.dj' => ['/status:\s*registered/i'], 351 | '.km' => ['/status:\s*registered/i'], 352 | '.mg' => ['/status:\s*registered/i'], 353 | '.rw' => ['/status:\s*registered/i'], 354 | '.sc' => ['/status:\s*registered/i'], 355 | '.so' => ['/status:\s*registered/i'], 356 | '.st' => ['/status:\s*registered/i'], 357 | '.tz' => ['/status:\s*registered/i'], 358 | '.ug' => ['/status:\s*registered/i'], 359 | '.zm' => ['/status:\s*registered/i'], 360 | '.zw' => ['/status:\s*registered/i'], 361 | ]; 362 | 363 | if (isset($tldUnavailabilityPatterns[$tld])) { 364 | foreach ($tldUnavailabilityPatterns[$tld] as $pattern) { 365 | if (preg_match($pattern, $whoisMessage)) { 366 | return true; // Explicitly NOT available 367 | } 368 | } 369 | } 370 | 371 | // General unavailability patterns 372 | $generalUnavailabilityPatterns = [ 373 | '/---not available/i', 374 | '/---not\s+found/i', 375 | '/---domain not found/i', 376 | '/not available/i', 377 | '/domain not available/i', 378 | '/status:\s*not available/i', 379 | '/registration status:\s*not available/i', 380 | '/domain status:\s*not available/i', 381 | '/status:\s*unavailable/i', 382 | '/status:\s*registered/i', 383 | '/status:\s*active/i', 384 | '/status:\s*connect/i', 385 | '/status:\s*client/i', 386 | '/status:\s*redemptionPeriod/i', 387 | '/status:\s*redemption\s*period/i', 388 | '/status:\s*redemption/i', 389 | '/status:\s*pendingDelete/i', 390 | '/status:\s*pending\s*delete/i', 391 | '/status:\s*serverHold/i', 392 | '/status:\s*server\s*hold/i', 393 | '/this domain has been registered/i', 394 | '/domain registered/i', 395 | '/already registered/i', 396 | '/currently registered/i', 397 | '/is registered/i', 398 | '/registration:\s*registered/i', 399 | ]; 400 | 401 | foreach ($generalUnavailabilityPatterns as $pattern) { 402 | if (preg_match($pattern, $whoisMessage)) { 403 | return true; // Explicitly NOT available 404 | } 405 | } 406 | 407 | return false; 408 | } 409 | 410 | /** 411 | * Check for clear registration indicators that mean domain is NOT available 412 | */ 413 | private static function containsRegistrationIndicators(string $whoisMessage, string $tld = ''): bool 414 | { 415 | $lowerMessage = strtolower($whoisMessage); 416 | 417 | // Strong indicators that domain is registered 418 | $registrationIndicators = [ 419 | 'domain:', 420 | 'ascii:', 421 | 'nserver:', 422 | 'nameserver:', 423 | 'name server:', 424 | 'registrar:', 425 | 'registrant:', 426 | 'creation date:', 427 | 'created:', 428 | 'changed:', 429 | 'expiry date:', 430 | 'expires:', 431 | 'updated:', 432 | 'last updated:', 433 | 'admin contact:', 434 | 'technical contact:', 435 | 'billing contact:', 436 | 'registry domain id:', 437 | 'registrar whois server:', 438 | 'domain status: client', 439 | 'dnssec:', 440 | ]; 441 | 442 | $foundIndicators = 0; 443 | foreach ($registrationIndicators as $indicator) { 444 | if (strpos($lowerMessage, $indicator) !== false) { 445 | $foundIndicators++; 446 | } 447 | } 448 | 449 | // For .ir domains, be extra careful - if we see domain: and nserver: it's definitely registered 450 | if ($tld === '.ir') { 451 | if (strpos($lowerMessage, 'domain:') !== false && strpos($lowerMessage, 'nserver:') !== false) { 452 | return true; 453 | } 454 | } 455 | 456 | // For .de domains, "Status: connect" means registered 457 | if ($tld === '.de' && strpos($lowerMessage, 'status: connect') !== false) { 458 | return true; 459 | } 460 | 461 | // If we find 3 or more registration indicators, it's likely registered 462 | return $foundIndicators >= 3; 463 | } 464 | 465 | /** 466 | * Check if WHOIS response is too short to contain real registration data 467 | */ 468 | private static function isResponseTooShort(string $whoisMessage): bool 469 | { 470 | $trimmedMessage = trim($whoisMessage); 471 | $lowerMessage = strtolower($trimmedMessage); 472 | 473 | // Don't treat explicit unavailability messages as "short" (even if they are short) 474 | if (strpos($lowerMessage, 'not available') !== false || 475 | strpos($lowerMessage, 'not found') !== false || 476 | strpos($lowerMessage, 'unavailable') !== false || 477 | strpos($lowerMessage, 'domain not found') !== false || 478 | strpos($lowerMessage, 'no match') !== false || 479 | strpos($lowerMessage, 'no entries found') !== false || 480 | strpos($lowerMessage, '---not available') !== false || 481 | strpos($lowerMessage, '---not found') !== false) { 482 | return false; // This is an explicit unavailability message, not "short" 483 | } 484 | 485 | // If message is very short (less than 100 characters) and doesn't contain unavailability indicators, likely available 486 | if (strlen($trimmedMessage) < 100) { 487 | return true; 488 | } 489 | 490 | // Count meaningful lines (ignore empty lines and comments) 491 | $lines = explode("\n", $trimmedMessage); 492 | $meaningfulLines = 0; 493 | 494 | foreach ($lines as $line) { 495 | $line = trim($line); 496 | if (!empty($line) && 497 | !str_starts_with($line, '%') && 498 | !str_starts_with($line, '#') && 499 | !str_starts_with($line, ';') && 500 | !str_starts_with($line, '>>>') && 501 | !str_starts_with($line, '---')) { 502 | $meaningfulLines++; 503 | } 504 | } 505 | 506 | // If less than 5 meaningful lines, likely available 507 | return $meaningfulLines < 5; 508 | } 509 | 510 | /** 511 | * Check for "No match" type patterns that indicate availability 512 | */ 513 | private static function containsNoMatchPatterns(string $whoisMessage): bool 514 | { 515 | $noMatchPatterns = [ 516 | '/no\s+match/i', 517 | '/not\s+found/i', 518 | '/no\s+data\s+found/i', 519 | '/no\s+entries\s+found/i', 520 | '/no\s+matching\s+record/i', 521 | '/object\s+does\s+not\s+exist/i', 522 | '/no\s+such\s+domain/i', 523 | '/domain\s+not\s+found/i', 524 | '/status:\s*available/i', 525 | '/registration\s+status:\s*available/i', 526 | '/status:\s*free/i', 527 | '/\bis\s+free\b/i', 528 | '/domain\s+name\s+not\s+known/i', 529 | '/domain\s+has\s+not\s+been\s+registered/i', 530 | '/domain\s+name\s+has\s+not\s+been\s+registered/i', 531 | '/\bis\s+available\s+for/i', 532 | '/no\s+se\s+encontro\s+el\s+objeto/i', 533 | '/object_not_found/i', 534 | '/el\s+dominio\s+no\s+se\s+encuentra\s+registrado/i', 535 | '/domain\s+is\s+available/i', 536 | '/domain\s+does\s+not\s+exist/i', 537 | '/does\s+not\s+exist\s+in\s+database/i', 538 | '/was\s+not\s+found/i', 539 | '/not\s+exist/i', 540 | '/no\s+está\s+registrado/i', 541 | '/---available/i', 542 | '/---not\s+found/i', 543 | '/---domain\s+not\s+found/i', 544 | '/%error:103/i', 545 | '/404/i', // For RDAP servers 546 | ]; 547 | 548 | foreach ($noMatchPatterns as $pattern) { 549 | if (preg_match($pattern, $whoisMessage)) { 550 | return true; 551 | } 552 | } 553 | 554 | return false; 555 | } 556 | 557 | /** 558 | * Check for TLD-specific availability patterns 559 | */ 560 | private static function checkTldSpecificPatterns(string $whoisMessage, string $tld): bool 561 | { 562 | $tldPatterns = [ 563 | // Major TLDs 564 | '.com' => ['/no\s+match\s+for/i', '/domain\s+not\s+found/i'], 565 | '.net' => ['/no\s+match\s+for/i', '/domain\s+not\s+found/i'], 566 | '.org' => ['/domain\s+not\s+found/i', '/not\s+found/i'], 567 | '.uk' => ['/no\s+match/i', '/this\s+domain\s+is\s+available/i'], 568 | '.de' => ['/is\s+available\s+for\s+registration/i', '/status:\s*free/i'], 569 | '.fr' => ['/not\s+found/i', '/available/i'], 570 | '.it' => ['/available/i', '/status:\s*available/i'], 571 | '.au' => ['/---available/i', '/is\s+available\s+for\s+registration/i'], 572 | '.com.au' => ['/is\s+available\s+for\s+registration/i', '/available/i'], 573 | '.org.au' => ['/is\s+available\s+for\s+registration/i', '/available/i'], 574 | '.net.au' => ['/is\s+available\s+for\s+registration/i', '/available/i'], 575 | '.be' => ['/status:\s*available/i', '/free/i'], 576 | '.ca' => ['/not\s+found/i', '/available/i'], 577 | '.ch' => ['/---1:/i', '/available/i'], 578 | '.li' => ['/available/i', '/is\s+available/i'], 579 | '.eu' => ['/status:\s*available/i', '/available/i'], 580 | '.nl' => ['/\bis\s+free/i', '/available/i'], 581 | '.dk' => ['/available/i', '/is\s+available/i'], 582 | '.no' => ['/available/i', '/is\s+available/i'], 583 | '.se' => ['/available/i', '/is\s+available/i'], 584 | '.fi' => ['/available/i', '/is\s+available/i'], 585 | '.pt' => ['/available/i', '/is\s+available/i'], 586 | '.es' => ['/available/i', '/is\s+available/i'], 587 | 588 | // Asian TLDs 589 | '.jp' => ['/no\s+match!!/i', '/no\s+match/i'], 590 | '.cn' => ['/no\s+matching\s+record/i', '/not\s+found/i'], 591 | '.in' => ['/not\s+found/i', '/no\s+data\s+found/i'], 592 | '.hk' => ['/the\s+domain\s+has\s+not\s+been\s+registered/i'], 593 | '.tw' => ['/no\s+found/i', '/not\s+found/i'], 594 | '.sg' => ['/---not\s+found/i', '/domain\s+not\s+found/i'], 595 | '.my' => ['/does\s+not\s+exist\s+in\s+database/i'], 596 | '.ph' => ['/domain\s+is\s+available/i'], 597 | '.th' => ['/no\s+match\s+found/i'], 598 | '.vn' => ['/available/i', '/not\s+found/i'], 599 | '.id' => ['/domain\s+not\s+found/i', '/available/i'], 600 | 601 | // American TLDs 602 | '.us' => ['/not\s+found/i', '/domain\s+not\s+found/i'], 603 | '.mx' => ['/no_se_encontro_el_objeto/i', '/not\s+found/i'], 604 | '.br' => ['/no\s+match\s+for/i', '/domain\s+not\s+found/i'], 605 | '.ar' => ['/el\s+dominio\s+no\s+se\s+encuentra\s+registrado/i'], 606 | '.co' => ['/not\s+found/i', '/available/i'], 607 | '.cl' => ['/no\s+entries\s+found/i', '/available/i'], 608 | '.pe' => ['/not\s+found/i', '/available/i'], 609 | '.ve' => ['/no\s+entries\s+found/i', '/available/i'], 610 | '.ec' => ['/404/i', '/available/i'], 611 | 612 | // European TLDs 613 | '.ru' => ['/no\s+entries\s+found/i', '/not\s+found/i'], 614 | '.pl' => ['/no\s+information\s+available/i', '/available/i'], 615 | '.cz' => ['/no\s+entries\s+found/i', '/available/i'], 616 | '.sk' => ['/domain\s+not\s+found/i', '/available/i'], 617 | '.hu' => ['/no\s+match/i', '/available/i'], 618 | '.ro' => ['/no\s+entries\s+found/i', '/available/i'], 619 | '.rs' => ['/not\s+found/i', '/available/i'], 620 | '.me' => ['/not\s+found/i', '/available/i'], 621 | '.ba' => ['/not\s+found/i', '/available/i'], 622 | '.mk' => ['/no\s+entries\s+found/i', '/available/i'], 623 | '.al' => ['/no\s+entries\s+found/i', '/available/i'], 624 | '.md' => ['/no\s+object\s+found/i', '/available/i'], 625 | '.ua' => ['/no\s+entries\s+found/i', '/available/i'], 626 | 627 | // African TLDs 628 | '.za' => ['/available/i', '/not\s+found/i'], 629 | '.co.za' => ['/available/i', '/not\s+found/i'], 630 | '.ng' => ['/not\s+found/i', '/available/i'], 631 | '.ke' => ['/no\s+object\s+found/i', '/available/i'], 632 | '.ma' => ['/no\s+object\s+found/i', '/available/i'], 633 | '.tn' => ['/not\s+found/i', '/available/i'], 634 | '.eg' => ['/not\s+found/i', '/available/i'], 635 | '.ci' => ['/not\s+found/i', '/available/i'], 636 | '.sn' => ['/not\s+found/i', '/available/i'], 637 | 638 | // Oceanian TLDs 639 | '.nz' => ['/not\s+found/i', '/available/i'], 640 | '.ws' => ['/the\s+queried\s+object\s+does\s+not\s+exist/i'], 641 | '.cc' => ['/no\s+match/i', '/available/i'], 642 | '.to' => ['/no\s+match\s+for/i', '/available/i'], 643 | 644 | // Other TLDs 645 | '.im' => ['/was\s+not\s+found/i', '/available/i'], 646 | '.io' => ['/---domain\s+not\s+found/i', '/available/i'], 647 | '.sh' => ['/domain\s+not\s+found/i', '/available/i'], 648 | '.ac' => ['/domain\s+not\s+found/i', '/available/i'], 649 | '.gg' => ['/not\s+found/i', '/available/i'], 650 | '.je' => ['/not\s+found/i', '/available/i'], 651 | '.as' => ['/not\s+found/i', '/available/i'], 652 | '.ms' => ['/no\s+object\s+found/i', '/available/i'], 653 | '.tc' => ['/no\s+object\s+found/i', '/available/i'], 654 | '.vg' => ['/domain\s+not\s+found/i', '/available/i'], 655 | '.gs' => ['/no\s+object\s+found/i', '/available/i'], 656 | '.fm' => ['/domain\s+not\s+found/i', '/available/i'], 657 | '.nr' => ['/no\s+object\s+found/i', '/available/i'], 658 | '.pw' => ['/domain\s+not\s+found/i', '/available/i'], 659 | '.tk' => ['/domain\s+name\s+not\s+known/i', '/available/i'], 660 | '.ml' => ['/domain\s+not\s+found/i', '/available/i'], 661 | '.ga' => ['/domain\s+not\s+found/i', '/available/i'], 662 | '.cf' => ['/domain\s+not\s+found/i', '/available/i'], 663 | '.gq' => ['/domain\s+not\s+found/i', '/available/i'], 664 | '.cm' => ['/not\s+registered/i', '/available/i'], 665 | '.bi' => ['/domain\s+not\s+found/i', '/available/i'], 666 | '.ne' => ['/no\s+object\s+found/i', '/available/i'], 667 | '.cd' => ['/no\s+object\s+found/i', '/available/i'], 668 | '.dj' => ['/not\s+found/i', '/available/i'], 669 | '.km' => ['/not\s+found/i', '/available/i'], 670 | '.mg' => ['/no\s+object\s+found/i', '/available/i'], 671 | '.rw' => ['/not\s+found/i', '/available/i'], 672 | '.sc' => ['/not\s+found/i', '/available/i'], 673 | '.so' => ['/not\s+found/i', '/available/i'], 674 | '.st' => ['/not\s+found/i', '/available/i'], 675 | '.tz' => ['/no\s+entries\s+found/i', '/available/i'], 676 | '.ug' => ['/no\s+entries\s+found/i', '/available/i'], 677 | '.zm' => ['/not\s+found/i', '/available/i'], 678 | '.zw' => ['/no\s+information\s+available/i', '/available/i'], 679 | 680 | // Special cases 681 | '.ir' => ['/no\s+entries\s+found/i'], 682 | '.gr' => ['/not\s+exist/i'], 683 | ]; 684 | 685 | if (isset($tldPatterns[$tld])) { 686 | foreach ($tldPatterns[$tld] as $pattern) { 687 | if (preg_match($pattern, $whoisMessage)) { 688 | return true; 689 | } 690 | } 691 | } 692 | 693 | return false; 694 | } 695 | 696 | /** 697 | * Check for domain status indicators that suggest availability 698 | */ 699 | private static function checkDomainStatusIndicators(string $whoisMessage): bool 700 | { 701 | $lowerMessage = strtolower($whoisMessage); 702 | 703 | // Check for explicit availability status indicators 704 | $statusIndicators = [ 705 | 'status: available', 706 | 'status:\tavailable', 707 | 'status: free', 708 | 'registration status: available', 709 | 'domain status: available', 710 | 'availability: available', 711 | 'state: available', 712 | 'status = available', 713 | 'status=available', 714 | ]; 715 | 716 | foreach ($statusIndicators as $indicator) { 717 | if (strpos($lowerMessage, $indicator) !== false) { 718 | return true; 719 | } 720 | } 721 | 722 | // Check for absence of typical registration fields 723 | $registrationFields = [ 724 | 'registrar:', 725 | 'creation date:', 726 | 'created:', 727 | 'expiry date:', 728 | 'expires:', 729 | 'name server:', 730 | 'nameserver:', 731 | 'nserver:', 732 | 'registrant:', 733 | 'admin contact:', 734 | 'technical contact:', 735 | ]; 736 | 737 | $foundFields = 0; 738 | foreach ($registrationFields as $field) { 739 | if (strpos($lowerMessage, $field) !== false) { 740 | $foundFields++; 741 | } 742 | } 743 | 744 | // If we find very few registration fields, domain might be available 745 | return $foundFields < 2; 746 | } 747 | } 748 | -------------------------------------------------------------------------------- /src/dist.whois.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "extensions": ".com,.net,.es,.com.es,.nom.es,.gob.es,.edu.es", 4 | "uri": "socket:\/\/whois.crsnic.net", 5 | "available": "No match for" 6 | }, 7 | { 8 | "extensions": ".org,.ngo,.ong", 9 | "uri": "socket:\/\/whois.publicinterestregistry.net", 10 | "available": "Domain not found" 11 | }, 12 | { 13 | "extensions": ".uk,.co.uk,.net.uk,.org.uk,.ltd.uk,.plc.uk,.me.uk", 14 | "uri": "socket:\/\/whois.nic.uk", 15 | "available": "No match" 16 | }, 17 | { 18 | "extensions": ".edu,.mil", 19 | "uri": "socket:\/\/whois.internic.net", 20 | "available": "No match for" 21 | }, 22 | { 23 | "extensions": ".br.com,.cn.com,.eu.com,.no.com,.qc.com,.sa.com,.se.com,.se.net,.us.com,.uy.com,.za.com,.uk.com,.uk.net,.gb.com,.gb.net,.online,.site", 24 | "uri": "socket:\/\/whois.centralnic.com", 25 | "available": "DOMAIN NOT FOUND" 26 | }, 27 | { 28 | "extensions": ".ink", 29 | "uri": "socket:\/\/whois.nic.ink", 30 | "available": "No Data Found" 31 | }, 32 | { 33 | "extensions": ".com.de", 34 | "uri": "socket:\/\/whois.centralnic.com", 35 | "available": "Status: free" 36 | }, 37 | { 38 | "extensions": ".ac,.co.ac", 39 | "uri": "socket:\/\/whois.nic.ac", 40 | "available": "Domain not found" 41 | }, 42 | { 43 | "extensions": ".af", 44 | "uri": "socket:\/\/whois.nic.af", 45 | "available": "No Object Found" 46 | }, 47 | { 48 | "extensions": ".am", 49 | "uri": "socket:\/\/whois.amnic.net", 50 | "available": "No match" 51 | }, 52 | { 53 | "extensions": ".as", 54 | "uri": "socket:\/\/whois.nic.as", 55 | "available": "NOT FOUND" 56 | }, 57 | { 58 | "extensions": ".at,.ac.at,.co.at,.gv.at,.or.at", 59 | "uri": "socket:\/\/whois.nic.at", 60 | "available": "nothing found" 61 | }, 62 | { 63 | "extensions": ".au,.asn.au,.com.au,.edu.au,.org.au,.net.au,.id.au", 64 | "uri": "socket:\/\/domaincheck.auda.org.au", 65 | "available": "---Available" 66 | }, 67 | { 68 | "extensions": ".be,.ac.be", 69 | "uri": "socket:\/\/whois.dns.be", 70 | "available": "Status:\tAVAILABLE" 71 | }, 72 | { 73 | "extensions": ".br,.adm.br,.adv.br,.am.br,.arq.br,.art.br,.bio.br,.cng.br,.cnt.br,.com.br,.ecn.br,.eng.br,.esp.br,.etc.br,.eti.br,.fm.br,.fot.br,.fst.br,.g12.br,.gov.br,.ind.br,.inf.br,.jor.br,.lel.br,.med.br,.mil.br,.net.br,.nom.br,.ntr.br,.odo.br,.org.br,.ppg.br,.pro.br,.psc.br,.psi.br,.rec.br,.slg.br,.tmp.br,.tur.br,.tv.br,.vet.br,.zlg.br", 74 | "uri": "socket:\/\/whois.nic.br", 75 | "available": "No match for" 76 | }, 77 | { 78 | "extensions": ".ca", 79 | "uri": "socket:\/\/whois.cira.ca", 80 | "available": "Not found" 81 | }, 82 | { 83 | "extensions": ".cc", 84 | "uri": "socket:\/\/whois.nic.cc", 85 | "available": "No match" 86 | }, 87 | { 88 | "extensions": ".cn,.ac.cn,.com.cn,.edu.cn,.gov.cn,.net.cn,.org.cn,.bj.cn,.sh.cn,.tj.cn,.cq.cn,.he.cn,.nm.cn,.ln.cn,.jl.cn,.hl.cn,.js.cn,.zj.cn,.ah.cn,.hb.cn,.hn.cn,.gd.cn,.gx.cn,.hi.cn,.sc.cn,.gz.cn,.yn.cn,.xz.cn,.sn.cn,.gs.cn,.qh.cn,.nx.cn,.xj.cn,.tw.cn,.hk.cn,.mo.cn", 89 | "uri": "socket:\/\/whois.cnnic.net.cn", 90 | "available": "No matching record" 91 | }, 92 | { 93 | "extensions": ".scot", 94 | "uri": "socket:\/\/whois.nic.scot", 95 | "available": "no matching objects found" 96 | }, 97 | { 98 | "extensions": ".cx", 99 | "uri": "socket:\/\/whois.nic.cx", 100 | "available": "No Object Found" 101 | }, 102 | { 103 | "extensions": ".cz", 104 | "uri": "socket:\/\/whois.nic.cz", 105 | "available": "No entries found" 106 | }, 107 | { 108 | "extensions": ".de", 109 | "uri": "socket:\/\/whois.denic.de", 110 | "available": "Status: free" 111 | }, 112 | { 113 | "extensions": ".dk", 114 | "uri": "socket:\/\/whois.dk-hostmaster.dk", 115 | "available": "No entries found" 116 | }, 117 | { 118 | "extensions": ".fo", 119 | "uri": "socket:\/\/whois.nic.fo", 120 | "available": "DOMAIN NOT FOUND" 121 | }, 122 | { 123 | "extensions": ".com.ec,.org.ec,.net.ec,.mil.ec,.fin.ec,.med.ec,.gob.ec,.ec", 124 | "uri": "https:\/\/rdap.registry.ec\/domain\/", 125 | "available": "404", 126 | "comment": "Updated to use RDAP server instead of traditional whois" 127 | }, 128 | { 129 | "extensions": ".fr,.tm.fr,.com.fr,.asso.fr,.presse.fr", 130 | "uri": "socket:\/\/whois.nic.fr", 131 | "available": "NOT FOUND" 132 | }, 133 | { 134 | "extensions": ".gf", 135 | "uri": "socket:\/\/whois.mediaserv.net", 136 | "available": "NO OBJECT FOUND" 137 | }, 138 | { 139 | "extensions": ".co.il,.org.il,.net.il,.ac.il,.k12.il,.gov.il,.muni.il", 140 | "uri": "socket:\/\/whois.isoc.org.il", 141 | "available": "No data was found" 142 | }, 143 | { 144 | "extensions": ".ac.in,.co.in,.org.in,.ernet.in,.gov.in,.net.in,.res.in,.in", 145 | "uri": "socket:\/\/whois.registry.in", 146 | "available": "No Data Found" 147 | }, 148 | { 149 | "extensions": ".is", 150 | "uri": "socket:\/\/whois.isnic.is", 151 | "available": "No entries found" 152 | }, 153 | { 154 | "extensions": ".it", 155 | "uri": "socket:\/\/whois.nic.it", 156 | "available": "AVAILABLE" 157 | }, 158 | { 159 | "extensions": ".ac.jp,.co.jp,.go.jp,.or.jp,.ne.jp", 160 | "uri": "socket:\/\/whois.jprs.jp", 161 | "available": "No match!!" 162 | }, 163 | { 164 | "extensions": ".ac.kr,.co.kr,.go.kr,.ne.kr,.ne.kr,.or.kr,.re.kr", 165 | "uri": "socket:\/\/whois.nic.or.kr", 166 | "available": "domain was not found" 167 | }, 168 | { 169 | "extensions": ".li", 170 | "uri": "socket:\/\/whois.nic.li", 171 | "available": "We do not have an entry in our database matching your query" 172 | }, 173 | { 174 | "extensions": ".lt", 175 | "uri": "socket:\/\/das.domreg.lt", 176 | "available": "Status:\t\t\tavailable" 177 | }, 178 | { 179 | "extensions": ".lu", 180 | "uri": "socket:\/\/whois.dns.lu", 181 | "available": "No such domain" 182 | }, 183 | { 184 | "extensions": ".asso.mc,.tm.mc,.ad", 185 | "uri": "socket:\/\/whois.ripe.net", 186 | "available": "no entries found" 187 | }, 188 | { 189 | "extensions": ".com.mm,.org.mm,.net.mm,.edu.mm,.gov.mm", 190 | "uri": "socket:\/\/whois.registry.gov.mm", 191 | "available": "DOMAIN NOT FOUND" 192 | }, 193 | { 194 | "extensions": ".mx,.com.mx,.org.mx,.net.mx,.edu.mx,.gob.mx", 195 | "uri": "socket:\/\/whois.mx", 196 | "available": "No_Se_Encontro_El_Objeto\/Object_Not_Found" 197 | }, 198 | { 199 | "extensions": ".nl", 200 | "uri": "socket:\/\/whois.domain-registry.nl", 201 | "available": "is free" 202 | }, 203 | { 204 | "extensions": ".no,.priv.no,.idrett.no", 205 | "uri": "socket:\/\/whois.norid.no", 206 | "available": "No match" 207 | }, 208 | { 209 | "extensions": ".nu", 210 | "uri": "socket:\/\/whois.iis.nu", 211 | "available": "not found" 212 | }, 213 | { 214 | "extensions": ".pl,.com.pl,.net.pl,.org.pl,.aid.pl,.agro.pl,.atm.pl,.auto.pl,.biz.pl,.edu.pl,.gmina.pl,.gsm.pl,.info.pl,.mail.pl,.miasta.pl,.media.pl,.mil.pl,.nom.pl,.pc.pl,.priv.pl,.realestate.pl,.rel.pl,.shop.pl,.sklep.pl,.sos.pl,.targi.pl,.tm.pl,.tourism.pl,.turystyka.pl", 215 | "uri": "socket:\/\/whois.dns.pl", 216 | "available": "No information available" 217 | }, 218 | { 219 | "extensions": ".ro,.com.ro,.org.ro,.store.ro,.tm.ro,.firm.ro,.www.ro,.arts.ro,.rec.ro,.info.ro,.nom.ro,.nt.ro", 220 | "uri": "socket:\/\/whois.rotld.ro", 221 | "available": "No entries found" 222 | }, 223 | { 224 | "extensions": ".se", 225 | "uri": "socket:\/\/whois.iis.se", 226 | "available": "not found" 227 | }, 228 | { 229 | "extensions": ".si", 230 | "uri": "socket:\/\/whois.arnes.si", 231 | "available": "No entries found" 232 | }, 233 | { 234 | "extensions": ".com.sg,.org.sg,.net.sg,.gov.sg,.sg,.edu.sg,.sg", 235 | "uri": "socket:\/\/whois.sgnic.sg", 236 | "available": "---Not found" 237 | }, 238 | { 239 | "extensions": ".sk", 240 | "uri": "socket:\/\/whois.sk-nic.sk", 241 | "available": "Domain not found" 242 | }, 243 | { 244 | "extensions": ".st", 245 | "uri": "socket:\/\/whois.nic.st", 246 | "available": "No entries found" 247 | }, 248 | { 249 | "extensions": ".tf", 250 | "uri": "socket:\/\/whois.nic.tf", 251 | "available": "No entries found" 252 | }, 253 | { 254 | "extensions": ".ac.th,.co.th,.go.th,.mi.th,.net.th,.or.th,.in.th", 255 | "uri": "socket:\/\/whois.thnic.net", 256 | "available": "No match found" 257 | }, 258 | { 259 | "extensions": ".tj", 260 | "uri": "socket:\/\/whois.nic.tj", 261 | "available": "No match" 262 | }, 263 | { 264 | "extensions": ".to", 265 | "uri": "socket:\/\/whois.tonic.to", 266 | "available": "No match for" 267 | }, 268 | { 269 | "extensions": ".bbs.tr,.com.tr,.edu.tr,.gov.tr,.k12.tr,.tsk.tr,.net.tr,.org.tr,.biz.tr,.name.tr,.tel.tr,.bel.tr,.gen.tr,.info.tr,.web.tr", 270 | "uri": "socket:\/\/whois.nic.tr", 271 | "available": "No match found" 272 | }, 273 | { 274 | "extensions": ".istanbul", 275 | "uri": "socket:\/\/whois.afilias-srs.net", 276 | "available": "NOT FOUND" 277 | }, 278 | { 279 | "extensions": ".com.tw,.org.tw,.net.tw", 280 | "uri": "socket:\/\/whois.twnic.net", 281 | "available": "No Found" 282 | }, 283 | { 284 | "extensions": ".ac.uk", 285 | "uri": "socket:\/\/whois.ja.net", 286 | "available": "No such domain" 287 | }, 288 | { 289 | "extensions": ".ac.za,.alt.za,.edu.za,.gov.za,.mil.za,.ngo.za,.nom.za,.school.za,.tm.za", 290 | "uri": "socket:\/\/whois.co.za", 291 | "available": "No information available" 292 | }, 293 | { 294 | "extensions": ".co.za", 295 | "uri": "socket:\/\/whois.registry.net.za", 296 | "available": "Available" 297 | }, 298 | { 299 | "extensions": ".net.za", 300 | "uri": "socket:\/\/net-whois.registry.net.za", 301 | "available": "Available" 302 | }, 303 | { 304 | "extensions": ".org.za", 305 | "uri": "socket:\/\/org-whois.registry.net.za", 306 | "available": "Available" 307 | }, 308 | { 309 | "extensions": ".web.za", 310 | "uri": "socket:\/\/web-whois.registry.net.za", 311 | "available": "Available" 312 | }, 313 | { 314 | "extensions": ".kz", 315 | "uri": "socket:\/\/whois.nic.kz", 316 | "available": "Nothing found" 317 | }, 318 | { 319 | "extensions": ".ch", 320 | "uri": "socket:\/\/whois.nic.ch:4343", 321 | "available": "---1:" 322 | }, 323 | { 324 | "extensions": ".info,.blue,.kim,.pink,.black,.green,.lgbt,.poker,.red,.vote,.voto,.archi,.bio,.ski,.bet,.promo,.pet,.lotto", 325 | "uri": "socket:\/\/whois.afilias.net", 326 | "available": "Domain not found" 327 | }, 328 | { 329 | "extensions": ".ua", 330 | "uri": "socket:\/\/whois.ua", 331 | "available": "No entries found" 332 | }, 333 | { 334 | "extensions": ".biz", 335 | "uri": "socket:\/\/whois.biz", 336 | "available": "No Data Found" 337 | }, 338 | { 339 | "extensions": ".ws", 340 | "uri": "socket:\/\/whois.website.ws", 341 | "available": "The queried object does not exist" 342 | }, 343 | { 344 | "extensions": ".gov", 345 | "uri": "socket:\/\/whois.nic.gov", 346 | "available": "No match for" 347 | }, 348 | { 349 | "extensions": ".name", 350 | "uri": "socket:\/\/whois.nic.name", 351 | "available": "No match" 352 | }, 353 | { 354 | "extensions": ".ie", 355 | "uri": "socket:\/\/whois.domainregistry.ie", 356 | "available": "Not found" 357 | }, 358 | { 359 | "extensions": ".hk,.com.hk,.org.hk,.net.hk,.edu.hk", 360 | "uri": "socket:\/\/whois.hkirc.hk", 361 | "available": "The domain has not been registered" 362 | }, 363 | { 364 | "extensions": ".us", 365 | "uri": "socket:\/\/whois.nic.us", 366 | "available": "No Data Found" 367 | }, 368 | { 369 | "extensions": ".tk", 370 | "uri": "socket:\/\/whois.dot.tk", 371 | "available": "domain name not known" 372 | }, 373 | { 374 | "extensions": ".cd", 375 | "uri": "socket:\/\/whois.nic.cd", 376 | "available": "No Object Found" 377 | }, 378 | { 379 | "extensions": ".aero", 380 | "uri": "socket:\/\/whois.aero", 381 | "available": "NOT FOUND" 382 | }, 383 | { 384 | "extensions": ".by", 385 | "uri": "socket:\/\/whois.cctld.by", 386 | "available": "Object does not exist" 387 | }, 388 | { 389 | "extensions": ".lv", 390 | "uri": "socket:\/\/whois.nic.lv", 391 | "available": "Status: free" 392 | }, 393 | { 394 | "extensions": ".bz", 395 | "uri": "socket:\/\/whois.afilias-grs.info.", 396 | "available": "NOT FOUND" 397 | }, 398 | { 399 | "extensions": ".jp", 400 | "uri": "socket:\/\/whois.jprs.jp", 401 | "available": "No match!!" 402 | }, 403 | { 404 | "extensions": ".cl", 405 | "uri": "socket:\/\/whois.nic.cl", 406 | "available": "no entries found." 407 | }, 408 | { 409 | "extensions": ".ag", 410 | "uri": "socket:\/\/whois.nic.ag", 411 | "available": "NOT FOUND" 412 | }, 413 | { 414 | "extensions": ".mobi", 415 | "uri": "socket:\/\/whois.dotmobiregistry.net", 416 | "available": "Domain not found" 417 | }, 418 | { 419 | "extensions": ".eu", 420 | "uri": "socket:\/\/whois.eu", 421 | "available": "Status: AVAILABLE" 422 | }, 423 | { 424 | "extensions": ".co.nz,.org.nz,.net.nz,.maori.nz,.iwi.nz,.ac.nz,.kiwi.nz,.geek.nz,.gen.nz,.school.nz,.nz", 425 | "uri": "socket:\/\/whois.irs.net.nz", 426 | "available": "Not found" 427 | }, 428 | { 429 | "extensions": ".io", 430 | "uri": "socket:\/\/whois.nic.io", 431 | "available": "---Domain not found" 432 | }, 433 | { 434 | "extensions": ".la", 435 | "uri": "socket:\/\/whois.nic.la", 436 | "available": "NOT FOUND" 437 | }, 438 | { 439 | "extensions": ".md", 440 | "uri": "socket:\/\/whois.nic.md", 441 | "available": "No match for" 442 | }, 443 | { 444 | "extensions": ".sc", 445 | "uri": "socket:\/\/whois2.afilias-grs.net", 446 | "available": "NOT FOUND" 447 | }, 448 | { 449 | "extensions": ".vc", 450 | "uri": "socket:\/\/whois2.afilias-grs.net", 451 | "available": "NOT FOUND" 452 | }, 453 | { 454 | "extensions": ".vg", 455 | "uri": "socket:\/\/whois.nic.vg", 456 | "available": "DOMAIN NOT FOUND" 457 | }, 458 | { 459 | "extensions": ".tc", 460 | "uri": "socket:\/\/whois.nic.tc", 461 | "available": "No Object Found" 462 | }, 463 | { 464 | "extensions": ".tw", 465 | "uri": "socket:\/\/whois.twnic.net.tw", 466 | "available": "No Found" 467 | }, 468 | { 469 | "extensions": ".travel", 470 | "uri": "socket:\/\/whois.nic.travel", 471 | "available": "Domain not found" 472 | }, 473 | { 474 | "extensions": ".my,.com.my,.net.my,.org.my,.edu.my,.gov.my", 475 | "uri": "socket:\/\/whois.mynic.my", 476 | "available": "does not exist in database" 477 | }, 478 | { 479 | "extensions": ".com.ph,.net.ph,.ph,.org.ph", 480 | "uri": "https:\/\/whois.dot.ph\/?search=", 481 | "available": "Domain is available" 482 | }, 483 | { 484 | "extensions": ".tv", 485 | "uri": "socket:\/\/whois.nic.tv", 486 | "available": "No Data Found" 487 | }, 488 | { 489 | "extensions": ".pt,.com.pt,.edu.pt", 490 | "uri": "socket:\/\/whois.dns.pt", 491 | "available": "No Match" 492 | }, 493 | { 494 | "extensions": ".me", 495 | "uri": "socket:\/\/whois.nic.me", 496 | "available": "NOT FOUND" 497 | }, 498 | { 499 | "extensions": ".asia", 500 | "uri": "socket:\/\/whois.nic.asia", 501 | "available": "NOT FOUND" 502 | }, 503 | { 504 | "extensions": ".fi", 505 | "uri": "socket:\/\/whois.ficora.fi", 506 | "available": "Domain not found" 507 | }, 508 | { 509 | "extensions": ".za.net,.za.org", 510 | "uri": "http:\/\/www.za.net\/cgi-bin\/whois.cgi?domain=", 511 | "available": "No such domain" 512 | }, 513 | { 514 | "extensions": ".com.ve,.net.ve,.org.ve,.web.ve,.info.ve,.co.ve", 515 | "uri": "socket:\/\/whois.nic.ve", 516 | "available": "No entries found" 517 | }, 518 | { 519 | "extensions": ".tel", 520 | "uri": "socket:\/\/whois.nic.tel", 521 | "available": "No Data Found" 522 | }, 523 | { 524 | "extensions": ".im", 525 | "uri": "socket:\/\/whois.nic.im", 526 | "available": "was not found" 527 | }, 528 | { 529 | "extensions": ".gr,.com.gr,.net.gr,.org.gr,.edu.gr,.gov.gr", 530 | "uri": "https:\/\/grwhois.ics.forth.gr:800\/plainwhois\/plainWhois?domainName=", 531 | "available": "not exist" 532 | }, 533 | { 534 | "extensions": ".ir,.co.ir,.ac.ir,.sch.ir,.gov.ir,.org.ir,.edu.ir", 535 | "uri": "socket:\/\/whois.nic.ir", 536 | "premium": "under certain conditions", 537 | "available": "no entries found" 538 | }, 539 | { 540 | "extensions": ".ru,.pp.ru,.net.ru,.org.ru,.su,.com.ru", 541 | "uri": "socket:\/\/whois.ripn.net", 542 | "available": "No entries found" 543 | }, 544 | { 545 | "extensions": ".spb.ru,.msk.ru", 546 | "uri": "socket:\/\/whois.relcom.ru", 547 | "available": "No entries found" 548 | }, 549 | { 550 | "extensions": ".com.ua,.dn.ua,.kh.ua,.lg.ua,.net.ua,.org.ua,.kiev.ua", 551 | "uri": "socket:\/\/whois.net.ua", 552 | "available": "No entries found" 553 | }, 554 | { 555 | "extensions": ".lviv.ua", 556 | "uri": "socket:\/\/whois.lviv.ua", 557 | "available": "No Object Found" 558 | }, 559 | { 560 | "extensions": ".co,.net.co,.com.co,.nom.co", 561 | "uri": "socket:\/\/whois.nic.co", 562 | "available": "No Data Found" 563 | }, 564 | { 565 | "extensions": ".gt,.com.gt,.net.gt,.org.gt,.ind.gt,.edu.gt,.gob.gt,.mil.gt", 566 | "uri": "https:\/\/www.gt\/sitio\/whois.php?dn=", 567 | "available": "no est\u00e1 registrado" 568 | }, 569 | { 570 | "extensions": ".re", 571 | "uri": "socket:\/\/whois.nic.re", 572 | "available": "NOT FOUND" 573 | }, 574 | { 575 | "extensions": ".pm", 576 | "uri": "socket:\/\/whois.nic.pm", 577 | "available": "No entries found" 578 | }, 579 | { 580 | "extensions": ".wf", 581 | "uri": "socket:\/\/whois.nic.wf", 582 | "available": "No entries found" 583 | }, 584 | { 585 | "extensions": ".yt", 586 | "uri": "socket:\/\/whois.nic.yt", 587 | "available": "NOT FOUND" 588 | }, 589 | { 590 | "extensions": ".xxx", 591 | "uri": "socket:\/\/whois.nic.xxx", 592 | "available": "No Data Found" 593 | }, 594 | { 595 | "extensions": ".hu", 596 | "uri": "socket:\/\/whois.nic.hu", 597 | "available": "No match" 598 | }, 599 | { 600 | "extensions": ".ac.ke,.co.ke,.or.ke,.ne.ke,.mobi.ke,.info.ke,.go.ke,.me.ke,.sc.ke", 601 | "uri": "socket:\/\/whois.kenic.or.ke", 602 | "available": "No Object Found" 603 | }, 604 | { 605 | "extensions": ".gd", 606 | "uri": "socket:\/\/whois.nic.gd", 607 | "available": "not found..." 608 | }, 609 | { 610 | "extensions": ".rs,.co.rs,.org.rs,.edu.rs,.in.rs", 611 | "uri": "socket:\/\/whois.rnids.rs", 612 | "available": "%ERROR:103" 613 | }, 614 | { 615 | "extensions": ".ae", 616 | "uri": "socket:\/\/whois.aeda.net.ae", 617 | "available": "No Data Found" 618 | }, 619 | { 620 | "extensions": ".pw", 621 | "uri": "socket:\/\/whois.nic.pw", 622 | "available": "DOMAIN NOT FOUND" 623 | }, 624 | { 625 | "extensions": ".cat", 626 | "uri": "socket:\/\/whois.nic.cat", 627 | "available": "no matching objects found" 628 | }, 629 | { 630 | "extensions": ".mil.id,.go.id", 631 | "uri": "socket:\/\/whois.id", 632 | "available": "DOMAIN NOT FOUND" 633 | }, 634 | { 635 | "extensions": ".fm", 636 | "uri": "socket:\/\/whois.nic.fm", 637 | "available": "DOMAIN NOT FOUND" 638 | }, 639 | { 640 | "extensions": ".mn", 641 | "uri": "socket:\/\/whois.afilias-grs.info", 642 | "available": "NOT FOUND" 643 | }, 644 | { 645 | "extensions": ".sx", 646 | "uri": "socket:\/\/whois.sx", 647 | "available": "Not found:" 648 | }, 649 | { 650 | "extensions": ".pa,.com.pa,.net.pa,.org.pa", 651 | "uri": "http:\/\/www.nic.pa\/en\/whois\/dominio\/", 652 | "available": "The domain doesn't exist" 653 | }, 654 | { 655 | "extensions": ".equipment,.gallery,.graphics,.lighting,.photography,.directory,.technology,.today,.bike,.clothing,.guru,.plumbing,.singles,.camera,.estate,.construction,.contractors,.kitchen,.land,.enterprises,.holdings,.ventures,.diamonds,.voyage,.photos,.shoes,.careers,.recipes,.academy,.agency,.associates,.bargains,.boutique,.builders,.cab,.camp,.center,.cheap,.codes,.coffee,.company,.computer,.cool,.education,.email,.expert,.exposed,.farm,.flights,.florist,.glass,.holiday,.house,.institute,.international,.limo,.maison,.management,.marketing,.repair,.solar,.solutions,.supplies,.supply,.support,.systems,.tips,.training,.viajes,.zone,.world,.apartments,.bingo,.business,.cafe,.capital,.cards,.care,.cash,.casino,.catering,.chat,.church,.city,.claims,.cleaning,.clinic,.coach,.community,.condos,.coupons,.credit,.creditcard,.cruises,.dating,.deals,.delivery,.dental,.digital,.direct,.discount,.dog,.domains,.energy,.engineering,.events,.exchange,.express,.fail,.finance,.financial,.fish,.fitness,.football,.fund,.furniture,.fyi,.gifts,.gold,.golf,.gratis,.gripe,.guide,.healthcare,.hockey,.immo,.industries,.insure,.investments,.jewelry,.lease,.legal,.life,.limited,.loans,.mba,.media,.memorial,.money,.movie,.network,.partners,.parts,.pictures,.pizza,.place,.plus,.productions,.properties,.reisen,.rentals,.report,.restaurant,.run,.sarl,.school,.schule,.services,.show,.soccer,.style,.surgery,.tax,.taxi,.team,.tennis,.theater,.tienda,.tires,.tools,.tours,.town,.toys,.university,.vacations,.villas,.vision,.watch,.works,.wtf,.irish", 656 | "uri": "socket:\/\/whois.donuts.co", 657 | "available": "Domain not found" 658 | }, 659 | { 660 | "extensions": ".foundation", 661 | "uri": "socket:\/\/whois.nic.foundation", 662 | "available": "Domain not found" 663 | }, 664 | { 665 | "extensions": ".wiki", 666 | "uri": "socket:\/\/whois.nic.wiki", 667 | "available": "No Data Found" 668 | }, 669 | { 670 | "extensions": ".cm", 671 | "uri": "socket:\/\/whois.netcom.cm", 672 | "available": "Not Registered" 673 | }, 674 | { 675 | "extensions": ".gs", 676 | "uri": "socket:\/\/whois.nic.gs", 677 | "available": "No Object Found" 678 | }, 679 | { 680 | "extensions": ".ms", 681 | "uri": "socket:\/\/whois.nic.ms", 682 | "available": "No Object Found" 683 | }, 684 | { 685 | "extensions": ".sh", 686 | "uri": "socket:\/\/whois.nic.sh", 687 | "available": "Domain not found" 688 | }, 689 | { 690 | "extensions": ".tm", 691 | "uri": "socket:\/\/whois.nic.tm", 692 | "available": "is available for purchase" 693 | }, 694 | { 695 | "extensions": ".ee", 696 | "uri": "socket:\/\/whois.tld.ee", 697 | "available": "Domain not found" 698 | }, 699 | { 700 | "extensions": ".airforce,.futbol,.social,.pub,.auction,.consulting,.dance,.democrat,.forsale,.haus,.immobilien,.kaufen,.reviews,.rocks", 701 | "uri": "socket:\/\/whois.donuts.co", 702 | "available": "Domain not found" 703 | }, 704 | { 705 | "extensions": ".actor", 706 | "uri": "socket:\/\/whois.nic.actor", 707 | "available": "Domain not found" 708 | }, 709 | { 710 | "extensions": ".desi", 711 | "uri": "socket:\/\/whois.nic.desi", 712 | "available": "DOMAIN NOT FOUND" 713 | }, 714 | { 715 | "extensions": ".arpa", 716 | "uri": "socket:\/\/whois.iana.org", 717 | "available": "0 objects" 718 | }, 719 | { 720 | "extensions": ".ax", 721 | "uri": "socket:\/\/whois.ax", 722 | "available": "Domain not found" 723 | }, 724 | { 725 | "extensions": ".berlin", 726 | "uri": "socket:\/\/whois.nic.berlin", 727 | "available": "object does not exist" 728 | }, 729 | { 730 | "extensions": ".build", 731 | "uri": "socket:\/\/whois.nic.build", 732 | "available": "DOMAIN NOT FOUND" 733 | }, 734 | { 735 | "extensions": ".buzz", 736 | "uri": "socket:\/\/whois.nic.buzz", 737 | "available": "No Data Found" 738 | }, 739 | { 740 | "extensions": ".capetown", 741 | "uri": "socket:\/\/whois.nic.capetown", 742 | "available": "Available" 743 | }, 744 | { 745 | "extensions": ".club", 746 | "uri": "socket:\/\/whois.nic.club", 747 | "available": "No Data Found" 748 | }, 749 | { 750 | "extensions": ".durban", 751 | "uri": "socket:\/\/whois.nic.durban", 752 | "available": "Available" 753 | }, 754 | { 755 | "extensions": ".gift,.guitars,.link,.pics,.sexy,.audio,.blackfriday,.christmas,.click,.diet,.flowers,.help,.hosting,.juegos,.lol,.photo,.property,.tattoo", 756 | "uri": "socket:\/\/whois.uniregistry.net", 757 | "available": "is available for registration" 758 | }, 759 | { 760 | "extensions": ".hiphop", 761 | "uri": "socket:\/\/whois.nic.hiphop", 762 | "available": "is available for registration" 763 | }, 764 | { 765 | "extensions": ".joburg", 766 | "uri": "socket:\/\/whois.nic.joburg", 767 | "available": "Available" 768 | }, 769 | { 770 | "extensions": ".luxury", 771 | "uri": "socket:\/\/whois.nic.luxury", 772 | "available": "DOMAIN NOT FOUND" 773 | }, 774 | { 775 | "extensions": ".menu", 776 | "uri": "socket:\/\/whois.nic.menu", 777 | "available": "No Data Found" 778 | }, 779 | { 780 | "extensions": ".moda", 781 | "uri": "socket:\/\/whois.nic.moda", 782 | "available": "Domain not found" 783 | }, 784 | { 785 | "extensions": ".ninja", 786 | "uri": "socket:\/\/whois.nic.ninja", 787 | "available": "Domain not found" 788 | }, 789 | { 790 | "extensions": ".shiksha", 791 | "uri": "socket:\/\/whois.nic.shiksha", 792 | "available": "Domain not found" 793 | }, 794 | { 795 | "extensions": ".uno", 796 | "uri": "socket:\/\/whois.nic.uno", 797 | "available": "DOMAIN NOT FOUND" 798 | }, 799 | { 800 | "extensions": ".work", 801 | "uri": "socket:\/\/whois.nic.work", 802 | "available": "No Data Found" 803 | }, 804 | { 805 | "extensions": ".co.zw", 806 | "uri": "http:\/\/zispa.org.zw\/cgi-bin\/domain_lookup.pl?s=", 807 | "available": "is available for registration" 808 | }, 809 | { 810 | "extensions": ".coop", 811 | "uri": "socket:\/\/whois.nic.coop", 812 | "available": "DOMAIN NOT FOUND" 813 | }, 814 | { 815 | "extensions": ".co.id,.desa.id,.web.id,.ac.id,.or.id,.sch.id,.my.id,.biz.id", 816 | "uri": "socket:\/\/whois.pandi.or.id", 817 | "available": "DOMAIN NOT FOUND" 818 | }, 819 | { 820 | "extensions": ".attorney", 821 | "uri": "socket:\/\/whois.nic.attorney", 822 | "available": "Domain not found." 823 | }, 824 | { 825 | "extensions": ".lawyer", 826 | "uri": "socket:\/\/whois.nic.lawyer", 827 | "available": "Domain not found." 828 | }, 829 | { 830 | "extensions": ".army", 831 | "uri": "socket:\/\/whois.nic.army", 832 | "available": "Domain not found." 833 | }, 834 | { 835 | "extensions": ".band", 836 | "uri": "socket:\/\/whois.nic.band", 837 | "available": "Domain not found." 838 | }, 839 | { 840 | "extensions": ".degree", 841 | "uri": "socket:\/\/whois.nic.degree", 842 | "available": "Domain not found." 843 | }, 844 | { 845 | "extensions": ".dentist", 846 | "uri": "socket:\/\/whois.nic.dentist", 847 | "available": "Domain not found." 848 | }, 849 | { 850 | "extensions": ".engineer", 851 | "uri": "socket:\/\/whois.nic.engineer", 852 | "available": "Domain not found." 853 | }, 854 | { 855 | "extensions": ".family", 856 | "uri": "socket:\/\/whois.nic.family", 857 | "available": "Domain not found." 858 | }, 859 | { 860 | "extensions": ".gives", 861 | "uri": "socket:\/\/whois.nic.gives", 862 | "available": "Domain not found." 863 | }, 864 | { 865 | "extensions": ".live", 866 | "uri": "socket:\/\/whois.nic.live", 867 | "available": "Domain not found." 868 | }, 869 | { 870 | "extensions": ".market", 871 | "uri": "socket:\/\/whois.nic.market", 872 | "available": "Domain not found." 873 | }, 874 | { 875 | "extensions": ".mortgage", 876 | "uri": "socket:\/\/whois.nic.mortgage", 877 | "available": "Domain not found." 878 | }, 879 | { 880 | "extensions": ".navy", 881 | "uri": "socket:\/\/whois.nic.navy", 882 | "available": "Domain not found." 883 | }, 884 | { 885 | "extensions": ".news", 886 | "uri": "socket:\/\/whois.nic.news", 887 | "available": "Domain not found." 888 | }, 889 | { 890 | "extensions": ".rehab", 891 | "uri": "socket:\/\/whois.nic.rehab", 892 | "available": "Domain not found." 893 | }, 894 | { 895 | "extensions": ".republican", 896 | "uri": "socket:\/\/whois.nic.republican", 897 | "available": "Domain not found." 898 | }, 899 | { 900 | "extensions": ".rip", 901 | "uri": "socket:\/\/whois.nic.rip", 902 | "available": "Domain not found." 903 | }, 904 | { 905 | "extensions": ".sale", 906 | "uri": "socket:\/\/whois.nic.sale", 907 | "available": "Domain not found." 908 | }, 909 | { 910 | "extensions": ".software", 911 | "uri": "socket:\/\/whois.nic.software", 912 | "available": "Domain not found." 913 | }, 914 | { 915 | "extensions": ".studio", 916 | "uri": "socket:\/\/whois.nic.studio", 917 | "available": "Domain not found." 918 | }, 919 | { 920 | "extensions": ".vet", 921 | "uri": "socket:\/\/whois.nic.vet", 922 | "available": "Domain not found." 923 | }, 924 | { 925 | "extensions": ".video", 926 | "uri": "socket:\/\/whois.nic.video", 927 | "available": "Domain not found." 928 | }, 929 | { 930 | "extensions": ".top", 931 | "uri": "socket:\/\/whois.nic.top", 932 | "available": "The queried object does not exist" 933 | }, 934 | { 935 | "extensions": ".co.tz,.or.tz,.go.tz,.ne.tz,.me.tz,.tv.tz,.ac.tz,.sc.tz", 936 | "uri": "socket:\/\/whois.tznic.or.tz", 937 | "available": "No entries found" 938 | }, 939 | { 940 | "extensions": ".ltda,.rich,.srl,.vegas,.onl", 941 | "uri": "socket:\/\/whois.afilias-srs.net", 942 | "available": "NOT FOUND" 943 | }, 944 | { 945 | "extensions": ".sex", 946 | "uri": "socket:\/\/whois.nic.sex", 947 | "available": "No match for" 948 | }, 949 | { 950 | "extensions": ".adult", 951 | "uri": "socket:\/\/whois.nic.adult", 952 | "available": "No Data Found" 953 | }, 954 | { 955 | "extensions": ".porn", 956 | "uri": "socket:\/\/whois.nic.porn", 957 | "available": "No Data Found" 958 | }, 959 | { 960 | "extensions": ".pe,.com.pe", 961 | "uri": "socket:\/\/kero.yachay.pe", 962 | "available": "No Object Found" 963 | }, 964 | { 965 | "extensions": ".accountant", 966 | "uri": "socket:\/\/whois.nic.accountant", 967 | "available": "No Data Found" 968 | }, 969 | { 970 | "extensions": ".accountants", 971 | "uri": "socket:\/\/whois.nic.accountants", 972 | "available": "Domain not found" 973 | }, 974 | { 975 | "extensions": ".bar", 976 | "uri": "socket:\/\/whois.nic.bar", 977 | "available": "DOMAIN NOT FOUND" 978 | }, 979 | { 980 | "extensions": ".best", 981 | "uri": "socket:\/\/whois.nic.best", 982 | "available": "DOMAIN NOT FOUND" 983 | }, 984 | { 985 | "extensions": ".bid", 986 | "uri": "socket:\/\/whois.nic.bid", 987 | "available": "No Data Found" 988 | }, 989 | { 990 | "extensions": ".ceo", 991 | "uri": "socket:\/\/whois.nic.ceo", 992 | "available": "DOMAIN NOT FOUND" 993 | }, 994 | { 995 | "extensions": ".college", 996 | "uri": "socket:\/\/whois.nic.college", 997 | "available": "DOMAIN NOT FOUND" 998 | }, 999 | { 1000 | "extensions": ".courses", 1001 | "uri": "socket:\/\/whois.nic.courses", 1002 | "available": "No Data Found" 1003 | }, 1004 | { 1005 | "extensions": ".melbourne", 1006 | "uri": "socket:\/\/whois.nic.melbourne", 1007 | "available": "No Data Found" 1008 | }, 1009 | { 1010 | "extensions": ".cricket", 1011 | "uri": "socket:\/\/whois.nic.cricket", 1012 | "available": "No Data Found" 1013 | }, 1014 | { 1015 | "extensions": ".cymru", 1016 | "uri": "socket:\/\/whois.nic.cymru", 1017 | "available": "This domain name has not been registered" 1018 | }, 1019 | { 1020 | "extensions": ".date", 1021 | "uri": "socket:\/\/whois.nic.date", 1022 | "available": "No Data Found" 1023 | }, 1024 | { 1025 | "extensions": ".design", 1026 | "uri": "socket:\/\/whois.nic.design", 1027 | "available": "No Data Found" 1028 | }, 1029 | { 1030 | "extensions": ".download", 1031 | "uri": "socket:\/\/whois.nic.download", 1032 | "available": "No Data Found" 1033 | }, 1034 | { 1035 | "extensions": ".earth", 1036 | "uri": "socket:\/\/whois.nic.earth", 1037 | "available": "No Data Found" 1038 | }, 1039 | { 1040 | "extensions": ".eus", 1041 | "uri": "socket:\/\/whois.nic.eus", 1042 | "available": "no matching objects found" 1043 | }, 1044 | { 1045 | "extensions": ".faith", 1046 | "uri": "socket:\/\/whois.nic.faith", 1047 | "available": "No Data Found" 1048 | }, 1049 | { 1050 | "extensions": ".fans", 1051 | "uri": "socket:\/\/whois.nic.fans", 1052 | "available": "DOMAIN NOT FOUND" 1053 | }, 1054 | { 1055 | "extensions": ".film", 1056 | "uri": "socket:\/\/whois.nic.film", 1057 | "available": "No Data Found" 1058 | }, 1059 | { 1060 | "extensions": ".gal", 1061 | "uri": "socket:\/\/whois.nic.gal", 1062 | "available": "no matching objects found" 1063 | }, 1064 | { 1065 | "extensions": ".global", 1066 | "uri": "socket:\/\/whois.nic.global", 1067 | "available": "Domain not found" 1068 | }, 1069 | { 1070 | "extensions": ".host", 1071 | "uri": "socket:\/\/whois.nic.host", 1072 | "available": "DOMAIN NOT FOUND" 1073 | }, 1074 | { 1075 | "extensions": ".how,.soy", 1076 | "uri": "socket:\/\/whois.nic.google", 1077 | "available": "Domain not found" 1078 | }, 1079 | { 1080 | "extensions": ".loan", 1081 | "uri": "socket:\/\/whois.nic.loan", 1082 | "available": "No Data Found" 1083 | }, 1084 | { 1085 | "extensions": ".london", 1086 | "uri": "socket:\/\/whois.nic.london", 1087 | "available": "DOMAIN NOT FOUND" 1088 | }, 1089 | { 1090 | "extensions": ".love", 1091 | "uri": "socket:\/\/whois.nic.love", 1092 | "available": "available for registration" 1093 | }, 1094 | { 1095 | "extensions": ".men", 1096 | "uri": "socket:\/\/whois.nic.men", 1097 | "available": "No Data Found" 1098 | }, 1099 | { 1100 | "extensions": ".moe", 1101 | "uri": "socket:\/\/whois.nic.moe", 1102 | "available": "No Data Found" 1103 | }, 1104 | { 1105 | "extensions": ".one", 1106 | "uri": "socket:\/\/whois.nic.one", 1107 | "available": "No Data Found" 1108 | }, 1109 | { 1110 | "extensions": ".osaka", 1111 | "uri": "socket:\/\/whois.nic.osaka", 1112 | "available": "No Data Found" 1113 | }, 1114 | { 1115 | "extensions": ".paris", 1116 | "uri": "socket:\/\/whois.nic.paris", 1117 | "available": "NOT FOUND" 1118 | }, 1119 | { 1120 | "extensions": ".party", 1121 | "uri": "socket:\/\/whois.nic.party", 1122 | "available": "No Data Found" 1123 | }, 1124 | { 1125 | "extensions": ".press", 1126 | "uri": "socket:\/\/whois.nic.press", 1127 | "available": "DOMAIN NOT FOUND" 1128 | }, 1129 | { 1130 | "extensions": ".quebec", 1131 | "uri": "socket:\/\/whois.nic.quebec", 1132 | "available": "no matching objects found" 1133 | }, 1134 | { 1135 | "extensions": ".racing", 1136 | "uri": "socket:\/\/whois.nic.racing", 1137 | "available": "No Data Found" 1138 | }, 1139 | { 1140 | "extensions": ".reise", 1141 | "uri": "socket:\/\/whois.nic.reise", 1142 | "available": "Domain not found" 1143 | }, 1144 | { 1145 | "extensions": ".rent", 1146 | "uri": "socket:\/\/whois.nic.rent", 1147 | "available": "DOMAIN NOT FOUND" 1148 | }, 1149 | { 1150 | "extensions": ".rest", 1151 | "uri": "socket:\/\/whois.nic.rest", 1152 | "available": "DOMAIN NOT FOUND" 1153 | }, 1154 | { 1155 | "extensions": ".review", 1156 | "uri": "socket:\/\/whois.nic.review", 1157 | "available": "No Data Found" 1158 | }, 1159 | { 1160 | "extensions": ".science", 1161 | "uri": "socket:\/\/whois.nic.science", 1162 | "available": "No Data Found" 1163 | }, 1164 | { 1165 | "extensions": ".space", 1166 | "uri": "socket:\/\/whois.nic.space", 1167 | "available": "DOMAIN NOT FOUND" 1168 | }, 1169 | { 1170 | "extensions": ".study", 1171 | "uri": "socket:\/\/whois.nic.study", 1172 | "available": "No Data Found" 1173 | }, 1174 | { 1175 | "extensions": ".sucks", 1176 | "uri": "socket:\/\/whois.nic.sucks", 1177 | "available": "No Data Found" 1178 | }, 1179 | { 1180 | "extensions": ".sydney", 1181 | "uri": "socket:\/\/whois.nic.sydney", 1182 | "available": "No Data Found" 1183 | }, 1184 | { 1185 | "extensions": ".tech", 1186 | "uri": "socket:\/\/whois.nic.tech", 1187 | "available": "DOMAIN NOT FOUND" 1188 | }, 1189 | { 1190 | "extensions": ".trade", 1191 | "uri": "socket:\/\/whois.nic.trade", 1192 | "available": "No Data Found" 1193 | }, 1194 | { 1195 | "extensions": ".voting", 1196 | "uri": "socket:\/\/whois.nic.voting", 1197 | "available": "No Data Found" 1198 | }, 1199 | { 1200 | "extensions": ".wales", 1201 | "uri": "socket:\/\/whois.nic.wales", 1202 | "available": "This domain name has not been registered" 1203 | }, 1204 | { 1205 | "extensions": ".webcam", 1206 | "uri": "socket:\/\/whois.nic.webcam", 1207 | "available": "No Data Found" 1208 | }, 1209 | { 1210 | "extensions": ".website", 1211 | "uri": "socket:\/\/whois.nic.website", 1212 | "available": "DOMAIN NOT FOUND" 1213 | }, 1214 | { 1215 | "extensions": ".win", 1216 | "uri": "socket:\/\/whois.nic.win", 1217 | "available": "No Data Found" 1218 | }, 1219 | { 1220 | "extensions": ".xyz", 1221 | "uri": "socket:\/\/whois.nic.xyz", 1222 | "available": "DOMAIN NOT FOUND" 1223 | }, 1224 | { 1225 | "extensions": ".ru.com", 1226 | "uri": "socket:\/\/whois.verisign-grs.com", 1227 | "available": "No match for" 1228 | }, 1229 | { 1230 | "extensions": ".swiss", 1231 | "uri": "socket:\/\/whois.nic.swiss", 1232 | "available": "The queried object does not exist: no matching objects found" 1233 | }, 1234 | { 1235 | "extensions": ".mk,.com.mk,.org.mk,.net.mk,.inf.mk,.edu.mk", 1236 | "uri": "socket:\/\/whois.marnet.mk", 1237 | "available": "No entries found" 1238 | }, 1239 | { 1240 | "extensions": ".cloud", 1241 | "uri": "socket:\/\/whois.nic.cloud", 1242 | "available": "No Data Found" 1243 | }, 1244 | { 1245 | "extensions": ".ma,.net.ma,.org.ma,.co.ma,.gov.ma,.press.ma,.ac.ma", 1246 | "uri": "socket:\/\/whois.registre.ma", 1247 | "available": "No Object Found" 1248 | }, 1249 | { 1250 | "extensions": ".mg,.com.mg,.org.mg,.co.mg", 1251 | "uri": "socket:\/\/whois.nic.mg", 1252 | "available": "No Object Found" 1253 | }, 1254 | { 1255 | "extensions": ".qa", 1256 | "uri": "socket:\/\/whois.registry.qa", 1257 | "available": "No Data Found" 1258 | }, 1259 | { 1260 | "extensions": ".africa.com", 1261 | "uri": "socket:\/\/srs-whois.dns.net.za", 1262 | "available": "No information was found matching that query." 1263 | }, 1264 | { 1265 | "extensions": ".ltd", 1266 | "uri": "socket:\/\/whois.donuts.co", 1267 | "available": "Domain not found" 1268 | }, 1269 | { 1270 | "extensions": ".id,.co.id,.desa.id,.web.id,.ac.id,.or.id,.sch.id,.my.id,.biz.id", 1271 | "uri": "socket:\/\/whois.pandi.or.id", 1272 | "available": "DOMAIN NOT FOUND" 1273 | }, 1274 | { 1275 | "extensions": ".sa,.com.sa,.net.sa,.med.sa,.sch.sa,.org.sa,.edu.sa,.gov.sa,.pub.sa", 1276 | "uri": "socket:\/\/whois.nic.net.sa", 1277 | "available": "No Match for" 1278 | }, 1279 | { 1280 | "extensions": ".lat", 1281 | "uri": "socket:\/\/whois.nic.lat", 1282 | "available": "The queried object does not exist" 1283 | }, 1284 | { 1285 | "extensions": ".hospital", 1286 | "uri": "socket:\/\/whois.nic.hospital", 1287 | "available": "Domain not found" 1288 | }, 1289 | { 1290 | "extensions": ".cam", 1291 | "uri": "socket:\/\/whois.nic.cam", 1292 | "available": "The queried object does not exist" 1293 | }, 1294 | { 1295 | "extensions": ".eco", 1296 | "uri": "socket:\/\/whois.nic.eco", 1297 | "available": "Not found" 1298 | }, 1299 | { 1300 | "extensions": ".health", 1301 | "uri": "socket:\/\/whois.nic.health", 1302 | "available": "No Data Found" 1303 | }, 1304 | { 1305 | "extensions": ".icu", 1306 | "uri": "socket:\/\/whois.nic.icu", 1307 | "available": "DOMAIN NOT FOUND" 1308 | }, 1309 | { 1310 | "extensions": ".fun", 1311 | "uri": "socket:\/\/whois.nic.fun", 1312 | "available": "DOMAIN NOT FOUND" 1313 | }, 1314 | { 1315 | "extensions": ".art", 1316 | "uri": "socket:\/\/whois.nic.art", 1317 | "available": "DOMAIN NOT FOUND" 1318 | }, 1319 | { 1320 | "extensions": ".doctor", 1321 | "uri": "socket:\/\/whois.nic.doctor", 1322 | "available": "Domain not found" 1323 | }, 1324 | { 1325 | "extensions": ".mom", 1326 | "uri": "socket:\/\/whois.uniregistry.net", 1327 | "available": "is available for registration" 1328 | }, 1329 | { 1330 | "extensions": ".store", 1331 | "uri": "socket:\/\/whois.nic.store", 1332 | "available": "DOMAIN NOT FOUND" 1333 | }, 1334 | { 1335 | "extensions": ".vip", 1336 | "uri": "socket:\/\/whois.nic.vip", 1337 | "available": "No Data Found" 1338 | }, 1339 | { 1340 | "extensions": ".gdn", 1341 | "uri": "socket:\/\/whois.nic.gdn", 1342 | "available": "Domain Not Found" 1343 | }, 1344 | { 1345 | "extensions": ".tube", 1346 | "uri": "socket:\/\/whois.nic.tube", 1347 | "available": "No Data Found" 1348 | }, 1349 | { 1350 | "extensions": ".stream", 1351 | "uri": "socket:\/\/whois.nic.stream", 1352 | "available": "No Data Found" 1353 | }, 1354 | { 1355 | "extensions": ".miami", 1356 | "uri": "socket:\/\/whois.nic.miami", 1357 | "available": "No Data Found" 1358 | }, 1359 | { 1360 | "extensions": ".jetzt", 1361 | "uri": "socket:\/\/whois.nic.jetzt", 1362 | "available": "Domain not found." 1363 | }, 1364 | { 1365 | "extensions": ".shopping", 1366 | "uri": "socket:\/\/whois.nic.shopping", 1367 | "available": "Domain not found." 1368 | }, 1369 | { 1370 | "extensions": ".shop", 1371 | "uri": "socket:\/\/whois.nic.shop", 1372 | "available": "DOMAIN NOT FOUND" 1373 | }, 1374 | { 1375 | "extensions": ".games", 1376 | "uri": "socket:\/\/whois.nic.games", 1377 | "available": "Domain not found." 1378 | }, 1379 | { 1380 | "extensions": ".blog", 1381 | "uri": "socket:\/\/whois.nic.blog", 1382 | "available": "DOMAIN NOT FOUND" 1383 | }, 1384 | { 1385 | "extensions": ".security", 1386 | "uri": "socket:\/\/whois.nic.security", 1387 | "available": "DOMAIN NOT FOUND" 1388 | }, 1389 | { 1390 | "extensions": ".protection", 1391 | "uri": "socket:\/\/whois.nic.protection", 1392 | "available": "DOMAIN NOT FOUND" 1393 | }, 1394 | { 1395 | "extensions": ".feedback", 1396 | "uri": "socket:\/\/whois.nic.feedback", 1397 | "available": "DOMAIN NOT FOUND" 1398 | }, 1399 | { 1400 | "extensions": ".theatre", 1401 | "uri": "socket:\/\/whois.nic.theatre", 1402 | "available": "DOMAIN NOT FOUND" 1403 | }, 1404 | { 1405 | "extensions": ".game", 1406 | "uri": "socket:\/\/whois.uniregistry.net", 1407 | "available": "is available for registration" 1408 | }, 1409 | { 1410 | "extensions": ".ar,.com.ar,.org.ar,.gob.ar,.gov.ar,.tur.ar,.net.ar,.mil.ar,.musica.ar", 1411 | "uri": "socket:\/\/whois.nic.ar", 1412 | "available": "El dominio no se encuentra registrado en NIC Argentina" 1413 | }, 1414 | { 1415 | "extensions": ".dev", 1416 | "uri": "socket:\/\/whois.nic.google", 1417 | "available": "Domain not found" 1418 | }, 1419 | { 1420 | "extensions": ".nyc", 1421 | "uri": "socket:\/\/whois.nic.nyc", 1422 | "available": "No Data Found" 1423 | }, 1424 | { 1425 | "extensions": ".it.com", 1426 | "uri": "socket:\/\/whois.it.com", 1427 | "available": "No match for" 1428 | } 1429 | ] 1430 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "8cfe6e3d7e060da2e9a339db6cd8499e", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "doctrine/instantiator", 12 | "version": "1.5.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/doctrine/instantiator.git", 16 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", 21 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": "^7.1 || ^8.0" 26 | }, 27 | "require-dev": { 28 | "doctrine/coding-standard": "^9 || ^11", 29 | "ext-pdo": "*", 30 | "ext-phar": "*", 31 | "phpbench/phpbench": "^0.16 || ^1", 32 | "phpstan/phpstan": "^1.4", 33 | "phpstan/phpstan-phpunit": "^1", 34 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 35 | "vimeo/psalm": "^4.30 || ^5.4" 36 | }, 37 | "type": "library", 38 | "autoload": { 39 | "psr-4": { 40 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 41 | } 42 | }, 43 | "notification-url": "https://packagist.org/downloads/", 44 | "license": [ 45 | "MIT" 46 | ], 47 | "authors": [ 48 | { 49 | "name": "Marco Pivetta", 50 | "email": "ocramius@gmail.com", 51 | "homepage": "https://ocramius.github.io/" 52 | } 53 | ], 54 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 55 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 56 | "keywords": [ 57 | "constructor", 58 | "instantiate" 59 | ], 60 | "support": { 61 | "issues": "https://github.com/doctrine/instantiator/issues", 62 | "source": "https://github.com/doctrine/instantiator/tree/1.5.0" 63 | }, 64 | "funding": [ 65 | { 66 | "url": "https://www.doctrine-project.org/sponsorship.html", 67 | "type": "custom" 68 | }, 69 | { 70 | "url": "https://www.patreon.com/phpdoctrine", 71 | "type": "patreon" 72 | }, 73 | { 74 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 75 | "type": "tidelift" 76 | } 77 | ], 78 | "time": "2022-12-30T00:15:36+00:00" 79 | }, 80 | { 81 | "name": "myclabs/deep-copy", 82 | "version": "1.11.0", 83 | "source": { 84 | "type": "git", 85 | "url": "https://github.com/myclabs/DeepCopy.git", 86 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" 87 | }, 88 | "dist": { 89 | "type": "zip", 90 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", 91 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", 92 | "shasum": "" 93 | }, 94 | "require": { 95 | "php": "^7.1 || ^8.0" 96 | }, 97 | "conflict": { 98 | "doctrine/collections": "<1.6.8", 99 | "doctrine/common": "<2.13.3 || >=3,<3.2.2" 100 | }, 101 | "require-dev": { 102 | "doctrine/collections": "^1.6.8", 103 | "doctrine/common": "^2.13.3 || ^3.2.2", 104 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 105 | }, 106 | "type": "library", 107 | "autoload": { 108 | "files": [ 109 | "src/DeepCopy/deep_copy.php" 110 | ], 111 | "psr-4": { 112 | "DeepCopy\\": "src/DeepCopy/" 113 | } 114 | }, 115 | "notification-url": "https://packagist.org/downloads/", 116 | "license": [ 117 | "MIT" 118 | ], 119 | "description": "Create deep copies (clones) of your objects", 120 | "keywords": [ 121 | "clone", 122 | "copy", 123 | "duplicate", 124 | "object", 125 | "object graph" 126 | ], 127 | "support": { 128 | "issues": "https://github.com/myclabs/DeepCopy/issues", 129 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" 130 | }, 131 | "funding": [ 132 | { 133 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 134 | "type": "tidelift" 135 | } 136 | ], 137 | "time": "2022-03-03T13:19:32+00:00" 138 | }, 139 | { 140 | "name": "nikic/php-parser", 141 | "version": "v4.15.3", 142 | "source": { 143 | "type": "git", 144 | "url": "https://github.com/nikic/PHP-Parser.git", 145 | "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" 146 | }, 147 | "dist": { 148 | "type": "zip", 149 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", 150 | "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", 151 | "shasum": "" 152 | }, 153 | "require": { 154 | "ext-tokenizer": "*", 155 | "php": ">=7.0" 156 | }, 157 | "require-dev": { 158 | "ircmaxell/php-yacc": "^0.0.7", 159 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" 160 | }, 161 | "bin": [ 162 | "bin/php-parse" 163 | ], 164 | "type": "library", 165 | "extra": { 166 | "branch-alias": { 167 | "dev-master": "4.9-dev" 168 | } 169 | }, 170 | "autoload": { 171 | "psr-4": { 172 | "PhpParser\\": "lib/PhpParser" 173 | } 174 | }, 175 | "notification-url": "https://packagist.org/downloads/", 176 | "license": [ 177 | "BSD-3-Clause" 178 | ], 179 | "authors": [ 180 | { 181 | "name": "Nikita Popov" 182 | } 183 | ], 184 | "description": "A PHP parser written in PHP", 185 | "keywords": [ 186 | "parser", 187 | "php" 188 | ], 189 | "support": { 190 | "issues": "https://github.com/nikic/PHP-Parser/issues", 191 | "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" 192 | }, 193 | "time": "2023-01-16T22:05:37+00:00" 194 | }, 195 | { 196 | "name": "phar-io/manifest", 197 | "version": "2.0.3", 198 | "source": { 199 | "type": "git", 200 | "url": "https://github.com/phar-io/manifest.git", 201 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53" 202 | }, 203 | "dist": { 204 | "type": "zip", 205 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", 206 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53", 207 | "shasum": "" 208 | }, 209 | "require": { 210 | "ext-dom": "*", 211 | "ext-phar": "*", 212 | "ext-xmlwriter": "*", 213 | "phar-io/version": "^3.0.1", 214 | "php": "^7.2 || ^8.0" 215 | }, 216 | "type": "library", 217 | "extra": { 218 | "branch-alias": { 219 | "dev-master": "2.0.x-dev" 220 | } 221 | }, 222 | "autoload": { 223 | "classmap": [ 224 | "src/" 225 | ] 226 | }, 227 | "notification-url": "https://packagist.org/downloads/", 228 | "license": [ 229 | "BSD-3-Clause" 230 | ], 231 | "authors": [ 232 | { 233 | "name": "Arne Blankerts", 234 | "email": "arne@blankerts.de", 235 | "role": "Developer" 236 | }, 237 | { 238 | "name": "Sebastian Heuer", 239 | "email": "sebastian@phpeople.de", 240 | "role": "Developer" 241 | }, 242 | { 243 | "name": "Sebastian Bergmann", 244 | "email": "sebastian@phpunit.de", 245 | "role": "Developer" 246 | } 247 | ], 248 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 249 | "support": { 250 | "issues": "https://github.com/phar-io/manifest/issues", 251 | "source": "https://github.com/phar-io/manifest/tree/2.0.3" 252 | }, 253 | "time": "2021-07-20T11:28:43+00:00" 254 | }, 255 | { 256 | "name": "phar-io/version", 257 | "version": "3.2.1", 258 | "source": { 259 | "type": "git", 260 | "url": "https://github.com/phar-io/version.git", 261 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 262 | }, 263 | "dist": { 264 | "type": "zip", 265 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 266 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 267 | "shasum": "" 268 | }, 269 | "require": { 270 | "php": "^7.2 || ^8.0" 271 | }, 272 | "type": "library", 273 | "autoload": { 274 | "classmap": [ 275 | "src/" 276 | ] 277 | }, 278 | "notification-url": "https://packagist.org/downloads/", 279 | "license": [ 280 | "BSD-3-Clause" 281 | ], 282 | "authors": [ 283 | { 284 | "name": "Arne Blankerts", 285 | "email": "arne@blankerts.de", 286 | "role": "Developer" 287 | }, 288 | { 289 | "name": "Sebastian Heuer", 290 | "email": "sebastian@phpeople.de", 291 | "role": "Developer" 292 | }, 293 | { 294 | "name": "Sebastian Bergmann", 295 | "email": "sebastian@phpunit.de", 296 | "role": "Developer" 297 | } 298 | ], 299 | "description": "Library for handling version information and constraints", 300 | "support": { 301 | "issues": "https://github.com/phar-io/version/issues", 302 | "source": "https://github.com/phar-io/version/tree/3.2.1" 303 | }, 304 | "time": "2022-02-21T01:04:05+00:00" 305 | }, 306 | { 307 | "name": "phpunit/php-code-coverage", 308 | "version": "9.2.24", 309 | "source": { 310 | "type": "git", 311 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 312 | "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed" 313 | }, 314 | "dist": { 315 | "type": "zip", 316 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2cf940ebc6355a9d430462811b5aaa308b174bed", 317 | "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed", 318 | "shasum": "" 319 | }, 320 | "require": { 321 | "ext-dom": "*", 322 | "ext-libxml": "*", 323 | "ext-xmlwriter": "*", 324 | "nikic/php-parser": "^4.14", 325 | "php": ">=7.3", 326 | "phpunit/php-file-iterator": "^3.0.3", 327 | "phpunit/php-text-template": "^2.0.2", 328 | "sebastian/code-unit-reverse-lookup": "^2.0.2", 329 | "sebastian/complexity": "^2.0", 330 | "sebastian/environment": "^5.1.2", 331 | "sebastian/lines-of-code": "^1.0.3", 332 | "sebastian/version": "^3.0.1", 333 | "theseer/tokenizer": "^1.2.0" 334 | }, 335 | "require-dev": { 336 | "phpunit/phpunit": "^9.3" 337 | }, 338 | "suggest": { 339 | "ext-pcov": "*", 340 | "ext-xdebug": "*" 341 | }, 342 | "type": "library", 343 | "extra": { 344 | "branch-alias": { 345 | "dev-master": "9.2-dev" 346 | } 347 | }, 348 | "autoload": { 349 | "classmap": [ 350 | "src/" 351 | ] 352 | }, 353 | "notification-url": "https://packagist.org/downloads/", 354 | "license": [ 355 | "BSD-3-Clause" 356 | ], 357 | "authors": [ 358 | { 359 | "name": "Sebastian Bergmann", 360 | "email": "sebastian@phpunit.de", 361 | "role": "lead" 362 | } 363 | ], 364 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 365 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 366 | "keywords": [ 367 | "coverage", 368 | "testing", 369 | "xunit" 370 | ], 371 | "support": { 372 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 373 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.24" 374 | }, 375 | "funding": [ 376 | { 377 | "url": "https://github.com/sebastianbergmann", 378 | "type": "github" 379 | } 380 | ], 381 | "time": "2023-01-26T08:26:55+00:00" 382 | }, 383 | { 384 | "name": "phpunit/php-file-iterator", 385 | "version": "3.0.6", 386 | "source": { 387 | "type": "git", 388 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 389 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 390 | }, 391 | "dist": { 392 | "type": "zip", 393 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 394 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 395 | "shasum": "" 396 | }, 397 | "require": { 398 | "php": ">=7.3" 399 | }, 400 | "require-dev": { 401 | "phpunit/phpunit": "^9.3" 402 | }, 403 | "type": "library", 404 | "extra": { 405 | "branch-alias": { 406 | "dev-master": "3.0-dev" 407 | } 408 | }, 409 | "autoload": { 410 | "classmap": [ 411 | "src/" 412 | ] 413 | }, 414 | "notification-url": "https://packagist.org/downloads/", 415 | "license": [ 416 | "BSD-3-Clause" 417 | ], 418 | "authors": [ 419 | { 420 | "name": "Sebastian Bergmann", 421 | "email": "sebastian@phpunit.de", 422 | "role": "lead" 423 | } 424 | ], 425 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 426 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 427 | "keywords": [ 428 | "filesystem", 429 | "iterator" 430 | ], 431 | "support": { 432 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 433 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 434 | }, 435 | "funding": [ 436 | { 437 | "url": "https://github.com/sebastianbergmann", 438 | "type": "github" 439 | } 440 | ], 441 | "time": "2021-12-02T12:48:52+00:00" 442 | }, 443 | { 444 | "name": "phpunit/php-invoker", 445 | "version": "3.1.1", 446 | "source": { 447 | "type": "git", 448 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 449 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 450 | }, 451 | "dist": { 452 | "type": "zip", 453 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 454 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 455 | "shasum": "" 456 | }, 457 | "require": { 458 | "php": ">=7.3" 459 | }, 460 | "require-dev": { 461 | "ext-pcntl": "*", 462 | "phpunit/phpunit": "^9.3" 463 | }, 464 | "suggest": { 465 | "ext-pcntl": "*" 466 | }, 467 | "type": "library", 468 | "extra": { 469 | "branch-alias": { 470 | "dev-master": "3.1-dev" 471 | } 472 | }, 473 | "autoload": { 474 | "classmap": [ 475 | "src/" 476 | ] 477 | }, 478 | "notification-url": "https://packagist.org/downloads/", 479 | "license": [ 480 | "BSD-3-Clause" 481 | ], 482 | "authors": [ 483 | { 484 | "name": "Sebastian Bergmann", 485 | "email": "sebastian@phpunit.de", 486 | "role": "lead" 487 | } 488 | ], 489 | "description": "Invoke callables with a timeout", 490 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 491 | "keywords": [ 492 | "process" 493 | ], 494 | "support": { 495 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 496 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 497 | }, 498 | "funding": [ 499 | { 500 | "url": "https://github.com/sebastianbergmann", 501 | "type": "github" 502 | } 503 | ], 504 | "time": "2020-09-28T05:58:55+00:00" 505 | }, 506 | { 507 | "name": "phpunit/php-text-template", 508 | "version": "2.0.4", 509 | "source": { 510 | "type": "git", 511 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 512 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 513 | }, 514 | "dist": { 515 | "type": "zip", 516 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 517 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 518 | "shasum": "" 519 | }, 520 | "require": { 521 | "php": ">=7.3" 522 | }, 523 | "require-dev": { 524 | "phpunit/phpunit": "^9.3" 525 | }, 526 | "type": "library", 527 | "extra": { 528 | "branch-alias": { 529 | "dev-master": "2.0-dev" 530 | } 531 | }, 532 | "autoload": { 533 | "classmap": [ 534 | "src/" 535 | ] 536 | }, 537 | "notification-url": "https://packagist.org/downloads/", 538 | "license": [ 539 | "BSD-3-Clause" 540 | ], 541 | "authors": [ 542 | { 543 | "name": "Sebastian Bergmann", 544 | "email": "sebastian@phpunit.de", 545 | "role": "lead" 546 | } 547 | ], 548 | "description": "Simple template engine.", 549 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 550 | "keywords": [ 551 | "template" 552 | ], 553 | "support": { 554 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 555 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 556 | }, 557 | "funding": [ 558 | { 559 | "url": "https://github.com/sebastianbergmann", 560 | "type": "github" 561 | } 562 | ], 563 | "time": "2020-10-26T05:33:50+00:00" 564 | }, 565 | { 566 | "name": "phpunit/php-timer", 567 | "version": "5.0.3", 568 | "source": { 569 | "type": "git", 570 | "url": "https://github.com/sebastianbergmann/php-timer.git", 571 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 572 | }, 573 | "dist": { 574 | "type": "zip", 575 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 576 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 577 | "shasum": "" 578 | }, 579 | "require": { 580 | "php": ">=7.3" 581 | }, 582 | "require-dev": { 583 | "phpunit/phpunit": "^9.3" 584 | }, 585 | "type": "library", 586 | "extra": { 587 | "branch-alias": { 588 | "dev-master": "5.0-dev" 589 | } 590 | }, 591 | "autoload": { 592 | "classmap": [ 593 | "src/" 594 | ] 595 | }, 596 | "notification-url": "https://packagist.org/downloads/", 597 | "license": [ 598 | "BSD-3-Clause" 599 | ], 600 | "authors": [ 601 | { 602 | "name": "Sebastian Bergmann", 603 | "email": "sebastian@phpunit.de", 604 | "role": "lead" 605 | } 606 | ], 607 | "description": "Utility class for timing", 608 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 609 | "keywords": [ 610 | "timer" 611 | ], 612 | "support": { 613 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 614 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 615 | }, 616 | "funding": [ 617 | { 618 | "url": "https://github.com/sebastianbergmann", 619 | "type": "github" 620 | } 621 | ], 622 | "time": "2020-10-26T13:16:10+00:00" 623 | }, 624 | { 625 | "name": "phpunit/phpunit", 626 | "version": "9.6.3", 627 | "source": { 628 | "type": "git", 629 | "url": "https://github.com/sebastianbergmann/phpunit.git", 630 | "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555" 631 | }, 632 | "dist": { 633 | "type": "zip", 634 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7b1615e3e887d6c719121c6d4a44b0ab9645555", 635 | "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555", 636 | "shasum": "" 637 | }, 638 | "require": { 639 | "doctrine/instantiator": "^1.3.1 || ^2", 640 | "ext-dom": "*", 641 | "ext-json": "*", 642 | "ext-libxml": "*", 643 | "ext-mbstring": "*", 644 | "ext-xml": "*", 645 | "ext-xmlwriter": "*", 646 | "myclabs/deep-copy": "^1.10.1", 647 | "phar-io/manifest": "^2.0.3", 648 | "phar-io/version": "^3.0.2", 649 | "php": ">=7.3", 650 | "phpunit/php-code-coverage": "^9.2.13", 651 | "phpunit/php-file-iterator": "^3.0.5", 652 | "phpunit/php-invoker": "^3.1.1", 653 | "phpunit/php-text-template": "^2.0.3", 654 | "phpunit/php-timer": "^5.0.2", 655 | "sebastian/cli-parser": "^1.0.1", 656 | "sebastian/code-unit": "^1.0.6", 657 | "sebastian/comparator": "^4.0.8", 658 | "sebastian/diff": "^4.0.3", 659 | "sebastian/environment": "^5.1.3", 660 | "sebastian/exporter": "^4.0.5", 661 | "sebastian/global-state": "^5.0.1", 662 | "sebastian/object-enumerator": "^4.0.3", 663 | "sebastian/resource-operations": "^3.0.3", 664 | "sebastian/type": "^3.2", 665 | "sebastian/version": "^3.0.2" 666 | }, 667 | "suggest": { 668 | "ext-soap": "*", 669 | "ext-xdebug": "*" 670 | }, 671 | "bin": [ 672 | "phpunit" 673 | ], 674 | "type": "library", 675 | "extra": { 676 | "branch-alias": { 677 | "dev-master": "9.6-dev" 678 | } 679 | }, 680 | "autoload": { 681 | "files": [ 682 | "src/Framework/Assert/Functions.php" 683 | ], 684 | "classmap": [ 685 | "src/" 686 | ] 687 | }, 688 | "notification-url": "https://packagist.org/downloads/", 689 | "license": [ 690 | "BSD-3-Clause" 691 | ], 692 | "authors": [ 693 | { 694 | "name": "Sebastian Bergmann", 695 | "email": "sebastian@phpunit.de", 696 | "role": "lead" 697 | } 698 | ], 699 | "description": "The PHP Unit Testing framework.", 700 | "homepage": "https://phpunit.de/", 701 | "keywords": [ 702 | "phpunit", 703 | "testing", 704 | "xunit" 705 | ], 706 | "support": { 707 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 708 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.3" 709 | }, 710 | "funding": [ 711 | { 712 | "url": "https://phpunit.de/sponsors.html", 713 | "type": "custom" 714 | }, 715 | { 716 | "url": "https://github.com/sebastianbergmann", 717 | "type": "github" 718 | }, 719 | { 720 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 721 | "type": "tidelift" 722 | } 723 | ], 724 | "time": "2023-02-04T13:37:15+00:00" 725 | }, 726 | { 727 | "name": "sebastian/cli-parser", 728 | "version": "1.0.1", 729 | "source": { 730 | "type": "git", 731 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 732 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" 733 | }, 734 | "dist": { 735 | "type": "zip", 736 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", 737 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", 738 | "shasum": "" 739 | }, 740 | "require": { 741 | "php": ">=7.3" 742 | }, 743 | "require-dev": { 744 | "phpunit/phpunit": "^9.3" 745 | }, 746 | "type": "library", 747 | "extra": { 748 | "branch-alias": { 749 | "dev-master": "1.0-dev" 750 | } 751 | }, 752 | "autoload": { 753 | "classmap": [ 754 | "src/" 755 | ] 756 | }, 757 | "notification-url": "https://packagist.org/downloads/", 758 | "license": [ 759 | "BSD-3-Clause" 760 | ], 761 | "authors": [ 762 | { 763 | "name": "Sebastian Bergmann", 764 | "email": "sebastian@phpunit.de", 765 | "role": "lead" 766 | } 767 | ], 768 | "description": "Library for parsing CLI options", 769 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 770 | "support": { 771 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 772 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" 773 | }, 774 | "funding": [ 775 | { 776 | "url": "https://github.com/sebastianbergmann", 777 | "type": "github" 778 | } 779 | ], 780 | "time": "2020-09-28T06:08:49+00:00" 781 | }, 782 | { 783 | "name": "sebastian/code-unit", 784 | "version": "1.0.8", 785 | "source": { 786 | "type": "git", 787 | "url": "https://github.com/sebastianbergmann/code-unit.git", 788 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 789 | }, 790 | "dist": { 791 | "type": "zip", 792 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 793 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 794 | "shasum": "" 795 | }, 796 | "require": { 797 | "php": ">=7.3" 798 | }, 799 | "require-dev": { 800 | "phpunit/phpunit": "^9.3" 801 | }, 802 | "type": "library", 803 | "extra": { 804 | "branch-alias": { 805 | "dev-master": "1.0-dev" 806 | } 807 | }, 808 | "autoload": { 809 | "classmap": [ 810 | "src/" 811 | ] 812 | }, 813 | "notification-url": "https://packagist.org/downloads/", 814 | "license": [ 815 | "BSD-3-Clause" 816 | ], 817 | "authors": [ 818 | { 819 | "name": "Sebastian Bergmann", 820 | "email": "sebastian@phpunit.de", 821 | "role": "lead" 822 | } 823 | ], 824 | "description": "Collection of value objects that represent the PHP code units", 825 | "homepage": "https://github.com/sebastianbergmann/code-unit", 826 | "support": { 827 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 828 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 829 | }, 830 | "funding": [ 831 | { 832 | "url": "https://github.com/sebastianbergmann", 833 | "type": "github" 834 | } 835 | ], 836 | "time": "2020-10-26T13:08:54+00:00" 837 | }, 838 | { 839 | "name": "sebastian/code-unit-reverse-lookup", 840 | "version": "2.0.3", 841 | "source": { 842 | "type": "git", 843 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 844 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 845 | }, 846 | "dist": { 847 | "type": "zip", 848 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 849 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 850 | "shasum": "" 851 | }, 852 | "require": { 853 | "php": ">=7.3" 854 | }, 855 | "require-dev": { 856 | "phpunit/phpunit": "^9.3" 857 | }, 858 | "type": "library", 859 | "extra": { 860 | "branch-alias": { 861 | "dev-master": "2.0-dev" 862 | } 863 | }, 864 | "autoload": { 865 | "classmap": [ 866 | "src/" 867 | ] 868 | }, 869 | "notification-url": "https://packagist.org/downloads/", 870 | "license": [ 871 | "BSD-3-Clause" 872 | ], 873 | "authors": [ 874 | { 875 | "name": "Sebastian Bergmann", 876 | "email": "sebastian@phpunit.de" 877 | } 878 | ], 879 | "description": "Looks up which function or method a line of code belongs to", 880 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 881 | "support": { 882 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 883 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 884 | }, 885 | "funding": [ 886 | { 887 | "url": "https://github.com/sebastianbergmann", 888 | "type": "github" 889 | } 890 | ], 891 | "time": "2020-09-28T05:30:19+00:00" 892 | }, 893 | { 894 | "name": "sebastian/comparator", 895 | "version": "4.0.8", 896 | "source": { 897 | "type": "git", 898 | "url": "https://github.com/sebastianbergmann/comparator.git", 899 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a" 900 | }, 901 | "dist": { 902 | "type": "zip", 903 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", 904 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a", 905 | "shasum": "" 906 | }, 907 | "require": { 908 | "php": ">=7.3", 909 | "sebastian/diff": "^4.0", 910 | "sebastian/exporter": "^4.0" 911 | }, 912 | "require-dev": { 913 | "phpunit/phpunit": "^9.3" 914 | }, 915 | "type": "library", 916 | "extra": { 917 | "branch-alias": { 918 | "dev-master": "4.0-dev" 919 | } 920 | }, 921 | "autoload": { 922 | "classmap": [ 923 | "src/" 924 | ] 925 | }, 926 | "notification-url": "https://packagist.org/downloads/", 927 | "license": [ 928 | "BSD-3-Clause" 929 | ], 930 | "authors": [ 931 | { 932 | "name": "Sebastian Bergmann", 933 | "email": "sebastian@phpunit.de" 934 | }, 935 | { 936 | "name": "Jeff Welch", 937 | "email": "whatthejeff@gmail.com" 938 | }, 939 | { 940 | "name": "Volker Dusch", 941 | "email": "github@wallbash.com" 942 | }, 943 | { 944 | "name": "Bernhard Schussek", 945 | "email": "bschussek@2bepublished.at" 946 | } 947 | ], 948 | "description": "Provides the functionality to compare PHP values for equality", 949 | "homepage": "https://github.com/sebastianbergmann/comparator", 950 | "keywords": [ 951 | "comparator", 952 | "compare", 953 | "equality" 954 | ], 955 | "support": { 956 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 957 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" 958 | }, 959 | "funding": [ 960 | { 961 | "url": "https://github.com/sebastianbergmann", 962 | "type": "github" 963 | } 964 | ], 965 | "time": "2022-09-14T12:41:17+00:00" 966 | }, 967 | { 968 | "name": "sebastian/complexity", 969 | "version": "2.0.2", 970 | "source": { 971 | "type": "git", 972 | "url": "https://github.com/sebastianbergmann/complexity.git", 973 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" 974 | }, 975 | "dist": { 976 | "type": "zip", 977 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", 978 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", 979 | "shasum": "" 980 | }, 981 | "require": { 982 | "nikic/php-parser": "^4.7", 983 | "php": ">=7.3" 984 | }, 985 | "require-dev": { 986 | "phpunit/phpunit": "^9.3" 987 | }, 988 | "type": "library", 989 | "extra": { 990 | "branch-alias": { 991 | "dev-master": "2.0-dev" 992 | } 993 | }, 994 | "autoload": { 995 | "classmap": [ 996 | "src/" 997 | ] 998 | }, 999 | "notification-url": "https://packagist.org/downloads/", 1000 | "license": [ 1001 | "BSD-3-Clause" 1002 | ], 1003 | "authors": [ 1004 | { 1005 | "name": "Sebastian Bergmann", 1006 | "email": "sebastian@phpunit.de", 1007 | "role": "lead" 1008 | } 1009 | ], 1010 | "description": "Library for calculating the complexity of PHP code units", 1011 | "homepage": "https://github.com/sebastianbergmann/complexity", 1012 | "support": { 1013 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1014 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" 1015 | }, 1016 | "funding": [ 1017 | { 1018 | "url": "https://github.com/sebastianbergmann", 1019 | "type": "github" 1020 | } 1021 | ], 1022 | "time": "2020-10-26T15:52:27+00:00" 1023 | }, 1024 | { 1025 | "name": "sebastian/diff", 1026 | "version": "4.0.4", 1027 | "source": { 1028 | "type": "git", 1029 | "url": "https://github.com/sebastianbergmann/diff.git", 1030 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" 1031 | }, 1032 | "dist": { 1033 | "type": "zip", 1034 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", 1035 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", 1036 | "shasum": "" 1037 | }, 1038 | "require": { 1039 | "php": ">=7.3" 1040 | }, 1041 | "require-dev": { 1042 | "phpunit/phpunit": "^9.3", 1043 | "symfony/process": "^4.2 || ^5" 1044 | }, 1045 | "type": "library", 1046 | "extra": { 1047 | "branch-alias": { 1048 | "dev-master": "4.0-dev" 1049 | } 1050 | }, 1051 | "autoload": { 1052 | "classmap": [ 1053 | "src/" 1054 | ] 1055 | }, 1056 | "notification-url": "https://packagist.org/downloads/", 1057 | "license": [ 1058 | "BSD-3-Clause" 1059 | ], 1060 | "authors": [ 1061 | { 1062 | "name": "Sebastian Bergmann", 1063 | "email": "sebastian@phpunit.de" 1064 | }, 1065 | { 1066 | "name": "Kore Nordmann", 1067 | "email": "mail@kore-nordmann.de" 1068 | } 1069 | ], 1070 | "description": "Diff implementation", 1071 | "homepage": "https://github.com/sebastianbergmann/diff", 1072 | "keywords": [ 1073 | "diff", 1074 | "udiff", 1075 | "unidiff", 1076 | "unified diff" 1077 | ], 1078 | "support": { 1079 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1080 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" 1081 | }, 1082 | "funding": [ 1083 | { 1084 | "url": "https://github.com/sebastianbergmann", 1085 | "type": "github" 1086 | } 1087 | ], 1088 | "time": "2020-10-26T13:10:38+00:00" 1089 | }, 1090 | { 1091 | "name": "sebastian/environment", 1092 | "version": "5.1.5", 1093 | "source": { 1094 | "type": "git", 1095 | "url": "https://github.com/sebastianbergmann/environment.git", 1096 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" 1097 | }, 1098 | "dist": { 1099 | "type": "zip", 1100 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 1101 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 1102 | "shasum": "" 1103 | }, 1104 | "require": { 1105 | "php": ">=7.3" 1106 | }, 1107 | "require-dev": { 1108 | "phpunit/phpunit": "^9.3" 1109 | }, 1110 | "suggest": { 1111 | "ext-posix": "*" 1112 | }, 1113 | "type": "library", 1114 | "extra": { 1115 | "branch-alias": { 1116 | "dev-master": "5.1-dev" 1117 | } 1118 | }, 1119 | "autoload": { 1120 | "classmap": [ 1121 | "src/" 1122 | ] 1123 | }, 1124 | "notification-url": "https://packagist.org/downloads/", 1125 | "license": [ 1126 | "BSD-3-Clause" 1127 | ], 1128 | "authors": [ 1129 | { 1130 | "name": "Sebastian Bergmann", 1131 | "email": "sebastian@phpunit.de" 1132 | } 1133 | ], 1134 | "description": "Provides functionality to handle HHVM/PHP environments", 1135 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1136 | "keywords": [ 1137 | "Xdebug", 1138 | "environment", 1139 | "hhvm" 1140 | ], 1141 | "support": { 1142 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1143 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" 1144 | }, 1145 | "funding": [ 1146 | { 1147 | "url": "https://github.com/sebastianbergmann", 1148 | "type": "github" 1149 | } 1150 | ], 1151 | "time": "2023-02-03T06:03:51+00:00" 1152 | }, 1153 | { 1154 | "name": "sebastian/exporter", 1155 | "version": "4.0.5", 1156 | "source": { 1157 | "type": "git", 1158 | "url": "https://github.com/sebastianbergmann/exporter.git", 1159 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" 1160 | }, 1161 | "dist": { 1162 | "type": "zip", 1163 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", 1164 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", 1165 | "shasum": "" 1166 | }, 1167 | "require": { 1168 | "php": ">=7.3", 1169 | "sebastian/recursion-context": "^4.0" 1170 | }, 1171 | "require-dev": { 1172 | "ext-mbstring": "*", 1173 | "phpunit/phpunit": "^9.3" 1174 | }, 1175 | "type": "library", 1176 | "extra": { 1177 | "branch-alias": { 1178 | "dev-master": "4.0-dev" 1179 | } 1180 | }, 1181 | "autoload": { 1182 | "classmap": [ 1183 | "src/" 1184 | ] 1185 | }, 1186 | "notification-url": "https://packagist.org/downloads/", 1187 | "license": [ 1188 | "BSD-3-Clause" 1189 | ], 1190 | "authors": [ 1191 | { 1192 | "name": "Sebastian Bergmann", 1193 | "email": "sebastian@phpunit.de" 1194 | }, 1195 | { 1196 | "name": "Jeff Welch", 1197 | "email": "whatthejeff@gmail.com" 1198 | }, 1199 | { 1200 | "name": "Volker Dusch", 1201 | "email": "github@wallbash.com" 1202 | }, 1203 | { 1204 | "name": "Adam Harvey", 1205 | "email": "aharvey@php.net" 1206 | }, 1207 | { 1208 | "name": "Bernhard Schussek", 1209 | "email": "bschussek@gmail.com" 1210 | } 1211 | ], 1212 | "description": "Provides the functionality to export PHP variables for visualization", 1213 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1214 | "keywords": [ 1215 | "export", 1216 | "exporter" 1217 | ], 1218 | "support": { 1219 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1220 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" 1221 | }, 1222 | "funding": [ 1223 | { 1224 | "url": "https://github.com/sebastianbergmann", 1225 | "type": "github" 1226 | } 1227 | ], 1228 | "time": "2022-09-14T06:03:37+00:00" 1229 | }, 1230 | { 1231 | "name": "sebastian/global-state", 1232 | "version": "5.0.5", 1233 | "source": { 1234 | "type": "git", 1235 | "url": "https://github.com/sebastianbergmann/global-state.git", 1236 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" 1237 | }, 1238 | "dist": { 1239 | "type": "zip", 1240 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", 1241 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", 1242 | "shasum": "" 1243 | }, 1244 | "require": { 1245 | "php": ">=7.3", 1246 | "sebastian/object-reflector": "^2.0", 1247 | "sebastian/recursion-context": "^4.0" 1248 | }, 1249 | "require-dev": { 1250 | "ext-dom": "*", 1251 | "phpunit/phpunit": "^9.3" 1252 | }, 1253 | "suggest": { 1254 | "ext-uopz": "*" 1255 | }, 1256 | "type": "library", 1257 | "extra": { 1258 | "branch-alias": { 1259 | "dev-master": "5.0-dev" 1260 | } 1261 | }, 1262 | "autoload": { 1263 | "classmap": [ 1264 | "src/" 1265 | ] 1266 | }, 1267 | "notification-url": "https://packagist.org/downloads/", 1268 | "license": [ 1269 | "BSD-3-Clause" 1270 | ], 1271 | "authors": [ 1272 | { 1273 | "name": "Sebastian Bergmann", 1274 | "email": "sebastian@phpunit.de" 1275 | } 1276 | ], 1277 | "description": "Snapshotting of global state", 1278 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1279 | "keywords": [ 1280 | "global state" 1281 | ], 1282 | "support": { 1283 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1284 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" 1285 | }, 1286 | "funding": [ 1287 | { 1288 | "url": "https://github.com/sebastianbergmann", 1289 | "type": "github" 1290 | } 1291 | ], 1292 | "time": "2022-02-14T08:28:10+00:00" 1293 | }, 1294 | { 1295 | "name": "sebastian/lines-of-code", 1296 | "version": "1.0.3", 1297 | "source": { 1298 | "type": "git", 1299 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1300 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" 1301 | }, 1302 | "dist": { 1303 | "type": "zip", 1304 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", 1305 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", 1306 | "shasum": "" 1307 | }, 1308 | "require": { 1309 | "nikic/php-parser": "^4.6", 1310 | "php": ">=7.3" 1311 | }, 1312 | "require-dev": { 1313 | "phpunit/phpunit": "^9.3" 1314 | }, 1315 | "type": "library", 1316 | "extra": { 1317 | "branch-alias": { 1318 | "dev-master": "1.0-dev" 1319 | } 1320 | }, 1321 | "autoload": { 1322 | "classmap": [ 1323 | "src/" 1324 | ] 1325 | }, 1326 | "notification-url": "https://packagist.org/downloads/", 1327 | "license": [ 1328 | "BSD-3-Clause" 1329 | ], 1330 | "authors": [ 1331 | { 1332 | "name": "Sebastian Bergmann", 1333 | "email": "sebastian@phpunit.de", 1334 | "role": "lead" 1335 | } 1336 | ], 1337 | "description": "Library for counting the lines of code in PHP source code", 1338 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1339 | "support": { 1340 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 1341 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" 1342 | }, 1343 | "funding": [ 1344 | { 1345 | "url": "https://github.com/sebastianbergmann", 1346 | "type": "github" 1347 | } 1348 | ], 1349 | "time": "2020-11-28T06:42:11+00:00" 1350 | }, 1351 | { 1352 | "name": "sebastian/object-enumerator", 1353 | "version": "4.0.4", 1354 | "source": { 1355 | "type": "git", 1356 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1357 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 1358 | }, 1359 | "dist": { 1360 | "type": "zip", 1361 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 1362 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 1363 | "shasum": "" 1364 | }, 1365 | "require": { 1366 | "php": ">=7.3", 1367 | "sebastian/object-reflector": "^2.0", 1368 | "sebastian/recursion-context": "^4.0" 1369 | }, 1370 | "require-dev": { 1371 | "phpunit/phpunit": "^9.3" 1372 | }, 1373 | "type": "library", 1374 | "extra": { 1375 | "branch-alias": { 1376 | "dev-master": "4.0-dev" 1377 | } 1378 | }, 1379 | "autoload": { 1380 | "classmap": [ 1381 | "src/" 1382 | ] 1383 | }, 1384 | "notification-url": "https://packagist.org/downloads/", 1385 | "license": [ 1386 | "BSD-3-Clause" 1387 | ], 1388 | "authors": [ 1389 | { 1390 | "name": "Sebastian Bergmann", 1391 | "email": "sebastian@phpunit.de" 1392 | } 1393 | ], 1394 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1395 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1396 | "support": { 1397 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1398 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 1399 | }, 1400 | "funding": [ 1401 | { 1402 | "url": "https://github.com/sebastianbergmann", 1403 | "type": "github" 1404 | } 1405 | ], 1406 | "time": "2020-10-26T13:12:34+00:00" 1407 | }, 1408 | { 1409 | "name": "sebastian/object-reflector", 1410 | "version": "2.0.4", 1411 | "source": { 1412 | "type": "git", 1413 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1414 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 1415 | }, 1416 | "dist": { 1417 | "type": "zip", 1418 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1419 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1420 | "shasum": "" 1421 | }, 1422 | "require": { 1423 | "php": ">=7.3" 1424 | }, 1425 | "require-dev": { 1426 | "phpunit/phpunit": "^9.3" 1427 | }, 1428 | "type": "library", 1429 | "extra": { 1430 | "branch-alias": { 1431 | "dev-master": "2.0-dev" 1432 | } 1433 | }, 1434 | "autoload": { 1435 | "classmap": [ 1436 | "src/" 1437 | ] 1438 | }, 1439 | "notification-url": "https://packagist.org/downloads/", 1440 | "license": [ 1441 | "BSD-3-Clause" 1442 | ], 1443 | "authors": [ 1444 | { 1445 | "name": "Sebastian Bergmann", 1446 | "email": "sebastian@phpunit.de" 1447 | } 1448 | ], 1449 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1450 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1451 | "support": { 1452 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 1453 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 1454 | }, 1455 | "funding": [ 1456 | { 1457 | "url": "https://github.com/sebastianbergmann", 1458 | "type": "github" 1459 | } 1460 | ], 1461 | "time": "2020-10-26T13:14:26+00:00" 1462 | }, 1463 | { 1464 | "name": "sebastian/recursion-context", 1465 | "version": "4.0.5", 1466 | "source": { 1467 | "type": "git", 1468 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1469 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" 1470 | }, 1471 | "dist": { 1472 | "type": "zip", 1473 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 1474 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 1475 | "shasum": "" 1476 | }, 1477 | "require": { 1478 | "php": ">=7.3" 1479 | }, 1480 | "require-dev": { 1481 | "phpunit/phpunit": "^9.3" 1482 | }, 1483 | "type": "library", 1484 | "extra": { 1485 | "branch-alias": { 1486 | "dev-master": "4.0-dev" 1487 | } 1488 | }, 1489 | "autoload": { 1490 | "classmap": [ 1491 | "src/" 1492 | ] 1493 | }, 1494 | "notification-url": "https://packagist.org/downloads/", 1495 | "license": [ 1496 | "BSD-3-Clause" 1497 | ], 1498 | "authors": [ 1499 | { 1500 | "name": "Sebastian Bergmann", 1501 | "email": "sebastian@phpunit.de" 1502 | }, 1503 | { 1504 | "name": "Jeff Welch", 1505 | "email": "whatthejeff@gmail.com" 1506 | }, 1507 | { 1508 | "name": "Adam Harvey", 1509 | "email": "aharvey@php.net" 1510 | } 1511 | ], 1512 | "description": "Provides functionality to recursively process PHP variables", 1513 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 1514 | "support": { 1515 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 1516 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" 1517 | }, 1518 | "funding": [ 1519 | { 1520 | "url": "https://github.com/sebastianbergmann", 1521 | "type": "github" 1522 | } 1523 | ], 1524 | "time": "2023-02-03T06:07:39+00:00" 1525 | }, 1526 | { 1527 | "name": "sebastian/resource-operations", 1528 | "version": "3.0.3", 1529 | "source": { 1530 | "type": "git", 1531 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1532 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" 1533 | }, 1534 | "dist": { 1535 | "type": "zip", 1536 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 1537 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 1538 | "shasum": "" 1539 | }, 1540 | "require": { 1541 | "php": ">=7.3" 1542 | }, 1543 | "require-dev": { 1544 | "phpunit/phpunit": "^9.0" 1545 | }, 1546 | "type": "library", 1547 | "extra": { 1548 | "branch-alias": { 1549 | "dev-master": "3.0-dev" 1550 | } 1551 | }, 1552 | "autoload": { 1553 | "classmap": [ 1554 | "src/" 1555 | ] 1556 | }, 1557 | "notification-url": "https://packagist.org/downloads/", 1558 | "license": [ 1559 | "BSD-3-Clause" 1560 | ], 1561 | "authors": [ 1562 | { 1563 | "name": "Sebastian Bergmann", 1564 | "email": "sebastian@phpunit.de" 1565 | } 1566 | ], 1567 | "description": "Provides a list of PHP built-in functions that operate on resources", 1568 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1569 | "support": { 1570 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues", 1571 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" 1572 | }, 1573 | "funding": [ 1574 | { 1575 | "url": "https://github.com/sebastianbergmann", 1576 | "type": "github" 1577 | } 1578 | ], 1579 | "time": "2020-09-28T06:45:17+00:00" 1580 | }, 1581 | { 1582 | "name": "sebastian/type", 1583 | "version": "3.2.1", 1584 | "source": { 1585 | "type": "git", 1586 | "url": "https://github.com/sebastianbergmann/type.git", 1587 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" 1588 | }, 1589 | "dist": { 1590 | "type": "zip", 1591 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 1592 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 1593 | "shasum": "" 1594 | }, 1595 | "require": { 1596 | "php": ">=7.3" 1597 | }, 1598 | "require-dev": { 1599 | "phpunit/phpunit": "^9.5" 1600 | }, 1601 | "type": "library", 1602 | "extra": { 1603 | "branch-alias": { 1604 | "dev-master": "3.2-dev" 1605 | } 1606 | }, 1607 | "autoload": { 1608 | "classmap": [ 1609 | "src/" 1610 | ] 1611 | }, 1612 | "notification-url": "https://packagist.org/downloads/", 1613 | "license": [ 1614 | "BSD-3-Clause" 1615 | ], 1616 | "authors": [ 1617 | { 1618 | "name": "Sebastian Bergmann", 1619 | "email": "sebastian@phpunit.de", 1620 | "role": "lead" 1621 | } 1622 | ], 1623 | "description": "Collection of value objects that represent the types of the PHP type system", 1624 | "homepage": "https://github.com/sebastianbergmann/type", 1625 | "support": { 1626 | "issues": "https://github.com/sebastianbergmann/type/issues", 1627 | "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" 1628 | }, 1629 | "funding": [ 1630 | { 1631 | "url": "https://github.com/sebastianbergmann", 1632 | "type": "github" 1633 | } 1634 | ], 1635 | "time": "2023-02-03T06:13:03+00:00" 1636 | }, 1637 | { 1638 | "name": "sebastian/version", 1639 | "version": "3.0.2", 1640 | "source": { 1641 | "type": "git", 1642 | "url": "https://github.com/sebastianbergmann/version.git", 1643 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 1644 | }, 1645 | "dist": { 1646 | "type": "zip", 1647 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 1648 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 1649 | "shasum": "" 1650 | }, 1651 | "require": { 1652 | "php": ">=7.3" 1653 | }, 1654 | "type": "library", 1655 | "extra": { 1656 | "branch-alias": { 1657 | "dev-master": "3.0-dev" 1658 | } 1659 | }, 1660 | "autoload": { 1661 | "classmap": [ 1662 | "src/" 1663 | ] 1664 | }, 1665 | "notification-url": "https://packagist.org/downloads/", 1666 | "license": [ 1667 | "BSD-3-Clause" 1668 | ], 1669 | "authors": [ 1670 | { 1671 | "name": "Sebastian Bergmann", 1672 | "email": "sebastian@phpunit.de", 1673 | "role": "lead" 1674 | } 1675 | ], 1676 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1677 | "homepage": "https://github.com/sebastianbergmann/version", 1678 | "support": { 1679 | "issues": "https://github.com/sebastianbergmann/version/issues", 1680 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 1681 | }, 1682 | "funding": [ 1683 | { 1684 | "url": "https://github.com/sebastianbergmann", 1685 | "type": "github" 1686 | } 1687 | ], 1688 | "time": "2020-09-28T06:39:44+00:00" 1689 | }, 1690 | { 1691 | "name": "squizlabs/php_codesniffer", 1692 | "version": "3.7.1", 1693 | "source": { 1694 | "type": "git", 1695 | "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", 1696 | "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" 1697 | }, 1698 | "dist": { 1699 | "type": "zip", 1700 | "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", 1701 | "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", 1702 | "shasum": "" 1703 | }, 1704 | "require": { 1705 | "ext-simplexml": "*", 1706 | "ext-tokenizer": "*", 1707 | "ext-xmlwriter": "*", 1708 | "php": ">=5.4.0" 1709 | }, 1710 | "require-dev": { 1711 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 1712 | }, 1713 | "bin": [ 1714 | "bin/phpcs", 1715 | "bin/phpcbf" 1716 | ], 1717 | "type": "library", 1718 | "extra": { 1719 | "branch-alias": { 1720 | "dev-master": "3.x-dev" 1721 | } 1722 | }, 1723 | "notification-url": "https://packagist.org/downloads/", 1724 | "license": [ 1725 | "BSD-3-Clause" 1726 | ], 1727 | "authors": [ 1728 | { 1729 | "name": "Greg Sherwood", 1730 | "role": "lead" 1731 | } 1732 | ], 1733 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 1734 | "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", 1735 | "keywords": [ 1736 | "phpcs", 1737 | "standards" 1738 | ], 1739 | "support": { 1740 | "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", 1741 | "source": "https://github.com/squizlabs/PHP_CodeSniffer", 1742 | "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" 1743 | }, 1744 | "time": "2022-06-18T07:21:10+00:00" 1745 | }, 1746 | { 1747 | "name": "theseer/tokenizer", 1748 | "version": "1.2.1", 1749 | "source": { 1750 | "type": "git", 1751 | "url": "https://github.com/theseer/tokenizer.git", 1752 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" 1753 | }, 1754 | "dist": { 1755 | "type": "zip", 1756 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", 1757 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", 1758 | "shasum": "" 1759 | }, 1760 | "require": { 1761 | "ext-dom": "*", 1762 | "ext-tokenizer": "*", 1763 | "ext-xmlwriter": "*", 1764 | "php": "^7.2 || ^8.0" 1765 | }, 1766 | "type": "library", 1767 | "autoload": { 1768 | "classmap": [ 1769 | "src/" 1770 | ] 1771 | }, 1772 | "notification-url": "https://packagist.org/downloads/", 1773 | "license": [ 1774 | "BSD-3-Clause" 1775 | ], 1776 | "authors": [ 1777 | { 1778 | "name": "Arne Blankerts", 1779 | "email": "arne@blankerts.de", 1780 | "role": "Developer" 1781 | } 1782 | ], 1783 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1784 | "support": { 1785 | "issues": "https://github.com/theseer/tokenizer/issues", 1786 | "source": "https://github.com/theseer/tokenizer/tree/1.2.1" 1787 | }, 1788 | "funding": [ 1789 | { 1790 | "url": "https://github.com/theseer", 1791 | "type": "github" 1792 | } 1793 | ], 1794 | "time": "2021-07-28T10:34:58+00:00" 1795 | } 1796 | ], 1797 | "aliases": [], 1798 | "minimum-stability": "stable", 1799 | "stability-flags": [], 1800 | "prefer-stable": false, 1801 | "prefer-lowest": false, 1802 | "platform": { 1803 | "php": ">=7.4" 1804 | }, 1805 | "platform-dev": [], 1806 | "plugin-api-version": "2.3.0" 1807 | } 1808 | --------------------------------------------------------------------------------