3v4l.org

run code in 300+ PHP versions simultaneously
<?php /** * A Compatibility library with PHP 5.5's simplified password hashing API. * * @author Anthony Ferrara <ircmaxell@php.net> * @license http://www.opensource.org/licenses/mit-license.html MIT License * @copyright 2012 The Authors */ if (!defined('PASSWORD_DEFAULT')) { define('PASSWORD_BCRYPT', 1); define('PASSWORD_DEFAULT', PASSWORD_BCRYPT); /** * Hash the password using the specified algorithm * * @param string $password The password to hash * @param int $algo The algorithm to use (Defined by PASSWORD_* constants) * @param array $options The options for the algorithm to use * * @return string|false The hashed password, or false on error. */ function password_hash($password, $algo, array $options = array()) { if (!function_exists('crypt')) { trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING); return null; } if (!is_string($password)) { trigger_error("password_hash(): Password must be a string", E_USER_WARNING); return null; } if (!is_int($algo)) { trigger_error("password_hash() expects parameter 2 to be long, " . gettype($algo) . " given", E_USER_WARNING); return null; } $resultLength = 0; switch ($algo) { case PASSWORD_BCRYPT: // Note that this is a C constant, but not exposed to PHP, so we don't define it here. $cost = 10; if (isset($options['cost'])) { $cost = $options['cost']; if ($cost < 4 || $cost > 31) { trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING); return null; } } // The length of salt to generate $raw_salt_len = 16; // The length required in the final serialization $required_salt_len = 22; $hash_format = sprintf("$2y$%02d$", $cost); // The expected length of the final crypt() output $resultLength = 60; break; default: trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING); return null; } $salt_requires_encoding = false; if (isset($options['salt'])) { switch (gettype($options['salt'])) { case 'NULL': case 'boolean': case 'integer': case 'double': case 'string': $salt = (string) $options['salt']; break; case 'object': if (method_exists($options['salt'], '__tostring')) { $salt = (string) $options['salt']; break; } case 'array': case 'resource': default: trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING); return null; } if (_strlen($salt) < $required_salt_len) { trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", PasswordCompat\binary\_strlen($salt), $required_salt_len), E_USER_WARNING); return null; } elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) { $salt_requires_encoding = true; } } else { $buffer = ''; $buffer_valid = false; if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) { $buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM); if ($buffer) { $buffer_valid = true; } } if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) { $buffer = openssl_random_pseudo_bytes($raw_salt_len); if ($buffer) { $buffer_valid = true; } } if (!$buffer_valid && @is_readable('/dev/urandom')) { $f = fopen('/dev/urandom', 'r'); $read = _strlen($buffer); while ($read < $raw_salt_len) { $buffer .= fread($f, $raw_salt_len - $read); $read = _strlen($buffer); } fclose($f); if ($read >= $raw_salt_len) { $buffer_valid = true; } } if (!$buffer_valid || _strlen($buffer) < $raw_salt_len) { $bl = _strlen($buffer); for ($i = 0; $i < $raw_salt_len; $i++) { if ($i < $bl) { $buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255)); } else { $buffer .= chr(mt_rand(0, 255)); } } } $salt = $buffer; $salt_requires_encoding = true; } if ($salt_requires_encoding) { // encode string with the Base64 variant used by crypt $base64_digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; $bcrypt64_digits = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $base64_string = base64_encode($salt); $salt = strtr(rtrim($base64_string, '='), $base64_digits, $bcrypt64_digits); } $salt = _substr($salt, 0, $required_salt_len); $hash = $hash_format . $salt; $ret = crypt($password, $hash); if (!is_string($ret) || _strlen($ret) != $resultLength) { return false; } return $ret; } /** * Get information about the password hash. Returns an array of the information * that was used to generate the password hash. * * array( * 'algo' => 1, * 'algoName' => 'bcrypt', * 'options' => array( * 'cost' => 10, * ), * ) * * @param string $hash The password hash to extract info from * * @return array The array of information about the hash. */ function password_get_info($hash) { $return = array( 'algo' => 0, 'algoName' => 'unknown', 'options' => array(), ); if (_substr($hash, 0, 4) == '$2y$' && _strlen($hash) == 60) { $return['algo'] = PASSWORD_BCRYPT; $return['algoName'] = 'bcrypt'; list($cost) = sscanf($hash, "$2y$%d$"); $return['options']['cost'] = $cost; } return $return; } /** * Determine if the password hash needs to be rehashed according to the options provided * * If the answer is true, after validating the password using password_verify, rehash it. * * @param string $hash The hash to test * @param int $algo The algorithm used for new password hashes * @param array $options The options array passed to password_hash * * @return boolean True if the password needs to be rehashed. */ function password_needs_rehash($hash, $algo, array $options = array()) { $info = password_get_info($hash); if ($info['algo'] != $algo) { return true; } switch ($algo) { case PASSWORD_BCRYPT: $cost = isset($options['cost']) ? $options['cost'] : 10; if ($cost != $info['options']['cost']) { return true; } break; } return false; } /** * Verify a password against a hash using a timing attack resistant approach * * @param string $password The password to verify * @param string $hash The hash to verify against * * @return boolean If the password matches the hash */ function password_verify($password, $hash) { if (!function_exists('crypt')) { trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING); return false; } $ret = crypt($password, $hash); if (!is_string($ret) || _strlen($ret) != _strlen($hash) || _strlen($ret) <= 13) { return false; } $status = 0; for ($i = 0; $i < _strlen($ret); $i++) { $status |= (ord($ret[$i]) ^ ord($hash[$i])); } return $status === 0; } } /** * Count the number of bytes in a string * * We cannot simply use strlen() for this, because it might be overwritten by the mbstring extension. * In this case, strlen() will count the number of *characters* based on the internal encoding. A * sequence of bytes might be regarded as a single multibyte character. * * @param string $binary_string The input string * * @internal * @return int The number of bytes */ function _strlen($binary_string) { if (function_exists('mb_strlen')) { return mb_strlen($binary_string, '8bit'); } return strlen($binary_string); } /** * Get a substring based on byte limits * * @see _strlen() * * @param string $binary_string The input string * @param int $start * @param int $length * * @internal * @return string The substring */ function _substr($binary_string, $start, $length) { if (function_exists('mb_substr')) { return mb_substr($binary_string, $start, $length, '8bit'); } return substr($binary_string, $start, $length); } echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT); ?>
Output for 7.3.1
$2y$10$nnZnKnEXqD3fHSjF1EG80.Ahb36j0PngUhyJtg241yTKjrSoThHvC
Output for 7.3.0
$2y$10$2ZOK/DSborsugHwuupmXl.fls4NecCnM3M50OsCX1pt71JI/0B.k2
Output for 7.2.13
$2y$10$xQXetRRJ1z6JG7192bVGyOKCLOLTbGy//JQsbeCWq4s4rI8Oo6vse
Output for 7.2.12
$2y$10$JC6zThnvtmn1SH.RZa8RyuogwvWEWH5BgJWKlrbusDwdbuHFJCZsK
Output for 7.2.11
$2y$10$A77piq5sp0D19KGINPKSFuPCu6EPKdXo1I92j4wrcPinExpCgmrSe
Output for 7.2.10
$2y$10$Iz2VQJmVbIKNRdTuMEgsBusHu6U7LKw7Iemj3XhzzJ4WyiwXYoB2.
Output for 7.2.9
$2y$10$lJe0LfbfVBlLGgJ3.pM4yOj1yxc3QcBrwoj1swgQcwut./qpr4ow2
Output for 7.2.8
$2y$10$yw2lxe4PUnX3cDxPuege1.PQKz9ttg2QbDvETVIAEH5b5dUrDf/.G
Output for 7.2.7
$2y$10$XTdeDCeiPptRzyCCKqFLjuuZQmCZYcbq69Fs3WP3nNCvBIH57hz0S
Output for 7.2.6
$2y$10$36nF8VOUlfYM9rzKFJ7oq.HQyQHEfqfWkNcAfNyrWdvc/SK6ef9k2
Output for 7.2.5
$2y$10$nYafU6LHfOwiu42/u59.4.JOPpipZg5FVVxZstdzOmFR0SPb1gfgO
Output for 7.2.4
$2y$10$NJF7oDOSZYWdjg9kvAuDPuZUjmaTOcb4tkpFZv6jPv59GMU1E8WfO
Output for 7.2.3
$2y$10$Mehifc5.bJoPk5mIbjb.d.PhuSWhagvv.904bVjZn8Hv9P53.m6pW
Output for 7.2.2
$2y$10$LACy.7WvLukSvDzqYnFsd.RkZ2He4K7OP6RJ6dJtxs3BesgXjNK32
Output for 7.2.1
$2y$10$t1xSdTwkQ7mqDm8UREbpqeNO9j7LrU9e.clk7hJQgxKMasu/va8OO
Output for 7.2.0
$2y$10$wb583ofVM9R2wEZPUT7P.O4EK7a7omNAYUfNdXYLW0RcGBRPtiXqC
Output for 7.1.25
$2y$10$PkeO8ZeWepE0X2aZx1ER0uxpiR06jEKWi.Ljy/1w.8nDOVwclAwFy
Output for 7.1.7
$2y$10$o2.RAFr3fGF2xAP9PoJZo.FXV39dz/Z3REpi6kUY8VsKOmckez2Bi
Output for 7.1.6
$2y$10$suutdYWap.JPX.Hz8ejneuSv1S9S5TWh4RaRhopwAuBRRX27iwWxW
Output for 7.1.5
$2y$10$osrhcJYsOBeMZXrXwYJwZ.oq48GMxg8D93BdV2NMAQTnCb2TDRWXe
Output for 7.1.0
$2y$10$hTQIGSHNKpR2Sk73woRLFeuOD0DdyNcR.xFHxx5HwXKnerZzOSiJe
Output for 7.0.20
$2y$10$t7fhNIi2VQ8Dk2Kwgs9tq..Zb9XTkZcDCAInN9e7.rGMUYxMk5VEW
Output for 7.0.14
$2y$10$II0DN5wkuVUTWJ8OyMWreuulD5UC0rHvngQJFMH81MA5EKXZ5CtwW
Output for 7.0.10
$2y$10$NetKnAgVtrqta9j2z..M8.Hjh3bUtxsFCUC0Kfs8qZmLjTv.f3UfG
Output for 7.0.9
$2y$10$ZkJx3n8fmSbwQtHWBle27uHCDFOqvG1QA.ANqqBEp0QdISJc3ZEFG
Output for 7.0.8
$2y$10$ECd/MRTnRlffZC3uyVMER.Ze6mLPih/tE/yrJDOqvCO74injGvg2G
Output for 7.0.7
$2y$10$cjvwNmtDynbKWNUmJzE2yevzS8zWWx3ehBhs4KblPrHg6uankkw4O
Output for 7.0.6
$2y$10$Tz91C0ExKmAahG9hnhZSGuc/J6Pr7r7wdjbIiILcQeV56l./dZARe
Output for 7.0.5
$2y$10$zd/UcvC9Y0snUYOgLZBF2O3gtBeoN.R.TzjDb5sXzfuQaUK20m8d2
Output for 7.0.4
$2y$10$gbyOW7m1nkCfZ8ScjmV8j.HrMelL9rPAGN3tDC9OWDbdnWgLUg2Se
Output for 7.0.3
$2y$10$7HQanw5fmdI7CU5cG9AsZeKKTDyUiRVbRsL22ZGfQctC7TsbCIONe
Output for 7.0.2
$2y$10$Vrm0OrPWXHfrM8obsi1yvulAlLvcamPyexv9031O3141u17z68XC2
Output for 7.0.1
$2y$10$KDvM.8Tx8gcegOtaYmhJ6up0/BzE2azYek9Hdqeg7MOiLO08DDqme
Output for 7.0.0
$2y$10$Fpzo8q42IhtLJ/8Cr5SR7eQjeCxIRmvX//yYwZXR.g5FH0g6p.zMO
Output for 5.6.28
$2y$10$O0ceGU9Qd9PzzbxntZK7aOhb4QN8xcD9zvhaCN.gpzSxZsVofd46e
Output for 5.6.25
$2y$10$J8NUZ8fIfR20ndiiW3HncuuatsGwiSLKrnXVhnMo14ibgNKLPaeiy
Output for 5.6.24
$2y$10$.nvioZH6uqBLZHp/YT3NBuII4tKVVR5InbvmoACNncagHHeiF6CzK
Output for 5.6.23
$2y$10$jDVwI9SwLFYCallNtvt/d.RnsRuIx3vZIj7tuLTvJqF9Jbfdm/WDe
Output for 5.6.22
$2y$10$MWx6cYUFryY04QxRkv3EaOFKyGVkIKmsBabG.0yOK4wItUpeIkj..
Output for 5.6.21
$2y$10$5s0gjZnbYDiW12Nd12nAK..zeR.q3hK4dZKNV8GmuPzHaFuJj1bmG
Output for 5.6.20
$2y$10$uVhMxJwoC3ny9MNxOkP7w.88B9HeSpm4ebAGN7YQ6U.q3XYhbb8RG
Output for 5.6.19
$2y$10$j85YVrKJfI4vpNwI1hr2H.9mdoEH9QgbEhi/hruhkwb49i86.h2j.
Output for 5.6.18
$2y$10$jvfOjLtdzHte8Uo.FyYy2.S7KQIFkSmUgno05UcBqUMFb.w3WNBGG
Output for 5.6.17
$2y$10$Z8XjiLC17H1pkfeOu6JEROLryuSZZSysjCeHjEAq7.0aP8jdOF5aa
Output for 5.6.16
$2y$10$oQChQ8k3JuqJXnHptb4v5.nT28MirQRu2vIVavsXisxVzNNMWhbBq
Output for 5.6.15
$2y$10$ylToDHykn8VfSigh0kOcHeaTD2kB68ZpaApFFtBbEU26L/pu.gk3W
Output for 5.6.14
$2y$10$cqzSc6xLto89KgtpkZkm9eSEODDO6c0jKmaD.B.ql5mjkdaUEcc2K
Output for 5.6.13
$2y$10$uiZbFRzJMwJwVmbtz0/nqOcdM4lmzY7Fk7.QBE//kOmmT41bJwDWa
Output for 5.6.12
$2y$10$tXV446lZOEbDt2mfmjKiEefJUSBmAeZ5akkc1.zphI35//zcW1UNy
Output for 5.6.11
$2y$10$P22kT1/AY06CJ4LQWiOcC.YIbjXFNLD6fPay4QWbLKR4Hq/Y7DXNG
Output for 5.6.10
$2y$10$waxTcwuMVaOQGkCwzxcJPusOyDhiOiriRV0f5iUy8e.c0IwadleYO
Output for 5.6.9
$2y$10$XCQME.SuZwQgImhYsZA7tuBRhL0ll/IWDJQF2G7qFOdUN8yVoQ7FO
Output for 5.6.8
$2y$10$LXD7rJLejqwLYLWaIBeoK.5oKrtoMbGTQK66c/EEp2fWfkBIc/QZq
Output for 5.6.7
$2y$10$IteKfZyY0rYG8J4byydBpuOY1f1TLNCHrP5wSE8ubZ.J.bd.hQ7g6
Output for 5.6.6
$2y$10$acPNpH9AeawWBvJtDkMOoO.bvDDx1qztQK0Xa/42eNCuP1K4Et8iK
Output for 5.6.5
$2y$10$ldmSwg0axrcFea7lVwi3X.wO/6e7U.yNmiq3fKU6VcREfWqWKJzx2
Output for 5.6.4
$2y$10$/Zs7MxLZTEJPukrHwYSmMOJLv3QZwUNCYdcamwRGU9FH/I1FaWEDC
Output for 5.6.3
$2y$10$/Fzlro.fa0xaFtAvVBDBCenIRoPUy6.QbaAZ/aEwr68Ka05NFm89S
Output for 5.6.2
$2y$10$1ggvinsErT.iKzMqE31EIOPxvmU7r.y7AWOmHCKV3YHpNxbsuKgaK
Output for 5.6.1
$2y$10$e7CQBgYiERfzCZdZ4d1Ab.EY8emEjelAog1J/4GJ8rfDi5.gm9qpy
Output for 5.6.0
$2y$10$7TeaXFEY0F4Gomn9Cma1NOBjwY4IoHRJUr52pQjUxq6BxlzgzoLs2
Output for 5.5.38
$2y$10$qfTcy1.vTmctYrHJeafsHusuCQbkajBed.tnoyrDq22nEfLvawcvS
Output for 5.5.37
$2y$10$Y4lr1ecxLxzvMpQty5WjVe5iQ7Mtzb1Nu.EFPURsgRStx0zOPeY..
Output for 5.5.36
$2y$10$V0BElrLoEO9LRbj2tbJzMuKTROb26WouUHMe/MtWrQjurR2/ve0WK
Output for 5.5.35
$2y$10$Zw3EMC8dx7NMkpEJ9W585ePQBCdzbBauGmVDGHxLz8UIZuQtSFlam
Output for 5.5.34
$2y$10$CslpMIG8BSfn/3MN27208eTIilFC8mzGnQegFLyc19w6cLCUdzPMG
Output for 5.5.33
$2y$10$u8x4N0bx0QPDM2ufsuGFEOJkCJ/3Gf8VebYSyFAQdDPSXwBQPR1FO
Output for 5.5.32
$2y$10$FA9/0vWDFo2Yb3QtaAYG8uIn2gVPna9an0W0VtA6WYVJsiB9wbsBO
Output for 5.5.31
$2y$10$W..UHLarv/cml1MLGs7pY.9UpvvRbhJwvMDtlWgmKJwMccXCwPBES
Output for 5.5.30
$2y$10$NzwLG2vo.R5JoYwQjVA/EugB.tx1bTMyaqgJjoWJSUaBO4eimiiue
Output for 5.5.29
$2y$10$goc/ASbbyH9gGvfCxU4dFO7odRPoemd6HQbhw8hHm8ng2Ej9kkDaG
Output for 5.5.28
$2y$10$ceTgxY6PRnfqOroWsEvZxOTapc81NiyRFIvndmbhZ7R0FOHXa2/76
Output for 5.5.27
$2y$10$IqlMFpJLQLo.4UCI9UwIK.J3c0DsjIYm9tJdmtyC8NJJL0dUxwD2e
Output for 5.5.26
$2y$10$XpDSLUcrqSl1jF3Ilcshlu/DR2PTzKTyg9DADN8v9XjgHlUtdfrnC
Output for 5.5.25
$2y$10$PHwqmjHx.JBTVu.JYPBrtuym0mptUNB6kJvBAY3cGgfYJegKPKA8a
Output for 5.5.24
$2y$10$sF3g.8DKmQ8tX4H5xebnN.Cmpc0v9YWEn1YDv6gY9Av2rf06eBfh6
Output for 5.5.23
$2y$10$RR6EhrvW7otLdVYINiRBD.t6ZksZuyrx1Gcmc6yT488pUA61J1.h.
Output for 5.5.22
$2y$10$rmK1ZlFRs.cXnPaUEl65qeHjmdIlZ5W8L0BuRzSK7Mo3H0qV2hW.u
Output for 5.5.21
$2y$10$dgvrcTT51EsVeUALOTdPJeRu/xGz08li9Z7TBmQqK0LKhYLuXpJ8m
Output for 5.5.20
$2y$10$8ilvhstEckpy5scMgrN3Xe4pzl1UsbjQEETQnkzwC7ClLrwcjSvbq
Output for 5.5.19
$2y$10$RQWxdKOfoyswkWSYGTuoK.cy.i4me66OdWYteAWDgL2I0iqL0AV0q
Output for 5.5.18
$2y$10$P3D62SPjsYhz6OQuSyp98uSZDQumBZ7iNeDcGBNwbFKQoovfphkey
Output for 5.5.16
$2y$10$N.BtQMQoJdYpxJCvoU/rpekPiky0nR2t1YbABeh/ArlZW18gqK.sC
Output for 5.5.15
$2y$10$3PaKQxDpcKaC6XXBv8kBZu3yVgOdQ/jVlzNKLNzBnhHwse8Yf4Fj2
Output for 5.5.14
$2y$10$LceXXhYKaCPQljE.mT6DVOiufqliSXK0rlHndkByMO0JH..cinCkO
Output for 5.5.13
$2y$10$iT6AR7hqXxIKzUxbfj/GW.85R3HDTrH7kPU05FYzY3/fYB0J5iO42
Output for 5.5.12
$2y$10$5XU2YDyuYqBIMErmTabHvO0aI7BnarAs7gQJtPj.LuxxbKQnfCwoa
Output for 5.5.11
$2y$10$6RoMLgE4x4K6NaAM4E1E4unjtRP0JmdqevG7.xVlgd4OtoJ/Cv7Qe
Output for 5.5.10
$2y$10$SXMy1jo3eFqFki0442ERQ.gVh7pk5l0iSVsw/5xL.gOl.SzfZPBum
Output for 5.5.9
$2y$10$mgQQgDSUnM3R02RiOukC8OMhf0CP4kgaAjJO5YgSof2RsGOWyFZ5y
Output for 5.5.8
$2y$10$N0y7uGYZO43BCh7j9cfdIO/sMf/BvYtgSsJMVXGFwmd242CgaYfzu
Output for 5.5.7
$2y$10$Utuv7fIVv1qYupDA16eha.CiExDXBNucz33a6oT5X9PAmh.XrBBCW
Output for 5.5.6
$2y$10$DNxXRDUNHnUNbpM1w5stMe5k/BllSLKB4/qW5fmvxlC0gEqlu.j2W
Output for 5.5.5
$2y$10$9CWObaiEShEi25RUgQc1V.c8sTrq7odvHvsISVj3xGvSgCe44nEcC
Output for 5.5.4
$2y$10$C4RN2iEscRiAMlEzBT447.hHgStwQqZj8yam8uLP3sixNA39mmDT.
Output for 5.5.3
$2y$10$U5SB7rfj3eXj5iYumaecge1CrSQ.rXS7SBW0DK3jeyr8wx0H.Aymq
Output for 5.5.2
$2y$10$xsZrtiiwzNNLxgSTnHnugOWxHJ6L/UAA8Ietudpwyf0VbuRUcwJNO
Output for 5.5.1
$2y$10$pDvBD.2ckB/9pVztvKR56eiwuIv9Cmdv6xUDSO5Gp3NWPre9Qu3Gi
Output for 5.5.0
$2y$10$S7PKE6N8w79XJ0zjXQH5lO0pM3yJxmi7q/LigKvej18wyRqg9cYSe
Output for 5.4.45
$2y$10$6ZoZ3uP6r8Yl3T8HlEJvgOy7bq/MXm8DF7WjB9hme8WBgDHJUHgAq
Output for 5.4.44
$2y$10$L618rGJmN3tCOytmruPBV..ZKTFsbZivg3EopOr4wwS2kgkQSmWs2
Output for 5.4.43
$2y$10$GbBcRMmIdNgUKLKoA1ThoudrCzbMig3zyM9fPtZinWPVkK9fY11DK
Output for 5.4.42
$2y$10$ajG6ZRE7bw0me0zu3vRXperEy6Q9P6VX6pxWQDkZI/4/en.BT5m7q
Output for 5.4.41
$2y$10$9Tvvl/ume1wrBy5/3G.KLOf0RBvMYtC9kpv5h5GNNnHmDLGXh9MgG
Output for 5.4.40
$2y$10$aOzAVvM8598ESNrRRHeLpeSxLKKouYNyK2/U0nYnU5JUkOSXY64w.
Output for 5.4.39
$2y$10$3wbJe8pY32Xj4m9XlV8iH.2mcQ4fMIXUZ8SxtSVlqWeak4kxTL7bW
Output for 5.4.38
$2y$10$5yh3ptdunozU2Aa9D7bIjuee0WBPGvpOiGt85StHrJrkIvxbKPoAu
Output for 5.4.37
$2y$10$6PYZH4UBtGOxJprE6eOkj.OaQQqV06CCfWfatHIm3SwveKyD/iwcW
Output for 5.4.36
$2y$10$PlY6.hrr4OMEELeQD6vndODjoj1n7CfXgkuTXGB/uBgQfTNpC9OBS
Output for 5.4.35
$2y$10$F0yVKf2wXX1bq0lzxlYKR.lk30IMLR63fT7kO0yHYUThZARbvs8DS
Output for 5.4.34
$2y$10$wLaDwRx0q/BRW4RcEXXObu15./CbkYnv3WBykR4rJUbPLkrXR80zq
Output for 5.4.32
$2y$10$TMjMqPVYxmOagTjErymrUegOC3nStAFdI7jNO1v0ussPRfGZF.L0G
Output for 5.4.31
$2y$10$wZ51KkQfxfaxqMSkFkoZtuitGy9RYHqhRLqxSpXNy80NPU6j5ayUK
Output for 5.4.30
$2y$10$OKJb5CF7Aa61gq2hbZAgwOy/PAKh/ZS4BU9VU/ZNUmd/yXTUal80O
Output for 5.4.29
$2y$10$Otn.Hkcmitgi7ZZ9mAYPwujO5WJ.hZtpJFi9uoeUXbxDLTEj6dgzW
Output for 5.4.28
$2y$10$O9cp6HVj9YWvh0otbwzkmOWja/bFehjOFmd6b1f29eCf3L/fO0u4m
Output for 5.4.27
$2y$10$vrFrh5bCCAye9d2JHPZSqOGFZSZpJ3tB/LOqlrutQsWdVuOs6EVbi
Output for 5.4.26
$2y$10$U1iSaunU.1hZWVNY9Xu/TemAanrDMORz8Ey0cgvfW4vwzasu8qJr2
Output for 5.4.25
$2y$10$LEpUjSE0nxqETTbiScmFIOmoAwwFmsOkh81Xi0JkwBog01Klc4ICG
Output for 5.4.24
$2y$10$7j4C/L0Ullhi1/riZvTcae1Uhwa/3g8c63hP9lWdN30N3eSttDyfm
Output for 5.4.23
$2y$10$GmAL1BaxBSAOg0FWc05x4e77E6cy.5nkl9ppOvz23SwM5HSRSgWiO
Output for 5.4.22
$2y$10$DBgPIOh.1OgHzEYrIDCVc.cPlwrhYVblNuiQOznckHsz/vqe1UWFa
Output for 5.4.21
$2y$10$5sEbYw79acYtA0EfdlpsNOaUkH1XxZ3dUxJ1pAwSdnPvHz1J26rbi
Output for 5.4.20
$2y$10$CMjvEOeRBxyHF.BJvxhj5.d4.7SX6G5WSWJPGJx28ilca.HfYktPK
Output for 5.4.19
$2y$10$0h9w2vr2QW5s8A4Usp1lM.3DUhsiDQH4gO3WjgNVStRErlLxUrtta
Output for 5.4.18
$2y$10$TEmjCXPkvgLzxC6sGg6fQuRJ/YbB.o5dgbtuhBm9DJgmCozEGhbTW
Output for 5.4.17
$2y$10$au/MsYsCWOqY71XS7laDaeDXq4zWBDG.G6MCtMFzsqz8hibzxk7Ye
Output for 5.4.16
$2y$10$w7Cx.k2YfqZxK7.hAB9zCedCbVRPPweGhwzv89fNiVhmp/B9sB5qu
Output for 5.4.15
$2y$10$.yn7gV.MePDkzU5rSIape.IFefe6A2eXxF8Xjd8pwRsuaeQ1FIwkW
Output for 5.4.14
$2y$10$GXW1kSlwq1klUdsmwojT5.IHkZUdsN3cCat0xG50IIISFNR3wSCLa
Output for 5.4.13
$2y$10$1Xe.Bf0yDyLzIb26wLtvBuP/L31hTYEMTimS/jZgP6venET5KnKGu
Output for 5.4.12
$2y$10$tmFwvdwmoG5iI2K.ZFeA4.ioOuv40MXr55kyUpbsmqbCQ.NOHEXt2
Output for 5.4.11
$2y$10$iUR1klj5fVpaHknj.XxknuDMHeaLwpSM.zRtIvo2HNKBguU6t55SO
Output for 5.4.10
$2y$10$vs56huiBF7Ec8g1Rg6FUxO29g3RHzqLefajEcUAXAKdxK/USTSlOO
Output for 5.4.9
$2y$10$OfesbZLJRXcTatmJDKZ.4.Z84ijYGEn1E4Vk9ZGwnv1QHaDLbJUn6
Output for 5.4.8
$2y$10$pPxt9ElSwgoqy2M7uJBX3eHKEIIyGamt5CqEKdZg0Z751SACDdHGS
Output for 5.4.7
$2y$10$Tym54mfBQy/0inHr4sCiDeUzbfsmUPUlWmQOIQtiVtsgmE7vpFSY2
Output for 5.4.6
$2y$10$XdAuyi7M.OT6p7JfcZk0PuU/zuur/etPKZWCrY/hsxjMdiuANQYhq
Output for 5.4.5
$2y$10$4zMx1Y7.GD54Ona6fiy7HOYhXa.pf7VMuxynzq05/rEk3lnmGfCFe
Output for 5.4.4
$2y$10$2rHHrML94x3Dumb/Qgz7HudGjRPp8iAm8.EbkR8lpL1OwRFyhCsbK
Output for 5.4.3
$2y$10$zoe.zZpOjx8wSPNiQBUXMuZcn/LIUktxLneprg1BFIUl8lDlp0Tvy
Output for 5.4.2
$2y$10$TX009vJ.a6bMiVZ5oi7L7.e84mPjebuJP1bKfCRtGKgs3crVLKDDK
Output for 5.4.1
$2y$10$Lazw.OlfzLHOoI/zYNGduu1R5.Kjqskyu0m8dUgoGDHrn5bdeFrm.
Output for 5.4.0
$2y$10$hjNBFrWl2GKgHfjBghsLgOduXKDPHEWSy6Vv8MczdtptlN5E.mX.K

preferences:
115.36 ms | 401 KiB | 149 Q