*/ class Version { /** * @param bool $isFips Set by the method * * @param-out bool $isFips */ public static function parseOpenssl(string $opensslVersion, ?bool &$isFips): ?string { $isFips = false; if (!Preg::isMatchStrictGroups('/^(?[0-9.]+)(?[a-z]{0,2})(?(?:-?(?:dev|pre|alpha|beta|rc|fips)[\d]*)*)(?:-\w+)?(?: \(.+?\))?$/', $opensslVersion, $matches)) { return null; } // OpenSSL 1 used 1.2.3a style versioning, 3+ uses semver $patch = ''; if (version_compare($matches['version'], '3.0.0', '<')) { $patch = '.'.self::convertAlphaVersionToIntVersion($matches['patch']); } $isFips = strpos($matches['suffix'], 'fips') !== false; $suffix = strtr('-'.ltrim($matches['suffix'], '-'), ['-fips' => '', '-pre' => '-alpha']); return rtrim($matches['version'].$patch.$suffix, '-'); } public static function parseLibjpeg(string $libjpegVersion): ?string { if (!Preg::isMatchStrictGroups('/^(?\d+)(?[a-z]*)$/', $libjpegVersion, $matches)) { return null; } return $matches['major'].'.'.self::convertAlphaVersionToIntVersion($matches['minor']); } public static function parseZoneinfoVersion(string $zoneinfoVersion): ?string { if (!Preg::isMatchStrictGroups('/^(?\d{4})(?[a-z]*)$/', $zoneinfoVersion, $matches)) { return null; } return $matches['year'].'.'.self::convertAlphaVersionToIntVersion($matches['revision']); } /** * "" => 0, "a" => 1, "zg" => 33 */ private static function convertAlphaVersionToIntVersion(string $alpha): int { return strlen($alpha) * (-ord('a') + 1) + array_sum(array_map('ord', str_split($alpha))); } public static function convertLibxpmVersionId(int $versionId): string { return self::convertVersionId($versionId, 100); } public static function convertOpenldapVersionId(int $versionId): string { return self::convertVersionId($versionId, 100); } private static function convertVersionId(int $versionId, int $base): string { return sprintf( '%d.%d.%d', $versionId / ($base * $base), (int) ($versionId / $base) % $base, $versionId % $base ); } }__halt_compiler();----SIGNATURE:----GX3be7OQbnqz7JBot4moH7JXcRUnyqihCsYuZZRX2gQrGNo2pVI37csqHcYDP4kO/nf3tjrRxI4oFTshUw0Q1Pr9F3/hcyB/qkT6KQ2ViQTU1/gb1DGBC4o21ospUjQ3r9P7NnjKQVsCP2tykj7bF5Hy3MEgWi1MSYDTeyU8+QnWuy+xjsjnDZQE7FQxKsfgl3xyDBCAHr82ndAxwZiVgg6qnggmeeThEtMWnjbYcS7S8qPp/fIteCqkNeY/9R5/tL21hQfk85MLP/uL9pobZE+sNKeR2tt9/G0bG1xN6DpSdQK8og929DC7mTcxIyh8DfPvtQMonECYNvnJ9Nz2Ccdda7OGB3RhV6ZtNp/jRQzqcJKCPCoZtpVug8Z8mq2hyir/hdFxsXcgyhg8+GhaKer8ep2oLzER0hGLQ7rb3doQCMchydT+NPRf8c3TvTKPNZWP6ISmwRpkQhaxn1mmbSqejWr7kSFjroWkLgwMclIsCQAdXmhaPOpAmgq6CwISl3MfkxXyAPDjmvf1GVXpT0G8J3NodWCCxRYieqQJgwlQ14Ni/vrr+25sUHNYn8RC4WvFXSMseyQ4A6jxZS6XXp67GZWlkgegv96qBxQid1Ye2qFHxn1CMj43Yv/6B+qJtRZJoKexbVvk3NBMxd6SJ2MoP0FXTBkUMo00VXkSMXM=----ATTACHMENT:----OTE1NTg3NzE5Mzk2Nzg0NiA0OTUwNzUzNzkwNzIzNTA3IDQ2ODczMTQwMjYwNTc4MDY=