3v4l.org

run code in 300+ PHP versions simultaneously
<?php /** * PHP URI Library * * A PHP library for working with URI's. Requires PHP 5.3.7 or later. Replaces * and extends PHP's parse_url() * * Originally inspired by P Guardiario's work. * * @author Nicholas Jordon * @link https://github.com/ProjectCleverWeb/PHP-URI * @copyright 2014 Nicholas Jordon - All Rights Reserved * @version 1.0.0 RC2 * @license http://opensource.org/licenses/MIT * @see http://en.wikipedia.org/wiki/URI_scheme */ namespace { class uri extends \uri\main {} } namespace uri { abstract class main { public $error; public $input; private $object; private $authority; private $domain; private $fqdn; private $fragment; private $host; private $protocol; private $pass; private $password; private $path; private $port; private $query; private $scheme; private $scheme_name; private $scheme_symbols; private $user; private $username; public function __construct($input) { $this->input = $input; $this->object = \uri\parser::parse($input); if (is_object($this->object)) { \uri\generate::authority($this->object); \uri\generate::aliases($this->object); // References required for Sudo-Private Variables $this->authority = &$this->object->authority; $this->domain = &$this->object->domain; $this->fqdn = &$this->object->fqdn; $this->fragment = &$this->object->fragment; $this->host = &$this->object->host; $this->protocol = &$this->object->protocol; $this->pass = &$this->object->pass; $this->password = &$this->object->password; $this->path = &$this->object->path; $this->port = &$this->object->port; $this->query = &$this->object->query; $this->scheme = &$this->object->scheme; $this->scheme_name = &$this->object->scheme_name; $this->scheme_symbols = &$this->object->scheme_symbols; $this->user = &$this->object->user; $this->username = &$this->object->username; } else { $this->error = 'Input could not be parsed as a URI'; } } public function __toString() { return \uri\generate::string($this->object); } public function __invoke() { return \uri\generate::string($this->object); } public function __get($name) { if (isset($this->object->$name)) { \uri\generate::scheme($this->object); \uri\generate::authority($this->object); return $this->object->$name; } else { $trace = debug_backtrace(); trigger_error( sprintf( 'Undefined property via %1$s::__get(): \'%2$s\' in %3$s on line %4$s', __NAMESPACE__.'\\'.__CLASS__, $name, $trace[0]['file'], $trace[0]['line'] ), E_USER_NOTICE ); return NULL; } } public function __set($name, $value) { if (\uri\modify::modify($this->object, 'replace', $name, $value)) { return $value; } else { $trace = debug_backtrace(); trigger_error( sprintf( 'Forbidden property via %1$s::__set(): \'%2$s\' in %3$s on line %4$s', __NAMESPACE__.'\\'.__CLASS__, $name, $trace[0]['file'], $trace[0]['line'] ), E_USER_NOTICE ); return NULL; } } public function __isset($name) { \uri\generate::scheme($this->object); \uri\generate::authority($this->object); return !empty($this->object->$name); } public function __unset($name) { if (isset($this->object->$name)) { $this->object->$name = ''; \uri\generate::scheme($this->object); \uri\generate::authority($this->object); return TRUE; } else { $trace = debug_backtrace(); trigger_error( sprintf( 'Undifined property via %1$s::__unset(): \'%2$s\' in %3$s on line %4$s', __NAMESPACE__.'\\'.__CLASS__, $name, $trace[0]['file'], $trace[0]['line'] ), E_USER_NOTICE ); } return FALSE; } public function str() { return \uri\generate::string($this->object); } public function to_string() { return \uri\generate::string($this->object); } public function p_str() { echo \uri\generate::string($this->object); } public function arr() { return (array) $this->object; } public function to_array() { return (array) $this->object; } public function path_info() { return \uri\generate::path_info($this->object); } public function query_arr() { return \uri\generate::query_array($this->object); } public function replace($section, $str) { return \uri\modify::modify($this->object, 'replace', $section, $str); } public function prepend($section, $str) { return \uri\modify::modify($this->object, 'prepend', $section, $str); } public function append($section, $str) { return \uri\modify::modify($this->object, 'append', $section, $str); } public function reset() { $this->__construct($this->input); } } class parser { const REGEX = '/^(([a-z]+)?(\:\/\/|\:|\/\/))?(?:([a-z0-9$_\.\+!\*\'\(\),;&=\-]+)(?:\:([a-z0-9$_\.\+!\*\'\(\),;&=\-]*))?@)?((?:\d{3}.\d{3}.\d{3}.\d{3})|(?:[a-z0-9\-_]+(?:\.[a-z0-9\-_]+)*))(?:\:([0-9]+))?((?:\:|\/)[a-z0-9\-_\/\.]+)?(?:\?([a-z0-9$_\.\+!\*\'\(\),;:@&=\-%]*))?(?:#([a-z0-9\-_]*))?/i'; public static function parse($uri) { if (!is_string($uri)) { return FALSE; } $parsed = self::regex_parse($uri); // Could not be parsed correctly if (empty($parsed)) { return FALSE; } return (object) array( 'scheme' => $parsed[1], 'scheme_name' => $parsed[2], 'scheme_symbols' => $parsed[3], 'user' => $parsed[4], 'pass' => $parsed[5], 'host' => $parsed[6], 'port' => $parsed[7], 'path' => $parsed[8], 'query' => $parsed[9], 'fragment' => $parsed[10], ); } private static function regex_parse($uri) { preg_match_all(self::REGEX, $uri, $parsed, PREG_SET_ORDER); // Host is required if (!isset($parsed[0][6])) { return FALSE; } // Return what was parsed, but make sure that each offset is set regardless return $parsed[0] + array_fill(0, 11, ''); } } class modify { /*** Methods ***/ public static function modify(&$object, $action, $section, $str) { settype($section, 'string'); $section = strtolower($section); if (is_callable(array('\\uri\\modify', $section))) { return call_user_func_array(array('\\uri\\modify', $section), array($object, $action, $str)); } else { return FALSE; } } public static function replace(&$object, $section, $str) { $object->$section = $str; } public static function prepend(&$object, $section, $str) { $object->$section = $str.$object->$section; } public static function append(&$object, $section, $str) { $object->$section = $object->$section.$str; } public static function scheme_name(&$object, $action, $str) { $org = $object->scheme_name; call_user_func_array(array('\\uri\\modify', $action), array($object, 'scheme_name', $str)); if (!preg_match('/\A[a-z]{1,10}\Z/', $object->scheme_name)) { $object->scheme_name = $org; return FALSE; } elseif (empty($object->scheme_symbols)) { $object->scheme_symbols = '://'; } return \uri\generate::string($object); } public static function scheme_symbols(&$object, $action, $str) { $org = $object->scheme_symbols; call_user_func_array(array('\\uri\\modify', $action), array($object, 'scheme_symbols', $str)); if (!preg_match('/\A(:)?([\/]{2,3})?\Z/', $object->scheme_symbols)) { $object->scheme_symbols = $org; return FALSE; } return \uri\generate::string($object); } public static function scheme(&$object, $action, $str) { $org = array($object->scheme, $object->scheme_name, $object->scheme_symbols); call_user_func_array(array('\\uri\\modify', $action), array($object, 'scheme', $str)); if (empty($object->scheme)) { $object->scheme = $object->scheme_name = $object->scheme_symbols = ''; } else { preg_match('/\A([a-z]{1,10})?(\:|:\/\/|\/\/|:\/\/\/)\Z/i', $object->scheme, $matches); if (empty($matches[1]) && empty($matches[2])) { // restore values $object->scheme = $org[0]; $object->scheme_name = $org[1]; $object->scheme_symbols = $org[2]; return FALSE; } else { // apply changes $matches = $matches + array('', '', ''); $object->scheme = $matches[0]; $object->scheme_name = $matches[1]; $object->scheme_symbols = $matches[2]; } } return \uri\generate::string($object); } public static function protocol(&$object, $action, $str) { self::scheme($object, $action, $str); } public static function user(&$object, $action, $str) { $str = rawurlencode($str); call_user_func_array(array('\\uri\\modify', $action), array($object, 'user', $str)); return \uri\generate::string($object); } public static function username(&$object, $action, $str) { self::user($object, $action, $str); } public static function pass(&$object, $action, $str) { $str = rawurlencode($str); call_user_func_array(array('\\uri\\modify', $action), array($object, 'pass', $str)); return \uri\generate::string($object); } public static function password(&$object, $action, $str) { self::pass($object, $action, $str); } public static function host(&$object, $action, $str) { $org = $object->host; call_user_func_array(array('\\uri\\modify', $action), array($object, 'host', $str)); if ( ( !preg_match('/\A(([a-z0-9_]([a-z0-9\-_]+)?)\.)+[a-z0-9]([a-z0-9\-]+)?\Z/i', $object->host) // fqdn && !preg_match('/\A([0-9]\.){3}[0-9]\Z/i', $object->host) // ip ) || strlen($object->host) > 255 ) { $object->host = $org; return FALSE; } return \uri\generate::string($object); } public static function domain(&$object, $action, $str) { self::host($object, $action, $str); } public static function fqdn(&$object, $action, $str) { self::host($object, $action, $str); } public static function port(&$object, $action, $str) { $org = $object->port; if ($str[0] == ':') { $str = substr($str, 1); } call_user_func_array(array('\\uri\\modify', $action), array($object, 'port', $str)); if (!preg_match('/\A[0-9]{0,5}\Z/', $object->port)) { $object->port = $org; return FALSE; } return \uri\generate::string($object); } public static function path(&$object, $action, $str) { $str = str_replace(array('//','\\'), '/', $str); $path_arr = explode('/', $str); $safe_arr = array(); foreach ($path_arr as $path_part) { $safe_arr[] = rawurlencode($path_part); } $str = implode('/', $safe_arr); call_user_func_array(array('\\uri\\modify', $action), array($object, 'path', $str)); return \uri\generate::string($object); } public static function query(&$object, $action, $str) { if (is_array($str)) { $str = http_build_query($str, '', '&', PHP_QUERY_RFC3986); } elseif ($str[0] == '?') { $str = substr($str, 1); } call_user_func_array(array('\\uri\\modify', $action), array($object, 'query', $str)); return \uri\generate::string($object); } public static function fragment(&$object, $action, $str) { if ($str[0] == '#') { unset($str[0]); } $str = urlencode($str); call_user_func_array(array('\\uri\\modify', $action), array($object, 'fragment', $str)); return \uri\generate::string($object); } } /** * */ class generate { /*** Methods ***/ public static function aliases(&$object) { $object->protocol = &$object->scheme; $object->username = &$object->user; $object->password = &$object->pass; $object->domain = &$object->host; $object->fqdn = &$object->host; } public static function scheme(&$object) { $object->scheme = $object->scheme_name.$object->scheme_symbols; } public static function authority(&$object) { $str_arr = array($object->user); if (empty($object->user) == FALSE && empty($object->pass)) { $str_arr[] = '@'; } elseif (!empty($object->user)) { $str_arr[] = ':'.$object->pass.'@'; } $str_arr[] = $object->host; if (!empty($object->port)) { $str_arr[] = ':'.$object->port; } $object->authority = implode('', $str_arr); } public static function string(&$object) { self::scheme($object); self::authority($object); $str_arr = array($object->scheme, $object->authority, $object->path); if (!empty($object->query)) { $str_arr[] = '?'.$object->query; } if (!empty($object->fragment)) { $str_arr[] = '#'.$object->fragment; } return implode('', $str_arr); } public static function path_info(&$object) { $defaults = array( 'dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '', 'array' => array() ); $info = pathinfo($object->path) + $defaults; $info['array'] = array_values(array_filter(explode('/', $object->path))); ksort($info); return $info; } public static function query_array(&$object) { parse_str($object->query, $return); return $return; } } /** * */ class query { /*** Methods ***/ } }

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.3.60.0070.01118.43
8.3.50.0090.00921.93
8.3.40.0120.00319.04
8.3.30.0120.00319.17
8.3.20.0080.00020.29
8.3.10.0060.00323.66
8.3.00.0110.00018.05
8.2.180.0150.00616.88
8.2.170.0120.00622.96
8.2.160.0110.00420.53
8.2.150.0040.00424.18
8.2.140.0050.00324.66
8.2.130.0000.00826.16
8.2.120.0030.00619.36
8.2.110.0070.00322.25
8.2.100.0090.00318.03
8.2.90.0040.00419.42
8.2.80.0040.00417.97
8.2.70.0090.00017.74
8.2.60.0070.00417.93
8.2.50.0000.01018.07
8.2.40.0040.00418.15
8.2.30.0040.00418.45
8.2.20.0050.00317.93
8.2.10.0000.00818.27
8.2.00.0000.00819.41
8.1.280.0160.00625.92
8.1.270.0080.00023.97
8.1.260.0030.00526.35
8.1.250.0080.00028.09
8.1.240.0060.00324.02
8.1.230.0060.00619.41
8.1.220.0040.00417.90
8.1.210.0000.00818.77
8.1.200.0000.01017.60
8.1.190.0040.00417.60
8.1.180.0030.00618.10
8.1.170.0030.00618.84
8.1.160.0080.00022.27
8.1.150.0030.00518.77
8.1.140.0000.00817.70
8.1.130.0070.00017.91
8.1.120.0040.00417.46
8.1.110.0070.00317.59
8.1.100.0000.00817.57
8.1.90.0040.00417.60
8.1.80.0000.00817.57
8.1.70.0000.00717.48
8.1.60.0080.00017.61
8.1.50.0060.00317.71
8.1.40.0000.00817.57
8.1.30.0040.00417.76
8.1.20.0050.00317.70
8.1.10.0050.00317.59
8.1.00.0000.00917.66
8.0.300.0070.00018.77
8.0.290.0060.00317.00
8.0.280.0050.00218.59
8.0.270.0000.00817.45
8.0.260.0000.00717.40
8.0.250.0080.00017.24
8.0.240.0000.00717.27
8.0.230.0040.00417.20
8.0.220.0040.00417.07
8.0.210.0040.00417.18
8.0.200.0030.00317.11
8.0.190.0040.00417.22
8.0.180.0040.00417.14
8.0.170.0030.00617.06
8.0.160.0040.00417.10
8.0.150.0030.00617.06
8.0.140.0080.00017.07
8.0.130.0030.00513.59
8.0.120.0000.00817.02
8.0.110.0000.01117.23
8.0.100.0030.00517.14
8.0.90.0030.00617.27
8.0.80.0100.01417.14
8.0.70.0030.00517.03
8.0.60.0080.00017.18
8.0.50.0040.00417.27
8.0.30.0090.01117.25
8.0.20.0110.01017.40
8.0.10.0000.00817.33
8.0.00.0090.00917.05
7.4.330.0030.00315.00
7.4.320.0000.00716.55
7.4.300.0000.00616.73
7.4.290.0000.00816.67
7.4.280.0030.00616.64
7.4.270.0000.00716.74
7.4.260.0040.00316.78
7.4.250.0040.00416.71
7.4.240.0020.00616.64
7.4.230.0000.00716.75
7.4.220.0060.01316.69
7.4.210.0150.00616.75
7.4.200.0000.00716.77
7.4.160.0030.01316.71
7.4.150.0150.01117.40
7.4.140.0110.00717.86
7.4.130.0090.01116.65
7.4.120.0100.00816.50
7.4.110.0140.00416.80
7.4.100.0050.01416.66
7.4.90.0030.01616.48
7.4.80.0140.00619.39
7.4.70.0070.01016.59
7.4.60.0100.00716.54
7.4.50.0000.00916.47
7.4.40.0120.00616.62
7.4.30.0100.00716.63
7.4.10.0100.00715.01
7.4.00.0090.00914.90
7.3.330.0030.00313.39
7.3.320.0030.00313.45
7.3.310.0040.00416.30
7.3.300.0040.00416.32
7.3.290.0070.00716.35
7.3.280.0120.01016.45
7.3.270.0090.01617.40
7.3.260.0150.01216.43
7.3.250.0090.00916.52
7.3.240.0140.00616.46
7.3.230.0030.01316.46
7.3.210.0120.00616.70
7.3.200.0120.00619.39
7.3.190.0110.00716.71
7.3.180.0130.00316.63
7.3.170.0060.01216.43
7.3.160.0150.00916.46
7.3.130.0030.01515.20
7.3.120.0020.01715.09
7.3.110.0060.01214.85
7.3.100.0040.00714.96
7.3.90.0100.00714.74
7.3.80.0060.00615.06
7.3.70.0030.00714.64
7.3.60.0100.01015.11
7.3.50.0000.01415.08
7.3.40.0030.01014.75
7.3.30.0090.00314.68
7.3.20.0030.01316.74
7.3.10.0040.01116.39
7.3.00.0060.00916.48
7.2.330.0040.01516.67
7.2.320.0000.01816.73
7.2.310.0150.00616.80
7.2.300.0080.00916.64
7.2.290.0090.00916.52
7.2.260.0070.01315.24
7.2.250.0080.00615.19
7.2.240.0040.01114.96
7.2.230.0090.00615.05
7.2.220.0100.00015.07
7.2.210.0040.00815.08
7.2.200.0070.00715.04
7.2.190.0060.01214.82
7.2.180.0030.00715.27
7.2.170.0060.00914.78
7.2.160.0040.01215.21
7.2.150.0090.00616.81
7.2.140.0070.00716.41
7.2.130.0070.00716.72
7.2.120.0040.01216.70
7.2.110.0150.00316.51
7.2.100.0060.00616.72
7.2.90.0110.00316.84
7.2.80.0040.01116.64
7.2.70.0060.01016.46
7.2.60.0070.00416.55
7.2.50.0030.01016.81
7.2.40.0090.00316.75
7.2.30.0060.00616.80
7.2.20.0030.01216.83
7.2.10.0070.01116.84
7.2.00.0060.00616.79
7.1.330.0060.00615.76
7.1.320.0060.00915.75
7.1.310.0070.00715.64
7.1.300.0180.00015.37
7.1.290.0030.01015.70
7.1.280.0060.00315.33
7.1.270.0060.00315.65
7.1.260.0100.00715.34
7.1.250.0040.00815.89
7.1.240.0040.01115.42
7.1.230.0040.01115.50
7.1.220.0100.00615.58
7.1.210.0030.01515.54
7.1.200.0070.00315.61
7.1.190.0060.00615.77
7.1.180.0060.00615.66
7.1.170.0030.00715.69
7.1.160.0000.01215.74
7.1.150.0030.00715.66
7.1.140.0080.00815.78
7.1.130.0060.00315.78
7.1.120.0070.01115.83
7.1.110.0000.01715.75
7.1.100.0040.00815.55
7.1.90.0030.00915.85
7.1.80.0060.01015.67
7.1.70.0050.00416.12
7.1.60.0100.01117.69
7.1.50.0030.00716.28
7.1.40.0070.00715.79
7.1.30.0030.00915.73
7.1.20.0090.00615.49
7.1.10.0120.00315.51
7.1.00.0030.04519.17
7.0.330.0060.01014.97
7.0.320.0040.01315.44
7.0.310.0060.01015.14
7.0.300.0070.00715.46
7.0.290.0090.00615.26
7.0.280.0040.00815.18
7.0.270.0030.00615.24
7.0.260.0070.00715.44
7.0.250.0000.01615.11
7.0.240.0030.01215.52
7.0.230.0040.00415.36
7.0.220.0070.00715.01
7.0.210.0060.00615.28
7.0.200.0050.00515.73
7.0.190.0110.00615.27
7.0.180.0070.00715.36
7.0.170.0070.01015.08
7.0.160.0070.00715.02
7.0.150.0040.00715.42
7.0.140.0030.04218.64
7.0.130.0030.01015.18
7.0.120.0120.00415.50
7.0.110.0030.01415.45
7.0.100.0130.02317.64
7.0.90.0080.04317.75
7.0.80.0120.03017.61
7.0.70.0020.04717.67
7.0.60.0100.04417.65
7.0.50.0080.02517.84
7.0.40.0080.04716.65
7.0.30.0110.04716.77
7.0.20.0020.02916.83
7.0.10.0150.03816.75
7.0.00.0120.02716.77
5.6.400.0030.01013.86
5.6.390.0040.01814.39
5.6.380.0040.01714.05
5.6.370.0090.00914.39
5.6.360.0030.01314.30
5.6.350.0060.00914.30
5.6.340.0060.00914.55
5.6.330.0060.00314.15
5.6.320.0070.00714.18
5.6.310.0050.00514.15
5.6.300.0030.00914.13
5.6.290.0090.00614.50
5.6.280.0030.04317.76
5.6.270.0000.01114.25
5.6.260.0110.00414.00
5.6.250.0090.03117.55
5.6.240.0160.03817.45
5.6.230.0050.04117.66
5.6.220.0050.03017.36
5.6.210.0050.04617.43
5.6.200.0070.03217.71
5.6.190.0070.05017.67
5.6.180.0060.04617.66
5.6.170.0030.04917.62
5.6.160.0070.05017.69
5.6.150.0050.04517.65
5.6.140.0070.02817.77
5.6.130.0080.03817.66
5.6.120.0070.02617.82
5.6.110.0090.04517.76
5.6.100.0050.05017.67
5.6.90.0110.02617.77
5.6.80.0130.03517.39
5.6.70.0080.04517.32
5.6.60.0040.04917.23
5.6.50.0130.03517.30
5.6.40.0080.04017.36
5.6.30.0070.04117.28
5.6.20.0080.04017.26
5.6.10.0150.03317.36
5.6.00.0050.02817.28
5.5.380.0030.02817.20
5.5.370.0080.04817.39
5.5.360.0040.03317.22
5.5.350.0050.02717.42
5.5.340.0080.03617.55
5.5.330.0070.04717.57
5.5.320.0050.03017.52
5.5.310.0140.03417.55
5.5.300.0030.05017.60
5.5.290.0020.02817.52
5.5.280.0050.04717.48
5.5.270.0050.04817.46
5.5.260.0060.04617.63
5.5.250.0100.04617.33
5.5.240.0120.03917.14
5.5.230.0140.04517.26
5.5.220.0080.02617.16
5.5.210.0100.03917.25
5.5.200.0080.04216.95
5.5.190.0080.04617.05
5.5.180.0050.02717.18
5.5.170.0030.01014.08
5.5.160.0130.02317.19
5.5.150.0050.03917.20
5.5.140.0070.04617.22
5.5.130.0080.03717.24
5.5.120.0050.04417.19
5.5.110.0030.04717.24
5.5.100.0070.04317.15
5.5.90.0070.04617.14
5.5.80.0100.03917.27
5.5.70.0100.04017.10
5.5.60.0050.04117.20
5.5.50.0150.03517.17
5.5.40.0040.02817.08
5.5.30.0070.02517.05
5.5.20.0090.04017.21
5.5.10.0070.02717.02
5.5.00.0050.04317.19
5.4.450.0030.03415.17
5.4.440.0030.04715.16
5.4.430.0050.03315.08
5.4.420.0020.04515.18
5.4.410.0090.03515.18
5.4.400.0030.03915.08
5.4.390.0060.03015.00
5.4.380.0110.03615.09
5.4.370.0080.02515.03
5.4.360.0040.03015.06
5.4.350.0050.04015.02
5.4.340.0070.03215.09
5.4.330.0000.01010.92
5.4.320.0030.04515.08
5.4.310.0050.02115.02
5.4.300.0030.04415.00
5.4.290.0130.03215.00
5.4.280.0030.04515.01
5.4.270.0120.03315.11
5.4.260.0070.02714.93
5.4.250.0070.03715.04
5.4.240.0120.03415.01
5.4.230.0050.03715.00
5.4.220.0050.02715.08
5.4.210.0080.04115.00
5.4.200.0030.02715.05
5.4.190.0050.04214.99
5.4.180.0060.03115.09
5.4.170.0050.03415.08
5.4.160.0030.02815.03
5.4.150.0050.03615.09
5.4.140.0030.03213.72
5.4.130.0040.04213.75
5.4.120.0050.02313.73
5.4.110.0050.04213.74
5.4.100.0050.02613.70
5.4.90.0070.01813.87
5.4.80.0050.02013.66
5.4.70.0020.02213.75
5.4.60.0020.02313.67
5.4.50.0050.02513.63
5.4.40.0020.02513.73
5.4.30.0050.02513.73
5.4.20.0000.02213.66
5.4.10.0030.03513.77
5.4.00.0000.03013.43
5.3.290.0030.03012.89
5.3.280.0060.04012.88
5.3.270.0030.02212.90
5.3.260.0030.02512.84
5.3.250.0060.03812.88
5.3.240.0030.04312.89
5.3.230.0050.02512.86
5.3.220.0120.03412.87
5.3.210.0100.03612.84
5.3.200.0030.04212.78
5.3.190.0050.02412.85
5.3.180.0030.02012.82
5.3.170.0000.02612.89
5.3.160.0030.02212.82
5.3.150.0020.02512.88
5.3.140.0030.02012.86
5.3.130.0030.02512.84
5.3.120.0030.02212.83
5.3.110.0030.02212.85
5.3.100.0030.02212.61
5.3.90.0030.02412.62
5.3.80.0020.02012.63
5.3.70.0090.03012.52
5.3.60.0050.01812.54
5.3.50.0000.02412.54
5.3.40.0030.02312.49
5.3.30.0000.02912.56
5.3.20.0020.02012.42
5.3.10.0060.01812.37
5.3.00.0040.02112.37

preferences:
46.56 ms | 401 KiB | 5 Q