soutrik commited on
Commit
254cbbb
1 Parent(s): 94f2f19

added: trained tokenizer plus gradio app

Browse files
.gitignore ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python
2
+ *.pyc
3
+ __pycache__/
4
+ *.pyo
5
+ *.pyd
6
+
7
+ # Virtual Environment
8
+ venv/
9
+ env/
10
+ env.bak/
11
+ env1/
12
+ venv1/
13
+ .venv/
14
+ .venv1/
15
+ env/
16
+ ENV/
17
+ env.bak/
18
+ ENV.bak/
19
+ env1/
20
+ ENV1/
21
+ .venv/
22
+ .venv1/
23
+ env/
24
+ ENV/
25
+ env.bak/
26
+ ENV.bak/
27
+ env1/
28
+ ENV1/
29
+ .venv/
30
+ .venv1/
31
+
32
+ # IDE
33
+ .idea/
34
+ .vscode/
35
+
36
+ # Logs
37
+ *.log
38
+
39
+ # Data
40
+ data/
41
+
42
+ # Compiled files
43
+ *.exe
44
+ *.dll
45
+ *.so
46
+ *.dylib
47
+
48
+ # Miscellaneous
49
+ *.swp
50
+ .DS_Store
51
+ data/
app.py CHANGED
@@ -1,7 +1,42 @@
1
  import gradio as gr
 
 
2
 
3
- def greet(name):
4
- return "Hello " + name + "!!"
 
5
 
6
- demo = gr.Interface(fn=greet, inputs="text", outputs="text")
7
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
+ import os
3
+ from tokenizer.basic_bpe import BasicTokenizer
4
 
5
+ print("Loading the model...")
6
+ model_path = os.path.join(os.getcwd(), "tokenizer_model")
7
+ model_path = os.path.join(model_path, "hindi_sentiments_basic.model")
8
 
9
+ basic_tokenizer = BasicTokenizer()
10
+ basic_tokenizer.load(model_path)
11
+
12
+
13
+ def test_tokenizer(text):
14
+ ids = basic_tokenizer.encode(text)
15
+ decoded = basic_tokenizer.decode(ids)
16
+ mapping = [(str(i), basic_tokenizer.decode([i])) for i in ids]
17
+
18
+ return ids, decoded, mapping
19
+
20
+
21
+ with gr.Blocks() as demo:
22
+ gr.HTML("<h1 align = 'center'> Token Generation for Hindi Dataset </h1>")
23
+
24
+ with gr.Row():
25
+ with gr.Column():
26
+ inputs = [
27
+ gr.TextArea(
28
+ label="Enter initial text to generate tokens in Hindi", lines=10
29
+ )
30
+ ]
31
+ generate_btn = gr.Button(value="Generate Text")
32
+ with gr.Column():
33
+ enc = gr.Textbox(label="Encoded Tokens")
34
+ txt = gr.Textbox(label="Decoded Text from tokens")
35
+ map = gr.Textbox(label="Mapping of the tokens and respective texts")
36
+ outputs = [enc, txt, map]
37
+
38
+ generate_btn.click(fn=test_tokenizer, inputs=inputs, outputs=outputs)
39
+
40
+
41
+ if __name__ == "__main__":
42
+ demo.launch(share=True)
notebooks/train_eng.ipynb ADDED
@@ -0,0 +1,885 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [
8
+ {
9
+ "data": {
10
+ "application/javascript": "IPython.notebook.set_autosave_interval(300000)"
11
+ },
12
+ "metadata": {},
13
+ "output_type": "display_data"
14
+ },
15
+ {
16
+ "name": "stdout",
17
+ "output_type": "stream",
18
+ "text": [
19
+ "Autosaving every 300 seconds\n"
20
+ ]
21
+ }
22
+ ],
23
+ "source": [
24
+ "%autosave 300\n",
25
+ "%reload_ext autoreload\n",
26
+ "%autoreload 2\n",
27
+ "%config Completer.use_jedi = False"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "code",
32
+ "execution_count": 2,
33
+ "metadata": {},
34
+ "outputs": [
35
+ {
36
+ "name": "stdout",
37
+ "output_type": "stream",
38
+ "text": [
39
+ "/mnt/batch/tasks/shared/LS_root/mounts/clusters/insights-model-run2/code/Users/soutrik.chowdhury/EraV2_Transformers/S20_tokenizer\n"
40
+ ]
41
+ }
42
+ ],
43
+ "source": [
44
+ "import os\n",
45
+ "\n",
46
+ "os.chdir(\n",
47
+ " \"/mnt/batch/tasks/shared/LS_root/mounts/clusters/insights-model-run2/code/Users/soutrik.chowdhury/EraV2_S20_tokenization\"\n",
48
+ ")\n",
49
+ "print(os.getcwd())"
50
+ ]
51
+ },
52
+ {
53
+ "cell_type": "code",
54
+ "execution_count": 3,
55
+ "metadata": {},
56
+ "outputs": [],
57
+ "source": [
58
+ "from tokenizer.basic_bpe import BasicTokenizer\n",
59
+ "from tokenizer.regex_bpe import RegexTokenizer"
60
+ ]
61
+ },
62
+ {
63
+ "cell_type": "code",
64
+ "execution_count": 5,
65
+ "metadata": {},
66
+ "outputs": [],
67
+ "source": [
68
+ "file_name = \"tiny_shakespeare.txt\"\n",
69
+ "file_path = os.path.join(os.getcwd(), \"data\", file_name)\n",
70
+ "\n",
71
+ "with open(file_path, \"r\") as f:\n",
72
+ " text = f.read()"
73
+ ]
74
+ },
75
+ {
76
+ "cell_type": "code",
77
+ "execution_count": 6,
78
+ "metadata": {},
79
+ "outputs": [
80
+ {
81
+ "name": "stdout",
82
+ "output_type": "stream",
83
+ "text": [
84
+ "The length of the text is 1115394\n"
85
+ ]
86
+ }
87
+ ],
88
+ "source": [
89
+ "print(f\"The length of the text is {len(text)}\")"
90
+ ]
91
+ },
92
+ {
93
+ "cell_type": "markdown",
94
+ "metadata": {},
95
+ "source": [
96
+ "creating the model file for basic tokenizer"
97
+ ]
98
+ },
99
+ {
100
+ "cell_type": "code",
101
+ "execution_count": 10,
102
+ "metadata": {},
103
+ "outputs": [],
104
+ "source": [
105
+ "model_path = os.path.join(os.getcwd(), \"tokenizer_model\")\n",
106
+ "os.makedirs(model_path, exist_ok=True)"
107
+ ]
108
+ },
109
+ {
110
+ "cell_type": "code",
111
+ "execution_count": 9,
112
+ "metadata": {},
113
+ "outputs": [
114
+ {
115
+ "name": "stdout",
116
+ "output_type": "stream",
117
+ "text": [
118
+ "merge 1/256: (101, 32) -> 256 (b'e ') had 27643 occurrences\n",
119
+ "merge 2/256: (116, 104) -> 257 (b'th') had 22739 occurrences\n",
120
+ "merge 3/256: (116, 32) -> 258 (b't ') had 16508 occurrences\n",
121
+ "merge 4/256: (115, 32) -> 259 (b's ') had 15364 occurrences\n",
122
+ "merge 5/256: (100, 32) -> 260 (b'd ') had 14165 occurrences\n",
123
+ "merge 6/256: (44, 32) -> 261 (b', ') had 14098 occurrences\n",
124
+ "merge 7/256: (111, 117) -> 262 (b'ou') had 12730 occurrences\n",
125
+ "merge 8/256: (101, 114) -> 263 (b'er') had 11771 occurrences\n",
126
+ "merge 9/256: (105, 110) -> 264 (b'in') had 10606 occurrences\n",
127
+ "merge 10/256: (121, 32) -> 265 (b'y ') had 10283 occurrences\n",
128
+ "merge 11/256: (97, 110) -> 266 (b'an') had 10197 occurrences\n",
129
+ "merge 12/256: (58, 10) -> 267 (b':\\n') had 8762 occurrences\n",
130
+ "merge 13/256: (111, 114) -> 268 (b'or') had 8458 occurrences\n",
131
+ "merge 14/256: (111, 32) -> 269 (b'o ') had 8134 occurrences\n",
132
+ "merge 15/256: (101, 110) -> 270 (b'en') had 7568 occurrences\n",
133
+ "merge 16/256: (10, 10) -> 271 (b'\\n\\n') had 7098 occurrences\n",
134
+ "merge 17/256: (97, 114) -> 272 (b'ar') had 7081 occurrences\n",
135
+ "merge 18/256: (32, 257) -> 273 (b' th') had 6662 occurrences\n",
136
+ "merge 19/256: (111, 110) -> 274 (b'on') had 6435 occurrences\n",
137
+ "merge 20/256: (108, 108) -> 275 (b'll') had 6357 occurrences\n",
138
+ "merge 21/256: (104, 97) -> 276 (b'ha') had 6055 occurrences\n",
139
+ "merge 22/256: (44, 10) -> 277 (b',\\n') had 5501 occurrences\n",
140
+ "merge 23/256: (46, 271) -> 278 (b'.\\n\\n') had 5018 occurrences\n",
141
+ "merge 24/256: (105, 259) -> 279 (b'is ') had 4913 occurrences\n",
142
+ "merge 25/256: (101, 115) -> 280 (b'es') had 4878 occurrences\n",
143
+ "merge 26/256: (121, 262) -> 281 (b'you') had 4649 occurrences\n",
144
+ "merge 27/256: (32, 115) -> 282 (b' s') had 4207 occurrences\n",
145
+ "merge 28/256: (116, 269) -> 283 (b'to ') had 4099 occurrences\n",
146
+ "merge 29/256: (266, 260) -> 284 (b'and ') had 3968 occurrences\n",
147
+ "merge 30/256: (111, 119) -> 285 (b'ow') had 3964 occurrences\n",
148
+ "merge 31/256: (101, 97) -> 286 (b'ea') had 3943 occurrences\n",
149
+ "merge 32/256: (32, 109) -> 287 (b' m') had 3906 occurrences\n",
150
+ "merge 33/256: (32, 119) -> 288 (b' w') had 3854 occurrences\n",
151
+ "merge 34/256: (111, 102) -> 289 (b'of') had 3836 occurrences\n",
152
+ "merge 35/256: (32, 104) -> 290 (b' h') had 3668 occurrences\n",
153
+ "merge 36/256: (264, 103) -> 291 (b'ing') had 3660 occurrences\n",
154
+ "merge 37/256: (111, 109) -> 292 (b'om') had 3614 occurrences\n",
155
+ "merge 38/256: (32, 97) -> 293 (b' a') had 3124 occurrences\n",
156
+ "merge 39/256: (99, 104) -> 294 (b'ch') had 2974 occurrences\n",
157
+ "merge 40/256: (257, 256) -> 295 (b'the ') had 2967 occurrences\n",
158
+ "merge 41/256: (115, 116) -> 296 (b'st') had 2961 occurrences\n",
159
+ "merge 42/256: (32, 98) -> 297 (b' b') had 2855 occurrences\n",
160
+ "merge 43/256: (110, 111) -> 298 (b'no') had 2756 occurrences\n",
161
+ "merge 44/256: (105, 114) -> 299 (b'ir') had 2700 occurrences\n",
162
+ "merge 45/256: (102, 268) -> 300 (b'for') had 2698 occurrences\n",
163
+ "merge 46/256: (118, 256) -> 301 (b've ') had 2650 occurrences\n",
164
+ "merge 47/256: (101, 261) -> 302 (b'e, ') had 2591 occurrences\n",
165
+ "merge 48/256: (105, 257) -> 303 (b'ith') had 2421 occurrences\n",
166
+ "merge 49/256: (273, 256) -> 304 (b' the ') had 2397 occurrences\n",
167
+ "merge 50/256: (115, 101) -> 305 (b'se') had 2373 occurrences\n",
168
+ "merge 51/256: (108, 105) -> 306 (b'li') had 2358 occurrences\n",
169
+ "merge 52/256: (84, 104) -> 307 (b'Th') had 2356 occurrences\n",
170
+ "merge 53/256: (275, 32) -> 308 (b'll ') had 2246 occurrences\n",
171
+ "merge 54/256: (114, 101) -> 309 (b're') had 2164 occurrences\n",
172
+ "merge 55/256: (115, 258) -> 310 (b'st ') had 2125 occurrences\n",
173
+ "merge 56/256: (97, 258) -> 311 (b'at ') had 2124 occurrences\n",
174
+ "merge 57/256: (65, 110) -> 312 (b'An') had 2105 occurrences\n",
175
+ "merge 58/256: (73, 32) -> 313 (b'I ') had 2092 occurrences\n",
176
+ "merge 59/256: (101, 272) -> 314 (b'ear') had 2081 occurrences\n",
177
+ "merge 60/256: (105, 109) -> 315 (b'im') had 2077 occurrences\n",
178
+ "merge 61/256: (105, 116) -> 316 (b'it') had 2070 occurrences\n",
179
+ "merge 62/256: (111, 111) -> 317 (b'oo') had 2025 occurrences\n",
180
+ "merge 63/256: (103, 104) -> 318 (b'gh') had 1981 occurrences\n",
181
+ "merge 64/256: (97, 116) -> 319 (b'at') had 1977 occurrences\n",
182
+ "merge 65/256: (105, 115) -> 320 (b'is') had 1941 occurrences\n",
183
+ "merge 66/256: (108, 101) -> 321 (b'le') had 1896 occurrences\n",
184
+ "merge 67/256: (263, 32) -> 322 (b'er ') had 1847 occurrences\n",
185
+ "merge 68/256: (262, 114) -> 323 (b'our') had 1816 occurrences\n",
186
+ "merge 69/256: (312, 260) -> 324 (b'And ') had 1801 occurrences\n",
187
+ "merge 70/256: (39, 259) -> 325 (b\"'s \") had 1767 occurrences\n",
188
+ "merge 71/256: (101, 101) -> 326 (b'ee') had 1763 occurrences\n",
189
+ "merge 72/256: (298, 258) -> 327 (b'not ') had 1749 occurrences\n",
190
+ "merge 73/256: (109, 265) -> 328 (b'my ') had 1725 occurrences\n",
191
+ "merge 74/256: (59, 10) -> 329 (b';\\n') had 1688 occurrences\n",
192
+ "merge 75/256: (114, 97) -> 330 (b'ra') had 1667 occurrences\n",
193
+ "merge 76/256: (46, 10) -> 331 (b'.\\n') had 1658 occurrences\n",
194
+ "merge 77/256: (281, 114) -> 332 (b'your') had 1634 occurrences\n",
195
+ "merge 78/256: (117, 114) -> 333 (b'ur') had 1632 occurrences\n",
196
+ "merge 79/256: (276, 258) -> 334 (b'hat ') had 1562 occurrences\n",
197
+ "merge 80/256: (114, 105) -> 335 (b'ri') had 1560 occurrences\n",
198
+ "merge 81/256: (117, 258) -> 336 (b'ut ') had 1555 occurrences\n",
199
+ "merge 82/256: (108, 260) -> 337 (b'ld ') had 1545 occurrences\n",
200
+ "merge 83/256: (289, 32) -> 338 (b'of ') had 1494 occurrences\n",
201
+ "merge 84/256: (79, 267) -> 339 (b'O:\\n') had 1494 occurrences\n",
202
+ "merge 85/256: (101, 260) -> 340 (b'ed ') had 1479 occurrences\n",
203
+ "merge 86/256: (108, 97) -> 341 (b'la') had 1460 occurrences\n",
204
+ "merge 87/256: (105, 258) -> 342 (b'it ') had 1444 occurrences\n",
205
+ "merge 88/256: (114, 111) -> 343 (b'ro') had 1434 occurrences\n",
206
+ "merge 89/256: (263, 256) -> 344 (b'ere ') had 1397 occurrences\n",
207
+ "merge 90/256: (101, 259) -> 345 (b'es ') had 1385 occurrences\n",
208
+ "merge 91/256: (100, 261) -> 346 (b'd, ') had 1381 occurrences\n",
209
+ "merge 92/256: (117, 110) -> 347 (b'un') had 1374 occurrences\n",
210
+ "merge 93/256: (69, 78) -> 348 (b'EN') had 1373 occurrences\n",
211
+ "merge 94/256: (107, 256) -> 349 (b'ke ') had 1367 occurrences\n",
212
+ "merge 95/256: (121, 261) -> 350 (b'y, ') had 1339 occurrences\n",
213
+ "merge 96/256: (73, 78) -> 351 (b'IN') had 1313 occurrences\n",
214
+ "merge 97/256: (32, 100) -> 352 (b' d') had 1295 occurrences\n",
215
+ "merge 98/256: (63, 271) -> 353 (b'?\\n\\n') had 1294 occurrences\n",
216
+ "merge 99/256: (97, 259) -> 354 (b'as ') had 1294 occurrences\n",
217
+ "merge 100/256: (102, 97) -> 355 (b'fa') had 1267 occurrences\n",
218
+ "merge 101/256: (119, 303) -> 356 (b'with') had 1258 occurrences\n",
219
+ "merge 102/256: (276, 301) -> 357 (b'have ') had 1240 occurrences\n",
220
+ "merge 103/256: (83, 267) -> 358 (b'S:\\n') had 1230 occurrences\n",
221
+ "merge 104/256: (32, 99) -> 359 (b' c') had 1228 occurrences\n",
222
+ "merge 105/256: (87, 104) -> 360 (b'Wh') had 1226 occurrences\n",
223
+ "merge 106/256: (257, 311) -> 361 (b'that ') had 1222 occurrences\n",
224
+ "merge 107/256: (270, 116) -> 362 (b'ent') had 1221 occurrences\n",
225
+ "merge 108/256: (257, 101) -> 363 (b'the') had 1213 occurrences\n",
226
+ "merge 109/256: (99, 101) -> 364 (b'ce') had 1206 occurrences\n",
227
+ "merge 110/256: (115, 104) -> 365 (b'sh') had 1195 occurrences\n",
228
+ "merge 111/256: (109, 97) -> 366 (b'ma') had 1173 occurrences\n",
229
+ "merge 112/256: (32, 112) -> 367 (b' p') had 1167 occurrences\n",
230
+ "merge 113/256: (257, 263) -> 368 (b'ther') had 1133 occurrences\n",
231
+ "merge 114/256: (98, 101) -> 369 (b'be') had 1131 occurrences\n",
232
+ "merge 115/256: (46, 32) -> 370 (b'. ') had 1127 occurrences\n",
233
+ "merge 116/256: (65, 82) -> 371 (b'AR') had 1124 occurrences\n",
234
+ "merge 117/256: (99, 256) -> 372 (b'ce ') had 1116 occurrences\n",
235
+ "merge 118/256: (291, 32) -> 373 (b'ing ') had 1113 occurrences\n",
236
+ "merge 119/256: (97, 108) -> 374 (b'al') had 1098 occurrences\n",
237
+ "merge 120/256: (59, 32) -> 375 (b'; ') had 1091 occurrences\n",
238
+ "merge 121/256: (257, 262) -> 376 (b'thou') had 1088 occurrences\n",
239
+ "merge 122/256: (115, 261) -> 377 (b's, ') had 1086 occurrences\n",
240
+ "merge 123/256: (109, 256) -> 378 (b'me ') had 1081 occurrences\n",
241
+ "merge 124/256: (115, 256) -> 379 (b'se ') had 1078 occurrences\n",
242
+ "merge 125/256: (108, 111) -> 380 (b'lo') had 1077 occurrences\n",
243
+ "merge 126/256: (99, 107) -> 381 (b'ck') had 1061 occurrences\n",
244
+ "merge 127/256: (119, 104) -> 382 (b'wh') had 1057 occurrences\n",
245
+ "merge 128/256: (105, 108) -> 383 (b'il') had 1046 occurrences\n",
246
+ "merge 129/256: (39, 260) -> 384 (b\"'d \") had 1026 occurrences\n",
247
+ "merge 130/256: (73, 339) -> 385 (b'IO:\\n') had 1025 occurrences\n",
248
+ "merge 131/256: (110, 285) -> 386 (b'now') had 1022 occurrences\n",
249
+ "merge 132/256: (105, 275) -> 387 (b'ill') had 1016 occurrences\n",
250
+ "merge 133/256: (98, 256) -> 388 (b'be ') had 982 occurrences\n",
251
+ "merge 134/256: (101, 275) -> 389 (b'ell') had 982 occurrences\n",
252
+ "merge 135/256: (114, 286) -> 390 (b'rea') had 978 occurrences\n",
253
+ "merge 136/256: (32, 116) -> 391 (b' t') had 972 occurrences\n",
254
+ "merge 137/256: (116, 261) -> 392 (b't, ') had 971 occurrences\n",
255
+ "merge 138/256: (262, 337) -> 393 (b'ould ') had 970 occurrences\n",
256
+ "merge 139/256: (101, 10) -> 394 (b'e\\n') had 962 occurrences\n",
257
+ "merge 140/256: (287, 265) -> 395 (b' my ') had 959 occurrences\n",
258
+ "merge 141/256: (118, 263) -> 396 (b'ver') had 955 occurrences\n",
259
+ "merge 142/256: (99, 292) -> 397 (b'com') had 952 occurrences\n",
260
+ "merge 143/256: (104, 256) -> 398 (b'he ') had 929 occurrences\n",
261
+ "merge 144/256: (32, 283) -> 399 (b' to ') had 926 occurrences\n",
262
+ "merge 145/256: (32, 73) -> 400 (b' I') had 906 occurrences\n",
263
+ "merge 146/256: (101, 108) -> 401 (b'el') had 902 occurrences\n",
264
+ "merge 147/256: (85, 358) -> 402 (b'US:\\n') had 879 occurrences\n",
265
+ "merge 148/256: (111, 108) -> 403 (b'ol') had 871 occurrences\n",
266
+ "merge 149/256: (100, 105) -> 404 (b'di') had 869 occurrences\n",
267
+ "merge 150/256: (32, 103) -> 405 (b' g') had 864 occurrences\n",
268
+ "merge 151/256: (97, 265) -> 406 (b'ay ') had 849 occurrences\n",
269
+ "merge 152/256: (116, 263) -> 407 (b'ter') had 849 occurrences\n",
270
+ "merge 153/256: (97, 264) -> 408 (b'ain') had 844 occurrences\n",
271
+ "merge 154/256: (32, 281) -> 409 (b' you') had 844 occurrences\n",
272
+ "merge 155/256: (307, 256) -> 410 (b'The ') had 843 occurrences\n",
273
+ "merge 156/256: (108, 256) -> 411 (b'le ') had 839 occurrences\n",
274
+ "merge 157/256: (105, 274) -> 412 (b'ion') had 838 occurrences\n",
275
+ "merge 158/256: (32, 102) -> 413 (b' f') had 826 occurrences\n",
276
+ "merge 159/256: (114, 117) -> 414 (b'ru') had 819 occurrences\n",
277
+ "merge 160/256: (105, 102) -> 415 (b'if') had 817 occurrences\n",
278
+ "merge 161/256: (101, 109) -> 416 (b'em') had 810 occurrences\n",
279
+ "merge 162/256: (266, 100) -> 417 (b'and') had 801 occurrences\n",
280
+ "merge 163/256: (84, 269) -> 418 (b'To ') had 800 occurrences\n",
281
+ "merge 164/256: (105, 318) -> 419 (b'igh') had 798 occurrences\n",
282
+ "merge 165/256: (272, 256) -> 420 (b'are ') had 796 occurrences\n",
283
+ "merge 166/256: (117, 112) -> 421 (b'up') had 779 occurrences\n",
284
+ "merge 167/256: (277, 324) -> 422 (b',\\nAnd ') had 774 occurrences\n",
285
+ "merge 168/256: (104, 315) -> 423 (b'him') had 761 occurrences\n",
286
+ "merge 169/256: (101, 100) -> 424 (b'ed') had 751 occurrences\n",
287
+ "merge 170/256: (105, 308) -> 425 (b'ill ') had 743 occurrences\n",
288
+ "merge 171/256: (268, 100) -> 426 (b'ord') had 736 occurrences\n",
289
+ "merge 172/256: (105, 294) -> 427 (b'ich') had 733 occurrences\n",
290
+ "merge 173/256: (108, 265) -> 428 (b'ly ') had 732 occurrences\n",
291
+ "merge 174/256: (317, 260) -> 429 (b'ood ') had 726 occurrences\n",
292
+ "merge 175/256: (85, 67) -> 430 (b'UC') had 725 occurrences\n",
293
+ "merge 176/256: (285, 110) -> 431 (b'own') had 717 occurrences\n",
294
+ "merge 177/256: (104, 279) -> 432 (b'his ') had 706 occurrences\n",
295
+ "merge 178/256: (351, 71) -> 433 (b'ING') had 703 occurrences\n",
296
+ "merge 179/256: (32, 284) -> 434 (b' and ') had 701 occurrences\n",
297
+ "merge 180/256: (99, 274) -> 435 (b'con') had 700 occurrences\n",
298
+ "merge 181/256: (110, 101) -> 436 (b'ne') had 699 occurrences\n",
299
+ "merge 182/256: (97, 121) -> 437 (b'ay') had 697 occurrences\n",
300
+ "merge 183/256: (101, 278) -> 438 (b'e.\\n\\n') had 693 occurrences\n",
301
+ "merge 184/256: (114, 292) -> 439 (b'rom') had 690 occurrences\n",
302
+ "merge 185/256: (105, 100) -> 440 (b'id') had 681 occurrences\n",
303
+ "merge 186/256: (117, 115) -> 441 (b'us') had 679 occurrences\n",
304
+ "merge 187/256: (262, 110) -> 442 (b'oun') had 677 occurrences\n",
305
+ "merge 188/256: (65, 78) -> 443 (b'AN') had 677 occurrences\n",
306
+ "merge 189/256: (109, 266) -> 444 (b'man') had 675 occurrences\n",
307
+ "merge 190/256: (97, 103) -> 445 (b'ag') had 669 occurrences\n",
308
+ "merge 191/256: (69, 82) -> 446 (b'ER') had 665 occurrences\n",
309
+ "merge 192/256: (79, 82) -> 447 (b'OR') had 663 occurrences\n",
310
+ "merge 193/256: (101, 258) -> 448 (b'et ') had 657 occurrences\n",
311
+ "merge 194/256: (114, 280) -> 449 (b'res') had 655 occurrences\n",
312
+ "merge 195/256: (305, 108) -> 450 (b'sel') had 649 occurrences\n",
313
+ "merge 196/256: (290, 279) -> 451 (b' his ') had 647 occurrences\n",
314
+ "merge 197/256: (101, 277) -> 452 (b'e,\\n') had 646 occurrences\n",
315
+ "merge 198/256: (101, 116) -> 453 (b'et') had 643 occurrences\n",
316
+ "merge 199/256: (99, 97) -> 454 (b'ca') had 642 occurrences\n",
317
+ "merge 200/256: (32, 264) -> 455 (b' in') had 641 occurrences\n",
318
+ "merge 201/256: (115, 276) -> 456 (b'sha') had 636 occurrences\n",
319
+ "merge 202/256: (33, 10) -> 457 (b'!\\n') had 635 occurrences\n",
320
+ "merge 203/256: (69, 84) -> 458 (b'ET') had 628 occurrences\n",
321
+ "merge 204/256: (84, 334) -> 459 (b'That ') had 615 occurrences\n",
322
+ "merge 205/256: (112, 111) -> 460 (b'po') had 611 occurrences\n",
323
+ "merge 206/256: (113, 117) -> 461 (b'qu') had 609 occurrences\n",
324
+ "merge 207/256: (257, 265) -> 462 (b'thy ') had 596 occurrences\n",
325
+ "merge 208/256: (33, 271) -> 463 (b'!\\n\\n') had 594 occurrences\n",
326
+ "merge 209/256: (109, 268) -> 464 (b'mor') had 584 occurrences\n",
327
+ "merge 210/256: (117, 108) -> 465 (b'ul') had 581 occurrences\n",
328
+ "merge 211/256: (110, 269) -> 466 (b'no ') had 579 occurrences\n",
329
+ "merge 212/256: (97, 109) -> 467 (b'am') had 577 occurrences\n",
330
+ "merge 213/256: (273, 101) -> 468 (b' the') had 572 occurrences\n",
331
+ "merge 214/256: (65, 267) -> 469 (b'A:\\n') had 570 occurrences\n",
332
+ "merge 215/256: (118, 270) -> 470 (b'ven') had 569 occurrences\n",
333
+ "merge 216/256: (98, 265) -> 471 (b'by ') had 566 occurrences\n",
334
+ "merge 217/256: (115, 10) -> 472 (b's\\n') had 560 occurrences\n",
335
+ "merge 218/256: (115, 112) -> 473 (b'sp') had 556 occurrences\n",
336
+ "merge 219/256: (75, 433) -> 474 (b'KING') had 556 occurrences\n",
337
+ "merge 220/256: (290, 315) -> 475 (b' him') had 553 occurrences\n",
338
+ "merge 221/256: (257, 279) -> 476 (b'this ') had 552 occurrences\n",
339
+ "merge 222/256: (273, 279) -> 477 (b' this ') had 552 occurrences\n",
340
+ "merge 223/256: (104, 263) -> 478 (b'her') had 552 occurrences\n",
341
+ "merge 224/256: (273, 311) -> 479 (b' that ') had 542 occurrences\n",
342
+ "merge 225/256: (111, 257) -> 480 (b'oth') had 539 occurrences\n",
343
+ "merge 226/256: (63, 10) -> 481 (b'?\\n') had 539 occurrences\n",
344
+ "merge 227/256: (274, 103) -> 482 (b'ong') had 537 occurrences\n",
345
+ "merge 228/256: (66, 336) -> 483 (b'But ') had 536 occurrences\n",
346
+ "merge 229/256: (280, 258) -> 484 (b'est ') had 532 occurrences\n",
347
+ "merge 230/256: (111, 261) -> 485 (b'o, ') had 528 occurrences\n",
348
+ "merge 231/256: (98, 336) -> 486 (b'but ') had 526 occurrences\n",
349
+ "merge 232/256: (32, 289) -> 487 (b' of') had 525 occurrences\n",
350
+ "merge 233/256: (70, 268) -> 488 (b'For') had 522 occurrences\n",
351
+ "merge 234/256: (115, 117) -> 489 (b'su') had 521 occurrences\n",
352
+ "merge 235/256: (288, 303) -> 490 (b' with') had 517 occurrences\n",
353
+ "merge 236/256: (117, 116) -> 491 (b'ut') had 517 occurrences\n",
354
+ "merge 237/256: (274, 256) -> 492 (b'one ') had 514 occurrences\n",
355
+ "merge 238/256: (97, 275) -> 493 (b'all') had 512 occurrences\n",
356
+ "merge 239/256: (73, 67) -> 494 (b'IC') had 509 occurrences\n",
357
+ "merge 240/256: (270, 100) -> 495 (b'end') had 500 occurrences\n",
358
+ "merge 241/256: (79, 76) -> 496 (b'OL') had 497 occurrences\n",
359
+ "merge 242/256: (100, 269) -> 497 (b'do ') had 495 occurrences\n",
360
+ "merge 243/256: (73, 288) -> 498 (b'I w') had 495 occurrences\n",
361
+ "merge 244/256: (292, 256) -> 499 (b'ome ') had 494 occurrences\n",
362
+ "merge 245/256: (107, 386) -> 500 (b'know') had 493 occurrences\n",
363
+ "merge 246/256: (115, 277) -> 501 (b's,\\n') had 493 occurrences\n",
364
+ "merge 247/256: (115, 299) -> 502 (b'sir') had 493 occurrences\n",
365
+ "merge 248/256: (261, 284) -> 503 (b', and ') had 490 occurrences\n",
366
+ "merge 249/256: (99, 116) -> 504 (b'ct') had 490 occurrences\n",
367
+ "merge 250/256: (117, 259) -> 505 (b'us ') had 489 occurrences\n",
368
+ "merge 251/256: (280, 259) -> 506 (b'ess ') had 486 occurrences\n",
369
+ "merge 252/256: (450, 102) -> 507 (b'self') had 486 occurrences\n",
370
+ "merge 253/256: (282, 116) -> 508 (b' st') had 486 occurrences\n",
371
+ "merge 254/256: (97, 349) -> 509 (b'ake ') had 481 occurrences\n",
372
+ "merge 255/256: (69, 76) -> 510 (b'EL') had 481 occurrences\n",
373
+ "merge 256/256: (107, 291) -> 511 (b'king') had 479 occurrences\n"
374
+ ]
375
+ }
376
+ ],
377
+ "source": [
378
+ "basic_tokenizer = BasicTokenizer()\n",
379
+ "basic_tokenizer.train(text, vocab_size=512, verbose=True)"
380
+ ]
381
+ },
382
+ {
383
+ "cell_type": "code",
384
+ "execution_count": 11,
385
+ "metadata": {},
386
+ "outputs": [],
387
+ "source": [
388
+ "prefix = os.path.join(model_path, \"shakespeare_basic\")\n",
389
+ "basic_tokenizer.save(prefix)"
390
+ ]
391
+ },
392
+ {
393
+ "cell_type": "markdown",
394
+ "metadata": {},
395
+ "source": [
396
+ "Regex tokenizer"
397
+ ]
398
+ },
399
+ {
400
+ "cell_type": "code",
401
+ "execution_count": 12,
402
+ "metadata": {},
403
+ "outputs": [
404
+ {
405
+ "name": "stdout",
406
+ "output_type": "stream",
407
+ "text": [
408
+ "merge 1/256: (32, 116) -> 256 (b' t') had 23837 occurrences\n",
409
+ "merge 2/256: (104, 101) -> 257 (b'he') had 18203 occurrences\n",
410
+ "merge 3/256: (32, 97) -> 258 (b' a') had 13541 occurrences\n",
411
+ "merge 4/256: (111, 117) -> 259 (b'ou') had 12730 occurrences\n",
412
+ "merge 5/256: (32, 115) -> 260 (b' s') had 12287 occurrences\n",
413
+ "merge 6/256: (32, 109) -> 261 (b' m') had 10786 occurrences\n",
414
+ "merge 7/256: (105, 110) -> 262 (b'in') had 10606 occurrences\n",
415
+ "merge 8/256: (32, 119) -> 263 (b' w') had 10546 occurrences\n",
416
+ "merge 9/256: (114, 101) -> 264 (b're') had 9843 occurrences\n",
417
+ "merge 10/256: (104, 97) -> 265 (b'ha') had 9673 occurrences\n",
418
+ "merge 11/256: (58, 10) -> 266 (b':\\n') had 8762 occurrences\n",
419
+ "merge 12/256: (110, 100) -> 267 (b'nd') had 8730 occurrences\n",
420
+ "merge 13/256: (256, 257) -> 268 (b' the') had 8684 occurrences\n",
421
+ "merge 14/256: (32, 98) -> 269 (b' b') had 8463 occurrences\n",
422
+ "merge 15/256: (105, 115) -> 270 (b'is') had 7526 occurrences\n",
423
+ "merge 16/256: (111, 114) -> 271 (b'or') had 7297 occurrences\n",
424
+ "merge 17/256: (10, 10) -> 272 (b'\\n\\n') had 7098 occurrences\n",
425
+ "merge 18/256: (32, 102) -> 273 (b' f') had 6563 occurrences\n",
426
+ "merge 19/256: (101, 114) -> 274 (b'er') had 6515 occurrences\n",
427
+ "merge 20/256: (108, 108) -> 275 (b'll') had 6357 occurrences\n",
428
+ "merge 21/256: (105, 116) -> 276 (b'it') had 6114 occurrences\n",
429
+ "merge 22/256: (111, 110) -> 277 (b'on') had 5973 occurrences\n",
430
+ "merge 23/256: (44, 10) -> 278 (b',\\n') had 5501 occurrences\n",
431
+ "merge 24/256: (32, 100) -> 279 (b' d') had 5478 occurrences\n",
432
+ "merge 25/256: (32, 99) -> 280 (b' c') had 5404 occurrences\n",
433
+ "merge 26/256: (101, 115) -> 281 (b'es') had 5202 occurrences\n",
434
+ "merge 27/256: (101, 110) -> 282 (b'en') had 5181 occurrences\n",
435
+ "merge 28/256: (32, 110) -> 283 (b' n') had 5176 occurrences\n",
436
+ "merge 29/256: (32, 108) -> 284 (b' l') had 5173 occurrences\n",
437
+ "merge 30/256: (32, 121) -> 285 (b' y') had 5140 occurrences\n",
438
+ "merge 31/256: (46, 272) -> 286 (b'.\\n\\n') had 5018 occurrences\n",
439
+ "merge 32/256: (256, 104) -> 287 (b' th') had 4940 occurrences\n",
440
+ "merge 33/256: (97, 114) -> 288 (b'ar') had 4884 occurrences\n",
441
+ "merge 34/256: (32, 104) -> 289 (b' h') had 4702 occurrences\n",
442
+ "merge 35/256: (32, 111) -> 290 (b' o') had 4693 occurrences\n",
443
+ "merge 36/256: (256, 111) -> 291 (b' to') had 4666 occurrences\n",
444
+ "merge 37/256: (285, 259) -> 292 (b' you') had 4587 occurrences\n",
445
+ "merge 38/256: (32, 112) -> 293 (b' p') had 4490 occurrences\n",
446
+ "merge 39/256: (265, 116) -> 294 (b'hat') had 4407 occurrences\n",
447
+ "merge 40/256: (32, 73) -> 295 (b' I') had 4079 occurrences\n",
448
+ "merge 41/256: (32, 257) -> 296 (b' he') had 4022 occurrences\n",
449
+ "merge 42/256: (118, 101) -> 297 (b've') had 3900 occurrences\n",
450
+ "merge 43/256: (111, 116) -> 298 (b'ot') had 3891 occurrences\n",
451
+ "merge 44/256: (115, 116) -> 299 (b'st') had 3709 occurrences\n",
452
+ "merge 45/256: (258, 267) -> 300 (b' and') had 3703 occurrences\n",
453
+ "merge 46/256: (111, 119) -> 301 (b'ow') had 3686 occurrences\n",
454
+ "merge 47/256: (262, 103) -> 302 (b'ing') had 3660 occurrences\n",
455
+ "merge 48/256: (97, 110) -> 303 (b'an') had 3635 occurrences\n",
456
+ "merge 49/256: (290, 102) -> 304 (b' of') had 3605 occurrences\n",
457
+ "merge 50/256: (111, 109) -> 305 (b'om') had 3584 occurrences\n",
458
+ "merge 51/256: (32, 103) -> 306 (b' g') had 3512 occurrences\n",
459
+ "merge 52/256: (97, 116) -> 307 (b'at') had 3357 occurrences\n",
460
+ "merge 53/256: (269, 101) -> 308 (b' be') had 3219 occurrences\n",
461
+ "merge 54/256: (115, 101) -> 309 (b'se') had 3065 occurrences\n",
462
+ "merge 55/256: (261, 121) -> 310 (b' my') had 2829 occurrences\n",
463
+ "merge 56/256: (32, 262) -> 311 (b' in') had 2746 occurrences\n",
464
+ "merge 57/256: (99, 101) -> 312 (b'ce') had 2740 occurrences\n",
465
+ "merge 58/256: (32, 265) -> 313 (b' ha') had 2713 occurrences\n",
466
+ "merge 59/256: (108, 101) -> 314 (b'le') had 2636 occurrences\n",
467
+ "merge 60/256: (97, 121) -> 315 (b'ay') had 2568 occurrences\n",
468
+ "merge 61/256: (108, 100) -> 316 (b'ld') had 2392 occurrences\n",
469
+ "merge 62/256: (105, 114) -> 317 (b'ir') had 2385 occurrences\n",
470
+ "merge 63/256: (101, 116) -> 318 (b'et') had 2375 occurrences\n",
471
+ "merge 64/256: (101, 100) -> 319 (b'ed') had 2344 occurrences\n",
472
+ "merge 65/256: (117, 116) -> 320 (b'ut') had 2304 occurrences\n",
473
+ "merge 66/256: (261, 101) -> 321 (b' me') had 2132 occurrences\n",
474
+ "merge 67/256: (105, 109) -> 322 (b'im') had 2125 occurrences\n",
475
+ "merge 68/256: (276, 104) -> 323 (b'ith') had 2089 occurrences\n",
476
+ "merge 69/256: (39, 115) -> 324 (b\"'s\") had 2063 occurrences\n",
477
+ "merge 70/256: (283, 298) -> 325 (b' not') had 2048 occurrences\n",
478
+ "merge 71/256: (99, 104) -> 326 (b'ch') had 2016 occurrences\n",
479
+ "merge 72/256: (256, 294) -> 327 (b' that') had 1962 occurrences\n",
480
+ "merge 73/256: (32, 270) -> 328 (b' is') had 1955 occurrences\n",
481
+ "merge 74/256: (103, 104) -> 329 (b'gh') had 1947 occurrences\n",
482
+ "merge 75/256: (65, 267) -> 330 (b'And') had 1927 occurrences\n",
483
+ "merge 76/256: (273, 271) -> 331 (b' for') had 1890 occurrences\n",
484
+ "merge 77/256: (107, 101) -> 332 (b'ke') had 1864 occurrences\n",
485
+ "merge 78/256: (32, 117) -> 333 (b' u') had 1850 occurrences\n",
486
+ "merge 79/256: (259, 114) -> 334 (b'our') had 1837 occurrences\n",
487
+ "merge 80/256: (263, 101) -> 335 (b' we') had 1816 occurrences\n",
488
+ "merge 81/256: (111, 111) -> 336 (b'oo') had 1800 occurrences\n",
489
+ "merge 82/256: (105, 275) -> 337 (b'ill') had 1763 occurrences\n",
490
+ "merge 83/256: (32, 101) -> 338 (b' e') had 1733 occurrences\n",
491
+ "merge 84/256: (257, 114) -> 339 (b'her') had 1710 occurrences\n",
492
+ "merge 85/256: (59, 10) -> 340 (b';\\n') had 1688 occurrences\n",
493
+ "merge 86/256: (263, 323) -> 341 (b' with') had 1676 occurrences\n",
494
+ "merge 87/256: (46, 10) -> 342 (b'.\\n') had 1658 occurrences\n",
495
+ "merge 88/256: (282, 116) -> 343 (b'ent') had 1638 occurrences\n",
496
+ "merge 89/256: (32, 276) -> 344 (b' it') had 1627 occurrences\n",
497
+ "merge 90/256: (292, 114) -> 345 (b' your') had 1610 occurrences\n",
498
+ "merge 91/256: (97, 100) -> 346 (b'ad') had 1598 occurrences\n",
499
+ "merge 92/256: (114, 105) -> 347 (b'ri') had 1545 occurrences\n",
500
+ "merge 93/256: (287, 259) -> 348 (b' thou') had 1496 occurrences\n",
501
+ "merge 94/256: (260, 116) -> 349 (b' st') had 1478 occurrences\n",
502
+ "merge 95/256: (39, 100) -> 350 (b\"'d\") had 1451 occurrences\n",
503
+ "merge 96/256: (32, 107) -> 351 (b' k') had 1438 occurrences\n",
504
+ "merge 97/256: (305, 101) -> 352 (b'ome') had 1436 occurrences\n",
505
+ "merge 98/256: (289, 270) -> 353 (b' his') had 1415 occurrences\n",
506
+ "merge 99/256: (329, 116) -> 354 (b'ght') had 1379 occurrences\n",
507
+ "merge 100/256: (69, 78) -> 355 (b'EN') had 1373 occurrences\n",
508
+ "merge 101/256: (271, 100) -> 356 (b'ord') had 1353 occurrences\n",
509
+ "merge 102/256: (105, 100) -> 357 (b'id') had 1350 occurrences\n",
510
+ "merge 103/256: (97, 115) -> 358 (b'as') had 1347 occurrences\n",
511
+ "merge 104/256: (84, 257) -> 359 (b'The') had 1345 occurrences\n",
512
+ "merge 105/256: (32, 264) -> 360 (b' re') had 1330 occurrences\n",
513
+ "merge 106/256: (313, 297) -> 361 (b' have') had 1325 occurrences\n",
514
+ "merge 107/256: (73, 78) -> 362 (b'IN') had 1313 occurrences\n",
515
+ "merge 108/256: (108, 121) -> 363 (b'ly') had 1312 occurrences\n",
516
+ "merge 109/256: (114, 97) -> 364 (b'ra') had 1303 occurrences\n",
517
+ "merge 110/256: (284, 105) -> 365 (b' li') had 1299 occurrences\n",
518
+ "merge 111/256: (63, 272) -> 366 (b'?\\n\\n') had 1294 occurrences\n",
519
+ "merge 112/256: (289, 322) -> 367 (b' him') had 1293 occurrences\n",
520
+ "merge 113/256: (117, 114) -> 368 (b'ur') had 1263 occurrences\n",
521
+ "merge 114/256: (287, 270) -> 369 (b' this') had 1261 occurrences\n",
522
+ "merge 115/256: (97, 108) -> 370 (b'al') had 1256 occurrences\n",
523
+ "merge 116/256: (73, 79) -> 371 (b'IO') had 1254 occurrences\n",
524
+ "merge 117/256: (260, 111) -> 372 (b' so') had 1238 occurrences\n",
525
+ "merge 118/256: (258, 115) -> 373 (b' as') had 1209 occurrences\n",
526
+ "merge 119/256: (279, 101) -> 374 (b' de') had 1202 occurrences\n",
527
+ "merge 120/256: (32, 277) -> 375 (b' on') had 1178 occurrences\n",
528
+ "merge 121/256: (111, 264) -> 376 (b'ore') had 1147 occurrences\n",
529
+ "merge 122/256: (114, 111) -> 377 (b'ro') had 1127 occurrences\n",
530
+ "merge 123/256: (65, 82) -> 378 (b'AR') had 1124 occurrences\n",
531
+ "merge 124/256: (104, 105) -> 379 (b'hi') had 1120 occurrences\n",
532
+ "merge 125/256: (259, 316) -> 380 (b'ould') had 1098 occurrences\n",
533
+ "merge 126/256: (336, 100) -> 381 (b'ood') had 1092 occurrences\n",
534
+ "merge 127/256: (99, 107) -> 382 (b'ck') had 1056 occurrences\n",
535
+ "merge 128/256: (97, 262) -> 383 (b'ain') had 1051 occurrences\n",
536
+ "merge 129/256: (118, 274) -> 384 (b'ver') had 1042 occurrences\n",
537
+ "merge 130/256: (281, 116) -> 385 (b'est') had 1008 occurrences\n",
538
+ "merge 131/256: (287, 121) -> 386 (b' thy') had 994 occurrences\n",
539
+ "merge 132/256: (260, 265) -> 387 (b' sha') had 993 occurrences\n",
540
+ "merge 133/256: (281, 115) -> 388 (b'ess') had 990 occurrences\n",
541
+ "merge 134/256: (101, 97) -> 389 (b'ea') had 972 occurrences\n",
542
+ "merge 135/256: (279, 111) -> 390 (b' do') had 968 occurrences\n",
543
+ "merge 136/256: (263, 337) -> 391 (b' will') had 966 occurrences\n",
544
+ "merge 137/256: (97, 109) -> 392 (b'am') had 954 occurrences\n",
545
+ "merge 138/256: (283, 111) -> 393 (b' no') had 943 occurrences\n",
546
+ "merge 139/256: (269, 320) -> 394 (b' but') had 912 occurrences\n",
547
+ "merge 140/256: (117, 115) -> 395 (b'us') had 907 occurrences\n",
548
+ "merge 141/256: (97, 267) -> 396 (b'and') had 897 occurrences\n",
549
+ "merge 142/256: (85, 83) -> 397 (b'US') had 895 occurrences\n",
550
+ "merge 143/256: (105, 102) -> 398 (b'if') had 894 occurrences\n",
551
+ "merge 144/256: (260, 101) -> 399 (b' se') had 881 occurrences\n",
552
+ "merge 145/256: (103, 101) -> 400 (b'ge') had 877 occurrences\n",
553
+ "merge 146/256: (258, 275) -> 401 (b' all') had 849 occurrences\n",
554
+ "merge 147/256: (84, 104) -> 402 (b'Th') had 845 occurrences\n",
555
+ "merge 148/256: (260, 117) -> 403 (b' su') had 830 occurrences\n",
556
+ "merge 149/256: (97, 332) -> 404 (b'ake') had 830 occurrences\n",
557
+ "merge 150/256: (84, 111) -> 405 (b'To') had 828 occurrences\n",
558
+ "merge 151/256: (296, 114) -> 406 (b' her') had 811 occurrences\n",
559
+ "merge 152/256: (114, 117) -> 407 (b'ru') had 810 occurrences\n",
560
+ "merge 153/256: (105, 277) -> 408 (b'ion') had 808 occurrences\n",
561
+ "merge 154/256: (116, 104) -> 409 (b'th') had 800 occurrences\n",
562
+ "merge 155/256: (258, 110) -> 410 (b' an') had 789 occurrences\n",
563
+ "merge 156/256: (116, 274) -> 411 (b'ter') had 786 occurrences\n",
564
+ "merge 157/256: (288, 100) -> 412 (b'ard') had 786 occurrences\n",
565
+ "merge 158/256: (284, 111) -> 413 (b' lo') had 782 occurrences\n",
566
+ "merge 159/256: (265, 110) -> 414 (b'han') had 779 occurrences\n",
567
+ "merge 160/256: (101, 275) -> 415 (b'ell') had 771 occurrences\n",
568
+ "merge 161/256: (101, 288) -> 416 (b'ear') had 769 occurrences\n",
569
+ "merge 162/256: (260, 112) -> 417 (b' sp') had 763 occurrences\n",
570
+ "merge 163/256: (268, 101) -> 418 (b' thee') had 751 occurrences\n",
571
+ "merge 164/256: (32, 334) -> 419 (b' our') had 742 occurrences\n",
572
+ "merge 165/256: (273, 97) -> 420 (b' fa') had 740 occurrences\n",
573
+ "merge 166/256: (387, 275) -> 421 (b' shall') had 740 occurrences\n",
574
+ "merge 167/256: (269, 121) -> 422 (b' by') had 739 occurrences\n",
575
+ "merge 168/256: (85, 67) -> 423 (b'UC') had 725 occurrences\n",
576
+ "merge 169/256: (105, 108) -> 424 (b'il') had 709 occurrences\n",
577
+ "merge 170/256: (258, 264) -> 425 (b' are') had 703 occurrences\n",
578
+ "merge 171/256: (362, 71) -> 426 (b'ING') had 703 occurrences\n",
579
+ "merge 172/256: (32, 67) -> 427 (b' C') had 693 occurrences\n",
580
+ "merge 173/256: (283, 101) -> 428 (b' ne') had 690 occurrences\n",
581
+ "merge 174/256: (114, 305) -> 429 (b'rom') had 690 occurrences\n",
582
+ "merge 175/256: (104, 111) -> 430 (b'ho') had 686 occurrences\n",
583
+ "merge 176/256: (351, 110) -> 431 (b' kn') had 683 occurrences\n",
584
+ "merge 177/256: (65, 78) -> 432 (b'AN') had 677 occurrences\n",
585
+ "merge 178/256: (32, 82) -> 433 (b' R') had 675 occurrences\n",
586
+ "merge 179/256: (84, 294) -> 434 (b'That') had 671 occurrences\n",
587
+ "merge 180/256: (32, 118) -> 435 (b' v') had 670 occurrences\n",
588
+ "merge 181/256: (69, 82) -> 436 (b'ER') had 665 occurrences\n",
589
+ "merge 182/256: (97, 299) -> 437 (b'ast') had 663 occurrences\n",
590
+ "merge 183/256: (79, 82) -> 438 (b'OR') had 663 occurrences\n",
591
+ "merge 184/256: (99, 116) -> 439 (b'ct') had 661 occurrences\n",
592
+ "merge 185/256: (259, 115) -> 440 (b'ous') had 661 occurrences\n",
593
+ "merge 186/256: (263, 294) -> 441 (b' what') had 655 occurrences\n",
594
+ "merge 187/256: (105, 354) -> 442 (b'ight') had 642 occurrences\n",
595
+ "merge 188/256: (260, 104) -> 443 (b' sh') had 639 occurrences\n",
596
+ "merge 189/256: (33, 10) -> 444 (b'!\\n') had 635 occurrences\n",
597
+ "merge 190/256: (117, 108) -> 445 (b'ul') had 633 occurrences\n",
598
+ "merge 191/256: (32, 39) -> 446 (b\" '\") had 628 occurrences\n",
599
+ "merge 192/256: (69, 84) -> 447 (b'ET') had 628 occurrences\n",
600
+ "merge 193/256: (303, 116) -> 448 (b'ant') had 627 occurrences\n",
601
+ "merge 194/256: (69, 83) -> 449 (b'ES') had 624 occurrences\n",
602
+ "merge 195/256: (333, 112) -> 450 (b' up') had 616 occurrences\n",
603
+ "merge 196/256: (309, 108) -> 451 (b'sel') had 614 occurrences\n",
604
+ "merge 197/256: (113, 117) -> 452 (b'qu') had 609 occurrences\n",
605
+ "merge 198/256: (66, 320) -> 453 (b'But') had 608 occurrences\n",
606
+ "merge 199/256: (288, 116) -> 454 (b'art') had 607 occurrences\n",
607
+ "merge 200/256: (306, 381) -> 455 (b' good') had 599 occurrences\n",
608
+ "merge 201/256: (33, 272) -> 456 (b'!\\n\\n') had 594 occurrences\n",
609
+ "merge 202/256: (114, 301) -> 457 (b'row') had 592 occurrences\n",
610
+ "merge 203/256: (307, 104) -> 458 (b'ath') had 591 occurrences\n",
611
+ "merge 204/256: (262, 101) -> 459 (b'ine') had 591 occurrences\n",
612
+ "merge 205/256: (284, 356) -> 460 (b' lord') had 589 occurrences\n",
613
+ "merge 206/256: (379, 326) -> 461 (b'hich') had 587 occurrences\n",
614
+ "merge 207/256: (110, 116) -> 462 (b'nt') had 586 occurrences\n",
615
+ "merge 208/256: (117, 299) -> 463 (b'ust') had 585 occurrences\n",
616
+ "merge 209/256: (39, 275) -> 464 (b\"'ll\") had 580 occurrences\n",
617
+ "merge 210/256: (277, 101) -> 465 (b'one') had 578 occurrences\n",
618
+ "merge 211/256: (293, 114) -> 466 (b' pr') had 577 occurrences\n",
619
+ "merge 212/256: (280, 305) -> 467 (b' com') had 575 occurrences\n",
620
+ "merge 213/256: (258, 116) -> 468 (b' at') had 574 occurrences\n",
621
+ "merge 214/256: (261, 303) -> 469 (b' man') had 569 occurrences\n",
622
+ "merge 215/256: (32, 77) -> 470 (b' M') had 567 occurrences\n",
623
+ "merge 216/256: (87, 294) -> 471 (b'What') had 567 occurrences\n",
624
+ "merge 217/256: (263, 257) -> 472 (b' whe') had 563 occurrences\n",
625
+ "merge 218/256: (32, 69) -> 473 (b' E') had 559 occurrences\n",
626
+ "merge 219/256: (75, 426) -> 474 (b'KING') had 556 occurrences\n",
627
+ "merge 220/256: (258, 109) -> 475 (b' am') had 554 occurrences\n",
628
+ "merge 221/256: (101, 267) -> 476 (b'end') had 553 occurrences\n",
629
+ "merge 222/256: (105, 99) -> 477 (b'ic') had 548 occurrences\n",
630
+ "merge 223/256: (280, 277) -> 478 (b' con') had 548 occurrences\n",
631
+ "merge 224/256: (98, 314) -> 479 (b'ble') had 545 occurrences\n",
632
+ "merge 225/256: (114, 121) -> 480 (b'ry') had 542 occurrences\n",
633
+ "merge 226/256: (63, 10) -> 481 (b'?\\n') had 539 occurrences\n",
634
+ "merge 227/256: (277, 103) -> 482 (b'ong') had 534 occurrences\n",
635
+ "merge 228/256: (105, 101) -> 483 (b'ie') had 533 occurrences\n",
636
+ "merge 229/256: (105, 297) -> 484 (b'ive') had 527 occurrences\n",
637
+ "merge 230/256: (273, 429) -> 485 (b' from') had 527 occurrences\n",
638
+ "merge 231/256: (269, 108) -> 486 (b' bl') had 527 occurrences\n",
639
+ "merge 232/256: (118, 282) -> 487 (b'ven') had 521 occurrences\n",
640
+ "merge 233/256: (32, 71) -> 488 (b' G') had 518 occurrences\n",
641
+ "merge 234/256: (70, 271) -> 489 (b'For') had 517 occurrences\n",
642
+ "merge 235/256: (260, 257) -> 490 (b' she') had 517 occurrences\n",
643
+ "merge 236/256: (101, 109) -> 491 (b'em') had 515 occurrences\n",
644
+ "merge 237/256: (306, 111) -> 492 (b' go') had 515 occurrences\n",
645
+ "merge 238/256: (97, 264) -> 493 (b'are') had 514 occurrences\n",
646
+ "merge 239/256: (261, 376) -> 494 (b' more') had 510 occurrences\n",
647
+ "merge 240/256: (268, 109) -> 495 (b' them') had 509 occurrences\n",
648
+ "merge 241/256: (259, 116) -> 496 (b'out') had 509 occurrences\n",
649
+ "merge 242/256: (73, 67) -> 497 (b'IC') had 509 occurrences\n",
650
+ "merge 243/256: (263, 358) -> 498 (b' was') had 504 occurrences\n",
651
+ "merge 244/256: (97, 117) -> 499 (b'au') had 504 occurrences\n",
652
+ "merge 245/256: (298, 339) -> 500 (b'other') had 503 occurrences\n",
653
+ "merge 246/256: (298, 104) -> 501 (b'oth') had 503 occurrences\n",
654
+ "merge 247/256: (72, 101) -> 502 (b'He') had 500 occurrences\n",
655
+ "merge 248/256: (260, 317) -> 503 (b' sir') had 500 occurrences\n",
656
+ "merge 249/256: (111, 108) -> 504 (b'ol') had 498 occurrences\n",
657
+ "merge 250/256: (283, 301) -> 505 (b' now') had 490 occurrences\n",
658
+ "merge 251/256: (32, 76) -> 506 (b' L') had 489 occurrences\n",
659
+ "merge 252/256: (32, 294) -> 507 (b' hat') had 488 occurrences\n",
660
+ "merge 253/256: (32, 398) -> 508 (b' if') had 484 occurrences\n",
661
+ "merge 254/256: (111, 299) -> 509 (b'ost') had 484 occurrences\n",
662
+ "merge 255/256: (76, 79) -> 510 (b'LO') had 481 occurrences\n",
663
+ "merge 256/256: (262, 100) -> 511 (b'ind') had 480 occurrences\n"
664
+ ]
665
+ }
666
+ ],
667
+ "source": [
668
+ "regex_tokenizer = RegexTokenizer()\n",
669
+ "regex_tokenizer.train(text, vocab_size=512, verbose=True)"
670
+ ]
671
+ },
672
+ {
673
+ "cell_type": "code",
674
+ "execution_count": 13,
675
+ "metadata": {},
676
+ "outputs": [],
677
+ "source": [
678
+ "prefix = os.path.join(model_path, \"shakespeare_regex\")\n",
679
+ "regex_tokenizer.save(prefix)"
680
+ ]
681
+ },
682
+ {
683
+ "cell_type": "markdown",
684
+ "metadata": {},
685
+ "source": [
686
+ "loading the tokenizer files and using it"
687
+ ]
688
+ },
689
+ {
690
+ "cell_type": "code",
691
+ "execution_count": 6,
692
+ "metadata": {},
693
+ "outputs": [],
694
+ "source": [
695
+ "model_path = os.path.join(os.getcwd(), \"tokenizer_model\")\n",
696
+ "model_path = os.path.join(model_path, \"shakespeare_basic.model\")"
697
+ ]
698
+ },
699
+ {
700
+ "cell_type": "code",
701
+ "execution_count": 7,
702
+ "metadata": {},
703
+ "outputs": [],
704
+ "source": [
705
+ "basic_tokenizer = BasicTokenizer()\n",
706
+ "basic_tokenizer.load(model_path)"
707
+ ]
708
+ },
709
+ {
710
+ "cell_type": "code",
711
+ "execution_count": 15,
712
+ "metadata": {},
713
+ "outputs": [],
714
+ "source": [
715
+ "ids = basic_tokenizer.encode(\"Hello World\")"
716
+ ]
717
+ },
718
+ {
719
+ "cell_type": "code",
720
+ "execution_count": 19,
721
+ "metadata": {},
722
+ "outputs": [],
723
+ "source": [
724
+ "reverse = basic_tokenizer.decode(ids)"
725
+ ]
726
+ },
727
+ {
728
+ "cell_type": "code",
729
+ "execution_count": 20,
730
+ "metadata": {},
731
+ "outputs": [],
732
+ "source": [
733
+ "mapping = [(str(i),basic_tokenizer.decode([i])) for i in ids]"
734
+ ]
735
+ },
736
+ {
737
+ "cell_type": "code",
738
+ "execution_count": 22,
739
+ "metadata": {},
740
+ "outputs": [],
741
+ "source": [
742
+ "def test_tokenizer(text):\n",
743
+ " ids = basic_tokenizer.encode(text)\n",
744
+ " decoded = basic_tokenizer.decode(ids)\n",
745
+ " mapping = [(str(i), basic_tokenizer.decode([i])) for i in ids]\n",
746
+ "\n",
747
+ " return ids, decoded, mapping"
748
+ ]
749
+ },
750
+ {
751
+ "cell_type": "code",
752
+ "execution_count": 23,
753
+ "metadata": {},
754
+ "outputs": [
755
+ {
756
+ "data": {
757
+ "text/plain": [
758
+ "([72, 389, 269, 87, 268, 108, 100],\n",
759
+ " 'Hello World',\n",
760
+ " [('72', 'H'),\n",
761
+ " ('389', 'ell'),\n",
762
+ " ('269', 'o '),\n",
763
+ " ('87', 'W'),\n",
764
+ " ('268', 'or'),\n",
765
+ " ('108', 'l'),\n",
766
+ " ('100', 'd')])"
767
+ ]
768
+ },
769
+ "execution_count": 23,
770
+ "metadata": {},
771
+ "output_type": "execute_result"
772
+ }
773
+ ],
774
+ "source": [
775
+ "test_tokenizer(\"Hello World\")"
776
+ ]
777
+ },
778
+ {
779
+ "cell_type": "code",
780
+ "execution_count": 12,
781
+ "metadata": {},
782
+ "outputs": [],
783
+ "source": [
784
+ "import gradio as gr"
785
+ ]
786
+ },
787
+ {
788
+ "cell_type": "code",
789
+ "execution_count": 24,
790
+ "metadata": {},
791
+ "outputs": [],
792
+ "source": [
793
+ "with gr.Blocks() as demo:\n",
794
+ " gr.HTML(\"<h1 align = 'center'> Token Generation for Hindi Dataset </h1>\")\n",
795
+ "\n",
796
+ " with gr.Row():\n",
797
+ " with gr.Column():\n",
798
+ " inputs = [gr.TextArea(label = \"Enter initial text to generate tokens in Hindi\", lines = 10)]\n",
799
+ " generate_btn = gr.Button(value = 'Generate Text')\n",
800
+ " with gr.Column():\n",
801
+ " enc = gr.Textbox(label = \"Encoded Tokens\")\n",
802
+ " txt = gr.Textbox(label = \"Decoded Text from tokens\")\n",
803
+ " map = gr.Textbox(label = \"Mapping of the tokens and respective texts\")\n",
804
+ " outputs = [\n",
805
+ " enc,\n",
806
+ " txt,\n",
807
+ " map\n",
808
+ " ]\n",
809
+ " \n",
810
+ " generate_btn.click(fn = test_tokenizer, inputs= inputs, outputs = outputs)\n"
811
+ ]
812
+ },
813
+ {
814
+ "cell_type": "code",
815
+ "execution_count": 27,
816
+ "metadata": {},
817
+ "outputs": [
818
+ {
819
+ "name": "stdout",
820
+ "output_type": "stream",
821
+ "text": [
822
+ "Rerunning server... use `close()` to stop if you need to change `launch()` parameters.\n",
823
+ "----\n",
824
+ "Running on public URL: https://9ce8a9238acdc2d242.gradio.live\n",
825
+ "\n",
826
+ "This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)\n"
827
+ ]
828
+ },
829
+ {
830
+ "data": {
831
+ "text/html": [
832
+ "<div><iframe src=\"https://9ce8a9238acdc2d242.gradio.live\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
833
+ ],
834
+ "text/plain": [
835
+ "<IPython.core.display.HTML object>"
836
+ ]
837
+ },
838
+ "metadata": {},
839
+ "output_type": "display_data"
840
+ },
841
+ {
842
+ "data": {
843
+ "text/plain": []
844
+ },
845
+ "execution_count": 27,
846
+ "metadata": {},
847
+ "output_type": "execute_result"
848
+ }
849
+ ],
850
+ "source": [
851
+ "demo.launch(share=True)"
852
+ ]
853
+ },
854
+ {
855
+ "cell_type": "code",
856
+ "execution_count": null,
857
+ "metadata": {},
858
+ "outputs": [],
859
+ "source": [
860
+ "demo.close()"
861
+ ]
862
+ }
863
+ ],
864
+ "metadata": {
865
+ "kernelspec": {
866
+ "display_name": "torch_env",
867
+ "language": "python",
868
+ "name": "python3"
869
+ },
870
+ "language_info": {
871
+ "codemirror_mode": {
872
+ "name": "ipython",
873
+ "version": 3
874
+ },
875
+ "file_extension": ".py",
876
+ "mimetype": "text/x-python",
877
+ "name": "python",
878
+ "nbconvert_exporter": "python",
879
+ "pygments_lexer": "ipython3",
880
+ "version": "3.10.14"
881
+ }
882
+ },
883
+ "nbformat": 4,
884
+ "nbformat_minor": 2
885
+ }
notebooks/train_hindi.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
requirements.txt CHANGED
@@ -1,2 +1,2 @@
1
- joblib
2
- regex
 
1
+ regex==2024.5.15
2
+ numpy==1.19.3
tokenizer/__init__.py ADDED
File without changes
tokenizer/base.py ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Base class for Tokenizers that can train a vocabulary from text, encode and decode strings into lists of integers and back.
3
+ The Tokenizer can also save and load its model to/from disk.
4
+ """
5
+
6
+ from tokenizer.utils import render_token
7
+
8
+
9
+ class Tokenizer:
10
+ """Base class for Tokenizers"""
11
+
12
+ def __init__(self):
13
+ # default: vocab size of 256 (all bytes), no merges, no patterns
14
+ self.merges = {} # (int, int) -> int
15
+ self.pattern = "" # str
16
+ self.special_tokens = {} # str -> int, e.g. {'<|endoftext|>': 100257}
17
+ self.vocab = self._build_vocab() # int -> bytes
18
+
19
+ def train(self, text, vocab_size, verbose=False):
20
+ # Tokenizer can train a vocabulary of size vocab_size from text
21
+ raise NotImplementedError
22
+
23
+ def encode(self, text):
24
+ # Tokenizer can encode a string into a list of integers
25
+ raise NotImplementedError
26
+
27
+ def decode(self, ids):
28
+ # Tokenizer can decode a list of integers into a string
29
+ raise NotImplementedError
30
+
31
+ def _build_vocab(self):
32
+ # vocab is simply and deterministically derived from merges
33
+ vocab = {idx: bytes([idx]) for idx in range(256)}
34
+ for (p0, p1), idx in self.merges.items():
35
+ vocab[idx] = vocab[p0] + vocab[p1]
36
+ for special, idx in self.special_tokens.items():
37
+ vocab[idx] = special.encode("utf-8")
38
+ return vocab
39
+
40
+ def save(self, file_prefix):
41
+ """
42
+ Saves two files: file_prefix.vocab and file_prefix.model
43
+ This is inspired (but not equivalent to!) sentencepiece's model saving:
44
+ - model file is the critical one, intended for load()
45
+ - vocab file is just a pretty printed version for human inspection only
46
+ """
47
+ # write the model: to be used in load() later
48
+ model_file = file_prefix + ".model"
49
+ with open(model_file, "w") as f:
50
+ # write the version, pattern and merges, that's all that's needed
51
+ f.write("minbpe v1\n")
52
+ f.write(f"{self.pattern}\n")
53
+ # write the special tokens, first the number of them, then each one
54
+ f.write(f"{len(self.special_tokens)}\n")
55
+ for special, idx in self.special_tokens.items():
56
+ f.write(f"{special} {idx}\n")
57
+ # the merges dict
58
+ for idx1, idx2 in self.merges:
59
+ f.write(f"{idx1} {idx2}\n")
60
+ # write the vocab: for the human to look at
61
+ vocab_file = file_prefix + ".vocab"
62
+ inverted_merges = {idx: pair for pair, idx in self.merges.items()}
63
+ with open(vocab_file, "w", encoding="utf-8") as f:
64
+ for idx, token in self.vocab.items():
65
+ # note: many tokens may be partial utf-8 sequences
66
+ # and cannot be decoded into valid strings. Here we're using
67
+ # errors='replace' to replace them with the replacement char �.
68
+ # this also means that we couldn't possibly use .vocab in load()
69
+ # because decoding in this way is a lossy operation!
70
+ s = render_token(token)
71
+ # find the children of this token, if any
72
+ if idx in inverted_merges:
73
+ # if this token has children, render it nicely as a merge
74
+ idx0, idx1 = inverted_merges[idx]
75
+ s0 = render_token(self.vocab[idx0])
76
+ s1 = render_token(self.vocab[idx1])
77
+ f.write(f"[{s0}][{s1}] -> [{s}] {idx}\n")
78
+ else:
79
+ # otherwise this is leaf token, just print it
80
+ # (this should just be the first 256 tokens, the bytes)
81
+ f.write(f"[{s}] {idx}\n")
82
+
83
+ def load(self, model_file):
84
+ """Inverse of save() but only for the model file"""
85
+ assert model_file.endswith(".model")
86
+ # read the model file
87
+ merges = {}
88
+ special_tokens = {}
89
+ idx = 256
90
+ with open(model_file, "r", encoding="utf-8") as f:
91
+ # read the version
92
+ version = f.readline().strip()
93
+ assert version == "minbpe v1"
94
+ # read the pattern
95
+ self.pattern = f.readline().strip()
96
+ # read the special tokens
97
+ num_special = int(f.readline().strip())
98
+ for _ in range(num_special):
99
+ special, special_idx = f.readline().strip().split()
100
+ special_tokens[special] = int(special_idx)
101
+ # read the merges
102
+ for line in f:
103
+ idx1, idx2 = map(int, line.split())
104
+ merges[(idx1, idx2)] = idx
105
+ idx += 1
106
+ self.merges = merges
107
+ self.special_tokens = special_tokens
108
+ self.vocab = self._build_vocab()
tokenizer/basic_bpe.py ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Basic Byte Pair Encoding (BPE) tokenizer. This is a simple tokenizer that can be trained on a text and then used to encode and decode strings.
3
+ The training process is based on the BPE algorithm, which merges the most common pairs of tokens iteratively to create new tokens.
4
+ The tokenizer can be saved to disk and loaded back later. The vocabulary and merges can be inspected in human-readable form.
5
+ No handling of special tokens or regex patterns.
6
+ """
7
+
8
+ from tokenizer.utils import get_stats, merge
9
+ from tokenizer.base import Tokenizer
10
+
11
+
12
+ class BasicTokenizer(Tokenizer):
13
+
14
+ def __init__(self):
15
+ super().__init__()
16
+
17
+ def train(self, text, vocab_size, verbose=False):
18
+ assert vocab_size >= 256
19
+ num_merges = vocab_size - 256
20
+
21
+ # input text preprocessing
22
+ text_bytes = text.encode("utf-8") # raw bytes
23
+ ids = list(text_bytes) # list of integers in range 0..255
24
+
25
+ # iteratively merge the most common pairs to create new tokens
26
+ merges = {} # (int, int) -> int
27
+ vocab = {idx: bytes([idx]) for idx in range(256)} # int -> bytes
28
+ for i in range(num_merges):
29
+ # count up the number of times every consecutive pair appears
30
+ stats = get_stats(ids)
31
+ # find the pair with the highest count
32
+ pair = max(stats, key=stats.get)
33
+ # mint a new token: assign it the next available id
34
+ idx = 256 + i
35
+ # replace all occurrences of pair in ids with idx
36
+ ids = merge(ids, pair, idx)
37
+ # save the merge
38
+ merges[pair] = idx
39
+ vocab[idx] = vocab[pair[0]] + vocab[pair[1]]
40
+ # prints
41
+ if verbose:
42
+ print(
43
+ f"merge {i+1}/{num_merges}: {pair} -> {idx} ({vocab[idx]}) had {stats[pair]} occurrences"
44
+ )
45
+
46
+ # save class variables
47
+ self.merges = merges # used in encode()
48
+ self.vocab = vocab # used in decode()
49
+
50
+ def decode(self, ids):
51
+ # given ids (list of integers), return Python string
52
+ text_bytes = b"".join(self.vocab[idx] for idx in ids)
53
+ text = text_bytes.decode("utf-8", errors="replace")
54
+ return text
55
+
56
+ def encode(self, text):
57
+ # given a string text, return the token ids
58
+ text_bytes = text.encode("utf-8") # raw bytes
59
+ ids = list(text_bytes) # list of integers in range 0..255
60
+ while len(ids) >= 2:
61
+ # find the pair with the lowest merge index
62
+ stats = get_stats(ids)
63
+ pair = min(stats, key=lambda p: self.merges.get(p, float("inf")))
64
+ # subtle: if there are no more merges available, the key will
65
+ # result in an inf for every single pair, and the min will be
66
+ # just the first pair in the list, arbitrarily
67
+ # we can detect this terminating case by a membership check
68
+ if pair not in self.merges:
69
+ break # nothing else can be merged anymore
70
+ # otherwise let's merge the best pair (lowest merge index)
71
+ idx = self.merges[pair]
72
+ ids = merge(ids, pair, idx)
73
+ return ids
tokenizer/regex_bpe.py ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Minimal (byte-level) Byte Pair Encoding tokenizer.
3
+
4
+ Algorithmically follows along the GPT tokenizer:
5
+ https://github.com/openai/gpt-2/blob/master/src/encoder.py
6
+
7
+ Unlike BasicTokenizer:
8
+ - RegexTokenizer handles an optional regex splitting pattern.
9
+ - RegexTokenizer handles optional special tokens.
10
+ """
11
+
12
+ import regex as re
13
+ from tokenizer.utils import get_stats, merge
14
+ from tokenizer.base import Tokenizer
15
+
16
+ # Regex split
17
+ GPT2_SPLIT_PATTERN = (
18
+ r"""'(?:[sdmt]|ll|ve|re)| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+"""
19
+ )
20
+ GPT4_SPLIT_PATTERN = r"""'(?i:[sdmt]|ll|ve|re)|[^\r\n\p{L}\p{N}]?+\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]++[\r\n]*|\s*[\r\n]|\s+(?!\S)|\s+"""
21
+
22
+
23
+ class RegexTokenizer(Tokenizer):
24
+
25
+ def __init__(self, pattern=None):
26
+ """
27
+ - pattern: optional string to override the default (GPT-4 split pattern)
28
+ - special_tokens: str -> int dictionary of special tokens
29
+ example: {'<|endoftext|>': 100257}
30
+ """
31
+ super().__init__()
32
+ self.pattern = GPT4_SPLIT_PATTERN if pattern is None else pattern
33
+ self.compiled_pattern = re.compile(self.pattern)
34
+ self.special_tokens = {}
35
+ self.inverse_special_tokens = {}
36
+
37
+ def train(self, text, vocab_size, verbose=False):
38
+ assert vocab_size >= 256
39
+ num_merges = vocab_size - 256
40
+
41
+ # split the text up into text chunks
42
+ text_chunks = re.findall(self.compiled_pattern, text)
43
+
44
+ # input text preprocessing
45
+ ids = [list(ch.encode("utf-8")) for ch in text_chunks]
46
+
47
+ # iteratively merge the most common pairs to create new tokens
48
+ merges = {} # (int, int) -> int
49
+ vocab = {idx: bytes([idx]) for idx in range(256)} # idx -> bytes
50
+ for i in range(num_merges):
51
+ # count the number of times every consecutive pair appears
52
+ stats = {}
53
+ for chunk_ids in ids:
54
+ # passing in stats will update it in place, adding up counts
55
+ get_stats(chunk_ids, stats)
56
+ # find the pair with the highest count
57
+ pair = max(stats, key=stats.get)
58
+ # mint a new token: assign it the next available id
59
+ idx = 256 + i
60
+ # replace all occurrences of pair in ids with idx
61
+ ids = [merge(chunk_ids, pair, idx) for chunk_ids in ids]
62
+ # save the merge
63
+ merges[pair] = idx
64
+ vocab[idx] = vocab[pair[0]] + vocab[pair[1]]
65
+ # prints
66
+ if verbose:
67
+ print(
68
+ f"merge {i+1}/{num_merges}: {pair} -> {idx} ({vocab[idx]}) had {stats[pair]} occurrences"
69
+ )
70
+
71
+ # save class variables
72
+ self.merges = merges # used in encode()
73
+ self.vocab = vocab # used in decode()
74
+
75
+ def register_special_tokens(self, special_tokens):
76
+ # special_tokens is a dictionary of str -> int
77
+ # example: {"<|endoftext|>": 100257}
78
+ self.special_tokens = special_tokens
79
+ self.inverse_special_tokens = {v: k for k, v in special_tokens.items()}
80
+
81
+ def decode(self, ids):
82
+ # given ids (list of integers), return Python string
83
+ part_bytes = []
84
+ for idx in ids:
85
+ if idx in self.vocab:
86
+ part_bytes.append(self.vocab[idx])
87
+ elif idx in self.inverse_special_tokens:
88
+ part_bytes.append(self.inverse_special_tokens[idx].encode("utf-8"))
89
+ else:
90
+ raise ValueError(f"invalid token id: {idx}")
91
+ text_bytes = b"".join(part_bytes)
92
+ text = text_bytes.decode("utf-8", errors="replace")
93
+ return text
94
+
95
+ def _encode_chunk(self, text_bytes):
96
+ # return the token ids
97
+ # let's begin. first, convert all bytes to integers in range 0..255
98
+ ids = list(text_bytes)
99
+ while len(ids) >= 2:
100
+ # find the pair with the lowest merge index
101
+ stats = get_stats(ids)
102
+ pair = min(stats, key=lambda p: self.merges.get(p, float("inf")))
103
+ # subtle: if there are no more merges available, the key will
104
+ # result in an inf for every single pair, and the min will be
105
+ # just the first pair in the list, arbitrarily
106
+ # we can detect this terminating case by a membership check
107
+ if pair not in self.merges:
108
+ break # nothing else can be merged anymore
109
+ # otherwise let's merge the best pair (lowest merge index)
110
+ idx = self.merges[pair]
111
+ ids = merge(ids, pair, idx)
112
+ return ids
113
+
114
+ def encode_ordinary(self, text):
115
+ """Encoding that ignores any special tokens."""
116
+ # split text into chunks of text by categories defined in regex pattern
117
+ text_chunks = re.findall(self.compiled_pattern, text)
118
+ # all chunks of text are encoded separately, then results are joined
119
+ ids = []
120
+ for chunk in text_chunks:
121
+ chunk_bytes = chunk.encode("utf-8") # raw bytes
122
+ chunk_ids = self._encode_chunk(chunk_bytes)
123
+ ids.extend(chunk_ids)
124
+ return ids
125
+
126
+ def encode(self, text, allowed_special="none_raise"):
127
+ """
128
+ Unlike encode_ordinary, this function handles special tokens.
129
+ allowed_special: can be "all"|"none"|"none_raise" or a custom set of special tokens
130
+ if none_raise, then an error is raised if any special token is encountered in text
131
+ this is the default tiktoken behavior right now as well
132
+ any other behavior is either annoying, or a major footgun
133
+ """
134
+ # decode the user desire w.r.t. handling of special tokens
135
+ special = None
136
+ if allowed_special == "all":
137
+ special = self.special_tokens
138
+ elif allowed_special == "none":
139
+ special = {}
140
+ elif allowed_special == "none_raise":
141
+ special = {}
142
+ assert all(token not in text for token in self.special_tokens)
143
+ elif isinstance(allowed_special, set):
144
+ special = {
145
+ k: v for k, v in self.special_tokens.items() if k in allowed_special
146
+ }
147
+ else:
148
+ raise ValueError(f"allowed_special={allowed_special} not understood")
149
+ if not special:
150
+ # shortcut: if no special tokens, just use the ordinary encoding
151
+ return self.encode_ordinary(text)
152
+ # otherwise, we have to be careful with potential special tokens in text
153
+ # we handle special tokens by splitting the text
154
+ # based on the occurrence of any exact match with any of the special tokens
155
+ # we can use re.split for this. note that surrounding the pattern with ()
156
+ # makes it into a capturing group, so the special tokens will be included
157
+ special_pattern = "(" + "|".join(re.escape(k) for k in special) + ")"
158
+ special_chunks = re.split(special_pattern, text)
159
+ # now all the special characters are separated from the rest of the text
160
+ # all chunks of text are encoded separately, then results are joined
161
+ ids = []
162
+ for part in special_chunks:
163
+ if part in special:
164
+ # this is a special token, encode it separately as a special case
165
+ ids.append(special[part])
166
+ else:
167
+ # this is an ordinary sequence, encode it normally
168
+ ids.extend(self.encode_ordinary(part))
169
+ return ids
tokenizer/utils.py ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Some utility functions for the tokenizer (Basic and Regex)
3
+ """
4
+
5
+ import unicodedata
6
+
7
+
8
+ def get_stats(ids, counts=None):
9
+ """
10
+ Given a list of integers, return a dictionary of counts of consecutive pairs
11
+ Example: [1, 2, 3, 1, 2] -> {(1, 2): 2, (2, 3): 1, (3, 1): 1}
12
+ Optionally allows to update an existing dictionary of counts
13
+ """
14
+ counts = {} if counts is None else counts
15
+ for pair in zip(ids, ids[1:]): # iterate consecutive elements
16
+ counts[pair] = counts.get(pair, 0) + 1
17
+ return counts
18
+
19
+
20
+ def merge(ids, pair, idx):
21
+ """
22
+ In the list of integers (ids), replace all consecutive occurrences
23
+ of pair with the new integer token idx
24
+ Example: ids=[1, 2, 3, 1, 2], pair=(1, 2), idx=4 -> [4, 3, 4]
25
+ """
26
+ newids = []
27
+ i = 0
28
+ while i < len(ids):
29
+ # if not at the very last position AND the pair matches, replace it
30
+ if ids[i] == pair[0] and i < len(ids) - 1 and ids[i + 1] == pair[1]:
31
+ newids.append(idx)
32
+ i += 2
33
+ else:
34
+ newids.append(ids[i])
35
+ i += 1
36
+ return newids
37
+
38
+
39
+ def replace_control_characters(s: str) -> str:
40
+ """Replace control characters in a string with their unicode escape"""
41
+ chars = []
42
+ for ch in s:
43
+ if unicodedata.category(ch)[0] != "C":
44
+ chars.append(ch) # this character is ok
45
+ else:
46
+ chars.append(f"\\u{ord(ch):04x}") # escape
47
+ return "".join(chars)
48
+
49
+
50
+ def render_token(t: bytes) -> str:
51
+ """Pretty print a token, escaping control characters"""
52
+ # pretty print a token, escaping control characters
53
+ s = t.decode("utf-8", errors="replace")
54
+ s = replace_control_characters(s)
55
+ return s
tokenizer_model/hindi_sentiments_basic.model ADDED
@@ -0,0 +1,4747 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ minbpe v1
2
+
3
+ 0
4
+ 224 164
5
+ 32 256
6
+ 224 165
7
+ 256 190
8
+ 258 135
9
+ 256 176
10
+ 258 128
11
+ 258 141
12
+ 257 149
13
+ 256 191
14
+ 256 130
15
+ 259 256
16
+ 263 256
17
+ 265 256
18
+ 260 257
19
+ 262 257
20
+ 258 139
21
+ 256 168
22
+ 256 149
23
+ 258 136
24
+ 261 257
25
+ 259 257
26
+ 185 275
27
+ 256 185
28
+ 256 164
29
+ 10 36
30
+ 266 257
31
+ 256 184
32
+ 256 174
33
+ 256 178
34
+ 269 178
35
+ 258 129
36
+ 266 256
37
+ 174 260
38
+ 268 174
39
+ 258 130
40
+ 257 184
41
+ 286 290
42
+ 264 270
43
+ 289 282
44
+ 281 256
45
+ 272 257
46
+ 256 166
47
+ 263 261
48
+ 171 293
49
+ 258 164
50
+ 264 271
51
+ 256 170
52
+ 267 168
53
+ 148 276
54
+ 260 256
55
+ 259 261
56
+ 256 151
57
+ 256 175
58
+ 261 268
59
+ 257 168
60
+ 277 278
61
+ 287 256
62
+ 257 278
63
+ 272 266
64
+ 279 262
65
+ 256 156
66
+ 257 170
67
+ 268 175
68
+ 271 278
69
+ 257 295
70
+ 264 297
71
+ 256 172
72
+ 269 175
73
+ 257 172
74
+ 226 128
75
+ 264 277
76
+ 267 164
77
+ 257 166
78
+ 256 181
79
+ 257 156
80
+ 268 159
81
+ 256 159
82
+ 257 305
83
+ 259 276
84
+ 316 282
85
+ 257 300
86
+ 257 133
87
+ 257 185
88
+ 256 182
89
+ 256 154
90
+ 273 270
91
+ 137 273
92
+ 135 283
93
+ 262 264
94
+ 256 188
95
+ 269 168
96
+ 288 151
97
+ 260 264
98
+ 257 176
99
+ 267 181
100
+ 256 161
101
+ 267 175
102
+ 256 173
103
+ 260 274
104
+ 272 282
105
+ 267 178
106
+ 270 278
107
+ 269 149
108
+ 257 178
109
+ 257 174
110
+ 265 261
111
+ 269 164
112
+ 326 141
113
+ 263 364
114
+ 267 166
115
+ 143 274
116
+ 256 136
117
+ 268 164
118
+ 264 261
119
+ 292 270
120
+ 267 149
121
+ 358 266
122
+ 258 137
123
+ 301 32
124
+ 306 182
125
+ 257 164
126
+ 184 270
127
+ 267 174
128
+ 257 181
129
+ 269 184
130
+ 280 320
131
+ 352 346
132
+ 262 273
133
+ 170 299
134
+ 173 271
135
+ 175 279
136
+ 267 156
137
+ 291 261
138
+ 258 140
139
+ 288 166
140
+ 279 304
141
+ 32 44
142
+ 268 149
143
+ 256 171
144
+ 267 184
145
+ 259 264
146
+ 257 151
147
+ 267 185
148
+ 280 312
149
+ 262 280
150
+ 258 131
151
+ 311 336
152
+ 343 274
153
+ 306 150
154
+ 133 303
155
+ 313 155
156
+ 257 150
157
+ 266 264
158
+ 170 276
159
+ 256 150
160
+ 273 271
161
+ 294 172
162
+ 261 264
163
+ 310 182
164
+ 269 143
165
+ 266 283
166
+ 362 298
167
+ 268 184
168
+ 268 185
169
+ 310 166
170
+ 10 296
171
+ 280 373
172
+ 281 257
173
+ 356 295
174
+ 168 336
175
+ 272 285
176
+ 314 266
177
+ 267 143
178
+ 273 260
179
+ 267 135
180
+ 324 312
181
+ 294 184
182
+ 269 150
183
+ 288 159
184
+ 176 279
185
+ 168 270
186
+ 273 277
187
+ 340 319
188
+ 415 274
189
+ 341 268
190
+ 258 158
191
+ 283 270
192
+ 10 281
193
+ 311 270
194
+ 291 323
195
+ 267 165
196
+ 271 184
197
+ 315 322
198
+ 268 178
199
+ 257 289
200
+ 269 182
201
+ 257 173
202
+ 262 274
203
+ 267 172
204
+ 343 420
205
+ 402 439
206
+ 287 285
207
+ 355 347
208
+ 271 300
209
+ 280 277
210
+ 318 299
211
+ 268 181
212
+ 260 282
213
+ 264 272
214
+ 442 293
215
+ 257 134
216
+ 178 308
217
+ 260 279
218
+ 262 32
219
+ 256 163
220
+ 294 178
221
+ 185 272
222
+ 265 421
223
+ 261 279
224
+ 185 271
225
+ 256 143
226
+ 280 270
227
+ 328 320
228
+ 354 351
229
+ 271 305
230
+ 257 171
231
+ 441 155
232
+ 418 307
233
+ 474 376
234
+ 268 166
235
+ 257 344
236
+ 318 276
237
+ 392 271
238
+ 265 348
239
+ 314 296
240
+ 264 432
241
+ 288 156
242
+ 271 164
243
+ 324 259
244
+ 259 288
245
+ 394 299
246
+ 355 332
247
+ 291 284
248
+ 354 347
249
+ 257 182
250
+ 291 298
251
+ 267 136
252
+ 257 161
253
+ 287 261
254
+ 316 266
255
+ 144 283
256
+ 339 272
257
+ 264 265
258
+ 284 317
259
+ 285 372
260
+ 281 274
261
+ 257 367
262
+ 317 502
263
+ 260 284
264
+ 272 276
265
+ 260 32
266
+ 267 171
267
+ 350 279
268
+ 360 459
269
+ 281 283
270
+ 456 315
271
+ 257 154
272
+ 257 137
273
+ 472 416
274
+ 277 184
275
+ 269 181
276
+ 298 335
277
+ 315 302
278
+ 287 298
279
+ 266 280
280
+ 348 401
281
+ 256 167
282
+ 485 274
283
+ 272 308
284
+ 259 32
285
+ 312 296
286
+ 283 369
287
+ 272 341
288
+ 365 284
289
+ 287 274
290
+ 258 156
291
+ 170 261
292
+ 338 303
293
+ 279 285
294
+ 294 176
295
+ 269 170
296
+ 326 153
297
+ 276 134
298
+ 269 173
299
+ 277 151
300
+ 288 181
301
+ 148 414
302
+ 133 483
303
+ 264 407
304
+ 264 345
305
+ 314 281
306
+ 268 183
307
+ 257 386
308
+ 262 284
309
+ 257 135
310
+ 337 321
311
+ 353 261
312
+ 314 301
313
+ 256 157
314
+ 510 516
315
+ 256 162
316
+ 433 447
317
+ 166 440
318
+ 166 434
319
+ 267 182
320
+ 333 274
321
+ 286 540
322
+ 272 383
323
+ 273 349
324
+ 262 302
325
+ 264 349
326
+ 262 309
327
+ 185 313
328
+ 267 170
329
+ 287 273
330
+ 360 308
331
+ 284 261
332
+ 552 366
333
+ 406 412
334
+ 304 270
335
+ 351 514
336
+ 315 294
337
+ 256 165
338
+ 287 280
339
+ 269 159
340
+ 326 152
341
+ 306 156
342
+ 334 184
343
+ 522 342
344
+ 329 457
345
+ 133 500
346
+ 133 273
347
+ 262 261
348
+ 280 261
349
+ 325 273
350
+ 306 159
351
+ 277 172
352
+ 389 280
353
+ 268 182
354
+ 267 147
355
+ 567 346
356
+ 327 184
357
+ 405 274
358
+ 271 172
359
+ 266 274
360
+ 164 297
361
+ 270 410
362
+ 268 170
363
+ 272 261
364
+ 267 151
365
+ 319 366
366
+ 375 422
367
+ 375 296
368
+ 374 285
369
+ 277 156
370
+ 302 156
371
+ 291 303
372
+ 385 480
373
+ 272 340
374
+ 181 279
375
+ 283 261
376
+ 272 273
377
+ 605 273
378
+ 271 378
379
+ 256 183
380
+ 511 307
381
+ 270 184
382
+ 288 161
383
+ 32 39
384
+ 451 409
385
+ 133 285
386
+ 174 286
387
+ 302 184
388
+ 413 587
389
+ 288 154
390
+ 262 285
391
+ 265 391
392
+ 257 387
393
+ 280 259
394
+ 265 276
395
+ 377 274
396
+ 377 297
397
+ 32 466
398
+ 375 444
399
+ 317 549
400
+ 279 273
401
+ 264 276
402
+ 339 271
403
+ 329 440
404
+ 551 309
405
+ 289 409
406
+ 275 274
407
+ 301 296
408
+ 306 181
409
+ 418 335
410
+ 498 276
411
+ 497 547
412
+ 185 297
413
+ 170 328
414
+ 331 297
415
+ 269 174
416
+ 270 378
417
+ 262 294
418
+ 494 475
419
+ 166 457
420
+ 257 165
421
+ 322 172
422
+ 413 366
423
+ 404 270
424
+ 344 337
425
+ 137 283
426
+ 166 405
427
+ 181 357
428
+ 279 261
429
+ 170 389
430
+ 663 332
431
+ 365 309
432
+ 170 545
433
+ 301 422
434
+ 300 321
435
+ 151 368
436
+ 266 281
437
+ 284 260
438
+ 406 342
439
+ 257 175
440
+ 363 299
441
+ 277 305
442
+ 319 291
443
+ 272 333
444
+ 427 321
445
+ 269 166
446
+ 173 351
447
+ 423 296
448
+ 173 499
449
+ 339 313
450
+ 275 583
451
+ 271 295
452
+ 271 156
453
+ 172 469
454
+ 435 261
455
+ 266 296
456
+ 284 565
457
+ 267 167
458
+ 274 332
459
+ 382 296
460
+ 361 286
461
+ 284 464
462
+ 257 155
463
+ 308 276
464
+ 260 273
465
+ 272 264
466
+ 280 262
467
+ 269 156
468
+ 617 277
469
+ 274 276
470
+ 317 279
471
+ 404 271
472
+ 271 168
473
+ 274 558
474
+ 287 284
475
+ 272 284
476
+ 280 265
477
+ 291 285
478
+ 292 274
479
+ 273 534
480
+ 257 507
481
+ 259 302
482
+ 446 283
483
+ 291 276
484
+ 318 261
485
+ 304 260
486
+ 171 573
487
+ 313 161
488
+ 301 281
489
+ 311 506
490
+ 174 273
491
+ 274 369
492
+ 260 283
493
+ 398 368
494
+ 652 280
495
+ 292 332
496
+ 261 454
497
+ 312 281
498
+ 172 273
499
+ 154 399
500
+ 279 590
501
+ 497 384
502
+ 597 309
503
+ 154 285
504
+ 700 359
505
+ 313 150
506
+ 271 170
507
+ 400 281
508
+ 539 274
509
+ 329 260
510
+ 257 159
511
+ 329 405
512
+ 331 479
513
+ 544 412
514
+ 428 296
515
+ 342 679
516
+ 496 167
517
+ 734 604
518
+ 262 322
519
+ 256 160
520
+ 277 166
521
+ 44 520
522
+ 563 662
523
+ 275 443
524
+ 370 382
525
+ 706 330
526
+ 777 285
527
+ 262 341
528
+ 390 276
529
+ 302 164
530
+ 339 297
531
+ 269 183
532
+ 260 280
533
+ 288 172
534
+ 350 411
535
+ 271 437
536
+ 264 489
537
+ 272 283
538
+ 168 362
539
+ 287 303
540
+ 580 273
541
+ 330 455
542
+ 275 283
543
+ 168 651
544
+ 144 710
545
+ 272 368
546
+ 291 310
547
+ 279 283
548
+ 569 449
549
+ 748 668
550
+ 300 327
551
+ 176 411
552
+ 264 284
553
+ 276 184
554
+ 266 32
555
+ 600 384
556
+ 268 161
557
+ 546 623
558
+ 462 480
559
+ 266 301
560
+ 310 156
561
+ 32 264
562
+ 264 566
563
+ 318 389
564
+ 411 446
565
+ 550 353
566
+ 596 425
567
+ 273 578
568
+ 403 278
569
+ 260 45
570
+ 259 417
571
+ 151 401
572
+ 606 266
573
+ 468 400
574
+ 262 327
575
+ 262 298
576
+ 284 304
577
+ 272 303
578
+ 356 410
579
+ 259 611
580
+ 307 471
581
+ 260 285
582
+ 283 276
583
+ 318 328
584
+ 316 409
585
+ 268 165
586
+ 310 183
587
+ 181 319
588
+ 282 305
589
+ 390 261
590
+ 359 285
591
+ 271 185
592
+ 45 283
593
+ 181 452
594
+ 289 746
595
+ 408 304
596
+ 395 285
597
+ 579 136
598
+ 257 143
599
+ 134 280
600
+ 367 629
601
+ 270 156
602
+ 303 274
603
+ 331 328
604
+ 302 172
605
+ 354 271
606
+ 271 426
607
+ 272 292
608
+ 809 321
609
+ 546 696
610
+ 275 273
611
+ 174 390
612
+ 301 380
613
+ 465 292
614
+ 292 323
615
+ 325 335
616
+ 572 589
617
+ 398 477
618
+ 393 520
619
+ 492 296
620
+ 413 779
621
+ 266 279
622
+ 261 290
623
+ 272 279
624
+ 615 493
625
+ 270 172
626
+ 184 284
627
+ 257 553
628
+ 135 273
629
+ 320 296
630
+ 176 727
631
+ 625 452
632
+ 278 281
633
+ 342 295
634
+ 511 335
635
+ 271 174
636
+ 264 392
637
+ 268 168
638
+ 258 155
639
+ 347 515
640
+ 345 284
641
+ 272 274
642
+ 306 151
643
+ 524 283
644
+ 277 295
645
+ 309 535
646
+ 277 168
647
+ 482 573
648
+ 370 423
649
+ 346 293
650
+ 162 348
651
+ 353 285
652
+ 301 337
653
+ 796 490
654
+ 495 282
655
+ 606 282
656
+ 264 632
657
+ 315 327
658
+ 263 276
659
+ 400 296
660
+ 166 260
661
+ 307 280
662
+ 262 44
663
+ 257 160
664
+ 334 168
665
+ 284 363
666
+ 338 500
667
+ 431 284
668
+ 133 533
669
+ 355 419
670
+ 345 883
671
+ 283 348
672
+ 262 330
673
+ 264 484
674
+ 338 298
675
+ 441 154
676
+ 277 437
677
+ 387 337
678
+ 302 170
679
+ 338 285
680
+ 277 170
681
+ 381 419
682
+ 299 518
683
+ 259 327
684
+ 306 161
685
+ 324 656
686
+ 262 283
687
+ 270 295
688
+ 267 159
689
+ 277 436
690
+ 628 356
691
+ 166 284
692
+ 287 538
693
+ 375 281
694
+ 144 443
695
+ 269 155
696
+ 135 778
697
+ 397 265
698
+ 181 270
699
+ 137 303
700
+ 725 309
701
+ 268 167
702
+ 265 873
703
+ 579 143
704
+ 456 464
705
+ 137 298
706
+ 526 274
707
+ 313 182
708
+ 154 692
709
+ 292 261
710
+ 274 335
711
+ 258 343
712
+ 356 378
713
+ 164 274
714
+ 303 299
715
+ 286 268
716
+ 331 284
717
+ 340 357
718
+ 171 646
719
+ 292 349
720
+ 259 322
721
+ 176 388
722
+ 276 172
723
+ 353 298
724
+ 166 286
725
+ 530 486
726
+ 338 483
727
+ 262 296
728
+ 331 261
729
+ 496 154
730
+ 274 383
731
+ 271 344
732
+ 684 270
733
+ 372 307
734
+ 902 371
735
+ 280 369
736
+ 790 571
737
+ 315 640
738
+ 374 308
739
+ 947 285
740
+ 261 32
741
+ 156 720
742
+ 431 261
743
+ 284 273
744
+ 274 307
745
+ 331 323
746
+ 264 726
747
+ 334 172
748
+ 373 296
749
+ 272 542
750
+ 701 143
751
+ 257 167
752
+ 261 471
753
+ 374 284
754
+ 45 274
755
+ 267 183
756
+ 280 358
757
+ 280 260
758
+ 300 294
759
+ 421 613
760
+ 280 276
761
+ 677 274
762
+ 481 184
763
+ 350 388
764
+ 470 466
765
+ 265 310
766
+ 430 327
767
+ 259 281
768
+ 535 934
769
+ 278 296
770
+ 264 397
771
+ 259 282
772
+ 317 323
773
+ 304 277
774
+ 705 807
775
+ 310 165
776
+ 264 379
777
+ 133 298
778
+ 150 396
779
+ 313 159
780
+ 637 308
781
+ 375 10
782
+ 32 292
783
+ 291 333
784
+ 311 836
785
+ 465 368
786
+ 182 399
787
+ 428 281
788
+ 269 154
789
+ 334 174
790
+ 798 163
791
+ 154 469
792
+ 1043 261
793
+ 134 309
794
+ 260 281
795
+ 283 614
796
+ 782 156
797
+ 844 532
798
+ 311 309
799
+ 154 261
800
+ 178 355
801
+ 402 631
802
+ 318 545
803
+ 322 155
804
+ 271 849
805
+ 377 801
806
+ 277 825
807
+ 330 262
808
+ 304 528
809
+ 304 271
810
+ 751 416
811
+ 259 294
812
+ 359 299
813
+ 460 321
814
+ 313 183
815
+ 473 308
816
+ 45 731
817
+ 168 309
818
+ 307 332
819
+ 178 853
820
+ 429 282
821
+ 333 273
822
+ 374 310
823
+ 306 175
824
+ 298 307
825
+ 288 170
826
+ 332 299
827
+ 393 331
828
+ 376 273
829
+ 270 305
830
+ 166 942
831
+ 278 266
832
+ 173 330
833
+ 259 301
834
+ 694 317
835
+ 709 832
836
+ 333 332
837
+ 342 468
838
+ 261 302
839
+ 133 323
840
+ 504 774
841
+ 345 489
842
+ 428 301
843
+ 903 990
844
+ 312 301
845
+ 32 45
846
+ 381 271
847
+ 451 806
848
+ 185 599
849
+ 673 816
850
+ 185 276
851
+ 292 384
852
+ 324 285
853
+ 173 913
854
+ 294 174
855
+ 284 486
856
+ 487 274
857
+ 150 446
858
+ 374 274
859
+ 287 391
860
+ 271 159
861
+ 554 670
862
+ 337 327
863
+ 823 1049
864
+ 783 309
865
+ 380 270
866
+ 303 450
867
+ 300 302
868
+ 288 167
869
+ 423 281
870
+ 353 308
871
+ 176 760
872
+ 313 181
873
+ 134 411
874
+ 172 752
875
+ 408 769
876
+ 156 261
877
+ 285 459
878
+ 380 279
879
+ 291 627
880
+ 345 484
881
+ 609 1068
882
+ 372 276
883
+ 277 181
884
+ 931 308
885
+ 271 151
886
+ 338 308
887
+ 361 273
888
+ 185 417
889
+ 344 274
890
+ 262 281
891
+ 182 1060
892
+ 544 342
893
+ 182 299
894
+ 310 184
895
+ 270 170
896
+ 309 396
897
+ 276 166
898
+ 277 174
899
+ 488 172
900
+ 303 735
901
+ 291 283
902
+ 408 446
903
+ 365 279
904
+ 397 407
905
+ 261 274
906
+ 882 981
907
+ 291 274
908
+ 173 261
909
+ 300 322
910
+ 330 273
911
+ 317 333
912
+ 264 336
913
+ 171 591
914
+ 505 291
915
+ 637 351
916
+ 620 527
917
+ 1168 739
918
+ 450 919
919
+ 755 478
920
+ 181 722
921
+ 135 284
922
+ 185 381
923
+ 261 298
924
+ 133 391
925
+ 560 363
926
+ 385 280
927
+ 261 388
928
+ 273 328
929
+ 274 838
930
+ 374 309
931
+ 303 1042
932
+ 799 396
933
+ 257 675
934
+ 478 955
935
+ 742 876
936
+ 781 475
937
+ 261 395
938
+ 306 172
939
+ 453 351
940
+ 338 531
941
+ 460 588
942
+ 311 349
943
+ 137 600
944
+ 575 922
945
+ 512 407
946
+ 583 304
947
+ 133 952
948
+ 1051 692
949
+ 1053 268
950
+ 273 454
951
+ 312 424
952
+ 926 1122
953
+ 257 148
954
+ 268 154
955
+ 273 391
956
+ 311 534
957
+ 307 271
958
+ 269 151
959
+ 292 284
960
+ 172 372
961
+ 356 305
962
+ 184 584
963
+ 382 281
964
+ 689 435
965
+ 753 1118
966
+ 347 420
967
+ 967 295
968
+ 543 395
969
+ 458 712
970
+ 1017 171
971
+ 586 295
972
+ 44 666
973
+ 45 323
974
+ 46 46
975
+ 133 317
976
+ 308 273
977
+ 151 304
978
+ 429 308
979
+ 161 774
980
+ 261 294
981
+ 608 532
982
+ 283 357
983
+ 309 455
984
+ 661 295
985
+ 261 324
986
+ 283 319
987
+ 369 335
988
+ 298 304
989
+ 168 817
990
+ 415 273
991
+ 365 333
992
+ 624 363
993
+ 276 295
994
+ 319 304
995
+ 940 274
996
+ 1247 578
997
+ 430 525
998
+ 171 901
999
+ 1029 985
1000
+ 331 775
1001
+ 276 305
1002
+ 863 514
1003
+ 625 273
1004
+ 365 280
1005
+ 137 285
1006
+ 323 388
1007
+ 152 1073
1008
+ 315 556
1009
+ 184 682
1010
+ 272 317
1011
+ 133 354
1012
+ 271 166
1013
+ 260 435
1014
+ 292 708
1015
+ 267 173
1016
+ 290 328
1017
+ 279 284
1018
+ 278 301
1019
+ 257 595
1020
+ 264 368
1021
+ 793 741
1022
+ 813 517
1023
+ 275 771
1024
+ 135 280
1025
+ 394 280
1026
+ 436 745
1027
+ 660 722
1028
+ 406 575
1029
+ 44 331
1030
+ 396 332
1031
+ 314 424
1032
+ 309 273
1033
+ 433 379
1034
+ 276 437
1035
+ 45 303
1036
+ 259 531
1037
+ 324 277
1038
+ 780 410
1039
+ 310 149
1040
+ 325 328
1041
+ 350 760
1042
+ 260 298
1043
+ 291 273
1044
+ 279 317
1045
+ 918 309
1046
+ 404 448
1047
+ 506 1006
1048
+ 1299 336
1049
+ 185 284
1050
+ 275 309
1051
+ 268 151
1052
+ 920 359
1053
+ 288 173
1054
+ 597 784
1055
+ 369 515
1056
+ 1307 357
1057
+ 184 848
1058
+ 1055 291
1059
+ 168 534
1060
+ 577 484
1061
+ 168 379
1062
+ 175 366
1063
+ 492 281
1064
+ 325 469
1065
+ 767 270
1066
+ 538 590
1067
+ 462 515
1068
+ 1064 284
1069
+ 508 430
1070
+ 697 319
1071
+ 373 281
1072
+ 307 262
1073
+ 522 575
1074
+ 260 417
1075
+ 1069 792
1076
+ 273 889
1077
+ 182 975
1078
+ 134 854
1079
+ 259 266
1080
+ 150 769
1081
+ 1074 289
1082
+ 494 297
1083
+ 302 687
1084
+ 309 329
1085
+ 431 333
1086
+ 308 279
1087
+ 398 309
1088
+ 737 327
1089
+ 313 172
1090
+ 657 379
1091
+ 1342 1235
1092
+ 270 182
1093
+ 262 352
1094
+ 286 394
1095
+ 325 927
1096
+ 172 383
1097
+ 155 695
1098
+ 343 1155
1099
+ 267 152
1100
+ 32 592
1101
+ 334 181
1102
+ 275 298
1103
+ 371 543
1104
+ 356 437
1105
+ 845 357
1106
+ 655 449
1107
+ 400 509
1108
+ 548 321
1109
+ 264 518
1110
+ 133 627
1111
+ 302 166
1112
+ 264 381
1113
+ 434 261
1114
+ 320 266
1115
+ 292 1087
1116
+ 262 317
1117
+ 272 330
1118
+ 176 395
1119
+ 799 1153
1120
+ 277 185
1121
+ 917 1267
1122
+ 268 156
1123
+ 785 270
1124
+ 753 488
1125
+ 285 270
1126
+ 172 768
1127
+ 408 530
1128
+ 385 923
1129
+ 337 636
1130
+ 176 427
1131
+ 269 165
1132
+ 337 32
1133
+ 292 682
1134
+ 259 393
1135
+ 1100 297
1136
+ 359 1277
1137
+ 403 665
1138
+ 314 509
1139
+ 283 349
1140
+ 325 427
1141
+ 173 572
1142
+ 330 399
1143
+ 331 720
1144
+ 313 157
1145
+ 271 181
1146
+ 670 371
1147
+ 294 1174
1148
+ 839 743
1149
+ 1175 538
1150
+ 701 134
1151
+ 310 159
1152
+ 1178 550
1153
+ 361 317
1154
+ 303 389
1155
+ 292 954
1156
+ 151 299
1157
+ 428 424
1158
+ 291 330
1159
+ 1044 613
1160
+ 320 281
1161
+ 380 319
1162
+ 280 299
1163
+ 470 39
1164
+ 256 135
1165
+ 269 171
1166
+ 878 309
1167
+ 45 256
1168
+ 333 261
1169
+ 339 417
1170
+ 184 532
1171
+ 325 438
1172
+ 134 477
1173
+ 338 323
1174
+ 150 261
1175
+ 135 1198
1176
+ 403 473
1177
+ 1052 276
1178
+ 1201 160
1179
+ 354 499
1180
+ 1431 265
1181
+ 527 376
1182
+ 276 378
1183
+ 584 1204
1184
+ 290 274
1185
+ 133 330
1186
+ 307 302
1187
+ 624 969
1188
+ 318 429
1189
+ 432 296
1190
+ 340 274
1191
+ 166 1131
1192
+ 134 368
1193
+ 307 283
1194
+ 424 344
1195
+ 329 628
1196
+ 133 531
1197
+ 1324 395
1198
+ 345 265
1199
+ 429 786
1200
+ 329 434
1201
+ 370 438
1202
+ 352 591
1203
+ 622 429
1204
+ 479 281
1205
+ 377 475
1206
+ 259 348
1207
+ 328 312
1208
+ 39 513
1209
+ 467 854
1210
+ 285 394
1211
+ 277 579
1212
+ 1463 134
1213
+ 329 286
1214
+ 332 307
1215
+ 170 1011
1216
+ 257 136
1217
+ 1333 417
1218
+ 137 1107
1219
+ 173 345
1220
+ 385 1148
1221
+ 340 273
1222
+ 161 822
1223
+ 330 388
1224
+ 269 161
1225
+ 1346 458
1226
+ 308 270
1227
+ 283 391
1228
+ 976 341
1229
+ 374 333
1230
+ 365 303
1231
+ 338 273
1232
+ 264 661
1233
+ 167 1246
1234
+ 325 607
1235
+ 365 283
1236
+ 824 322
1237
+ 267 154
1238
+ 831 273
1239
+ 321 156
1240
+ 821 323
1241
+ 313 163
1242
+ 285 324
1243
+ 133 261
1244
+ 294 166
1245
+ 959 394
1246
+ 1497 286
1247
+ 371 156
1248
+ 150 304
1249
+ 943 528
1250
+ 174 279
1251
+ 556 489
1252
+ 400 301
1253
+ 151 728
1254
+ 382 301
1255
+ 357 831
1256
+ 1507 265
1257
+ 173 1007
1258
+ 315 865
1259
+ 374 303
1260
+ 155 574
1261
+ 430 302
1262
+ 133 1373
1263
+ 453 1088
1264
+ 1086 359
1265
+ 485 273
1266
+ 714 695
1267
+ 331 794
1268
+ 864 506
1269
+ 946 295
1270
+ 271 178
1271
+ 541 455
1272
+ 574 271
1273
+ 1170 921
1274
+ 948 674
1275
+ 260 302
1276
+ 390 274
1277
+ 307 277
1278
+ 585 170
1279
+ 318 383
1280
+ 161 994
1281
+ 317 280
1282
+ 133 283
1283
+ 563 498
1284
+ 639 323
1285
+ 154 541
1286
+ 549 303
1287
+ 277 473
1288
+ 257 145
1289
+ 283 280
1290
+ 353 274
1291
+ 960 471
1292
+ 277 426
1293
+ 478 612
1294
+ 1172 371
1295
+ 311 651
1296
+ 159 299
1297
+ 262 631
1298
+ 271 687
1299
+ 817 537
1300
+ 261 44
1301
+ 334 156
1302
+ 1176 388
1303
+ 1285 342
1304
+ 170 376
1305
+ 32 40
1306
+ 265 264
1307
+ 337 294
1308
+ 307 270
1309
+ 370 342
1310
+ 655 315
1311
+ 1048 479
1312
+ 294 598
1313
+ 645 327
1314
+ 277 386
1315
+ 344 562
1316
+ 344 1308
1317
+ 845 463
1318
+ 431 285
1319
+ 1430 1432
1320
+ 430 674
1321
+ 176 330
1322
+ 44 380
1323
+ 524 285
1324
+ 385 1318
1325
+ 134 1207
1326
+ 257 147
1327
+ 172 816
1328
+ 261 392
1329
+ 675 178
1330
+ 450 275
1331
+ 134 303
1332
+ 324 280
1333
+ 461 426
1334
+ 306 154
1335
+ 284 290
1336
+ 151 607
1337
+ 133 280
1338
+ 323 486
1339
+ 493 827
1340
+ 1591 308
1341
+ 330 384
1342
+ 370 412
1343
+ 273 273
1344
+ 1454 490
1345
+ 328 1455
1346
+ 283 837
1347
+ 292 697
1348
+ 372 558
1349
+ 32 296
1350
+ 264 470
1351
+ 271 473
1352
+ 161 357
1353
+ 284 357
1354
+ 519 373
1355
+ 303 357
1356
+ 438 184
1357
+ 891 602
1358
+ 257 404
1359
+ 32 281
1360
+ 270 176
1361
+ 403 170
1362
+ 298 284
1363
+ 1227 1336
1364
+ 1615 660
1365
+ 1616 1228
1366
+ 262 276
1367
+ 285 292
1368
+ 445 344
1369
+ 752 654
1370
+ 276 426
1371
+ 372 368
1372
+ 271 476
1373
+ 998 335
1374
+ 259 370
1375
+ 515 381
1376
+ 150 530
1377
+ 274 629
1378
+ 453 345
1379
+ 361 1234
1380
+ 381 713
1381
+ 570 353
1382
+ 756 896
1383
+ 388 793
1384
+ 172 366
1385
+ 464 612
1386
+ 401 284
1387
+ 260 261
1388
+ 298 380
1389
+ 680 503
1390
+ 360 893
1391
+ 299 286
1392
+ 363 370
1393
+ 318 982
1394
+ 1350 315
1395
+ 1646 342
1396
+ 365 285
1397
+ 279 643
1398
+ 340 683
1399
+ 285 323
1400
+ 1082 476
1401
+ 271 410
1402
+ 481 151
1403
+ 287 283
1404
+ 492 301
1405
+ 151 477
1406
+ 951 897
1407
+ 866 443
1408
+ 334 176
1409
+ 264 495
1410
+ 718 281
1411
+ 172 307
1412
+ 262 303
1413
+ 264 279
1414
+ 315 872
1415
+ 669 166
1416
+ 453 307
1417
+ 757 319
1418
+ 168 349
1419
+ 156 323
1420
+ 622 261
1421
+ 1672 604
1422
+ 390 333
1423
+ 739 346
1424
+ 338 627
1425
+ 586 679
1426
+ 133 308
1427
+ 335 295
1428
+ 374 261
1429
+ 44 329
1430
+ 1254 308
1431
+ 584 425
1432
+ 320 301
1433
+ 664 156
1434
+ 957 486
1435
+ 561 273
1436
+ 303 285
1437
+ 1105 578
1438
+ 260 528
1439
+ 173 616
1440
+ 599 324
1441
+ 564 281
1442
+ 598 313
1443
+ 810 363
1444
+ 603 273
1445
+ 277 553
1446
+ 285 359
1447
+ 277 164
1448
+ 301 444
1449
+ 621 958
1450
+ 756 259
1451
+ 1520 393
1452
+ 133 395
1453
+ 268 172
1454
+ 134 533
1455
+ 174 1523
1456
+ 374 283
1457
+ 156 1273
1458
+ 256 152
1459
+ 285 828
1460
+ 298 647
1461
+ 342 1343
1462
+ 1369 643
1463
+ 294 1171
1464
+ 32 380
1465
+ 260 619
1466
+ 829 357
1467
+ 380 874
1468
+ 277 171
1469
+ 166 272
1470
+ 325 768
1471
+ 1257 565
1472
+ 1374 498
1473
+ 268 378
1474
+ 501 299
1475
+ 561 778
1476
+ 283 789
1477
+ 272 414
1478
+ 291 417
1479
+ 311 362
1480
+ 304 349
1481
+ 262 641
1482
+ 264 319
1483
+ 350 379
1484
+ 377 717
1485
+ 482 901
1486
+ 285 486
1487
+ 316 273
1488
+ 151 309
1489
+ 133 834
1490
+ 184 708
1491
+ 657 407
1492
+ 1395 476
1493
+ 262 301
1494
+ 32 1384
1495
+ 815 1398
1496
+ 672 262
1497
+ 1038 697
1498
+ 44 292
1499
+ 1101 271
1500
+ 671 425
1501
+ 997 1401
1502
+ 431 309
1503
+ 44 361
1504
+ 907 295
1505
+ 998 307
1506
+ 702 260
1507
+ 164 1290
1508
+ 302 367
1509
+ 280 463
1510
+ 143 1184
1511
+ 275 261
1512
+ 1413 743
1513
+ 339 643
1514
+ 274 299
1515
+ 496 181
1516
+ 1189 304
1517
+ 288 175
1518
+ 478 1418
1519
+ 529 184
1520
+ 264 1300
1521
+ 294 385
1522
+ 631 332
1523
+ 181 1116
1524
+ 271 385
1525
+ 259 296
1526
+ 1111 276
1527
+ 156 963
1528
+ 355 558
1529
+ 1569 283
1530
+ 1781 819
1531
+ 172 298
1532
+ 508 382
1533
+ 294 134
1534
+ 688 261
1535
+ 350 348
1536
+ 1008 840
1537
+ 462 923
1538
+ 321 181
1539
+ 302 174
1540
+ 168 842
1541
+ 137 280
1542
+ 302 387
1543
+ 259 44
1544
+ 182 505
1545
+ 264 283
1546
+ 351 333
1547
+ 851 290
1548
+ 1125 646
1549
+ 1126 1127
1550
+ 330 307
1551
+ 294 182
1552
+ 154 581
1553
+ 1125 362
1554
+ 1587 827
1555
+ 285 274
1556
+ 257 157
1557
+ 357 273
1558
+ 601 1451
1559
+ 289 1595
1560
+ 788 295
1561
+ 143 1596
1562
+ 445 184
1563
+ 133 715
1564
+ 408 1328
1565
+ 660 285
1566
+ 307 837
1567
+ 315 568
1568
+ 257 152
1569
+ 311 277
1570
+ 431 273
1571
+ 344 270
1572
+ 689 417
1573
+ 512 1221
1574
+ 372 261
1575
+ 1139 876
1576
+ 1462 265
1577
+ 764 296
1578
+ 453 261
1579
+ 805 274
1580
+ 501 399
1581
+ 284 309
1582
+ 691 366
1583
+ 1609 1020
1584
+ 170 450
1585
+ 339 448
1586
+ 170 414
1587
+ 451 746
1588
+ 348 260
1589
+ 1075 283
1590
+ 270 803
1591
+ 333 454
1592
+ 1220 1469
1593
+ 310 163
1594
+ 262 333
1595
+ 533 304
1596
+ 1187 274
1597
+ 178 434
1598
+ 448 349
1599
+ 937 537
1600
+ 856 1597
1601
+ 276 300
1602
+ 342 410
1603
+ 264 589
1604
+ 527 307
1605
+ 961 399
1606
+ 327 367
1607
+ 258 153
1608
+ 1627 1078
1609
+ 406 273
1610
+ 360 609
1611
+ 272 352
1612
+ 716 1216
1613
+ 465 32
1614
+ 895 274
1615
+ 159 431
1616
+ 1145 374
1617
+ 1868 395
1618
+ 257 343
1619
+ 322 678
1620
+ 172 1477
1621
+ 580 283
1622
+ 178 260
1623
+ 598 505
1624
+ 1875 616
1625
+ 719 388
1626
+ 1480 1047
1627
+ 260 303
1628
+ 262 860
1629
+ 308 299
1630
+ 267 137
1631
+ 168 434
1632
+ 270 657
1633
+ 907 378
1634
+ 165 1643
1635
+ 168 550
1636
+ 164 475
1637
+ 341 285
1638
+ 891 1351
1639
+ 402 1650
1640
+ 134 1181
1641
+ 523 829
1642
+ 1893 383
1643
+ 322 1113
1644
+ 592 323
1645
+ 664 687
1646
+ 392 576
1647
+ 331 304
1648
+ 280 780
1649
+ 334 182
1650
+ 275 285
1651
+ 610 469
1652
+ 278 688
1653
+ 493 309
1654
+ 561 284
1655
+ 388 303
1656
+ 1907 1075
1657
+ 370 280
1658
+ 267 163
1659
+ 273 334
1660
+ 261 1493
1661
+ 535 1240
1662
+ 1357 1668
1663
+ 1914 298
1664
+ 1915 463
1665
+ 1916 388
1666
+ 340 1640
1667
+ 1918 1445
1668
+ 370 430
1669
+ 270 181
1670
+ 318 376
1671
+ 327 174
1672
+ 170 868
1673
+ 261 757
1674
+ 513 629
1675
+ 427 808
1676
+ 1173 1255
1677
+ 1686 376
1678
+ 274 283
1679
+ 279 1508
1680
+ 820 301
1681
+ 285 416
1682
+ 271 176
1683
+ 433 532
1684
+ 645 281
1685
+ 1370 1239
1686
+ 310 154
1687
+ 345 349
1688
+ 349 484
1689
+ 261 995
1690
+ 1694 1084
1691
+ 154 390
1692
+ 698 449
1693
+ 319 396
1694
+ 276 170
1695
+ 304 787
1696
+ 277 468
1697
+ 1518 448
1698
+ 279 1023
1699
+ 32 422
1700
+ 161 1095
1701
+ 839 330
1702
+ 277 410
1703
+ 504 1095
1704
+ 291 352
1705
+ 318 991
1706
+ 1193 1707
1707
+ 294 1167
1708
+ 702 379
1709
+ 1960 862
1710
+ 843 1712
1711
+ 501 1166
1712
+ 455 363
1713
+ 350 427
1714
+ 347 397
1715
+ 280 292
1716
+ 564 444
1717
+ 373 301
1718
+ 262 323
1719
+ 487 562
1720
+ 32 325
1721
+ 1383 581
1722
+ 331 429
1723
+ 1718 1719
1724
+ 156 284
1725
+ 329 284
1726
+ 178 459
1727
+ 428 619
1728
+ 1514 1347
1729
+ 272 555
1730
+ 380 336
1731
+ 10 256
1732
+ 385 1638
1733
+ 321 182
1734
+ 318 868
1735
+ 1225 335
1736
+ 1276 412
1737
+ 171 1031
1738
+ 393 648
1739
+ 609 276
1740
+ 360 1375
1741
+ 1704 1728
1742
+ 172 1275
1743
+ 403 638
1744
+ 737 525
1745
+ 325 307
1746
+ 291 279
1747
+ 285 403
1748
+ 280 949
1749
+ 170 991
1750
+ 171 1219
1751
+ 988 776
1752
+ 1381 407
1753
+ 349 407
1754
+ 165 574
1755
+ 154 1159
1756
+ 989 337
1757
+ 279 287
1758
+ 2009 641
1759
+ 508 400
1760
+ 162 642
1761
+ 1320 1515
1762
+ 323 285
1763
+ 403 165
1764
+ 319 1284
1765
+ 501 975
1766
+ 577 368
1767
+ 736 32
1768
+ 172 1279
1769
+ 302 300
1770
+ 314 334
1771
+ 1399 455
1772
+ 176 341
1773
+ 724 1551
1774
+ 288 152
1775
+ 300 556
1776
+ 1282 490
1777
+ 326 140
1778
+ 338 952
1779
+ 287 308
1780
+ 1758 1555
1781
+ 276 436
1782
+ 653 912
1783
+ 381 369
1784
+ 388 273
1785
+ 334 133
1786
+ 261 327
1787
+ 819 491
1788
+ 398 586
1789
+ 467 1181
1790
+ 273 401
1791
+ 597 260
1792
+ 345 632
1793
+ 357 689
1794
+ 277 161
1795
+ 676 302
1796
+ 44 350
1797
+ 875 274
1798
+ 460 425
1799
+ 1187 273
1800
+ 623 371
1801
+ 284 286
1802
+ 321 387
1803
+ 322 170
1804
+ 256 155
1805
+ 539 371
1806
+ 744 332
1807
+ 335 305
1808
+ 882 822
1809
+ 285 332
1810
+ 291 317
1811
+ 397 345
1812
+ 288 543
1813
+ 280 271
1814
+ 875 363
1815
+ 694 333
1816
+ 325 262
1817
+ 543 1433
1818
+ 322 176
1819
+ 416 333
1820
+ 377 384
1821
+ 398 607
1822
+ 1298 1435
1823
+ 320 424
1824
+ 294 344
1825
+ 338 391
1826
+ 322 595
1827
+ 478 476
1828
+ 598 319
1829
+ 471 1059
1830
+ 1012 884
1831
+ 350 351
1832
+ 264 285
1833
+ 271 134
1834
+ 277 378
1835
+ 1796 313
1836
+ 2087 851
1837
+ 45 298
1838
+ 171 1580
1839
+ 338 411
1840
+ 283 328
1841
+ 1800 965
1842
+ 341 363
1843
+ 261 283
1844
+ 331 625
1845
+ 171 1582
1846
+ 392 770
1847
+ 467 309
1848
+ 313 154
1849
+ 523 399
1850
+ 396 499
1851
+ 150 285
1852
+ 735 278
1853
+ 659 181
1854
+ 270 166
1855
+ 772 260
1856
+ 423 301
1857
+ 259 39
1858
+ 274 726
1859
+ 2110 335
1860
+ 324 449
1861
+ 1322 603
1862
+ 2113 1809
1863
+ 1449 1594
1864
+ 392 262
1865
+ 178 1133
1866
+ 260 294
1867
+ 581 642
1868
+ 299 379
1869
+ 325 587
1870
+ 628 1600
1871
+ 2122 448
1872
+ 319 353
1873
+ 344 1457
1874
+ 467 303
1875
+ 747 615
1876
+ 519 312
1877
+ 1826 635
1878
+ 643 308
1879
+ 1180 1436
1880
+ 1045 379
1881
+ 1468 828
1882
+ 348 438
1883
+ 736 395
1884
+ 44 487
1885
+ 306 183
1886
+ 559 184
1887
+ 966 324
1888
+ 977 613
1889
+ 1005 936
1890
+ 314 512
1891
+ 331 1338
1892
+ 1066 290
1893
+ 700 265
1894
+ 530 308
1895
+ 2146 530
1896
+ 894 262
1897
+ 181 1623
1898
+ 452 1206
1899
+ 2150 363
1900
+ 521 447
1901
+ 479 296
1902
+ 307 274
1903
+ 937 312
1904
+ 156 297
1905
+ 706 333
1906
+ 2157 1864
1907
+ 172 328
1908
+ 523 390
1909
+ 1344 680
1910
+ 656 749
1911
+ 311 1475
1912
+ 1867 715
1913
+ 2164 1869
1914
+ 341 537
1915
+ 133 310
1916
+ 170 363
1917
+ 279 518
1918
+ 406 438
1919
+ 170 1479
1920
+ 467 477
1921
+ 691 1124
1922
+ 365 330
1923
+ 181 381
1924
+ 292 532
1925
+ 1026 1028
1926
+ 1882 634
1927
+ 292 394
1928
+ 702 1884
1929
+ 698 45
1930
+ 348 667
1931
+ 382 707
1932
+ 432 301
1933
+ 284 548
1934
+ 152 381
1935
+ 329 1891
1936
+ 185 396
1937
+ 582 382
1938
+ 461 305
1939
+ 365 1473
1940
+ 261 399
1941
+ 178 609
1942
+ 44 264
1943
+ 916 534
1944
+ 1306 299
1945
+ 279 475
1946
+ 2197 357
1947
+ 1592 630
1948
+ 168 1248
1949
+ 185 447
1950
+ 1362 528
1951
+ 275 333
1952
+ 269 185
1953
+ 371 170
1954
+ 164 1291
1955
+ 271 738
1956
+ 454 371
1957
+ 172 412
1958
+ 899 321
1959
+ 288 150
1960
+ 257 986
1961
+ 370 260
1962
+ 327 164
1963
+ 391 376
1964
+ 175 1913
1965
+ 732 271
1966
+ 798 164
1967
+ 2218 265
1968
+ 425 184
1969
+ 334 151
1970
+ 810 969
1971
+ 570 503
1972
+ 867 970
1973
+ 676 294
1974
+ 1084 319
1975
+ 285 609
1976
+ 458 274
1977
+ 165 1085
1978
+ 1495 1919
1979
+ 397 661
1980
+ 276 410
1981
+ 279 897
1982
+ 424 387
1983
+ 164 284
1984
+ 408 261
1985
+ 361 279
1986
+ 1158 274
1987
+ 134 308
1988
+ 1160 1152
1989
+ 266 773
1990
+ 487 337
1991
+ 287 310
1992
+ 277 176
1993
+ 1038 1925
1994
+ 404 277
1995
+ 137 354
1996
+ 292 584
1997
+ 320 811
1998
+ 277 182
1999
+ 1071 479
2000
+ 156 285
2001
+ 270 386
2002
+ 684 460
2003
+ 1321 640
2004
+ 172 602
2005
+ 143 323
2006
+ 453 499
2007
+ 2258 359
2008
+ 1929 319
2009
+ 1405 1690
2010
+ 1692 352
2011
+ 765 184
2012
+ 554 271
2013
+ 313 167
2014
+ 324 693
2015
+ 294 154
2016
+ 320 707
2017
+ 185 414
2018
+ 411 419
2019
+ 361 1371
2020
+ 264 834
2021
+ 404 633
2022
+ 352 808
2023
+ 977 384
2024
+ 398 401
2025
+ 1162 264
2026
+ 2277 402
2027
+ 2278 1688
2028
+ 304 576
2029
+ 361 1516
2030
+ 276 156
2031
+ 338 261
2032
+ 325 1163
2033
+ 1093 295
2034
+ 311 1517
2035
+ 318 505
2036
+ 388 427
2037
+ 292 753
2038
+ 384 277
2039
+ 665 299
2040
+ 393 666
2041
+ 301 325
2042
+ 185 362
2043
+ 705 298
2044
+ 426 166
2045
+ 353 359
2046
+ 772 812
2047
+ 277 476
2048
+ 327 1709
2049
+ 184 1711
2050
+ 390 383
2051
+ 800 1378
2052
+ 321 404
2053
+ 650 274
2054
+ 450 396
2055
+ 182 1528
2056
+ 2307 384
2057
+ 450 359
2058
+ 257 905
2059
+ 504 286
2060
+ 403 664
2061
+ 582 400
2062
+ 159 1511
2063
+ 650 283
2064
+ 620 924
2065
+ 2316 739
2066
+ 488 300
2067
+ 292 963
2068
+ 2319 1303
2069
+ 325 366
2070
+ 339 933
2071
+ 601 353
2072
+ 564 422
2073
+ 159 359
2074
+ 151 1641
2075
+ 32 1205
2076
+ 2327 992
2077
+ 32 1099
2078
+ 10 10
2079
+ 298 290
2080
+ 397 859
2081
+ 414 345
2082
+ 602 260
2083
+ 176 696
2084
+ 338 715
2085
+ 379 285
2086
+ 451 261
2087
+ 815 1065
2088
+ 154 357
2089
+ 270 168
2090
+ 815 460
2091
+ 329 347
2092
+ 325 1275
2093
+ 504 1535
2094
+ 813 536
2095
+ 314 46
2096
+ 335 156
2097
+ 429 1002
2098
+ 265 417
2099
+ 681 1065
2100
+ 1980 273
2101
+ 45 325
2102
+ 133 1269
2103
+ 170 396
2104
+ 331 381
2105
+ 379 286
2106
+ 1263 783
2107
+ 2358 355
2108
+ 314 773
2109
+ 298 953
2110
+ 277 570
2111
+ 1725 295
2112
+ 279 341
2113
+ 2364 304
2114
+ 1989 593
2115
+ 701 136
2116
+ 1302 307
2117
+ 736 376
2118
+ 325 1169
2119
+ 173 729
2120
+ 175 291
2121
+ 554 277
2122
+ 647 1202
2123
+ 762 1035
2124
+ 1499 617
2125
+ 338 330
2126
+ 718 1533
2127
+ 2378 273
2128
+ 133 493
2129
+ 331 617
2130
+ 151 586
2131
+ 795 699
2132
+ 174 1669
2133
+ 264 1221
2134
+ 465 264
2135
+ 165 1001
2136
+ 1205 1541
2137
+ 812 581
2138
+ 330 357
2139
+ 510 615
2140
+ 133 480
2141
+ 267 138
2142
+ 698 273
2143
+ 134 283
2144
+ 362 571
2145
+ 261 273
2146
+ 338 280
2147
+ 932 429
2148
+ 284 862
2149
+ 835 979
2150
+ 322 166
2151
+ 1391 566
2152
+ 1426 858
2153
+ 556 284
2154
+ 174 1498
2155
+ 258 157
2156
+ 168 506
2157
+ 574 329
2158
+ 709 273
2159
+ 304 481
2160
+ 170 429
2161
+ 370 478
2162
+ 790 1268
2163
+ 338 283
2164
+ 327 173
2165
+ 167 560
2166
+ 436 855
2167
+ 257 723
2168
+ 980 604
2169
+ 385 1394
2170
+ 150 572
2171
+ 341 276
2172
+ 403 166
2173
+ 758 868
2174
+ 367 419
2175
+ 601 721
2176
+ 510 1729
2177
+ 170 725
2178
+ 702 1720
2179
+ 2430 744
2180
+ 444 283
2181
+ 262 393
2182
+ 741 32
2183
+ 1005 1476
2184
+ 948 371
2185
+ 691 336
2186
+ 504 2014
2187
+ 361 384
2188
+ 2439 490
2189
+ 1466 419
2190
+ 436 869
2191
+ 1355 358
2192
+ 536 314
2193
+ 915 1730
2194
+ 1532 662
2195
+ 536 292
2196
+ 2023 371
2197
+ 1101 2025
2198
+ 390 395
2199
+ 2026 838
2200
+ 294 1752
2201
+ 582 699
2202
+ 756 1756
2203
+ 541 369
2204
+ 154 1284
2205
+ 272 1403
2206
+ 452 463
2207
+ 2458 396
2208
+ 585 1404
2209
+ 399 362
2210
+ 372 2035
2211
+ 277 367
2212
+ 1558 1406
2213
+ 361 259
2214
+ 391 273
2215
+ 350 1182
2216
+ 304 319
2217
+ 524 1107
2218
+ 689 409
2219
+ 281 337
2220
+ 1761 1183
2221
+ 328 335
2222
+ 311 477
2223
+ 303 273
2224
+ 2045 285
2225
+ 1185 1411
2226
+ 1110 419
2227
+ 292 552
2228
+ 2479 1294
2229
+ 381 332
2230
+ 361 390
2231
+ 761 382
2232
+ 135 1768
2233
+ 399 1004
2234
+ 339 620
2235
+ 322 150
2236
+ 294 367
2237
+ 493 273
2238
+ 150 959
2239
+ 1112 919
2240
+ 544 299
2241
+ 271 173
2242
+ 1773 728
2243
+ 277 686
2244
+ 960 363
2245
+ 635 317
2246
+ 473 730
2247
+ 174 317
2248
+ 284 280
2249
+ 1779 1425
2250
+ 2501 299
2251
+ 2502 399
2252
+ 2503 284
2253
+ 1194 484
2254
+ 406 1780
2255
+ 1196 302
2256
+ 307 2064
2257
+ 2508 359
2258
+ 172 607
2259
+ 745 491
2260
+ 472 609
2261
+ 322 367
2262
+ 1783 285
2263
+ 292 848
2264
+ 294 1200
2265
+ 961 285
2266
+ 284 655
2267
+ 501 602
2268
+ 2519 332
2269
+ 957 396
2270
+ 436 280
2271
+ 318 396
2272
+ 311 842
2273
+ 2524 764
2274
+ 965 1202
2275
+ 1112 560
2276
+ 298 371
2277
+ 1311 445
2278
+ 732 460
2279
+ 1281 381
2280
+ 925 449
2281
+ 614 1774
2282
+ 138 303
2283
+ 184 354
2284
+ 1793 307
2285
+ 267 160
2286
+ 450 405
2287
+ 2538 819
2288
+ 802 1115
2289
+ 356 657
2290
+ 569 315
2291
+ 328 1436
2292
+ 557 596
2293
+ 286 614
2294
+ 310 164
2295
+ 398 768
2296
+ 337 302
2297
+ 1578 284
2298
+ 274 571
2299
+ 175 1124
2300
+ 277 800
2301
+ 1061 1062
2302
+ 2091 369
2303
+ 259 413
2304
+ 322 386
2305
+ 1799 2092
2306
+ 325 342
2307
+ 1581 416
2308
+ 524 2094
2309
+ 494 801
2310
+ 288 165
2311
+ 2097 340
2312
+ 334 970
2313
+ 677 713
2314
+ 379 329
2315
+ 348 357
2316
+ 930 1571
2317
+ 321 367
2318
+ 1805 962
2319
+ 391 310
2320
+ 259 391
2321
+ 915 789
2322
+ 524 1806
2323
+ 350 353
2324
+ 1111 273
2325
+ 501 874
2326
+ 1589 362
2327
+ 2578 359
2328
+ 44 377
2329
+ 425 164
2330
+ 791 369
2331
+ 168 1593
2332
+ 339 571
2333
+ 181 2114
2334
+ 1447 315
2335
+ 1448 647
2336
+ 2115 1067
2337
+ 2588 1450
2338
+ 257 1325
2339
+ 1047 1326
2340
+ 270 150
2341
+ 318 542
2342
+ 424 161
2343
+ 1812 1327
2344
+ 269 378
2345
+ 184 447
2346
+ 754 302
2347
+ 360 1817
2348
+ 1599 953
2349
+ 2600 1818
2350
+ 292 447
2351
+ 521 354
2352
+ 1827 274
2353
+ 976 1310
2354
+ 325 1828
2355
+ 517 466
2356
+ 1461 297
2357
+ 288 157
2358
+ 289 806
2359
+ 168 279
2360
+ 678 704
2361
+ 1332 630
2362
+ 526 1217
2363
+ 1608 757
2364
+ 892 357
2365
+ 2133 528
2366
+ 561 280
2367
+ 528 278
2368
+ 292 581
2369
+ 1143 278
2370
+ 918 260
2371
+ 314 521
2372
+ 1305 1618
2373
+ 928 367
2374
+ 601 503
2375
+ 313 173
2376
+ 351 1847
2377
+ 667 268
2378
+ 2629 289
2379
+ 2630 1076
2380
+ 649 557
2381
+ 386 133
2382
+ 455 286
2383
+ 754 1852
2384
+ 1045 2144
2385
+ 408 505
2386
+ 2637 304
2387
+ 312 334
2388
+ 311 368
2389
+ 138 641
2390
+ 2641 1754
2391
+ 519 1000
2392
+ 550 616
2393
+ 491 387
2394
+ 151 2147
2395
+ 1230 914
2396
+ 1854 174
2397
+ 1465 1310
2398
+ 360 260
2399
+ 2151 377
2400
+ 133 309
2401
+ 598 1066
2402
+ 2653 394
2403
+ 181 297
2404
+ 164 717
2405
+ 368 292
2406
+ 912 1121
2407
+ 385 1863
2408
+ 2659 1629
2409
+ 275 634
2410
+ 518 271
2411
+ 1825 1134
2412
+ 270 468
2413
+ 284 715
2414
+ 288 171
2415
+ 1079 1632
2416
+ 268 171
2417
+ 413 307
2418
+ 2669 939
2419
+ 294 1759
2420
+ 681 1016
2421
+ 320 688
2422
+ 261 724
2423
+ 431 274
2424
+ 658 593
2425
+ 445 171
2426
+ 361 1410
2427
+ 264 416
2428
+ 178 1635
2429
+ 314 666
2430
+ 555 339
2431
+ 438 751
2432
+ 377 272
2433
+ 291 611
2434
+ 2685 265
2435
+ 271 1195
2436
+ 360 1635
2437
+ 262 414
2438
+ 345 717
2439
+ 513 361
2440
+ 1024 291
2441
+ 1602 592
2442
+ 462 1148
2443
+ 1877 371
2444
+ 137 383
2445
+ 292 539
2446
+ 2175 1239
2447
+ 608 447
2448
+ 335 154
2449
+ 292 560
2450
+ 330 265
2451
+ 172 658
2452
+ 2703 1881
2453
+ 2704 2178
2454
+ 1022 379
2455
+ 1599 486
2456
+ 2707 454
2457
+ 382 521
2458
+ 329 1242
2459
+ 1642 1080
2460
+ 2181 354
2461
+ 2712 2182
2462
+ 1439 610
2463
+ 317 401
2464
+ 962 305
2465
+ 287 785
2466
+ 2717 368
2467
+ 261 623
2468
+ 1886 276
2469
+ 345 859
2470
+ 531 458
2471
+ 302 1634
2472
+ 178 535
2473
+ 168 477
2474
+ 1054 291
2475
+ 349 632
2476
+ 863 274
2477
+ 485 363
2478
+ 2729 1352
2479
+ 1345 324
2480
+ 133 1027
2481
+ 438 166
2482
+ 424 738
2483
+ 553 886
2484
+ 2735 1652
2485
+ 653 1874
2486
+ 324 425
2487
+ 423 659
2488
+ 507 271
2489
+ 1892 274
2490
+ 273 933
2491
+ 2742 391
2492
+ 2743 469
2493
+ 269 163
2494
+ 492 688
2495
+ 984 476
2496
+ 329 1441
2497
+ 610 273
2498
+ 548 453
2499
+ 154 284
2500
+ 262 525
2501
+ 181 719
2502
+ 315 274
2503
+ 2754 265
2504
+ 313 637
2505
+ 292 518
2506
+ 172 1900
2507
+ 926 985
2508
+ 334 134
2509
+ 298 286
2510
+ 1655 862
2511
+ 1179 924
2512
+ 1190 283
2513
+ 320 521
2514
+ 361 452
2515
+ 2766 299
2516
+ 503 745
2517
+ 1906 593
2518
+ 495 322
2519
+ 918 784
2520
+ 388 308
2521
+ 864 279
2522
+ 280 704
2523
+ 484 529
2524
+ 1637 387
2525
+ 337 491
2526
+ 304 504
2527
+ 2778 357
2528
+ 1801 630
2529
+ 603 581
2530
+ 725 284
2531
+ 789 1256
2532
+ 438 1062
2533
+ 343 713
2534
+ 134 340
2535
+ 272 631
2536
+ 585 184
2537
+ 134 285
2538
+ 1218 464
2539
+ 467 261
2540
+ 300 1490
2541
+ 1917 445
2542
+ 792 557
2543
+ 523 285
2544
+ 524 274
2545
+ 908 315
2546
+ 261 366
2547
+ 271 143
2548
+ 531 317
2549
+ 512 319
2550
+ 262 39
2551
+ 262 568
2552
+ 165 259
2553
+ 1316 807
2554
+ 151 841
2555
+ 272 652
2556
+ 1797 1674
2557
+ 1499 1675
2558
+ 354 262
2559
+ 44 462
2560
+ 450 291
2561
+ 277 135
2562
+ 361 328
2563
+ 272 565
2564
+ 2815 286
2565
+ 342 166
2566
+ 1676 528
2567
+ 2239 877
2568
+ 537 300
2569
+ 344 713
2570
+ 284 379
2571
+ 519 1238
2572
+ 305 184
2573
+ 1437 280
2574
+ 402 280
2575
+ 1872 1136
2576
+ 259 860
2577
+ 261 280
2578
+ 924 531
2579
+ 185 1680
2580
+ 2245 847
2581
+ 385 1889
2582
+ 2833 363
2583
+ 154 307
2584
+ 878 1027
2585
+ 164 801
2586
+ 311 1248
2587
+ 776 707
2588
+ 1128 389
2589
+ 349 566
2590
+ 527 353
2591
+ 598 355
2592
+ 906 278
2593
+ 852 818
2594
+ 461 570
2595
+ 2252 330
2596
+ 765 1682
2597
+ 325 752
2598
+ 151 458
2599
+ 380 719
2600
+ 900 281
2601
+ 893 1080
2602
+ 763 1770
2603
+ 308 335
2604
+ 1685 328
2605
+ 259 568
2606
+ 493 272
2607
+ 479 521
2608
+ 133 274
2609
+ 2136 1933
2610
+ 419 276
2611
+ 1090 387
2612
+ 1334 278
2613
+ 592 261
2614
+ 307 319
2615
+ 1364 290
2616
+ 1581 541
2617
+ 334 170
2618
+ 1510 279
2619
+ 1115 321
2620
+ 265 1901
2621
+ 467 1207
2622
+ 1226 46
2623
+ 166 297
2624
+ 324 588
2625
+ 802 624
2626
+ 891 2203
2627
+ 2878 1020
2628
+ 2180 1354
2629
+ 380 1912
2630
+ 423 512
2631
+ 349 1236
2632
+ 756 972
2633
+ 797 2272
2634
+ 426 1512
2635
+ 1876 264
2636
+ 2887 439
2637
+ 2888 303
2638
+ 32 50
2639
+ 260 641
2640
+ 285 1133
2641
+ 462 280
2642
+ 277 178
2643
+ 863 1698
2644
+ 1945 614
2645
+ 2896 298
2646
+ 184 539
2647
+ 151 287
2648
+ 161 374
2649
+ 360 642
2650
+ 292 1222
2651
+ 841 354
2652
+ 339 345
2653
+ 353 312
2654
+ 10 274
2655
+ 340 399
2656
+ 1024 302
2657
+ 2167 378
2658
+ 795 368
2659
+ 271 1702
2660
+ 2911 640
2661
+ 348 1092
2662
+ 1370 369
2663
+ 184 944
2664
+ 1376 134
2665
+ 855 373
2666
+ 283 599
2667
+ 32 51
2668
+ 747 1956
2669
+ 451 283
2670
+ 314 375
2671
+ 507 349
2672
+ 443 172
2673
+ 452 369
2674
+ 172 1365
2675
+ 271 182
2676
+ 259 46
2677
+ 370 384
2678
+ 259 622
2679
+ 770 178
2680
+ 1165 264
2681
+ 1957 1958
2682
+ 788 378
2683
+ 323 1705
2684
+ 2935 291
2685
+ 282 184
2686
+ 1109 968
2687
+ 302 278
2688
+ 518 1962
2689
+ 577 1525
2690
+ 300 1963
2691
+ 1842 1713
2692
+ 403 156
2693
+ 144 1629
2694
+ 172 1966
2695
+ 1098 161
2696
+ 2947 791
2697
+ 2948 2309
2698
+ 2949 602
2699
+ 2310 302
2700
+ 2951 2257
2701
+ 2952 938
2702
+ 561 417
2703
+ 980 389
2704
+ 1952 2311
2705
+ 2956 527
2706
+ 2957 261
2707
+ 665 259
2708
+ 431 330
2709
+ 324 621
2710
+ 155 353
2711
+ 704 304
2712
+ 684 349
2713
+ 184 1964
2714
+ 324 949
2715
+ 360 541
2716
+ 393 325
2717
+ 259 435
2718
+ 1154 968
2719
+ 325 383
2720
+ 333 284
2721
+ 159 1337
2722
+ 2973 286
2723
+ 2974 2320
2724
+ 2975 635
2725
+ 813 470
2726
+ 311 517
2727
+ 1034 517
2728
+ 470 264
2729
+ 398 1714
2730
+ 320 685
2731
+ 10 340
2732
+ 2983 299
2733
+ 2984 1841
2734
+ 1212 448
2735
+ 172 283
2736
+ 544 438
2737
+ 277 173
2738
+ 284 1973
2739
+ 275 1077
2740
+ 429 32
2741
+ 1965 2329
2742
+ 339 396
2743
+ 1532 498
2744
+ 861 184
2745
+ 2335 1976
2746
+ 1786 379
2747
+ 423 618
2748
+ 1442 321
2749
+ 1349 448
2750
+ 291 1631
2751
+ 1260 283
2752
+ 314 422
2753
+ 337 525
2754
+ 371 134
2755
+ 370 574
2756
+ 171 275
2757
+ 782 687
2758
+ 381 274
2759
+ 345 368
2760
+ 337 425
2761
+ 1721 680
2762
+ 709 1162
2763
+ 727 273
2764
+ 1468 261
2765
+ 1385 321
2766
+ 173 1377
2767
+ 3018 476
2768
+ 299 284
2769
+ 161 1535
2770
+ 448 682
2771
+ 184 323
2772
+ 1678 1538
2773
+ 375 512
2774
+ 482 591
2775
+ 390 340
2776
+ 1562 465
2777
+ 551 477
2778
+ 761 430
2779
+ 781 1189
2780
+ 323 335
2781
+ 398 304
2782
+ 392 826
2783
+ 1033 256
2784
+ 1054 668
2785
+ 3036 476
2786
+ 1985 2357
2787
+ 377 285
2788
+ 303 383
2789
+ 270 955
2790
+ 509 380
2791
+ 703 386
2792
+ 495 301
2793
+ 181 336
2794
+ 1399 2363
2795
+ 324 529
2796
+ 724 651
2797
+ 1331 393
2798
+ 350 1110
2799
+ 1540 273
2800
+ 350 286
2801
+ 3052 938
2802
+ 350 936
2803
+ 494 2368
2804
+ 160 454
2805
+ 2369 2083
2806
+ 3057 285
2807
+ 311 379
2808
+ 507 1058
2809
+ 1170 658
2810
+ 3061 419
2811
+ 297 295
2812
+ 391 299
2813
+ 621 793
2814
+ 667 810
2815
+ 2372 282
2816
+ 429 648
2817
+ 708 321
2818
+ 892 906
2819
+ 559 426
2820
+ 264 1152
2821
+ 714 1035
2822
+ 361 381
2823
+ 45 341
2824
+ 360 416
2825
+ 718 296
2826
+ 403 436
2827
+ 361 538
2828
+ 496 161
2829
+ 360 1133
2830
+ 1998 542
2831
+ 1953 279
2832
+ 39 321
2833
+ 973 2042
2834
+ 348 299
2835
+ 3086 593
2836
+ 338 284
2837
+ 1732 922
2838
+ 302 173
2839
+ 408 1733
2840
+ 665 1046
2841
+ 133 857
2842
+ 184 791
2843
+ 256 1141
2844
+ 314 1224
2845
+ 2371 869
2846
+ 409 265
2847
+ 338 917
2848
+ 398 287
2849
+ 2389 1735
2850
+ 3101 1607
2851
+ 292 2390
2852
+ 403 851
2853
+ 168 1542
2854
+ 345 381
2855
+ 351 439
2856
+ 3107 274
2857
+ 276 671
2858
+ 184 349
2859
+ 467 411
2860
+ 3111 646
2861
+ 488 2006
2862
+ 382 811
2863
+ 1379 322
2864
+ 415 1104
2865
+ 667 616
2866
+ 576 278
2867
+ 426 803
2868
+ 1738 1258
2869
+ 288 2394
2870
+ 608 323
2871
+ 1067 949
2872
+ 2404 1195
2873
+ 438 2406
2874
+ 370 885
2875
+ 284 1027
2876
+ 705 1012
2877
+ 269 172
2878
+ 482 1219
2879
+ 1055 2409
2880
+ 381 285
2881
+ 387 899
2882
+ 1259 1072
2883
+ 302 751
2884
+ 151 1494
2885
+ 171 417
2886
+ 681 670
2887
+ 404 1940
2888
+ 699 676
2889
+ 825 509
2890
+ 178 395
2891
+ 387 814
2892
+ 308 1975
2893
+ 470 592
2894
+ 307 1824
2895
+ 166 1388
2896
+ 160 680
2897
+ 306 1741
2898
+ 1251 703
2899
+ 329 297
2900
+ 3151 152
2901
+ 3152 435
2902
+ 1575 565
2903
+ 166 1242
2904
+ 298 1242
2905
+ 724 2396
2906
+ 1543 321
2907
+ 920 389
2908
+ 454 463
2909
+ 320 509
2910
+ 430 640
2911
+ 133 572
2912
+ 741 370
2913
+ 417 2410
2914
+ 1548 658
2915
+ 292 1177
2916
+ 161 261
2917
+ 438 305
2918
+ 403 178
2919
+ 339 1157
2920
+ 3171 1009
2921
+ 3172 266
2922
+ 274 261
2923
+ 261 342
2924
+ 436 260
2925
+ 344 867
2926
+ 257 1521
2927
+ 493 431
2928
+ 3179 340
2929
+ 644 843
2930
+ 3181 357
2931
+ 2235 571
2932
+ 436 400
2933
+ 259 870
2934
+ 350 696
2935
+ 314 870
2936
+ 382 393
2937
+ 866 1724
2938
+ 1744 172
2939
+ 3190 1927
2940
+ 345 2306
2941
+ 920 2016
2942
+ 260 301
2943
+ 1138 414
2944
+ 339 599
2945
+ 353 1096
2946
+ 993 2366
2947
+ 292 875
2948
+ 1050 792
2949
+ 408 396
2950
+ 1138 1538
2951
+ 2438 2440
2952
+ 1540 395
2953
+ 135 634
2954
+ 3205 283
2955
+ 3206 1078
2956
+ 814 1261
2957
+ 172 1396
2958
+ 504 994
2959
+ 644 1266
2960
+ 2431 1561
2961
+ 3212 378
2962
+ 645 301
2963
+ 1378 1389
2964
+ 264 262
2965
+ 274 394
2966
+ 32 524
2967
+ 1731 1268
2968
+ 423 945
2969
+ 944 2286
2970
+ 795 477
2971
+ 1605 847
2972
+ 1387 750
2973
+ 376 1816
2974
+ 639 682
2975
+ 864 794
2976
+ 3227 260
2977
+ 1037 32
2978
+ 360 330
2979
+ 430 856
2980
+ 32 2019
2981
+ 742 1549
2982
+ 318 620
2983
+ 594 837
2984
+ 3235 363
2985
+ 3236 906
2986
+ 995 1549
2987
+ 1749 294
2988
+ 161 1552
2989
+ 408 2450
2990
+ 871 950
2991
+ 275 341
2992
+ 3243 505
2993
+ 3244 285
2994
+ 2028 1753
2995
+ 173 1754
2996
+ 840 170
2997
+ 951 309
2998
+ 3249 2455
2999
+ 908 909
3000
+ 1402 557
3001
+ 337 577
3002
+ 2030 1757
3003
+ 361 2031
3004
+ 3255 953
3005
+ 370 400
3006
+ 280 290
3007
+ 330 2459
3008
+ 260 409
3009
+ 303 333
3010
+ 633 584
3011
+ 181 633
3012
+ 171 1179
3013
+ 3264 314
3014
+ 3265 298
3015
+ 1105 1287
3016
+ 3267 2462
3017
+ 3268 304
3018
+ 307 758
3019
+ 269 188
3020
+ 3271 309
3021
+ 529 164
3022
+ 530 953
3023
+ 399 390
3024
+ 3275 285
3025
+ 322 182
3026
+ 639 539
3027
+ 1405 372
3028
+ 181 1040
3029
+ 340 417
3030
+ 2041 471
3031
+ 458 323
3032
+ 3283 458
3033
+ 3284 1557
3034
+ 139 631
3035
+ 3286 2464
3036
+ 41 622
3037
+ 2467 292
3038
+ 277 2043
3039
+ 3290 400
3040
+ 344 2470
3041
+ 1041 279
3042
+ 312 666
3043
+ 468 2473
3044
+ 174 1410
3045
+ 543 283
3046
+ 3297 268
3047
+ 3298 410
3048
+ 1412 318
3049
+ 304 703
3050
+ 956 184
3051
+ 165 1046
3052
+ 350 363
3053
+ 39 292
3054
+ 2480 273
3055
+ 1104 2481
3056
+ 3307 359
3057
+ 337 557
3058
+ 2051 302
3059
+ 379 274
3060
+ 1562 525
3061
+ 271 155
3062
+ 541 1295
3063
+ 259 41
3064
+ 3315 292
3065
+ 334 698
3066
+ 957 2485
3067
+ 1190 285
3068
+ 1417 347
3069
+ 1770 561
3070
+ 3321 1768
3071
+ 478 305
3072
+ 294 1411
3073
+ 261 363
3074
+ 1298 279
3075
+ 3326 2491
3076
+ 3327 490
3077
+ 3328 879
3078
+ 3329 1005
3079
+ 3330 842
3080
+ 3331 2492
3081
+ 3332 2057
3082
+ 3333 300
3083
+ 3334 1772
3084
+ 3335 135
3085
+ 3336 1420
3086
+ 3337 2058
3087
+ 3338 490
3088
+ 1048 328
3089
+ 424 595
3090
+ 1301 376
3091
+ 507 1193
3092
+ 671 449
3093
+ 690 1422
3094
+ 3345 371
3095
+ 432 281
3096
+ 291 589
3097
+ 327 162
3098
+ 1564 541
3099
+ 3350 729
3100
+ 557 1117
3101
+ 335 378
3102
+ 292 1305
3103
+ 582 1008
3104
+ 1777 182
3105
+ 437 1567
3106
+ 184 1177
3107
+ 824 608
3108
+ 2506 907
3109
+ 1782 461
3110
+ 747 1570
3111
+ 885 1309
3112
+ 461 638
3113
+ 3364 881
3114
+ 166 376
3115
+ 964 184
3116
+ 785 1120
3117
+ 601 479
3118
+ 2520 576
3119
+ 300 425
3120
+ 1428 1009
3121
+ 632 315
3122
+ 385 580
3123
+ 172 643
3124
+ 3375 396
3125
+ 519 1121
3126
+ 388 359
3127
+ 1564 355
3128
+ 313 147
3129
+ 2526 2527
3130
+ 1791 298
3131
+ 1192 261
3132
+ 1434 1792
3133
+ 1572 559
3134
+ 3385 1314
3135
+ 463 399
3136
+ 3387 452
3137
+ 1123 1057
3138
+ 2496 1315
3139
+ 908 425
3140
+ 2077 388
3141
+ 321 678
3142
+ 438 554
3143
+ 2534 1434
3144
+ 45 340
3145
+ 275 280
3146
+ 318 1011
3147
+ 723 155
3148
+ 333 277
3149
+ 678 2079
3150
+ 3401 750
3151
+ 176 2081
3152
+ 276 182
3153
+ 3404 841
3154
+ 347 309
3155
+ 150 526
3156
+ 3407 954
3157
+ 1575 2539
3158
+ 1316 2082
3159
+ 285 733
3160
+ 264 362
3161
+ 308 328
3162
+ 266 261
3163
+ 3414 341
3164
+ 291 2029
3165
+ 850 330
3166
+ 1576 265
3167
+ 156 287
3168
+ 884 350
3169
+ 372 376
3170
+ 3421 2549
3171
+ 3422 966
3172
+ 3423 2550
3173
+ 3424 451
3174
+ 3425 680
3175
+ 1579 271
3176
+ 594 284
3177
+ 568 462
3178
+ 516 305
3179
+ 273 262
3180
+ 2553 296
3181
+ 2090 2554
3182
+ 1286 638
3183
+ 268 150
3184
+ 350 623
3185
+ 531 261
3186
+ 371 2093
3187
+ 284 967
3188
+ 172 357
3189
+ 886 437
3190
+ 1295 2096
3191
+ 3442 787
3192
+ 1439 2561
3193
+ 260 322
3194
+ 385 283
3195
+ 2563 323
3196
+ 3447 658
3197
+ 1051 363
3198
+ 3449 910
3199
+ 1301 1209
3200
+ 265 325
3201
+ 349 265
3202
+ 821 256
3203
+ 341 399
3204
+ 2102 1584
3205
+ 285 461
3206
+ 1583 322
3207
+ 166 1441
3208
+ 272 411
3209
+ 1128 2104
3210
+ 44 1129
3211
+ 1585 278
3212
+ 2567 2568
3213
+ 925 909
3214
+ 181 362
3215
+ 390 2571
3216
+ 3467 175
3217
+ 272 533
3218
+ 322 137
3219
+ 181 1320
3220
+ 157 1807
3221
+ 1211 290
3222
+ 2575 445
3223
+ 1014 539
3224
+ 322 1588
3225
+ 1212 1132
3226
+ 425 386
3227
+ 1808 1807
3228
+ 264 2576
3229
+ 1003 273
3230
+ 302 790
3231
+ 1312 322
3232
+ 385 324
3233
+ 759 39
3234
+ 496 157
3235
+ 339 667
3236
+ 3487 496
3237
+ 3488 182
3238
+ 2579 369
3239
+ 330 366
3240
+ 330 402
3241
+ 334 1200
3242
+ 2536 537
3243
+ 970 386
3244
+ 973 2111
3245
+ 151 2582
3246
+ 156 381
3247
+ 2532 1588
3248
+ 761 423
3249
+ 1427 2584
3250
+ 3501 284
3251
+ 481 2585
3252
+ 264 886
3253
+ 544 575
3254
+ 1811 594
3255
+ 503 2593
3256
+ 608 369
3257
+ 353 749
3258
+ 1108 270
3259
+ 325 542
3260
+ 2065 165
3261
+ 702 1135
3262
+ 3513 1291
3263
+ 3514 334
3264
+ 3515 1813
3265
+ 504 547
3266
+ 3517 1070
3267
+ 3518 1216
3268
+ 260 327
3269
+ 311 1551
3270
+ 388 887
3271
+ 3522 335
3272
+ 1071 328
3273
+ 3524 358
3274
+ 723 951
3275
+ 3526 1598
3276
+ 3527 363
3277
+ 3528 265
3278
+ 3529 649
3279
+ 488 1071
3280
+ 3531 1456
3281
+ 2123 1218
3282
+ 311 2124
3283
+ 276 965
3284
+ 1072 174
3285
+ 747 299
3286
+ 1825 2129
3287
+ 1460 2604
3288
+ 3539 649
3289
+ 666 168
3290
+ 185 933
3291
+ 175 2607
3292
+ 258 152
3293
+ 1018 367
3294
+ 523 2466
3295
+ 321 476
3296
+ 341 284
3297
+ 1223 1309
3298
+ 361 2609
3299
+ 276 185
3300
+ 1831 911
3301
+ 135 417
3302
+ 324 397
3303
+ 349 661
3304
+ 1747 155
3305
+ 621 479
3306
+ 688 284
3307
+ 315 525
3308
+ 303 342
3309
+ 717 381
3310
+ 610 1120
3311
+ 635 283
3312
+ 299 602
3313
+ 890 261
3314
+ 311 353
3315
+ 1141 2614
3316
+ 3567 270
3317
+ 633 1833
3318
+ 1607 1834
3319
+ 3570 330
3320
+ 322 1467
3321
+ 672 1019
3322
+ 2616 302
3323
+ 359 337
3324
+ 367 2617
3325
+ 2618 412
3326
+ 136 828
3327
+ 172 261
3328
+ 935 626
3329
+ 1314 467
3330
+ 855 312
3331
+ 32 512
3332
+ 890 323
3333
+ 2135 1469
3334
+ 1142 292
3335
+ 1611 466
3336
+ 433 584
3337
+ 356 1838
3338
+ 845 2137
3339
+ 259 442
3340
+ 789 332
3341
+ 279 372
3342
+ 1145 1841
3343
+ 645 294
3344
+ 543 649
3345
+ 673 768
3346
+ 513 1614
3347
+ 292 1843
3348
+ 1835 271
3349
+ 1617 445
3350
+ 1143 1844
3351
+ 1845 2139
3352
+ 2624 174
3353
+ 264 2141
3354
+ 1112 299
3355
+ 2627 361
3356
+ 3607 348
3357
+ 3608 1619
3358
+ 3609 2628
3359
+ 3610 39
3360
+ 673 1621
3361
+ 461 168
3362
+ 1622 134
3363
+ 3614 718
3364
+ 44 644
3365
+ 380 1623
3366
+ 3617 377
3367
+ 3618 1449
3368
+ 3619 577
3369
+ 3620 2634
3370
+ 368 2143
3371
+ 1624 1332
3372
+ 1851 2635
3373
+ 3624 648
3374
+ 2636 304
3375
+ 3626 2638
3376
+ 287 276
3377
+ 638 1339
3378
+ 649 329
3379
+ 1023 155
3380
+ 2145 318
3381
+ 3632 936
3382
+ 3633 273
3383
+ 3634 355
3384
+ 1286 386
3385
+ 871 182
3386
+ 1102 181
3387
+ 3638 2644
3388
+ 178 416
3389
+ 2646 2647
3390
+ 2648 1024
3391
+ 261 2148
3392
+ 1197 2040
3393
+ 2651 1290
3394
+ 491 175
3395
+ 3646 270
3396
+ 133 340
3397
+ 463 347
3398
+ 2652 319
3399
+ 353 537
3400
+ 1472 1857
3401
+ 2152 654
3402
+ 3653 387
3403
+ 302 1332
3404
+ 328 299
3405
+ 385 515
3406
+ 1038 350
3407
+ 3658 287
3408
+ 3659 1859
3409
+ 521 532
3410
+ 1861 1016
3411
+ 1341 2154
3412
+ 3663 1023
3413
+ 453 320
3414
+ 449 1026
3415
+ 164 307
3416
+ 394 359
3417
+ 325 1621
3418
+ 1408 2661
3419
+ 633 349
3420
+ 2152 339
3421
+ 536 466
3422
+ 717 857
3423
+ 330 353
3424
+ 271 553
3425
+ 1330 297
3426
+ 1823 367
3427
+ 601 586
3428
+ 1002 428
3429
+ 1120 830
3430
+ 320 840
3431
+ 642 311
3432
+ 3683 363
3433
+ 3684 347
3434
+ 3685 361
3435
+ 3686 541
3436
+ 3687 376
3437
+ 1280 1236
3438
+ 2160 533
3439
+ 3690 2674
3440
+ 397 276
3441
+ 1827 273
3442
+ 644 325
3443
+ 1050 277
3444
+ 313 134
3445
+ 404 610
3446
+ 374 352
3447
+ 300 1870
3448
+ 800 143
3449
+ 348 593
3450
+ 370 767
3451
+ 2684 465
3452
+ 1237 1020
3453
+ 849 491
3454
+ 676 1871
3455
+ 1872 559
3456
+ 310 1636
3457
+ 644 337
3458
+ 370 711
3459
+ 277 159
3460
+ 355 634
3461
+ 827 284
3462
+ 2599 1151
3463
+ 3714 328
3464
+ 3715 370
3465
+ 3716 1637
3466
+ 323 2689
3467
+ 181 775
3468
+ 1859 769
3469
+ 264 1614
3470
+ 3721 467
3471
+ 307 614
3472
+ 804 357
3473
+ 794 593
3474
+ 308 1303
3475
+ 331 2130
3476
+ 914 331
3477
+ 318 1586
3478
+ 3729 827
3479
+ 397 353
3480
+ 1857 819
3481
+ 2142 489
3482
+ 588 174
3483
+ 2696 304
3484
+ 345 589
3485
+ 267 2145
3486
+ 462 897
3487
+ 433 354
3488
+ 908 1771
3489
+ 321 154
3490
+ 682 639
3491
+ 2177 871
3492
+ 1349 2161
3493
+ 472 535
3494
+ 173 427
3495
+ 1325 484
3496
+ 898 2124
3497
+ 697 486
3498
+ 3749 280
3499
+ 371 1241
3500
+ 318 280
3501
+ 164 273
3502
+ 524 298
3503
+ 448 384
3504
+ 267 378
3505
+ 2705 2179
3506
+ 137 443
3507
+ 305 1883
3508
+ 660 274
3509
+ 365 1766
3510
+ 3761 384
3511
+ 2482 514
3512
+ 315 413
3513
+ 2119 2710
3514
+ 950 585
3515
+ 1316 298
3516
+ 334 1480
3517
+ 3768 283
3518
+ 3769 1482
3519
+ 766 172
3520
+ 325 285
3521
+ 136 340
3522
+ 174 2718
3523
+ 159 547
3524
+ 1154 324
3525
+ 315 45
3526
+ 462 1240
3527
+ 325 779
3528
+ 302 176
3529
+ 2725 2726
3530
+ 259 409
3531
+ 728 292
3532
+ 959 1288
3533
+ 3784 1407
3534
+ 257 1647
3535
+ 705 1040
3536
+ 3787 274
3537
+ 182 527
3538
+ 537 675
3539
+ 1243 299
3540
+ 758 1011
3541
+ 1350 464
3542
+ 150 458
3543
+ 734 389
3544
+ 327 754
3545
+ 1648 405
3546
+ 577 1236
3547
+ 1244 900
3548
+ 1890 1245
3549
+ 154 286
3550
+ 3801 450
3551
+ 370 894
3552
+ 1649 887
3553
+ 3804 2731
3554
+ 3805 2185
3555
+ 334 166
3556
+ 821 303
3557
+ 2714 2733
3558
+ 339 381
3559
+ 280 1651
3560
+ 423 521
3561
+ 950 690
3562
+ 318 1354
3563
+ 568 453
3564
+ 171 967
3565
+ 554 481
3566
+ 2745 401
3567
+ 3818 265
3568
+ 3819 1894
3569
+ 772 942
3570
+ 350 2166
3571
+ 470 50
3572
+ 2750 330
3573
+ 603 383
3574
+ 2751 274
3575
+ 3826 528
3576
+ 563 355
3577
+ 503 594
3578
+ 665 910
3579
+ 424 1647
3580
+ 2753 309
3581
+ 365 298
3582
+ 285 1482
3583
+ 3834 273
3584
+ 540 274
3585
+ 338 354
3586
+ 1589 458
3587
+ 261 382
3588
+ 367 1487
3589
+ 403 678
3590
+ 656 312
3591
+ 763 1186
3592
+ 318 461
3593
+ 1862 2195
3594
+ 1899 996
3595
+ 2758 2196
3596
+ 448 2123
3597
+ 3848 347
3598
+ 3849 1155
3599
+ 1156 1050
3600
+ 325 2198
3601
+ 323 455
3602
+ 2074 1654
3603
+ 3854 1655
3604
+ 3855 419
3605
+ 3856 1902
3606
+ 3857 2759
3607
+ 3858 1903
3608
+ 3859 2082
3609
+ 325 545
3610
+ 2761 339
3611
+ 3862 2762
3612
+ 3863 445
3613
+ 308 275
3614
+ 397 886
3615
+ 492 707
3616
+ 1657 428
3617
+ 1077 2067
3618
+ 750 2768
3619
+ 1361 271
3620
+ 2084 614
3621
+ 3872 273
3622
+ 1244 776
3623
+ 1108 277
3624
+ 408 346
3625
+ 3876 396
3626
+ 272 323
3627
+ 472 2204
3628
+ 3879 388
3629
+ 324 603
3630
+ 3881 1908
3631
+ 156 729
3632
+ 3883 2071
3633
+ 2771 299
3634
+ 576 168
3635
+ 274 285
3636
+ 2774 941
3637
+ 1663 454
3638
+ 966 1080
3639
+ 879 484
3640
+ 3891 1106
3641
+ 321 473
3642
+ 663 1243
3643
+ 686 2206
3644
+ 1649 2207
3645
+ 178 2208
3646
+ 333 653
3647
+ 344 2210
3648
+ 345 345
3649
+ 424 723
3650
+ 465 340
3651
+ 3902 452
3652
+ 1032 2212
3653
+ 334 1848
3654
+ 266 424
3655
+ 355 1487
3656
+ 157 822
3657
+ 134 519
3658
+ 298 285
3659
+ 3910 351
3660
+ 2214 304
3661
+ 259 1225
3662
+ 1906 1255
3663
+ 526 279
3664
+ 181 1912
3665
+ 298 299
3666
+ 274 594
3667
+ 170 503
3668
+ 184 399
3669
+ 508 2784
3670
+ 170 2509
3671
+ 548 322
3672
+ 151 1024
3673
+ 2786 590
3674
+ 3925 2787
3675
+ 1495 1258
3676
+ 3927 847
3677
+ 271 2223
3678
+ 181 683
3679
+ 491 367
3680
+ 367 2224
3681
+ 166 628
3682
+ 1484 638
3683
+ 1241 749
3684
+ 2791 1305
3685
+ 3936 359
3686
+ 711 723
3687
+ 592 298
3688
+ 1447 1666
3689
+ 519 270
3690
+ 264 355
3691
+ 3942 270
3692
+ 3943 1811
3693
+ 2192 458
3694
+ 1470 277
3695
+ 1855 319
3696
+ 977 260
3697
+ 2497 620
3698
+ 3949 2799
3699
+ 3950 285
3700
+ 3951 477
3701
+ 3952 1651
3702
+ 327 135
3703
+ 659 1671
3704
+ 1821 664
3705
+ 164 859
3706
+ 361 1498
3707
+ 1203 387
3708
+ 1208 302
3709
+ 1920 1673
3710
+ 1642 2139
3711
+ 369 2232
3712
+ 1230 262
3713
+ 569 909
3714
+ 1259 606
3715
+ 3966 840
3716
+ 1312 865
3717
+ 1803 1590
3718
+ 673 752
3719
+ 978 670
3720
+ 1082 437
3721
+ 1280 484
3722
+ 2809 270
3723
+ 2236 2687
3724
+ 414 805
3725
+ 296 344
3726
+ 447 972
3727
+ 2811 260
3728
+ 3979 1157
3729
+ 334 2238
3730
+ 2814 910
3731
+ 3982 386
3732
+ 881 387
3733
+ 467 284
3734
+ 300 766
3735
+ 181 317
3736
+ 931 279
3737
+ 3988 298
3738
+ 536 296
3739
+ 2819 607
3740
+ 763 1572
3741
+ 1678 285
3742
+ 1802 808
3743
+ 331 401
3744
+ 570 586
3745
+ 1018 1472
3746
+ 563 939
3747
+ 805 954
3748
+ 167 261
3749
+ 987 265
3750
+ 2825 1679
3751
+ 4002 181
3752
+ 1402 2645
3753
+ 1353 1322
3754
+ 166 2243
3755
+ 367 654
3756
+ 148 2829
3757
+ 1496 297
3758
+ 156 2830
3759
+ 280 531
3760
+ 361 399
3761
+ 740 2763
3762
+ 44 672
3763
+ 1769 1262
3764
+ 339 1680
3765
+ 1361 887
3766
+ 895 713
3767
+ 659 2832
3768
+ 325 1157
3769
+ 4020 261
3770
+ 4021 335
3771
+ 173 1088
3772
+ 262 607
3773
+ 463 391
3774
+ 4025 463
3775
+ 1556 492
3776
+ 522 266
3777
+ 1926 818
3778
+ 175 356
3779
+ 300 930
3780
+ 681 277
3781
+ 4032 1658
3782
+ 2838 818
3783
+ 1633 312
3784
+ 488 168
3785
+ 320 740
3786
+ 339 1508
3787
+ 2676 490
3788
+ 519 382
3789
+ 335 570
3790
+ 2654 2250
3791
+ 4042 874
3792
+ 852 334
3793
+ 635 340
3794
+ 772 432
3795
+ 1251 669
3796
+ 513 419
3797
+ 4048 966
3798
+ 4049 744
3799
+ 1617 327
3800
+ 390 1077
3801
+ 2259 1488
3802
+ 986 1241
3803
+ 404 345
3804
+ 294 278
3805
+ 2850 317
3806
+ 2851 2756
3807
+ 568 1922
3808
+ 284 2049
3809
+ 166 416
3810
+ 4061 869
3811
+ 523 261
3812
+ 4063 692
3813
+ 1352 284
3814
+ 265 812
3815
+ 284 420
3816
+ 1819 318
3817
+ 468 351
3818
+ 1144 2260
3819
+ 321 1309
3820
+ 4071 519
3821
+ 4072 711
3822
+ 138 812
3823
+ 453 913
3824
+ 4075 578
3825
+ 1502 286
3826
+ 4077 824
3827
+ 1355 1040
3828
+ 4079 1644
3829
+ 765 1404
3830
+ 1161 1123
3831
+ 601 328
3832
+ 134 2211
3833
+ 4084 529
3834
+ 269 157
3835
+ 896 386
3836
+ 537 172
3837
+ 983 736
3838
+ 4089 280
3839
+ 4090 528
3840
+ 4091 1161
3841
+ 4092 2642
3842
+ 4093 830
3843
+ 4094 2251
3844
+ 154 1688
3845
+ 2861 1117
3846
+ 1474 334
3847
+ 283 2862
3848
+ 4099 1227
3849
+ 4100 1368
3850
+ 562 1140
3851
+ 170 1265
3852
+ 303 614
3853
+ 259 1197
3854
+ 2261 300
3855
+ 398 1369
3856
+ 944 2185
3857
+ 318 2262
3858
+ 274 1202
3859
+ 2867 302
3860
+ 846 1335
3861
+ 292 328
3862
+ 492 659
3863
+ 167 463
3864
+ 4115 273
3865
+ 4116 2872
3866
+ 353 829
3867
+ 344 329
3868
+ 4119 780
3869
+ 1400 2876
3870
+ 1794 788
3871
+ 272 689
3872
+ 267 162
3873
+ 362 641
3874
+ 742 1262
3875
+ 325 1908
3876
+ 328 373
3877
+ 659 595
3878
+ 2877 1486
3879
+ 262 546
3880
+ 1003 1162
3881
+ 302 884
3882
+ 1031 642
3883
+ 445 1119
3884
+ 302 182
3885
+ 334 690
3886
+ 405 1232
3887
+ 165 560
3888
+ 458 276
3889
+ 1128 604
3890
+ 350 2052
3891
+ 291 445
3892
+ 283 332
3893
+ 390 280
3894
+ 823 962
3895
+ 133 611
3896
+ 377 1856
3897
+ 724 349
3898
+ 2885 2886
3899
+ 933 616
3900
+ 4151 797
3901
+ 749 592
3902
+ 350 1351
3903
+ 319 499
3904
+ 786 885
3905
+ 526 447
3906
+ 2273 395
3907
+ 850 352
3908
+ 311 616
3909
+ 505 270
3910
+ 909 164
3911
+ 167 273
3912
+ 284 530
3913
+ 1892 363
3914
+ 280 384
3915
+ 557 273
3916
+ 2275 2708
3917
+ 312 1224
3918
+ 1943 611
3919
+ 328 537
3920
+ 823 425
3921
+ 348 270
3922
+ 259 740
3923
+ 2188 2897
3924
+ 721 170
3925
+ 161 716
3926
+ 1201 163
3927
+ 262 433
3928
+ 2279 1947
3929
+ 281 281
3930
+ 285 434
3931
+ 2901 898
3932
+ 4183 353
3933
+ 4184 352
3934
+ 4185 291
3935
+ 166 581
3936
+ 291 341
3937
+ 4188 703
3938
+ 277 165
3939
+ 2284 321
3940
+ 1231 437
3941
+ 513 350
3942
+ 2177 360
3943
+ 340 743
3944
+ 279 1701
3945
+ 798 181
3946
+ 719 330
3947
+ 304 861
3948
+ 264 1860
3949
+ 1137 2908
3950
+ 4201 1270
3951
+ 1375 2909
3952
+ 1949 2912
3953
+ 422 175
3954
+ 585 2254
3955
+ 945 731
3956
+ 2914 307
3957
+ 4208 1164
3958
+ 2915 1613
3959
+ 4210 383
3960
+ 4211 2817
3961
+ 181 1368
3962
+ 997 2138
3963
+ 4214 2916
3964
+ 259 608
3965
+ 335 473
3966
+ 168 2918
3967
+ 792 314
3968
+ 622 304
3969
+ 2248 732
3970
+ 2920 1265
3971
+ 419 525
3972
+ 2921 593
3973
+ 292 279
3974
+ 376 274
3975
+ 2096 481
3976
+ 2294 2280
3977
+ 361 2692
3978
+ 280 318
3979
+ 178 330
3980
+ 307 715
3981
+ 835 299
3982
+ 342 2296
3983
+ 450 284
3984
+ 1013 271
3985
+ 4236 167
3986
+ 383 274
3987
+ 264 2880
3988
+ 299 454
3989
+ 1282 261
3990
+ 656 1096
3991
+ 444 280
3992
+ 686 1199
3993
+ 4244 1097
3994
+ 4245 2929
3995
+ 669 1167
3996
+ 2298 273
3997
+ 1079 2790
3998
+ 487 1949
3999
+ 785 1626
4000
+ 430 1106
4001
+ 4252 1930
4002
+ 4253 2528
4003
+ 1199 339
4004
+ 337 315
4005
+ 332 435
4006
+ 278 840
4007
+ 2933 1377
4008
+ 324 272
4009
+ 393 264
4010
+ 501 680
4011
+ 178 2853
4012
+ 292 527
4013
+ 299 395
4014
+ 826 1709
4015
+ 1553 260
4016
+ 4267 430
4017
+ 4268 285
4018
+ 4269 495
4019
+ 556 1860
4020
+ 320 619
4021
+ 1173 369
4022
+ 283 318
4023
+ 4274 374
4024
+ 4275 1416
4025
+ 4276 435
4026
+ 2300 301
4027
+ 1685 479
4028
+ 811 10
4029
+ 182 1941
4030
+ 733 182
4031
+ 677 342
4032
+ 319 307
4033
+ 1052 414
4034
+ 382 334
4035
+ 685 387
4036
+ 841 1760
4037
+ 1748 618
4038
+ 436 270
4039
+ 504 822
4040
+ 397 797
4041
+ 1273 619
4042
+ 351 1294
4043
+ 334 973
4044
+ 143 435
4045
+ 4296 299
4046
+ 182 1166
4047
+ 256 851
4048
+ 325 1210
4049
+ 1512 721
4050
+ 280 1057
4051
+ 312 650
4052
+ 2275 1832
4053
+ 432 685
4054
+ 308 603
4055
+ 4306 1163
4056
+ 1234 277
4057
+ 171 299
4058
+ 314 619
4059
+ 256 133
4060
+ 257 2945
4061
+ 596 449
4062
+ 4313 2946
4063
+ 4314 2950
4064
+ 1702 568
4065
+ 1361 1962
4066
+ 562 184
4067
+ 2312 2959
4068
+ 259 472
4069
+ 2581 2772
4070
+ 826 1762
4071
+ 904 294
4072
+ 2281 523
4073
+ 4324 1070
4074
+ 4325 321
4075
+ 2314 482
4076
+ 4327 2960
4077
+ 4328 488
4078
+ 261 379
4079
+ 185 974
4080
+ 4331 307
4081
+ 4332 555
4082
+ 337 930
4083
+ 2288 327
4084
+ 4335 2840
4085
+ 4336 271
4086
+ 4337 2216
4087
+ 314 945
4088
+ 344 443
4089
+ 172 616
4090
+ 4341 323
4091
+ 4342 304
4092
+ 178 1134
4093
+ 150 383
4094
+ 1149 495
4095
+ 482 1580
4096
+ 2965 264
4097
+ 4348 2966
4098
+ 1176 276
4099
+ 156 317
4100
+ 1096 264
4101
+ 307 369
4102
+ 4353 359
4103
+ 658 332
4104
+ 2967 321
4105
+ 1708 302
4106
+ 166 1664
4107
+ 4358 359
4108
+ 2954 614
4109
+ 653 436
4110
+ 620 332
4111
+ 270 178
4112
+ 353 277
4113
+ 134 1416
4114
+ 4365 2972
4115
+ 729 420
4116
+ 536 39
4117
+ 1274 2321
4118
+ 4369 32
4119
+ 32 331
4120
+ 287 421
4121
+ 4372 340
4122
+ 370 471
4123
+ 2979 888
4124
+ 681 460
4125
+ 383 1366
4126
+ 618 802
4127
+ 1081 2793
4128
+ 370 1249
4129
+ 271 1030
4130
+ 271 846
4131
+ 2988 1382
4132
+ 4383 311
4133
+ 4384 550
4134
+ 481 170
4135
+ 32 523
4136
+ 32 465
4137
+ 4388 1034
4138
+ 1274 2993
4139
+ 2331 32
4140
+ 338 611
4141
+ 4392 505
4142
+ 4393 1716
4143
+ 4394 362
4144
+ 4395 357
4145
+ 714 2992
4146
+ 519 1717
4147
+ 839 348
4148
+ 4399 319
4149
+ 156 273
4150
+ 526 708
4151
+ 423 685
4152
+ 702 613
4153
+ 421 538
4154
+ 747 307
4155
+ 4406 419
4156
+ 971 379
4157
+ 398 1975
4158
+ 2940 712
4159
+ 296 156
4160
+ 1328 280
4161
+ 279 277
4162
+ 167 623
4163
+ 1530 991
4164
+ 1660 696
4165
+ 350 1533
4166
+ 320 2998
4167
+ 262 945
4168
+ 302 905
4169
+ 1656 292
4170
+ 264 1406
4171
+ 331 272
4172
+ 721 295
4173
+ 327 1380
4174
+ 1057 172
4175
+ 487 270
4176
+ 594 1905
4177
+ 292 389
4178
+ 577 1237
4179
+ 1314 2855
4180
+ 331 658
4181
+ 371 184
4182
+ 4433 317
4183
+ 618 676
4184
+ 468 1969
4185
+ 2340 3002
4186
+ 4437 270
4187
+ 3003 1674
4188
+ 4439 1653
4189
+ 1018 943
4190
+ 4441 786
4191
+ 174 1458
4192
+ 166 261
4193
+ 4444 256
4194
+ 4445 1534
4195
+ 4446 285
4196
+ 397 589
4197
+ 463 2719
4198
+ 4449 292
4199
+ 435 744
4200
+ 451 285
4201
+ 276 181
4202
+ 676 636
4203
+ 325 280
4204
+ 2345 992
4205
+ 1695 32
4206
+ 1909 517
4207
+ 397 379
4208
+ 32 444
4209
+ 329 376
4210
+ 368 257
4211
+ 292 2903
4212
+ 1536 443
4213
+ 4464 1348
4214
+ 2230 481
4215
+ 487 443
4216
+ 277 1537
4217
+ 134 284
4218
+ 155 2349
4219
+ 800 2093
4220
+ 4471 1722
4221
+ 462 2350
4222
+ 4473 547
4223
+ 4474 285
4224
+ 3015 3016
4225
+ 1270 444
4226
+ 838 330
4227
+ 361 1698
4228
+ 377 323
4229
+ 264 1098
4230
+ 171 346
4231
+ 4482 265
4232
+ 4483 364
4233
+ 4484 285
4234
+ 4485 540
4235
+ 806 2353
4236
+ 4487 2334
4237
+ 1259 372
4238
+ 4489 3020
4239
+ 758 982
4240
+ 4491 1715
4241
+ 1722 2943
4242
+ 314 2305
4243
+ 381 304
4244
+ 393 1982
4245
+ 482 333
4246
+ 1903 807
4247
+ 3023 1724
4248
+ 4499 2318
4249
+ 470 45
4250
+ 482 275
4251
+ 4502 2053
4252
+ 392 669
4253
+ 2179 729
4254
+ 264 3027
4255
+ 371 638
4256
+ 300 1503
4257
+ 3032 970
4258
+ 888 262
4259
+ 289 285
4260
+ 1229 349
4261
+ 2354 2322
4262
+ 342 1083
4263
+ 271 543
4264
+ 747 1070
4265
+ 4516 762
4266
+ 4517 291
4267
+ 850 634
4268
+ 386 473
4269
+ 156 775
4270
+ 310 161
4271
+ 270 164
4272
+ 312 619
4273
+ 1984 1233
4274
+ 4525 1977
4275
+ 4526 2619
4276
+ 4527 3035
4277
+ 4528 802
4278
+ 4529 2976
4279
+ 4530 2356
4280
+ 4531 2343
4281
+ 4532 2338
4282
+ 4533 603
4283
+ 4534 319
4284
+ 4535 399
4285
+ 4536 508
4286
+ 4537 330
4287
+ 4538 894
4288
+ 4539 1386
4289
+ 4540 39
4290
+ 4541 3037
4291
+ 4542 2314
4292
+ 4543 762
4293
+ 4544 716
4294
+ 4545 3038
4295
+ 4546 564
4296
+ 4547 2985
4297
+ 4548 3039
4298
+ 4549 3040
4299
+ 4550 349
4300
+ 4551 1961
4301
+ 4552 861
4302
+ 4553 1165
4303
+ 2359 2160
4304
+ 4555 323
4305
+ 154 944
4306
+ 1986 896
4307
+ 672 574
4308
+ 334 178
4309
+ 319 356
4310
+ 265 634
4311
+ 259 861
4312
+ 610 335
4313
+ 2294 1947
4314
+ 327 2847
4315
+ 898 842
4316
+ 393 361
4317
+ 1898 1505
4318
+ 755 280
4319
+ 408 600
4320
+ 4571 273
4321
+ 4572 372
4322
+ 300 433
4323
+ 4574 307
4324
+ 833 347
4325
+ 370 324
4326
+ 294 135
4327
+ 4578 421
4328
+ 4579 308
4329
+ 4580 474
4330
+ 762 359
4331
+ 316 301
4332
+ 905 559
4333
+ 576 1021
4334
+ 1727 647
4335
+ 272 395
4336
+ 3048 382
4337
+ 277 1382
4338
+ 400 650
4339
+ 170 567
4340
+ 3050 3051
4341
+ 674 513
4342
+ 3053 371
4343
+ 159 384
4344
+ 477 317
4345
+ 4596 1146
4346
+ 526 505
4347
+ 185 269
4348
+ 4599 289
4349
+ 4600 340
4350
+ 487 867
4351
+ 367 332
4352
+ 3054 324
4353
+ 4604 297
4354
+ 431 395
4355
+ 690 182
4356
+ 1654 1714
4357
+ 4608 3059
4358
+ 4609 298
4359
+ 4610 660
4360
+ 181 1873
4361
+ 638 745
4362
+ 2962 1490
4363
+ 561 340
4364
+ 4615 394
4365
+ 307 290
4366
+ 1448 3066
4367
+ 1983 300
4368
+ 508 478
4369
+ 2043 461
4370
+ 786 2162
4371
+ 325 372
4372
+ 379 2468
4373
+ 1039 292
4374
+ 2697 594
4375
+ 281 264
4376
+ 260 44
4377
+ 503 44
4378
+ 2274 271
4379
+ 1264 1388
4380
+ 1731 571
4381
+ 776 281
4382
+ 339 283
4383
+ 401 292
4384
+ 473 461
4385
+ 569 1510
4386
+ 403 803
4387
+ 2376 551
4388
+ 262 2056
4389
+ 1789 425
4390
+ 1100 272
4391
+ 1995 835
4392
+ 1058 509
4393
+ 555 3073
4394
+ 1443 271
4395
+ 148 1541
4396
+ 337 529
4397
+ 2377 439
4398
+ 557 311
4399
+ 2379 337
4400
+ 338 834
4401
+ 294 2355
4402
+ 1156 820
4403
+ 1997 1987
4404
+ 334 3083
4405
+ 335 678
4406
+ 636 927
4407
+ 32 562
4408
+ 509 531
4409
+ 4660 287
4410
+ 837 304
4411
+ 2246 1543
4412
+ 488 134
4413
+ 319 616
4414
+ 596 2541
4415
+ 1568 653
4416
+ 274 478
4417
+ 334 671
4418
+ 341 373
4419
+ 445 1214
4420
+ 562 626
4421
+ 1272 867
4422
+ 3088 402
4423
+ 276 154
4424
+ 379 729
4425
+ 3089 321
4426
+ 1534 848
4427
+ 1306 824
4428
+ 3090 262
4429
+ 671 529
4430
+ 1500 580
4431
+ 4682 2219
4432
+ 338 274
4433
+ 4684 833
4434
+ 430 622
4435
+ 1263 1945
4436
+ 737 622
4437
+ 4688 1338
4438
+ 610 607
4439
+ 980 2104
4440
+ 3095 39
4441
+ 380 1116
4442
+ 2385 2129
4443
+ 2001 633
4444
+ 185 280
4445
+ 4696 571
4446
+ 361 1528
4447
+ 353 1701
4448
+ 1238 277
4449
+ 4700 387
4450
+ 4701 1390
4451
+ 329 272
4452
+ 4703 538
4453
+ 916 654
4454
+ 542 349
4455
+ 1435 271
4456
+ 410 386
4457
+ 184 581
4458
+ 2297 277
4459
+ 318 3080
4460
+ 654 168
4461
+ 379 1681
4462
+ 775 172
4463
+ 151 1025
4464
+ 488 154
4465
+ 4716 607
4466
+ 2385 1134
4467
+ 2388 337
4468
+ 523 541
4469
+ 271 161
4470
+ 260 39
4471
+ 519 745
4472
+ 632 529
4473
+ 733 171
4474
+ 719 729
4475
+ 1124 269
4476
+ 4727 167
4477
+ 327 2392
4478
+ 503 311
4479
+ 323 2393
4480
+ 907 437
4481
+ 1483 3108
4482
+ 178 785
4483
+ 490 971
4484
+ 32 318
4485
+ 755 645
4486
+ 385 728
4487
+ 174 1371
4488
+ 699 156
4489
+ 291 565
4490
+ 377 299
4491
+ 541 383
4492
+ 951 317
4493
+ 284 391
4494
+ 850 1184
4495
+ 948 647
4496
+ 2810 1006
4497
+ 468 277
4498
+ 915 454
4499
+ 741 296
4500
+ 1036 1946
4501
+ 305 846
4502
+ 2737 1545
4503
+ 691 277
4504
+ 649 648
4505
+ 958 1215
4506
+ 667 2397
4507
+ 1734 941
4508
+ 4759 537
4509
+ 566 278
4510
+ 1217 613
4511
+ 1335 557
4512
+ 168 1517
4513
+ 814 170
4514
+ 1339 1019
4515
+ 1367 292
4516
+ 44 895
4517
+ 1687 866
4518
+ 361 715
4519
+ 276 174
4520
+ 323 366
4521
+ 4772 2907
4522
+ 4773 272
4523
+ 1150 1371
4524
+ 900 424
4525
+ 360 405
4526
+ 4777 273
4527
+ 1460 2388
4528
+ 302 1250
4529
+ 804 3116
4530
+ 491 156
4531
+ 329 463
4532
+ 488 1530
4533
+ 4784 982
4534
+ 4785 1810
4535
+ 1036 1831
4536
+ 489 657
4537
+ 588 1167
4538
+ 298 440
4539
+ 1141 277
4540
+ 325 1477
4541
+ 3121 1072
4542
+ 963 1206
4543
+ 687 491
4544
+ 171 620
4545
+ 3122 2403
4546
+ 151 285
4547
+ 4798 280
4548
+ 325 391
4549
+ 137 1806
4550
+ 830 3124
4551
+ 4802 1662
4552
+ 1871 342
4553
+ 276 912
4554
+ 759 466
4555
+ 307 704
4556
+ 339 284
4557
+ 890 1237
4558
+ 168 1164
4559
+ 2816 1563
4560
+ 347 274
4561
+ 2106 3117
4562
+ 419 314
4563
+ 4814 282
4564
+ 274 542
4565
+ 2337 939
4566
+ 4817 2007
4567
+ 374 317
4568
+ 4819 842
4569
+ 371 993
4570
+ 2666 1086
4571
+ 1048 1459
4572
+ 277 150
4573
+ 174 328
4574
+ 329 1388
4575
+ 426 170
4576
+ 4827 834
4577
+ 989 1114
4578
+ 302 929
4579
+ 743 264
4580
+ 1362 1739
4581
+ 529 170
4582
+ 664 1740
4583
+ 292 2215
4584
+ 672 1524
4585
+ 171 3132
4586
+ 165 1524
4587
+ 1383 286
4588
+ 172 1163
4589
+ 260 438
4590
+ 458 1648
4591
+ 4842 291
4592
+ 523 284
4593
+ 355 561
4594
+ 4845 2798
4595
+ 487 2210
4596
+ 381 1256
4597
+ 436 764
4598
+ 380 722
4599
+ 4850 371
4600
+ 413 372
4601
+ 582 1359
4602
+ 430 283
4603
+ 1897 557
4604
+ 3136 425
4605
+ 2100 363
4606
+ 408 634
4607
+ 903 616
4608
+ 292 303
4609
+ 321 3137
4610
+ 1344 2270
4611
+ 2412 1039
4612
+ 610 342
4613
+ 624 1739
4614
+ 3139 2870
4615
+ 345 886
4616
+ 341 347
4617
+ 260 391
4618
+ 1539 461
4619
+ 929 329
4620
+ 271 624
4621
+ 2169 398
4622
+ 4873 310
4623
+ 4874 3142
4624
+ 4875 299
4625
+ 4876 260
4626
+ 4877 634
4627
+ 548 636
4628
+ 1013 349
4629
+ 335 278
4630
+ 288 182
4631
+ 284 320
4632
+ 3145 627
4633
+ 996 2919
4634
+ 4885 548
4635
+ 296 1993
4636
+ 1139 1262
4637
+ 596 1213
4638
+ 835 262
4639
+ 1119 1505
4640
+ 893 382
4641
+ 449 1429
4642
+ 423 740
4643
+ 266 639
4644
+ 268 160
4645
+ 764 424
4646
+ 377 1761
4647
+ 1928 2405
4648
+ 325 3149
4649
+ 2418 749
4650
+ 2419 846
4651
+ 170 1061
4652
+ 361 2140
4653
+ 279 274
4654
+ 1536 2403
4655
+ 709 363
4656
+ 1836 1481
4657
+ 267 543
4658
+ 4909 1394
4659
+ 533 265
4660
+ 1513 1546
4661
+ 181 274
4662
+ 512 489
4663
+ 3154 764
4664
+ 3085 265
4665
+ 3030 2267
4666
+ 274 365
4667
+ 3155 1625
4668
+ 771 273
4669
+ 379 1319
4670
+ 321 626
4671
+ 323 555
4672
+ 360 2423
4673
+ 763 342
4674
+ 636 407
4675
+ 1992 664
4676
+ 323 348
4677
+ 1220 3146
4678
+ 184 3160
4679
+ 2036 274
4680
+ 2421 2375
4681
+ 941 373
4682
+ 368 283
4683
+ 2380 2615
4684
+ 270 742
4685
+ 1765 1193
4686
+ 4937 2834
4687
+ 2222 858
4688
+ 438 2422
4689
+ 4940 911
4690
+ 888 669
4691
+ 150 328
4692
+ 143 273
4693
+ 1776 962
4694
+ 426 278
4695
+ 3164 645
4696
+ 930 868
4697
+ 1957 460
4698
+ 133 3102
4699
+ 426 570
4700
+ 2424 1851
4701
+ 588 168
4702
+ 4953 1017
4703
+ 4954 181
4704
+ 4955 399
4705
+ 1260 284
4706
+ 371 1429
4707
+ 1172 1390
4708
+ 898 836
4709
+ 4960 276
4710
+ 4961 665
4711
+ 329 1131
4712
+ 4963 270
4713
+ 508 730
4714
+ 380 2013
4715
+ 403 172
4716
+ 185 448
4717
+ 2013 445
4718
+ 1287 591
4719
+ 1972 372
4720
+ 178 2423
4721
+ 553 566
4722
+ 3006 1478
4723
+ 659 170
4724
+ 332 1570
4725
+ 321 134
4726
+ 154 2686
4727
+ 272 298
4728
+ 278 648
4729
+ 334 723
4730
+ 740 273
4731
+ 1076 298
4732
+ 939 172
4733
+ 2427 1278
4734
+ 636 1098
4735
+ 2417 271
4736
+ 711 344
4737
+ 342 378
4738
+ 1446 867
4739
+ 271 1278
4740
+ 156 2779
4741
+ 900 773
4742
+ 956 2193
4743
+ 327 168
4744
+ 555 325
4745
+ 323 274
4746
+ 1135 361
4747
+ 1223 172
tokenizer_model/hindi_sentiments_basic.vocab ADDED
The diff for this file is too large to render. See raw diff
 
train.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ This script is used to train the tokenizer model using the combined content of the dataset.
3
+ The trained model is saved in the tokenizer_model directory.
4
+ """
5
+
6
+ import os
7
+ from tokenizer.basic_bpe import BasicTokenizer
8
+
9
+ # reading the input file
10
+ combined_file_path = "hindi_combined.txt"
11
+ combined_file_path = os.path.join(os.getcwd(), "data", combined_file_path)
12
+ with open(combined_file_path, "r") as file:
13
+ combined_content = file.read()
14
+
15
+ basic_tokenizer = BasicTokenizer()
16
+ print("Training the tokenizer model...")
17
+ basic_tokenizer.train(combined_content, vocab_size=5000, verbose=True)
18
+
19
+ print("Saving the model...")
20
+ model_path = os.path.join(os.getcwd(), "tokenizer_model")
21
+ os.makedirs(model_path, exist_ok=True)
22
+ prefix = os.path.join(model_path, "hindi_sentiments_basic")
23
+ basic_tokenizer.save(prefix)
24
+ print("Model saved at:", prefix)