3v4l.org

run code in 300+ PHP versions simultaneously
<?php function to_ascii($text,$encoding="UTF-8") { if (is_string($text)) { // Includes combinations of characters that present as a single glyph $text = preg_replace_callback('/\X/u', __FUNCTION__, $text); } elseif (is_array($text) && count($text) == 1 && is_string($text[0])) { // IGNORE characters that can't be TRANSLITerated to ASCII $text = @iconv($encoding, "ASCII//IGNORE//TRANSLIT", $text[0]); // The documentation says that iconv() returns false on failure but it returns '' if ($text === '' || !is_string($text)) { $text = '?'; } elseif (preg_match('/\w/', $text)) { // If the text contains any letters... $text = preg_replace('/\W+/', '', $text); // ...then remove all non-letters } } else { // $text was not a string $text = ''; } return $text; } function find_similar3($needle,$str,$keep_needle_order=false){ if(!is_string($needle)||!is_string($str)) { return false; } $valid=array(); //get encodings and words from haystack and needle setlocale(LC_CTYPE, 'en_GB.UTF8'); $encoding_s=mb_detect_encoding($str); $encoding_n=mb_detect_encoding($needle); mb_regex_encoding ($encoding_n); $pneed=array_filter(mb_split('\W',$needle)); mb_regex_encoding ($encoding_s); $pstr=array_filter(mb_split('\W',$str)); foreach($pneed as $k=>$word)//loop trough needle's words { foreach($pstr as $key=>$w) { if($encoding_n!==$encoding_s) {//if $encodings are not the same make some transliteration $tmp_word=($encoding_n!=='ASCII')?to_ascii($word,$encoding_n):$word; $tmp_w=($encoding_s!=='ASCII')?to_ascii($w,$encoding_s):$w; }else { $tmp_word=$word; $tmp_w=$w; } $tmp[$tmp_w]=levenshtein($tmp_w,$tmp_word);//collect levenshtein distances $keys[$tmp_w]=array($key,$w); } $nominees=array_flip(array_keys($tmp,min($tmp)));//get the nominees $tmp=10000; foreach($nominees as $nominee=>$idx) {//test sound like to get more precision $idx=levenshtein(metaphone($nominee),metaphone($tmp_word)); if($idx<$tmp){ $answer=$nominee;//get the winner } unset($nominees[$nominee]); } if(!$keep_needle_order){ $valid[$keys[$answer][0]]=$keys[$answer][1];//get the right form of the winner } else{ $valid[$k]=$keys[$answer][1]; } $tmp=$nominees=array();//clean a little for the next iteration } if(!$keep_needle_order) { ksort($valid); } $valid=array_values($valid);//get only the values /*return the array of the closest value to the needle according to this algorithm of course*/ return $valid; } var_dump(find_similar3('i knew you love me','finally i know you loved me and all my pets')); var_dump(find_similar3('I you love','This is a demo text and I love you about this')); var_dump(find_similar3('a unik idia','I have a unique idea. Do you need?')); var_dump(find_similar3("Goebel, Weiss, Goethe, Goethe und Goetz",'Weiß, Goldmann, Göbel, Weiss, Göthe, Goethe und Götz')); var_dump(find_similar3('Ḽơᶉëᶆ ȋṕšᶙṁ ḍỡḽǭᵳ ʂǐť ӓṁệẗ, ĉṓɲṩḙċťᶒțûɾ ấɖḯƥĭṩčįɳġ ḝłįʈ', 'Ḽơᶉëᶆ ȋṕšᶙṁ ḍỡḽǭᵳ ʂǐť ӓṁệẗ, ĉṓɲṩḙċťᶒțûɾ ấɖḯƥĭṩčįɳġ ḝłįʈ, șếᶑ ᶁⱺ ẽḭŭŝḿꝋď ṫĕᶆᶈṓɍ ỉñḉīḑȋᵭṵńť ṷŧ ḹẩḇőꝛế éȶ đꝍꞎôꝛȇ ᵯáꞡᶇā ąⱡîɋṹẵ.'));
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/Mpbcg
function name:  (null)
number of ops:  36
compiled vars:  none
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
  101     0  E >   INIT_FCALL                                               'var_dump'
          1        INIT_FCALL                                               'find_similar3'
          2        SEND_VAL                                                 'i+knew+you+love+me'
          3        SEND_VAL                                                 'finally++i+know+you+loved+me+and+all+my+pets'
          4        DO_FCALL                                      0  $0      
          5        SEND_VAR                                                 $0
          6        DO_ICALL                                                 
  102     7        INIT_FCALL                                               'var_dump'
          8        INIT_FCALL                                               'find_similar3'
          9        SEND_VAL                                                 'I+you+love'
         10        SEND_VAL                                                 'This+is+a+demo+text+and+I+love+you+about+this'
         11        DO_FCALL                                      0  $2      
         12        SEND_VAR                                                 $2
         13        DO_ICALL                                                 
  103    14        INIT_FCALL                                               'var_dump'
         15        INIT_FCALL                                               'find_similar3'
         16        SEND_VAL                                                 'a+unik+idia'
         17        SEND_VAL                                                 'I+have+a+unique+idea.+Do+you+need%3F'
         18        DO_FCALL                                      0  $4      
         19        SEND_VAR                                                 $4
         20        DO_ICALL                                                 
  104    21        INIT_FCALL                                               'var_dump'
         22        INIT_FCALL                                               'find_similar3'
         23        SEND_VAL                                                 'Goebel%2C+Weiss%2C+Goethe%2C+Goethe+und+Goetz'
         24        SEND_VAL                                                 'Wei%C3%9F%2C+Goldmann%2C+G%C3%B6bel%2C+Weiss%2C+G%C3%B6the%2C+Goethe+und+G%C3%B6tz'
         25        DO_FCALL                                      0  $6      
         26        SEND_VAR                                                 $6
         27        DO_ICALL                                                 
  105    28        INIT_FCALL                                               'var_dump'
         29        INIT_FCALL                                               'find_similar3'
         30        SEND_VAL                                                 '%E1%B8%BC%C6%A1%E1%B6%89%C3%AB%E1%B6%86+%C8%8B%E1%B9%95%C5%A1%E1%B6%99%E1%B9%81+%E1%B8%8D%E1%BB%A1%E1%B8%BD%C7%AD%E1%B5%B3+%CA%82%C7%90%C5%A5+%D3%93%E1%B9%81%E1%BB%87%E1%BA%97%2C+%C4%89%E1%B9%93%C9%B2%E1%B9%A9%E1%B8%99%C4%8B%C5%A5%E1%B6%92%C8%9B%C3%BB%C9%BE+%E1%BA%A5%C9%96%E1%B8%AF%C6%A5%C4%AD%E1%B9%A9%C4%8D%C4%AF%C9%B3%C4%A1+%E1%B8%9D%C5%82%C4%AF%CA%88'
  106    31        SEND_VAL                                                 '%E1%B8%BC%C6%A1%E1%B6%89%C3%AB%E1%B6%86+%C8%8B%E1%B9%95%C5%A1%E1%B6%99%E1%B9%81+%E1%B8%8D%E1%BB%A1%E1%B8%BD%C7%AD%E1%B5%B3+%CA%82%C7%90%C5%A5+%D3%93%E1%B9%81%E1%BB%87%E1%BA%97%2C+%C4%89%E1%B9%93%C9%B2%E1%B9%A9%E1%B8%99%C4%8B%C5%A5%E1%B6%92%C8%9B%C3%BB%C9%BE+%E1%BA%A5%C9%96%E1%B8%AF%C6%A5%C4%AD%E1%B9%A9%C4%8D%C4%AF%C9%B3%C4%A1+%E1%B8%9D%C5%82%C4%AF%CA%88%2C+%C8%99%E1%BA%BF%E1%B6%91+%E1%B6%81%E2%B1%BA+%E1%BA%BD%E1%B8%AD%C5%AD%C5%9D%E1%B8%BF%EA%9D%8B%C4%8F+%E1%B9%AB%C4%95%E1%B6%86%E1%B6%88%E1%B9%93%C9%8D+%E1%BB%89%C3%B1%E1%B8%89%C4%AB%E1%B8%91%C8%8B%E1%B5%AD%E1%B9%B5%C5%84%C5%A5+%E1%B9%B7%C5%A7+%E1%B8%B9%E1%BA%A9%E1%B8%87%C5%91%EA%9D%9B%E1%BA%BF+%C3%A9%C8%B6+%C4%91%EA%9D%8D%EA%9E%8E%C3%B4%EA%9D%9B%C8%87+%E1%B5%AF%C3%A1%EA%9E%A1%E1%B6%87%C4%81+%C4%85%E2%B1%A1%C3%AE%C9%8B%E1%B9%B9%E1%BA%B5.'
  105    32        DO_FCALL                                      0  $8      
  106    33        SEND_VAR                                                 $8
  105    34        DO_ICALL                                                 
  106    35      > RETURN                                                   1

Function to_ascii:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 4, Position 2 = 11
Branch analysis from position: 4
1 jumps found. (Code = 42) Position 1 = 52
Branch analysis from position: 52
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 11
2 jumps found. (Code = 46) Position 1 = 13, Position 2 = 16
Branch analysis from position: 13
2 jumps found. (Code = 46) Position 1 = 17, Position 2 = 20
Branch analysis from position: 17
2 jumps found. (Code = 43) Position 1 = 21, Position 2 = 51
Branch analysis from position: 21
2 jumps found. (Code = 47) Position 1 = 33, Position 2 = 36
Branch analysis from position: 33
2 jumps found. (Code = 43) Position 1 = 37, Position 2 = 39
Branch analysis from position: 37
1 jumps found. (Code = 42) Position 1 = 50
Branch analysis from position: 50
1 jumps found. (Code = 42) Position 1 = 52
Branch analysis from position: 52
Branch analysis from position: 39
2 jumps found. (Code = 43) Position 1 = 44, Position 2 = 50
Branch analysis from position: 44
1 jumps found. (Code = 42) Position 1 = 52
Branch analysis from position: 52
Branch analysis from position: 50
Branch analysis from position: 36
Branch analysis from position: 51
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 20
Branch analysis from position: 16
filename:       /in/Mpbcg
function name:  to_ascii
number of ops:  54
compiled vars:  !0 = $text, !1 = $encoding
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
    5     0  E >   RECV                                             !0      
          1        RECV_INIT                                        !1      'UTF-8'
    6     2        TYPE_CHECK                                   64          !0
          3      > JMPZ                                                     ~2, ->11
    8     4    >   INIT_FCALL                                               'preg_replace_callback'
          5        SEND_VAL                                                 '%2F%5CX%2Fu'
          6        SEND_VAL                                                 'to_ascii'
          7        SEND_VAR                                                 !0
          8        DO_ICALL                                         $3      
          9        ASSIGN                                                   !0, $3
    6    10      > JMP                                                      ->52
   10    11    >   TYPE_CHECK                                  128  ~5      !0
         12      > JMPZ_EX                                          ~5      ~5, ->16
         13    >   COUNT                                            ~6      !0
         14        IS_EQUAL                                         ~7      ~6, 1
         15        BOOL                                             ~5      ~7
         16    > > JMPZ_EX                                          ~5      ~5, ->20
         17    >   FETCH_DIM_R                                      ~8      !0, 0
         18        TYPE_CHECK                                   64  ~9      ~8
         19        BOOL                                             ~5      ~9
         20    > > JMPZ                                                     ~5, ->51
   12    21    >   BEGIN_SILENCE                                    ~10     
         22        INIT_FCALL_BY_NAME                                       'iconv'
         23        SEND_VAR_EX                                              !1
         24        SEND_VAL_EX                                              'ASCII%2F%2FIGNORE%2F%2FTRANSLIT'
         25        CHECK_FUNC_ARG                                           
         26        FETCH_DIM_FUNC_ARG                               $11     !0, 0
         27        SEND_FUNC_ARG                                            $11
         28        DO_FCALL                                      0  $12     
         29        END_SILENCE                                              ~10
         30        ASSIGN                                                   !0, $12
   14    31        IS_IDENTICAL                                     ~14     !0, ''
         32      > JMPNZ_EX                                         ~14     ~14, ->36
         33    >   TYPE_CHECK                                   64  ~15     !0
         34        BOOL_NOT                                         ~16     ~15
         35        BOOL                                             ~14     ~16
         36    > > JMPZ                                                     ~14, ->39
   15    37    >   ASSIGN                                                   !0, '%3F'
   14    38      > JMP                                                      ->50
   17    39    >   INIT_FCALL                                               'preg_match'
         40        SEND_VAL                                                 '%2F%5Cw%2F'
         41        SEND_VAR                                                 !0
         42        DO_ICALL                                         $18     
         43      > JMPZ                                                     $18, ->50
   18    44    >   INIT_FCALL                                               'preg_replace'
         45        SEND_VAL                                                 '%2F%5CW%2B%2F'
         46        SEND_VAL                                                 ''
         47        SEND_VAR                                                 !0
         48        DO_ICALL                                         $19     
         49        ASSIGN                                                   !0, $19
   10    50    > > JMP                                                      ->52
   22    51    >   ASSIGN                                                   !0, ''
   24    52    > > RETURN                                                   !0
   25    53*     > RETURN                                                   null

End of function to_ascii

Function find_similar3:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 47) Position 1 = 6, Position 2 = 9
Branch analysis from position: 6
2 jumps found. (Code = 43) Position 1 = 10, Position 2 = 11
Branch analysis from position: 10
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 11
2 jumps found. (Code = 77) Position 1 = 47, Position 2 = 137
Branch analysis from position: 47
2 jumps found. (Code = 78) Position 1 = 48, Position 2 = 137
Branch analysis from position: 48
2 jumps found. (Code = 77) Position 1 = 50, Position 2 = 88
Branch analysis from position: 50
2 jumps found. (Code = 78) Position 1 = 51, Position 2 = 88
Branch analysis from position: 51
2 jumps found. (Code = 43) Position 1 = 54, Position 2 = 75
Branch analysis from position: 54
2 jumps found. (Code = 43) Position 1 = 56, Position 2 = 62
Branch analysis from position: 56
1 jumps found. (Code = 42) Position 1 = 63
Branch analysis from position: 63
2 jumps found. (Code = 43) Position 1 = 66, Position 2 = 72
Branch analysis from position: 66
1 jumps found. (Code = 42) Position 1 = 73
Branch analysis from position: 73
1 jumps found. (Code = 42) Position 1 = 77
Branch analysis from position: 77
1 jumps found. (Code = 42) Position 1 = 50
Branch analysis from position: 50
Branch analysis from position: 72
1 jumps found. (Code = 42) Position 1 = 77
Branch analysis from position: 77
Branch analysis from position: 62
2 jumps found. (Code = 43) Position 1 = 66, Position 2 = 72
Branch analysis from position: 66
Branch analysis from position: 72
Branch analysis from position: 75
1 jumps found. (Code = 42) Position 1 = 50
Branch analysis from position: 50
Branch analysis from position: 88
2 jumps found. (Code = 77) Position 1 = 102, Position 2 = 120
Branch analysis from position: 102
2 jumps found. (Code = 78) Position 1 = 103, Position 2 = 120
Branch analysis from position: 103
2 jumps found. (Code = 43) Position 1 = 117, Position 2 = 118
Branch analysis from position: 117
1 jumps found. (Code = 42) Position 1 = 102
Branch analysis from position: 102
Branch analysis from position: 118
Branch analysis from position: 120
2 jumps found. (Code = 43) Position 1 = 123, Position 2 = 130
Branch analysis from position: 123
1 jumps found. (Code = 42) Position 1 = 134
Branch analysis from position: 134
1 jumps found. (Code = 42) Position 1 = 47
Branch analysis from position: 47
Branch analysis from position: 130
1 jumps found. (Code = 42) Position 1 = 47
Branch analysis from position: 47
Branch analysis from position: 120
Branch analysis from position: 88
Branch analysis from position: 137
2 jumps found. (Code = 43) Position 1 = 140, Position 2 = 143
Branch analysis from position: 140
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 143
Branch analysis from position: 137
Branch analysis from position: 9
filename:       /in/Mpbcg
function name:  find_similar3
number of ops:  149
compiled vars:  !0 = $needle, !1 = $str, !2 = $keep_needle_order, !3 = $valid, !4 = $encoding_s, !5 = $encoding_n, !6 = $pneed, !7 = $pstr, !8 = $word, !9 = $k, !10 = $w, !11 = $key, !12 = $tmp_word, !13 = $tmp_w, !14 = $tmp, !15 = $keys, !16 = $nominees, !17 = $idx, !18 = $nominee, !19 = $answer
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   31     0  E >   RECV                                             !0      
          1        RECV                                             !1      
          2        RECV_INIT                                        !2      <false>
   32     3        TYPE_CHECK                                   64  ~20     !0
          4        BOOL_NOT                                         ~21     ~20
          5      > JMPNZ_EX                                         ~21     ~21, ->9
          6    >   TYPE_CHECK                                   64  ~22     !1
          7        BOOL_NOT                                         ~23     ~22
          8        BOOL                                             ~21     ~23
          9    > > JMPZ                                                     ~21, ->11
   34    10    > > RETURN                                                   <false>
   36    11    >   ASSIGN                                                   !3, <array>
   38    12        INIT_FCALL                                               'setlocale'
         13        SEND_VAL                                                 0
         14        SEND_VAL                                                 'en_GB.UTF8'
         15        DO_ICALL                                                 
   39    16        INIT_FCALL                                               'mb_detect_encoding'
         17        SEND_VAR                                                 !1
         18        DO_ICALL                                         $26     
         19        ASSIGN                                                   !4, $26
   40    20        INIT_FCALL                                               'mb_detect_encoding'
         21        SEND_VAR                                                 !0
         22        DO_ICALL                                         $28     
         23        ASSIGN                                                   !5, $28
   42    24        INIT_FCALL                                               'mb_regex_encoding'
         25        SEND_VAR                                                 !5
         26        DO_ICALL                                                 
   43    27        INIT_FCALL                                               'array_filter'
         28        INIT_FCALL                                               'mb_split'
         29        SEND_VAL                                                 '%5CW'
         30        SEND_VAR                                                 !0
         31        DO_ICALL                                         $31     
         32        SEND_VAR                                                 $31
         33        DO_ICALL                                         $32     
         34        ASSIGN                                                   !6, $32
   45    35        INIT_FCALL                                               'mb_regex_encoding'
         36        SEND_VAR                                                 !4
         37        DO_ICALL                                                 
   46    38        INIT_FCALL                                               'array_filter'
         39        INIT_FCALL                                               'mb_split'
         40        SEND_VAL                                                 '%5CW'
         41        SEND_VAR                                                 !1
         42        DO_ICALL                                         $35     
         43        SEND_VAR                                                 $35
         44        DO_ICALL                                         $36     
         45        ASSIGN                                                   !7, $36
   50    46      > FE_RESET_R                                       $38     !6, ->137
         47    > > FE_FETCH_R                                       ~39     $38, !8, ->137
         48    >   ASSIGN                                                   !9, ~39
   52    49      > FE_RESET_R                                       $41     !7, ->88
         50    > > FE_FETCH_R                                       ~42     $41, !10, ->88
         51    >   ASSIGN                                                   !11, ~42
   54    52        IS_NOT_IDENTICAL                                         !5, !4
         53      > JMPZ                                                     ~44, ->75
   56    54    >   IS_NOT_IDENTICAL                                         !5, 'ASCII'
         55      > JMPZ                                                     ~45, ->62
         56    >   INIT_FCALL                                               'to_ascii'
         57        SEND_VAR                                                 !8
         58        SEND_VAR                                                 !5
         59        DO_FCALL                                      0  $46     
         60        QM_ASSIGN                                        ~47     $46
         61      > JMP                                                      ->63
         62    >   QM_ASSIGN                                        ~47     !8
         63    >   ASSIGN                                                   !12, ~47
   57    64        IS_NOT_IDENTICAL                                         !4, 'ASCII'
         65      > JMPZ                                                     ~49, ->72
         66    >   INIT_FCALL                                               'to_ascii'
         67        SEND_VAR                                                 !10
         68        SEND_VAR                                                 !4
         69        DO_FCALL                                      0  $50     
         70        QM_ASSIGN                                        ~51     $50
         71      > JMP                                                      ->73
         72    >   QM_ASSIGN                                        ~51     !10
         73    >   ASSIGN                                                   !13, ~51
   54    74      > JMP                                                      ->77
   60    75    >   ASSIGN                                                   !12, !8
   61    76        ASSIGN                                                   !13, !10
   64    77    >   INIT_FCALL                                               'levenshtein'
         78        SEND_VAR                                                 !13
         79        SEND_VAR                                                 !12
         80        DO_ICALL                                         $56     
         81        ASSIGN_DIM                                               !14, !13
         82        OP_DATA                                                  $56
   65    83        INIT_ARRAY                                       ~58     !11
         84        ADD_ARRAY_ELEMENT                                ~58     !10
         85        ASSIGN_DIM                                               !15, !13
         86        OP_DATA                                                  ~58
   52    87      > JMP                                                      ->50
         88    >   FE_FREE                                                  $41
   69    89        INIT_FCALL                                               'array_flip'
         90        INIT_FCALL                                               'array_keys'
         91        SEND_VAR                                                 !14
         92        INIT_FCALL                                               'min'
         93        SEND_VAR                                                 !14
         94        DO_ICALL                                         $59     
         95        SEND_VAR                                                 $59
         96        DO_ICALL                                         $60     
         97        SEND_VAR                                                 $60
         98        DO_ICALL                                         $61     
         99        ASSIGN                                                   !16, $61
   70   100        ASSIGN                                                   !14, 10000
   71   101      > FE_RESET_R                                       $64     !16, ->120
        102    > > FE_FETCH_R                                       ~65     $64, !17, ->120
        103    >   ASSIGN                                                   !18, ~65
   73   104        INIT_FCALL                                               'levenshtein'
        105        INIT_FCALL                                               'metaphone'
        106        SEND_VAR                                                 !18
        107        DO_ICALL                                         $67     
        108        SEND_VAR                                                 $67
        109        INIT_FCALL                                               'metaphone'
        110        SEND_VAR                                                 !12
        111        DO_ICALL                                         $68     
        112        SEND_VAR                                                 $68
        113        DO_ICALL                                         $69     
        114        ASSIGN                                                   !17, $69
   74   115        IS_SMALLER                                               !17, !14
        116      > JMPZ                                                     ~71, ->118
   75   117    >   ASSIGN                                                   !19, !18
   78   118    >   UNSET_DIM                                                !16, !18
   71   119      > JMP                                                      ->102
        120    >   FE_FREE                                                  $64
   80   121        BOOL_NOT                                         ~73     !2
        122      > JMPZ                                                     ~73, ->130
   81   123    >   FETCH_DIM_R                                      ~74     !15, !19
        124        FETCH_DIM_R                                      ~75     ~74, 0
        125        FETCH_DIM_R                                      ~77     !15, !19
        126        FETCH_DIM_R                                      ~78     ~77, 1
        127        ASSIGN_DIM                                               !3, ~75
        128        OP_DATA                                                  ~78
   80   129      > JMP                                                      ->134
   84   130    >   FETCH_DIM_R                                      ~80     !15, !19
        131        FETCH_DIM_R                                      ~81     ~80, 1
        132        ASSIGN_DIM                                               !3, !9
        133        OP_DATA                                                  ~81
   86   134    >   ASSIGN                                           ~82     !16, <array>
        135        ASSIGN                                                   !14, ~82
   50   136      > JMP                                                      ->47
        137    >   FE_FREE                                                  $38
   88   138        BOOL_NOT                                         ~84     !2
        139      > JMPZ                                                     ~84, ->143
   90   140    >   INIT_FCALL                                               'ksort'
        141        SEND_REF                                                 !3
        142        DO_ICALL                                                 
   93   143    >   INIT_FCALL                                               'array_values'
        144        SEND_VAR                                                 !3
        145        DO_ICALL                                         $86     
        146        ASSIGN                                                   !3, $86
   96   147      > RETURN                                                   !3
   98   148*     > RETURN                                                   null

End of function find_similar3

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
141.5 ms | 1478 KiB | 36 Q