isomorfeus-ferret 0.12.7 → 0.13.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +101 -19
  3. data/README.md +85 -13
  4. data/ext/isomorfeus_ferret_ext/bm_bitvector.c +22 -30
  5. data/ext/isomorfeus_ferret_ext/bm_hash.c +6 -12
  6. data/ext/isomorfeus_ferret_ext/bm_micro_string.c +3 -6
  7. data/ext/isomorfeus_ferret_ext/bm_store.c +11 -22
  8. data/ext/isomorfeus_ferret_ext/brotli_common_dictionary.c +1 -1
  9. data/ext/isomorfeus_ferret_ext/brotli_dec_decode.c +1 -1
  10. data/ext/isomorfeus_ferret_ext/bzlib.c +1572 -0
  11. data/ext/isomorfeus_ferret_ext/bzlib.h +282 -0
  12. data/ext/isomorfeus_ferret_ext/bzlib_blocksort.c +1094 -0
  13. data/ext/isomorfeus_ferret_ext/bzlib_compress.c +672 -0
  14. data/ext/isomorfeus_ferret_ext/bzlib_crctable.c +104 -0
  15. data/ext/isomorfeus_ferret_ext/bzlib_decompress.c +652 -0
  16. data/ext/isomorfeus_ferret_ext/bzlib_huffman.c +205 -0
  17. data/ext/isomorfeus_ferret_ext/bzlib_private.h +509 -0
  18. data/ext/isomorfeus_ferret_ext/bzlib_randtable.c +84 -0
  19. data/ext/isomorfeus_ferret_ext/fio_tmpfile.h +53 -53
  20. data/ext/isomorfeus_ferret_ext/frb_analysis.c +785 -1192
  21. data/ext/isomorfeus_ferret_ext/frb_index.c +497 -495
  22. data/ext/isomorfeus_ferret_ext/frb_qparser.c +48 -60
  23. data/ext/isomorfeus_ferret_ext/frb_search.c +1520 -1002
  24. data/ext/isomorfeus_ferret_ext/frb_store.c +96 -96
  25. data/ext/isomorfeus_ferret_ext/frb_threading.h +0 -1
  26. data/ext/isomorfeus_ferret_ext/frb_utils.c +147 -196
  27. data/ext/isomorfeus_ferret_ext/frt_analysis.c +695 -1090
  28. data/ext/isomorfeus_ferret_ext/frt_analysis.h +174 -170
  29. data/ext/isomorfeus_ferret_ext/frt_array.c +2 -4
  30. data/ext/isomorfeus_ferret_ext/frt_bitvector.c +9 -16
  31. data/ext/isomorfeus_ferret_ext/frt_bitvector.h +32 -81
  32. data/ext/isomorfeus_ferret_ext/frt_document.c +15 -20
  33. data/ext/isomorfeus_ferret_ext/frt_document.h +10 -10
  34. data/ext/isomorfeus_ferret_ext/frt_except.c +5 -12
  35. data/ext/isomorfeus_ferret_ext/frt_field_index.c +3 -3
  36. data/ext/isomorfeus_ferret_ext/frt_field_index.h +6 -7
  37. data/ext/isomorfeus_ferret_ext/frt_filter.c +35 -46
  38. data/ext/isomorfeus_ferret_ext/frt_fs_store.c +1 -0
  39. data/ext/isomorfeus_ferret_ext/frt_global.c +91 -200
  40. data/ext/isomorfeus_ferret_ext/frt_global.h +7 -18
  41. data/ext/isomorfeus_ferret_ext/frt_hash.c +1 -2
  42. data/ext/isomorfeus_ferret_ext/frt_ind.c +32 -35
  43. data/ext/isomorfeus_ferret_ext/frt_ind.h +9 -9
  44. data/ext/isomorfeus_ferret_ext/frt_index.c +603 -410
  45. data/ext/isomorfeus_ferret_ext/frt_index.h +272 -291
  46. data/ext/isomorfeus_ferret_ext/frt_lang.c +0 -2
  47. data/ext/isomorfeus_ferret_ext/frt_mempool.c +1 -2
  48. data/ext/isomorfeus_ferret_ext/frt_multimapper.c +4 -7
  49. data/ext/isomorfeus_ferret_ext/frt_q_boolean.c +68 -91
  50. data/ext/isomorfeus_ferret_ext/frt_q_const_score.c +35 -38
  51. data/ext/isomorfeus_ferret_ext/frt_q_filtered_query.c +53 -72
  52. data/ext/isomorfeus_ferret_ext/frt_q_fuzzy.c +25 -32
  53. data/ext/isomorfeus_ferret_ext/frt_q_match_all.c +21 -23
  54. data/ext/isomorfeus_ferret_ext/frt_q_multi_term.c +66 -103
  55. data/ext/isomorfeus_ferret_ext/frt_q_parser.c +207 -195
  56. data/ext/isomorfeus_ferret_ext/frt_q_phrase.c +20 -16
  57. data/ext/isomorfeus_ferret_ext/frt_q_prefix.c +17 -14
  58. data/ext/isomorfeus_ferret_ext/frt_q_range.c +102 -131
  59. data/ext/isomorfeus_ferret_ext/frt_q_span.c +179 -178
  60. data/ext/isomorfeus_ferret_ext/frt_q_term.c +47 -60
  61. data/ext/isomorfeus_ferret_ext/frt_q_wildcard.c +18 -16
  62. data/ext/isomorfeus_ferret_ext/frt_ram_store.c +45 -84
  63. data/ext/isomorfeus_ferret_ext/frt_search.c +105 -146
  64. data/ext/isomorfeus_ferret_ext/frt_search.h +331 -320
  65. data/ext/isomorfeus_ferret_ext/frt_similarity.c +5 -13
  66. data/ext/isomorfeus_ferret_ext/frt_similarity.h +7 -12
  67. data/ext/isomorfeus_ferret_ext/frt_sort.c +105 -149
  68. data/ext/isomorfeus_ferret_ext/frt_store.c +13 -7
  69. data/ext/isomorfeus_ferret_ext/frt_store.h +10 -2
  70. data/ext/isomorfeus_ferret_ext/frt_threading.h +0 -1
  71. data/ext/isomorfeus_ferret_ext/isomorfeus_ferret.c +22 -112
  72. data/ext/isomorfeus_ferret_ext/isomorfeus_ferret.h +2 -32
  73. data/ext/isomorfeus_ferret_ext/lz4.c +2495 -0
  74. data/ext/isomorfeus_ferret_ext/lz4.h +774 -0
  75. data/ext/isomorfeus_ferret_ext/lz4frame.c +1899 -0
  76. data/ext/isomorfeus_ferret_ext/lz4frame.h +623 -0
  77. data/ext/isomorfeus_ferret_ext/lz4hc.c +1615 -0
  78. data/ext/isomorfeus_ferret_ext/lz4hc.h +413 -0
  79. data/ext/isomorfeus_ferret_ext/lz4xxhash.c +1030 -0
  80. data/ext/isomorfeus_ferret_ext/lz4xxhash.h +328 -0
  81. data/ext/isomorfeus_ferret_ext/stem_modules.h +0 -86
  82. data/ext/isomorfeus_ferret_ext/test.c +0 -17
  83. data/ext/isomorfeus_ferret_ext/test_1710.c +11 -12
  84. data/ext/isomorfeus_ferret_ext/test_analysis.c +590 -583
  85. data/ext/isomorfeus_ferret_ext/test_compound_io.c +1 -1
  86. data/ext/isomorfeus_ferret_ext/test_document.c +19 -15
  87. data/ext/isomorfeus_ferret_ext/test_except.c +1 -2
  88. data/ext/isomorfeus_ferret_ext/test_fields.c +59 -60
  89. data/ext/isomorfeus_ferret_ext/test_file_deleter.c +10 -27
  90. data/ext/isomorfeus_ferret_ext/test_filter.c +11 -8
  91. data/ext/isomorfeus_ferret_ext/test_global.c +0 -46
  92. data/ext/isomorfeus_ferret_ext/test_hash.c +2 -2
  93. data/ext/isomorfeus_ferret_ext/test_hashset.c +1 -1
  94. data/ext/isomorfeus_ferret_ext/test_highlighter.c +15 -11
  95. data/ext/isomorfeus_ferret_ext/test_index.c +372 -365
  96. data/ext/isomorfeus_ferret_ext/test_q_const_score.c +5 -3
  97. data/ext/isomorfeus_ferret_ext/test_q_filtered.c +5 -3
  98. data/ext/isomorfeus_ferret_ext/test_q_fuzzy.c +13 -10
  99. data/ext/isomorfeus_ferret_ext/test_q_parser.c +45 -7
  100. data/ext/isomorfeus_ferret_ext/test_q_span.c +15 -12
  101. data/ext/isomorfeus_ferret_ext/test_ram_store.c +3 -3
  102. data/ext/isomorfeus_ferret_ext/test_search.c +60 -64
  103. data/ext/isomorfeus_ferret_ext/test_segments.c +5 -4
  104. data/ext/isomorfeus_ferret_ext/test_sort.c +17 -14
  105. data/ext/isomorfeus_ferret_ext/test_store.c +2 -0
  106. data/ext/isomorfeus_ferret_ext/test_term.c +3 -1
  107. data/ext/isomorfeus_ferret_ext/test_term_vectors.c +9 -10
  108. data/ext/isomorfeus_ferret_ext/test_test.c +1 -2
  109. data/ext/isomorfeus_ferret_ext/test_threading.c +9 -10
  110. data/ext/isomorfeus_ferret_ext/testhelper.c +1 -2
  111. data/lib/isomorfeus/ferret/version.rb +1 -1
  112. metadata +27 -57
  113. data/ext/isomorfeus_ferret_ext/email.rl +0 -21
  114. data/ext/isomorfeus_ferret_ext/frt_scanner.c +0 -900
  115. data/ext/isomorfeus_ferret_ext/frt_scanner.h +0 -28
  116. data/ext/isomorfeus_ferret_ext/frt_scanner_mb.c +0 -6706
  117. data/ext/isomorfeus_ferret_ext/frt_scanner_utf8.c +0 -4420
  118. data/ext/isomorfeus_ferret_ext/scanner.h +0 -28
  119. data/ext/isomorfeus_ferret_ext/scanner.in +0 -43
  120. data/ext/isomorfeus_ferret_ext/scanner.rl +0 -84
  121. data/ext/isomorfeus_ferret_ext/scanner_mb.rl +0 -200
  122. data/ext/isomorfeus_ferret_ext/scanner_utf8.rl +0 -85
  123. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_basque.c +0 -1167
  124. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_basque.h +0 -6
  125. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_catalan.c +0 -1433
  126. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_catalan.h +0 -6
  127. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_danish.c +0 -301
  128. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_danish.h +0 -6
  129. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_dutch.c +0 -590
  130. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_dutch.h +0 -6
  131. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_english.c +0 -1049
  132. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_english.h +0 -6
  133. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_finnish.c +0 -705
  134. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_finnish.h +0 -6
  135. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_french.c +0 -1239
  136. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_french.h +0 -6
  137. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_german.c +0 -477
  138. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_german.h +0 -6
  139. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_hungarian.c +0 -1217
  140. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_hungarian.h +0 -7
  141. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_indonesian.c +0 -394
  142. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_indonesian.h +0 -6
  143. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_irish.c +0 -457
  144. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_irish.h +0 -6
  145. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_italian.c +0 -1009
  146. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_italian.h +0 -6
  147. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_norwegian.c +0 -259
  148. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_norwegian.h +0 -6
  149. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_porter.c +0 -704
  150. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_porter.h +0 -6
  151. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_portuguese.c +0 -948
  152. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_portuguese.h +0 -6
  153. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_spanish.c +0 -1028
  154. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_spanish.h +0 -6
  155. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_swedish.c +0 -275
  156. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_swedish.h +0 -6
  157. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_2_hungarian.c +0 -849
  158. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_2_hungarian.h +0 -6
  159. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_2_romanian.c +0 -952
  160. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_2_romanian.h +0 -6
  161. data/ext/isomorfeus_ferret_ext/stem_KOI8_R_russian.c +0 -669
  162. data/ext/isomorfeus_ferret_ext/stem_KOI8_R_russian.h +0 -6
  163. data/ext/isomorfeus_ferret_ext/stem_modules.txt +0 -63
  164. data/ext/isomorfeus_ferret_ext/uchar-ucs4.rl +0 -1854
  165. data/ext/isomorfeus_ferret_ext/uchar-utf8.rl +0 -1999
  166. data/ext/isomorfeus_ferret_ext/url.rl +0 -27
@@ -0,0 +1,84 @@
1
+
2
+ /*-------------------------------------------------------------*/
3
+ /*--- Table for randomising repetitive blocks ---*/
4
+ /*--- randtable.c ---*/
5
+ /*-------------------------------------------------------------*/
6
+
7
+ /* ------------------------------------------------------------------
8
+ This file is part of bzip2/libbzip2, a program and library for
9
+ lossless, block-sorting data compression.
10
+
11
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
12
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
13
+
14
+ Please read the WARNING, DISCLAIMER and PATENTS sections in the
15
+ README file.
16
+
17
+ This program is released under the terms of the license contained
18
+ in the file LICENSE.
19
+ ------------------------------------------------------------------ */
20
+
21
+
22
+ #include "bzlib_private.h"
23
+
24
+
25
+ /*---------------------------------------------*/
26
+ Int32 BZ2_rNums[512] = {
27
+ 619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
28
+ 985, 724, 205, 454, 863, 491, 741, 242, 949, 214,
29
+ 733, 859, 335, 708, 621, 574, 73, 654, 730, 472,
30
+ 419, 436, 278, 496, 867, 210, 399, 680, 480, 51,
31
+ 878, 465, 811, 169, 869, 675, 611, 697, 867, 561,
32
+ 862, 687, 507, 283, 482, 129, 807, 591, 733, 623,
33
+ 150, 238, 59, 379, 684, 877, 625, 169, 643, 105,
34
+ 170, 607, 520, 932, 727, 476, 693, 425, 174, 647,
35
+ 73, 122, 335, 530, 442, 853, 695, 249, 445, 515,
36
+ 909, 545, 703, 919, 874, 474, 882, 500, 594, 612,
37
+ 641, 801, 220, 162, 819, 984, 589, 513, 495, 799,
38
+ 161, 604, 958, 533, 221, 400, 386, 867, 600, 782,
39
+ 382, 596, 414, 171, 516, 375, 682, 485, 911, 276,
40
+ 98, 553, 163, 354, 666, 933, 424, 341, 533, 870,
41
+ 227, 730, 475, 186, 263, 647, 537, 686, 600, 224,
42
+ 469, 68, 770, 919, 190, 373, 294, 822, 808, 206,
43
+ 184, 943, 795, 384, 383, 461, 404, 758, 839, 887,
44
+ 715, 67, 618, 276, 204, 918, 873, 777, 604, 560,
45
+ 951, 160, 578, 722, 79, 804, 96, 409, 713, 940,
46
+ 652, 934, 970, 447, 318, 353, 859, 672, 112, 785,
47
+ 645, 863, 803, 350, 139, 93, 354, 99, 820, 908,
48
+ 609, 772, 154, 274, 580, 184, 79, 626, 630, 742,
49
+ 653, 282, 762, 623, 680, 81, 927, 626, 789, 125,
50
+ 411, 521, 938, 300, 821, 78, 343, 175, 128, 250,
51
+ 170, 774, 972, 275, 999, 639, 495, 78, 352, 126,
52
+ 857, 956, 358, 619, 580, 124, 737, 594, 701, 612,
53
+ 669, 112, 134, 694, 363, 992, 809, 743, 168, 974,
54
+ 944, 375, 748, 52, 600, 747, 642, 182, 862, 81,
55
+ 344, 805, 988, 739, 511, 655, 814, 334, 249, 515,
56
+ 897, 955, 664, 981, 649, 113, 974, 459, 893, 228,
57
+ 433, 837, 553, 268, 926, 240, 102, 654, 459, 51,
58
+ 686, 754, 806, 760, 493, 403, 415, 394, 687, 700,
59
+ 946, 670, 656, 610, 738, 392, 760, 799, 887, 653,
60
+ 978, 321, 576, 617, 626, 502, 894, 679, 243, 440,
61
+ 680, 879, 194, 572, 640, 724, 926, 56, 204, 700,
62
+ 707, 151, 457, 449, 797, 195, 791, 558, 945, 679,
63
+ 297, 59, 87, 824, 713, 663, 412, 693, 342, 606,
64
+ 134, 108, 571, 364, 631, 212, 174, 643, 304, 329,
65
+ 343, 97, 430, 751, 497, 314, 983, 374, 822, 928,
66
+ 140, 206, 73, 263, 980, 736, 876, 478, 430, 305,
67
+ 170, 514, 364, 692, 829, 82, 855, 953, 676, 246,
68
+ 369, 970, 294, 750, 807, 827, 150, 790, 288, 923,
69
+ 804, 378, 215, 828, 592, 281, 565, 555, 710, 82,
70
+ 896, 831, 547, 261, 524, 462, 293, 465, 502, 56,
71
+ 661, 821, 976, 991, 658, 869, 905, 758, 745, 193,
72
+ 768, 550, 608, 933, 378, 286, 215, 979, 792, 961,
73
+ 61, 688, 793, 644, 986, 403, 106, 366, 905, 644,
74
+ 372, 567, 466, 434, 645, 210, 389, 550, 919, 135,
75
+ 780, 773, 635, 389, 707, 100, 626, 958, 165, 504,
76
+ 920, 176, 193, 713, 857, 265, 203, 50, 668, 108,
77
+ 645, 990, 626, 197, 510, 357, 358, 850, 858, 364,
78
+ 936, 638
79
+ };
80
+
81
+
82
+ /*-------------------------------------------------------------*/
83
+ /*--- end randtable.c ---*/
84
+ /*-------------------------------------------------------------*/
@@ -1,53 +1,53 @@
1
- /*
2
- Copyright: Boaz Segev, 2018-2019
3
- License: MIT
4
- */
5
- #ifndef H_FIO_TMPFILE_H
6
- /** a simple helper to create temporary files and file names */
7
- #define H_FIO_TMPFILE_H
8
-
9
- #ifndef _GNU_SOURCE
10
- #define _GNU_SOURCE
11
- #endif
12
-
13
- #include <stdio.h>
14
- #include <stdlib.h>
15
-
16
- #include <fcntl.h>
17
- #include <sys/stat.h>
18
- #include <sys/types.h>
19
- #include <unistd.h>
20
-
21
- #ifdef __MINGW32__
22
- #include <fileapi.h>
23
- #endif
24
-
25
- static inline int fio_tmpfile(void) {
26
- // create a temporary file to contain the data.
27
- int fd = 0;
28
- #ifdef __MINGW32__
29
- char name_template[] = "fio";
30
- TCHAR temp_path[(MAX_PATH-14)];
31
- TCHAR temp_filename[MAX_PATH];
32
- GetTempPath(MAX_PATH - 14, temp_path);
33
- GetTempFileNameA(temp_path, name_template, 0, temp_filename);
34
- fd = _open(temp_filename, _O_CREAT | _O_RDWR);
35
- _chmod(temp_filename, _S_IREAD | _S_IWRITE);
36
- #elif defined(P_tmpdir)
37
- if (P_tmpdir[sizeof(P_tmpdir) - 1] == '/') {
38
- char name_template[] = P_tmpdir "facil_io_tmpfile_XXXXXXXX";
39
- fd = mkstemp(name_template);
40
- } else {
41
- char name_template[] = P_tmpdir "/facil_io_tmpfile_XXXXXXXX";
42
- fd = mkstemp(name_template);
43
- }
44
- #else
45
- char name_template[] = "/tmp/facil_io_tmpfile_XXXXXXXX";
46
- fd = mkstemp(name_template);
47
- #endif
48
- return fd;
49
- }
50
-
51
- #endif
52
-
53
-
1
+ /*
2
+ Copyright: Boaz Segev, 2018-2019
3
+ License: MIT
4
+ */
5
+ #ifndef H_FIO_TMPFILE_H
6
+ /** a simple helper to create temporary files and file names */
7
+ #define H_FIO_TMPFILE_H
8
+
9
+ #ifndef _GNU_SOURCE
10
+ #define _GNU_SOURCE
11
+ #endif
12
+
13
+ #include <stdio.h>
14
+ #include <stdlib.h>
15
+
16
+ #include <fcntl.h>
17
+ #include <sys/stat.h>
18
+ #include <sys/types.h>
19
+ #include <unistd.h>
20
+
21
+ #ifdef __MINGW32__
22
+ #include <fileapi.h>
23
+ #endif
24
+
25
+ static inline int fio_tmpfile(void) {
26
+ // create a temporary file to contain the data.
27
+ int fd = 0;
28
+ #ifdef __MINGW32__
29
+ char name_template[] = "fio";
30
+ TCHAR temp_path[(MAX_PATH-14)];
31
+ TCHAR temp_filename[MAX_PATH];
32
+ GetTempPath(MAX_PATH - 14, temp_path);
33
+ GetTempFileNameA(temp_path, name_template, 0, temp_filename);
34
+ fd = _open(temp_filename, _O_CREAT | _O_RDWR);
35
+ _chmod(temp_filename, _S_IREAD | _S_IWRITE);
36
+ #elif defined(P_tmpdir)
37
+ if (P_tmpdir[sizeof(P_tmpdir) - 1] == '/') {
38
+ char name_template[] = P_tmpdir "facil_io_tmpfile_XXXXXXXX";
39
+ fd = mkstemp(name_template);
40
+ } else {
41
+ char name_template[] = P_tmpdir "/facil_io_tmpfile_XXXXXXXX";
42
+ fd = mkstemp(name_template);
43
+ }
44
+ #else
45
+ char name_template[] = "/tmp/facil_io_tmpfile_XXXXXXXX";
46
+ fd = mkstemp(name_template);
47
+ #endif
48
+ return fd;
49
+ }
50
+
51
+ #endif
52
+
53
+