3v4l.org

run code in 300+ PHP versions simultaneously
<?php $duo = <<< PHP <?php class Duo { const DUO_PREFIX = "TX"; const APP_PREFIX = "APP"; const AUTH_PREFIX = "AUTH"; const DUO_EXPIRE = 300; const APP_EXPIRE = 3600; const IKEY_LEN = 20; const SKEY_LEN = 40; const AKEY_LEN = 40; // if this changes you have to change ERR_AKEY const ERR_USER = 'ERR|The username passed to sign_request() is invalid.'; const ERR_IKEY = 'ERR|The Duo integration key passed to sign_request() is invalid.'; const ERR_SKEY = 'ERR|The Duo secret key passed to sign_request() is invalid.'; const ERR_AKEY = 'ERR|The application secret key passed to sign_request() must be at least 40 characters.'; private static function sign_vals($key, $vals, $prefix, $expire, $time=NULL) { $exp = ($time ? $time : time()) + $expire; $val = $vals . '|' . $exp; $b64 = base64_encode($val); $cookie = $prefix . '|' . $b64; $sig = hash_hmac("sha1", $cookie, $key); return $cookie . '|' . $sig; } private static function parse_vals($key, $val, $prefix, $ikey, $time=NULL) { $ts = ($time ? $time : time()); $parts = explode('|', $val); if (count($parts) !== 3) { return null; } list($u_prefix, $u_b64, $u_sig) = $parts; $sig = hash_hmac("sha1", $u_prefix . '|' . $u_b64, $key); if (hash_hmac("sha1", $sig, $key) !== hash_hmac("sha1", $u_sig, $key)) { return null; } if ($u_prefix !== $prefix) { return null; } $cookie_parts = explode('|', base64_decode($u_b64)); if (count($cookie_parts) !== 3) { return null; } list($user, $u_ikey, $exp) = $cookie_parts; if ($u_ikey !== $ikey) { return null; } if ($ts >= intval($exp)) { return null; } return $user; } public static function signRequest($ikey, $skey, $akey, $username, $time=NULL) { if (!isset($username) || strlen($username) === 0) { return self::ERR_USER; } if (strpos($username, '|') !== FALSE) { return self::ERR_USER; } if (!isset($ikey) || strlen($ikey) !== self::IKEY_LEN) { return self::ERR_IKEY; } if (!isset($skey) || strlen($skey) !== self::SKEY_LEN) { return self::ERR_SKEY; } if (!isset($akey) || strlen($akey) < self::AKEY_LEN) { return self::ERR_AKEY; } $vals = $username . '|' . $ikey; $duo_sig = self::sign_vals($skey, $vals, self::DUO_PREFIX, self::DUO_EXPIRE, $time); $app_sig = self::sign_vals($akey, $vals, self::APP_PREFIX, self::APP_EXPIRE, $time); return $duo_sig . ':' . $app_sig; } public static function verifyResponse($ikey, $skey, $akey, $sig_response, $time=NULL) { list($auth_sig, $app_sig) = explode(':', $sig_response); $auth_user = self::parse_vals($skey, $auth_sig, self::AUTH_PREFIX, $ikey, $time); $app_user = self::parse_vals($akey, $app_sig, self::APP_PREFIX, $ikey, $time); if ($auth_user !== $app_user) { return null; } return $auth_user; } } ?> PHP; echo md5($duo);
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/5CTp5
function name:  (null)
number of ops:  221
compiled vars:  !0 = $duo, !1 = $key, !2 = $vals, !3 = $prefix, !4 = $expire, !5 = $time, !6 = $exp, !7 = $val, !8 = $b64, !9 = $cookie, !10 = $sig, !11 = $ikey, !12 = $ts, !13 = $parts, !14 = $u_prefix, !15 = $u_b64, !16 = $u_sig, !17 = $cookie_parts, !18 = $user, !19 = $u_ikey, !20 = $skey, !21 = $akey, !22 = $username, !23 = $duo_sig, !24 = $app_sig, !25 = $sig_response, !26 = $auth_sig, !27 = $auth_user, !28 = $app_user
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
    4     0  E >   ROPE_INIT                                   215  ~30     '%3C%3Fphp%0A%0Aclass+Duo+%7B%0A%09const+DUO_PREFIX+%3D+%22TX%22%3B%0A%09const+APP_PREFIX+%3D+%22APP%22%3B%0A%09const+AUTH_PREFIX+%3D+%22AUTH%22%3B%0A%0A%09const+DUO_EXPIRE+%3D+300%3B%0A%09const+APP_EXPIRE+%3D+3600%3B%0A%0A%09const+IKEY_LEN+%3D+20%3B%0A%09const+SKEY_LEN+%3D+40%3B%0A%09const+AKEY_LEN+%3D+40%3B+%2F%2F+if+this+changes+you+have+to+change+ERR_AKEY%0A%0A%09const+ERR_USER+%3D+%27ERR%7CThe+username+passed+to+sign_request%28%29+is+invalid.%27%3B%0A%09const+ERR_IKEY+%3D+%27ERR%7CThe+Duo+integration+key+passed+to+sign_request%28%29+is+invalid.%27%3B%0A%09const+ERR_SKEY+%3D+%27ERR%7CThe+Duo+secret+key+passed+to+sign_request%28%29+is+invalid.%27%3B%0A%09const+ERR_AKEY+%3D+%27ERR%7CThe+application+secret+key+passed+to+sign_request%28%29+must+be+at+least+40+characters.%27%3B+%0A%0A%09private+static+function+sign_vals%28'
   23     1        ROPE_ADD                                      1  ~30     ~30, !1
          2        ROPE_ADD                                      2  ~30     ~30, '%2C+'
          3        ROPE_ADD                                      3  ~30     ~30, !2
          4        ROPE_ADD                                      4  ~30     ~30, '%2C+'
          5        ROPE_ADD                                      5  ~30     ~30, !3
          6        ROPE_ADD                                      6  ~30     ~30, '%2C+'
          7        ROPE_ADD                                      7  ~30     ~30, !4
          8        ROPE_ADD                                      8  ~30     ~30, '%2C+'
          9        ROPE_ADD                                      9  ~30     ~30, !5
         10        ROPE_ADD                                     10  ~30     ~30, '%3DNULL%29+%7B+%0A%09%09'
   24    11        ROPE_ADD                                     11  ~30     ~30, !6
         12        ROPE_ADD                                     12  ~30     ~30, '+%3D+%28'
         13        ROPE_ADD                                     13  ~30     ~30, !5
         14        ROPE_ADD                                     14  ~30     ~30, '+%3F+'
         15        ROPE_ADD                                     15  ~30     ~30, !5
         16        ROPE_ADD                                     16  ~30     ~30, '+%3A+time%28%29%29+%2B+'
         17        ROPE_ADD                                     17  ~30     ~30, !4
         18        ROPE_ADD                                     18  ~30     ~30, '%3B%0A%09%09'
   25    19        ROPE_ADD                                     19  ~30     ~30, !7
         20        ROPE_ADD                                     20  ~30     ~30, '+%3D+'
         21        ROPE_ADD                                     21  ~30     ~30, !2
         22        ROPE_ADD                                     22  ~30     ~30, '+.+%27%7C%27+.+'
         23        ROPE_ADD                                     23  ~30     ~30, !6
         24        ROPE_ADD                                     24  ~30     ~30, '%3B%0A%09%09'
   26    25        ROPE_ADD                                     25  ~30     ~30, !8
         26        ROPE_ADD                                     26  ~30     ~30, '+%3D+base64_encode%28'
         27        ROPE_ADD                                     27  ~30     ~30, !7
         28        ROPE_ADD                                     28  ~30     ~30, '%29%3B%0A%09%09'
   27    29        ROPE_ADD                                     29  ~30     ~30, !9
         30        ROPE_ADD                                     30  ~30     ~30, '+%3D+'
         31        ROPE_ADD                                     31  ~30     ~30, !3
         32        ROPE_ADD                                     32  ~30     ~30, '+.+%27%7C%27+.+'
         33        ROPE_ADD                                     33  ~30     ~30, !8
         34        ROPE_ADD                                     34  ~30     ~30, '%3B%0A%0A%09%09'
   29    35        ROPE_ADD                                     35  ~30     ~30, !10
         36        ROPE_ADD                                     36  ~30     ~30, '+%3D+hash_hmac%28%22sha1%22%2C+'
         37        ROPE_ADD                                     37  ~30     ~30, !9
         38        ROPE_ADD                                     38  ~30     ~30, '%2C+'
         39        ROPE_ADD                                     39  ~30     ~30, !1
         40        ROPE_ADD                                     40  ~30     ~30, '%29%3B%0A%09%09return+'
   30    41        ROPE_ADD                                     41  ~30     ~30, !9
         42        ROPE_ADD                                     42  ~30     ~30, '+.+%27%7C%27+.+'
         43        ROPE_ADD                                     43  ~30     ~30, !10
         44        ROPE_ADD                                     44  ~30     ~30, '%3B%0A%09%7D%0A%0A%09private+static+function+parse_vals%28'
   33    45        ROPE_ADD                                     45  ~30     ~30, !1
         46        ROPE_ADD                                     46  ~30     ~30, '%2C+'
         47        ROPE_ADD                                     47  ~30     ~30, !7
         48        ROPE_ADD                                     48  ~30     ~30, '%2C+'
         49        ROPE_ADD                                     49  ~30     ~30, !3
         50        ROPE_ADD                                     50  ~30     ~30, '%2C+'
         51        ROPE_ADD                                     51  ~30     ~30, !11
         52        ROPE_ADD                                     52  ~30     ~30, '%2C+'
         53        ROPE_ADD                                     53  ~30     ~30, !5
         54        ROPE_ADD                                     54  ~30     ~30, '%3DNULL%29+%7B%0A%09%09'
   34    55        ROPE_ADD                                     55  ~30     ~30, !12
         56        ROPE_ADD                                     56  ~30     ~30, '+%3D+%28'
         57        ROPE_ADD                                     57  ~30     ~30, !5
         58        ROPE_ADD                                     58  ~30     ~30, '+%3F+'
         59        ROPE_ADD                                     59  ~30     ~30, !5
         60        ROPE_ADD                                     60  ~30     ~30, '+%3A+time%28%29%29%3B%0A%0A%09%09'
   36    61        ROPE_ADD                                     61  ~30     ~30, !13
         62        ROPE_ADD                                     62  ~30     ~30, '+%3D+explode%28%27%7C%27%2C+'
         63        ROPE_ADD                                     63  ~30     ~30, !7
         64        ROPE_ADD                                     64  ~30     ~30, '%29%3B%0A%09%09if+%28count%28'
   37    65        ROPE_ADD                                     65  ~30     ~30, !13
         66        ROPE_ADD                                     66  ~30     ~30, '%29+%21%3D%3D+3%29+%7B%0A%09%09%09return+null%3B%0A%09%09%7D%0A%09%09list%28'
   40    67        ROPE_ADD                                     67  ~30     ~30, !14
         68        ROPE_ADD                                     68  ~30     ~30, '%2C+'
         69        ROPE_ADD                                     69  ~30     ~30, !15
         70        ROPE_ADD                                     70  ~30     ~30, '%2C+'
         71        ROPE_ADD                                     71  ~30     ~30, !16
         72        ROPE_ADD                                     72  ~30     ~30, '%29+%3D+'
         73        ROPE_ADD                                     73  ~30     ~30, !13
         74        ROPE_ADD                                     74  ~30     ~30, '%3B%0A%0A%09%09'
   42    75        ROPE_ADD                                     75  ~30     ~30, !10
         76        ROPE_ADD                                     76  ~30     ~30, '+%3D+hash_hmac%28%22sha1%22%2C+'
         77        ROPE_ADD                                     77  ~30     ~30, !14
         78        ROPE_ADD                                     78  ~30     ~30, '+.+%27%7C%27+.+'
         79        ROPE_ADD                                     79  ~30     ~30, !15
         80        ROPE_ADD                                     80  ~30     ~30, '%2C+'
         81        ROPE_ADD                                     81  ~30     ~30, !1
         82        ROPE_ADD                                     82  ~30     ~30, '%29%3B%0A%09%09if+%28hash_hmac%28%22sha1%22%2C+'
   43    83        ROPE_ADD                                     83  ~30     ~30, !10
         84        ROPE_ADD                                     84  ~30     ~30, '%2C+'
         85        ROPE_ADD                                     85  ~30     ~30, !1
         86        ROPE_ADD                                     86  ~30     ~30, '%29+%21%3D%3D+hash_hmac%28%22sha1%22%2C+'
         87        ROPE_ADD                                     87  ~30     ~30, !16
         88        ROPE_ADD                                     88  ~30     ~30, '%2C+'
         89        ROPE_ADD                                     89  ~30     ~30, !1
         90        ROPE_ADD                                     90  ~30     ~30, '%29%29+%7B%0A%09%09%09return+null%3B%0A%09%09%7D%0A%0A%09%09if+%28'
   47    91        ROPE_ADD                                     91  ~30     ~30, !14
         92        ROPE_ADD                                     92  ~30     ~30, '+%21%3D%3D+'
         93        ROPE_ADD                                     93  ~30     ~30, !3
         94        ROPE_ADD                                     94  ~30     ~30, '%29+%7B%0A%09%09%09return+null%3B%0A%09%09%7D%0A%0A%09%09'
   51    95        ROPE_ADD                                     95  ~30     ~30, !17
         96        ROPE_ADD                                     96  ~30     ~30, '+%3D+explode%28%27%7C%27%2C+base64_decode%28'
         97        ROPE_ADD                                     97  ~30     ~30, !15
         98        ROPE_ADD                                     98  ~30     ~30, '%29%29%3B%0A%09%09if+%28count%28'
   52    99        ROPE_ADD                                     99  ~30     ~30, !17
        100        ROPE_ADD                                    100  ~30     ~30, '%29+%21%3D%3D+3%29+%7B%0A%09%09%09return+null%3B%0A%09%09%7D%0A%09%09list%28'
   55   101        ROPE_ADD                                    101  ~30     ~30, !18
        102        ROPE_ADD                                    102  ~30     ~30, '%2C+'
        103        ROPE_ADD                                    103  ~30     ~30, !19
        104        ROPE_ADD                                    104  ~30     ~30, '%2C+'
        105        ROPE_ADD                                    105  ~30     ~30, !6
        106        ROPE_ADD                                    106  ~30     ~30, '%29+%3D+'
        107        ROPE_ADD                                    107  ~30     ~30, !17
        108        ROPE_ADD                                    108  ~30     ~30, '%3B%0A%0A%09%09if+%28'
   57   109        ROPE_ADD                                    109  ~30     ~30, !19
        110        ROPE_ADD                                    110  ~30     ~30, '+%21%3D%3D+'
        111        ROPE_ADD                                    111  ~30     ~30, !11
        112        ROPE_ADD                                    112  ~30     ~30, '%29+%7B%0A%09%09%09return+null%3B%0A%09%09%7D%0A%09%09if+%28'
   60   113        ROPE_ADD                                    113  ~30     ~30, !12
        114        ROPE_ADD                                    114  ~30     ~30, '+%3E%3D+intval%28'
        115        ROPE_ADD                                    115  ~30     ~30, !6
        116        ROPE_ADD                                    116  ~30     ~30, '%29%29+%7B%0A%09%09%09return+null%3B%0A%09%09%7D%0A%0A%09%09return+'
   64   117        ROPE_ADD                                    117  ~30     ~30, !18
        118        ROPE_ADD                                    118  ~30     ~30, '%3B%0A%09%7D%0A%0A%09public+static+function+signRequest%28'
   67   119        ROPE_ADD                                    119  ~30     ~30, !11
        120        ROPE_ADD                                    120  ~30     ~30, '%2C+'
        121        ROPE_ADD                                    121  ~30     ~30, !20
        122        ROPE_ADD                                    122  ~30     ~30, '%2C+'
        123        ROPE_ADD                                    123  ~30     ~30, !21
        124        ROPE_ADD                                    124  ~30     ~30, '%2C+'
        125        ROPE_ADD                                    125  ~30     ~30, !22
        126        ROPE_ADD                                    126  ~30     ~30, '%2C+'
        127        ROPE_ADD                                    127  ~30     ~30, !5
        128        ROPE_ADD                                    128  ~30     ~30, '%3DNULL%29+%7B%0A%09%09if+%28%21isset%28'
   68   129        ROPE_ADD                                    129  ~30     ~30, !22
        130        ROPE_ADD                                    130  ~30     ~30, '%29+%7C%7C+strlen%28'
        131        ROPE_ADD                                    131  ~30     ~30, !22
        132        ROPE_ADD                                    132  ~30     ~30, '%29+%3D%3D%3D+0%29+%7B%0A%09%09%09return+self%3A%3AERR_USER%3B%0A%09%09%7D%0A%09%09if+%28strpos%28'
   71   133        ROPE_ADD                                    133  ~30     ~30, !22
        134        ROPE_ADD                                    134  ~30     ~30, '%2C+%27%7C%27%29+%21%3D%3D+FALSE%29+%7B%0A%09%09%09return+self%3A%3AERR_USER%3B%0A%09%09%7D%0A%09%09if+%28%21isset%28'
   74   135        ROPE_ADD                                    135  ~30     ~30, !11
        136        ROPE_ADD                                    136  ~30     ~30, '%29+%7C%7C+strlen%28'
        137        ROPE_ADD                                    137  ~30     ~30, !11
        138        ROPE_ADD                                    138  ~30     ~30, '%29+%21%3D%3D+self%3A%3AIKEY_LEN%29+%7B%0A%09%09%09return+self%3A%3AERR_IKEY%3B%0A%09%09%7D%0A%09%09if+%28%21isset%28'
   77   139        ROPE_ADD                                    139  ~30     ~30, !20
        140        ROPE_ADD                                    140  ~30     ~30, '%29+%7C%7C+strlen%28'
        141        ROPE_ADD                                    141  ~30     ~30, !20
        142        ROPE_ADD                                    142  ~30     ~30, '%29+%21%3D%3D+self%3A%3ASKEY_LEN%29+%7B%0A%09%09%09return+self%3A%3AERR_SKEY%3B%0A%09%09%7D%0A%09%09if+%28%21isset%28'
   80   143        ROPE_ADD                                    143  ~30     ~30, !21
        144        ROPE_ADD                                    144  ~30     ~30, '%29+%7C%7C+strlen%28'
        145        ROPE_ADD                                    145  ~30     ~30, !21
        146        ROPE_ADD                                    146  ~30     ~30, '%29+%3C+self%3A%3AAKEY_LEN%29+%7B%0A%09%09%09return+self%3A%3AERR_AKEY%3B%0A%09%09%7D%0A%0A%09%09'
   84   147        ROPE_ADD                                    147  ~30     ~30, !2
        148        ROPE_ADD                                    148  ~30     ~30, '+%3D+'
        149        ROPE_ADD                                    149  ~30     ~30, !22
        150        ROPE_ADD                                    150  ~30     ~30, '+.+%27%7C%27+.+'
        151        ROPE_ADD                                    151  ~30     ~30, !11
        152        ROPE_ADD                                    152  ~30     ~30, '%3B%0A%0A%09%09'
   86   153        ROPE_ADD                                    153  ~30     ~30, !23
        154        ROPE_ADD                                    154  ~30     ~30, '+%3D+self%3A%3Asign_vals%28'
        155        ROPE_ADD                                    155  ~30     ~30, !20
        156        ROPE_ADD                                    156  ~30     ~30, '%2C+'
        157        ROPE_ADD                                    157  ~30     ~30, !2
        158        ROPE_ADD                                    158  ~30     ~30, '%2C+self%3A%3ADUO_PREFIX%2C+self%3A%3ADUO_EXPIRE%2C+'
        159        ROPE_ADD                                    159  ~30     ~30, !5
        160        ROPE_ADD                                    160  ~30     ~30, '%29%3B%0A%09%09'
   87   161        ROPE_ADD                                    161  ~30     ~30, !24
        162        ROPE_ADD                                    162  ~30     ~30, '+%3D+self%3A%3Asign_vals%28'
        163        ROPE_ADD                                    163  ~30     ~30, !21
        164        ROPE_ADD                                    164  ~30     ~30, '%2C+'
        165        ROPE_ADD                                    165  ~30     ~30, !2
        166        ROPE_ADD                                    166  ~30     ~30, '%2C+self%3A%3AAPP_PREFIX%2C+self%3A%3AAPP_EXPIRE%2C+'
        167        ROPE_ADD                                    167  ~30     ~30, !5
        168        ROPE_ADD                                    168  ~30     ~30, '%29%3B%0A%0A%09%09return+'
   89   169        ROPE_ADD                                    169  ~30     ~30, !23
        170        ROPE_ADD                                    170  ~30     ~30, '+.+%27%3A%27+.+'
        171        ROPE_ADD                                    171  ~30     ~30, !24
        172        ROPE_ADD                                    172  ~30     ~30, '%3B%0A%09%7D%0A%0A%09public+static+function+verifyResponse%28'
   92   173        ROPE_ADD                                    173  ~30     ~30, !11
        174        ROPE_ADD                                    174  ~30     ~30, '%2C+'
        175        ROPE_ADD                                    175  ~30     ~30, !20
        176        ROPE_ADD                                    176  ~30     ~30, '%2C+'
        177        ROPE_ADD                                    177  ~30     ~30, !21
        178        ROPE_ADD                                    178  ~30     ~30, '%2C+'
        179        ROPE_ADD                                    179  ~30     ~30, !25
        180        ROPE_ADD                                    180  ~30     ~30, '%2C+'
        181        ROPE_ADD                                    181  ~30     ~30, !5
        182        ROPE_ADD                                    182  ~30     ~30, '%3DNULL%29+%7B%0A%09%09list%28'
   93   183        ROPE_ADD                                    183  ~30     ~30, !26
        184        ROPE_ADD                                    184  ~30     ~30, '%2C+'
        185        ROPE_ADD                                    185  ~30     ~30, !24
        186        ROPE_ADD                                    186  ~30     ~30, '%29+%3D+explode%28%27%3A%27%2C+'
        187        ROPE_ADD                                    187  ~30     ~30, !25
        188        ROPE_ADD                                    188  ~30     ~30, '%29%3B%0A%0A%09%09'
   95   189        ROPE_ADD                                    189  ~30     ~30, !27
        190        ROPE_ADD                                    190  ~30     ~30, '+%3D+self%3A%3Aparse_vals%28'
        191        ROPE_ADD                                    191  ~30     ~30, !20
        192        ROPE_ADD                                    192  ~30     ~30, '%2C+'
        193        ROPE_ADD                                    193  ~30     ~30, !26
        194        ROPE_ADD                                    194  ~30     ~30, '%2C+self%3A%3AAUTH_PREFIX%2C+'
        195        ROPE_ADD                                    195  ~30     ~30, !11
        196        ROPE_ADD                                    196  ~30     ~30, '%2C+'
        197        ROPE_ADD                                    197  ~30     ~30, !5
        198        ROPE_ADD                                    198  ~30     ~30, '%29%3B%0A%09%09'
   96   199        ROPE_ADD                                    199  ~30     ~30, !28
        200        ROPE_ADD                                    200  ~30     ~30, '+%3D+self%3A%3Aparse_vals%28'
        201        ROPE_ADD                                    201  ~30     ~30, !21
        202        ROPE_ADD                                    202  ~30     ~30, '%2C+'
        203        ROPE_ADD                                    203  ~30     ~30, !24
        204        ROPE_ADD                                    204  ~30     ~30, '%2C+self%3A%3AAPP_PREFIX%2C+'
        205        ROPE_ADD                                    205  ~30     ~30, !11
        206        ROPE_ADD                                    206  ~30     ~30, '%2C+'
        207        ROPE_ADD                                    207  ~30     ~30, !5
        208        ROPE_ADD                                    208  ~30     ~30, '%29%3B%0A%0A%09%09if+%28'
   98   209        ROPE_ADD                                    209  ~30     ~30, !27
        210        ROPE_ADD                                    210  ~30     ~30, '+%21%3D%3D+'
        211        ROPE_ADD                                    211  ~30     ~30, !28
        212        ROPE_ADD                                    212  ~30     ~30, '%29+%7B%0A%09%09%09return+null%3B%0A%09%09%7D%0A%0A%09%09return+'
  102   213        ROPE_ADD                                    213  ~30     ~30, !27
        214        ROPE_END                                    214  ~29     ~30, '%3B%0A%09%7D%0A%7D%0A%0A%3F%3E'
    3   215        ASSIGN                                                   !0, ~29
  108   216        INIT_FCALL                                               'md5'
        217        SEND_VAR                                                 !0
        218        DO_ICALL                                         $139    
        219        ECHO                                                     $139
        220      > RETURN                                                   1

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
170.77 ms | 1416 KiB | 15 Q