read('catalog.json',null);if(!is_array($catalog)||!is_string($catalog['generated_at']??null))return null; $at=strtotime($catalog['generated_at']);if($at===false||$attime()+30)return null; $host=static fn($value)=>strtolower(rtrim((string)parse_url(str_contains((string)$value,'://')?(string)$value:'https://'.$value,PHP_URL_HOST),'.')); if(!$host($config->host??'')||$host($catalog['host']??'')!==$host($config->host??''))return null; foreach(['degr','tp','cons'] as $group){if(!is_array($catalog['groups'][$group]??null))return null;foreach($catalog['groups'][$group] as $entry)if(!is_array($entry)||!is_int($entry['number']??null)||$entry['number']<1||$entry['number']>9||!is_string($entry['name']??null))return null;} return $catalog; } }