1# Generated by Snowball 2.2.0 - https://snowballstem.org/
2
3from .basestemmer import BaseStemmer
4from .among import Among
5
6
7class ArabicStemmer(BaseStemmer):
8    '''
9    This class implements the stemming algorithm defined by a snowball script.
10    Generated by Snowball 2.2.0 - https://snowballstem.org/
11    '''
12
13    a_0 = [
14        Among(u"\u0640", -1, 1),
15        Among(u"\u064B", -1, 1),
16        Among(u"\u064C", -1, 1),
17        Among(u"\u064D", -1, 1),
18        Among(u"\u064E", -1, 1),
19        Among(u"\u064F", -1, 1),
20        Among(u"\u0650", -1, 1),
21        Among(u"\u0651", -1, 1),
22        Among(u"\u0652", -1, 1),
23        Among(u"\u0660", -1, 2),
24        Among(u"\u0661", -1, 3),
25        Among(u"\u0662", -1, 4),
26        Among(u"\u0663", -1, 5),
27        Among(u"\u0664", -1, 6),
28        Among(u"\u0665", -1, 7),
29        Among(u"\u0666", -1, 8),
30        Among(u"\u0667", -1, 9),
31        Among(u"\u0668", -1, 10),
32        Among(u"\u0669", -1, 11),
33        Among(u"\uFE80", -1, 12),
34        Among(u"\uFE81", -1, 16),
35        Among(u"\uFE82", -1, 16),
36        Among(u"\uFE83", -1, 13),
37        Among(u"\uFE84", -1, 13),
38        Among(u"\uFE85", -1, 17),
39        Among(u"\uFE86", -1, 17),
40        Among(u"\uFE87", -1, 14),
41        Among(u"\uFE88", -1, 14),
42        Among(u"\uFE89", -1, 15),
43        Among(u"\uFE8A", -1, 15),
44        Among(u"\uFE8B", -1, 15),
45        Among(u"\uFE8C", -1, 15),
46        Among(u"\uFE8D", -1, 18),
47        Among(u"\uFE8E", -1, 18),
48        Among(u"\uFE8F", -1, 19),
49        Among(u"\uFE90", -1, 19),
50        Among(u"\uFE91", -1, 19),
51        Among(u"\uFE92", -1, 19),
52        Among(u"\uFE93", -1, 20),
53        Among(u"\uFE94", -1, 20),
54        Among(u"\uFE95", -1, 21),
55        Among(u"\uFE96", -1, 21),
56        Among(u"\uFE97", -1, 21),
57        Among(u"\uFE98", -1, 21),
58        Among(u"\uFE99", -1, 22),
59        Among(u"\uFE9A", -1, 22),
60        Among(u"\uFE9B", -1, 22),
61        Among(u"\uFE9C", -1, 22),
62        Among(u"\uFE9D", -1, 23),
63        Among(u"\uFE9E", -1, 23),
64        Among(u"\uFE9F", -1, 23),
65        Among(u"\uFEA0", -1, 23),
66        Among(u"\uFEA1", -1, 24),
67        Among(u"\uFEA2", -1, 24),
68        Among(u"\uFEA3", -1, 24),
69        Among(u"\uFEA4", -1, 24),
70        Among(u"\uFEA5", -1, 25),
71        Among(u"\uFEA6", -1, 25),
72        Among(u"\uFEA7", -1, 25),
73        Among(u"\uFEA8", -1, 25),
74        Among(u"\uFEA9", -1, 26),
75        Among(u"\uFEAA", -1, 26),
76        Among(u"\uFEAB", -1, 27),
77        Among(u"\uFEAC", -1, 27),
78        Among(u"\uFEAD", -1, 28),
79        Among(u"\uFEAE", -1, 28),
80        Among(u"\uFEAF", -1, 29),
81        Among(u"\uFEB0", -1, 29),
82        Among(u"\uFEB1", -1, 30),
83        Among(u"\uFEB2", -1, 30),
84        Among(u"\uFEB3", -1, 30),
85        Among(u"\uFEB4", -1, 30),
86        Among(u"\uFEB5", -1, 31),
87        Among(u"\uFEB6", -1, 31),
88        Among(u"\uFEB7", -1, 31),
89        Among(u"\uFEB8", -1, 31),
90        Among(u"\uFEB9", -1, 32),
91        Among(u"\uFEBA", -1, 32),
92        Among(u"\uFEBB", -1, 32),
93        Among(u"\uFEBC", -1, 32),
94        Among(u"\uFEBD", -1, 33),
95        Among(u"\uFEBE", -1, 33),
96        Among(u"\uFEBF", -1, 33),
97        Among(u"\uFEC0", -1, 33),
98        Among(u"\uFEC1", -1, 34),
99        Among(u"\uFEC2", -1, 34),
100        Among(u"\uFEC3", -1, 34),
101        Among(u"\uFEC4", -1, 34),
102        Among(u"\uFEC5", -1, 35),
103        Among(u"\uFEC6", -1, 35),
104        Among(u"\uFEC7", -1, 35),
105        Among(u"\uFEC8", -1, 35),
106        Among(u"\uFEC9", -1, 36),
107        Among(u"\uFECA", -1, 36),
108        Among(u"\uFECB", -1, 36),
109        Among(u"\uFECC", -1, 36),
110        Among(u"\uFECD", -1, 37),
111        Among(u"\uFECE", -1, 37),
112        Among(u"\uFECF", -1, 37),
113        Among(u"\uFED0", -1, 37),
114        Among(u"\uFED1", -1, 38),
115        Among(u"\uFED2", -1, 38),
116        Among(u"\uFED3", -1, 38),
117        Among(u"\uFED4", -1, 38),
118        Among(u"\uFED5", -1, 39),
119        Among(u"\uFED6", -1, 39),
120        Among(u"\uFED7", -1, 39),
121        Among(u"\uFED8", -1, 39),
122        Among(u"\uFED9", -1, 40),
123        Among(u"\uFEDA", -1, 40),
124        Among(u"\uFEDB", -1, 40),
125        Among(u"\uFEDC", -1, 40),
126        Among(u"\uFEDD", -1, 41),
127        Among(u"\uFEDE", -1, 41),
128        Among(u"\uFEDF", -1, 41),
129        Among(u"\uFEE0", -1, 41),
130        Among(u"\uFEE1", -1, 42),
131        Among(u"\uFEE2", -1, 42),
132        Among(u"\uFEE3", -1, 42),
133        Among(u"\uFEE4", -1, 42),
134        Among(u"\uFEE5", -1, 43),
135        Among(u"\uFEE6", -1, 43),
136        Among(u"\uFEE7", -1, 43),
137        Among(u"\uFEE8", -1, 43),
138        Among(u"\uFEE9", -1, 44),
139        Among(u"\uFEEA", -1, 44),
140        Among(u"\uFEEB", -1, 44),
141        Among(u"\uFEEC", -1, 44),
142        Among(u"\uFEED", -1, 45),
143        Among(u"\uFEEE", -1, 45),
144        Among(u"\uFEEF", -1, 46),
145        Among(u"\uFEF0", -1, 46),
146        Among(u"\uFEF1", -1, 47),
147        Among(u"\uFEF2", -1, 47),
148        Among(u"\uFEF3", -1, 47),
149        Among(u"\uFEF4", -1, 47),
150        Among(u"\uFEF5", -1, 51),
151        Among(u"\uFEF6", -1, 51),
152        Among(u"\uFEF7", -1, 49),
153        Among(u"\uFEF8", -1, 49),
154        Among(u"\uFEF9", -1, 50),
155        Among(u"\uFEFA", -1, 50),
156        Among(u"\uFEFB", -1, 48),
157        Among(u"\uFEFC", -1, 48)
158    ]
159
160    a_1 = [
161        Among(u"\u0622", -1, 1),
162        Among(u"\u0623", -1, 1),
163        Among(u"\u0624", -1, 1),
164        Among(u"\u0625", -1, 1),
165        Among(u"\u0626", -1, 1)
166    ]
167
168    a_2 = [
169        Among(u"\u0622", -1, 1),
170        Among(u"\u0623", -1, 1),
171        Among(u"\u0624", -1, 2),
172        Among(u"\u0625", -1, 1),
173        Among(u"\u0626", -1, 3)
174    ]
175
176    a_3 = [
177        Among(u"\u0627\u0644", -1, 2),
178        Among(u"\u0628\u0627\u0644", -1, 1),
179        Among(u"\u0643\u0627\u0644", -1, 1),
180        Among(u"\u0644\u0644", -1, 2)
181    ]
182
183    a_4 = [
184        Among(u"\u0623\u0622", -1, 2),
185        Among(u"\u0623\u0623", -1, 1),
186        Among(u"\u0623\u0624", -1, 1),
187        Among(u"\u0623\u0625", -1, 4),
188        Among(u"\u0623\u0627", -1, 3)
189    ]
190
191    a_5 = [
192        Among(u"\u0641", -1, 1),
193        Among(u"\u0648", -1, 1)
194    ]
195
196    a_6 = [
197        Among(u"\u0627\u0644", -1, 2),
198        Among(u"\u0628\u0627\u0644", -1, 1),
199        Among(u"\u0643\u0627\u0644", -1, 1),
200        Among(u"\u0644\u0644", -1, 2)
201    ]
202
203    a_7 = [
204        Among(u"\u0628", -1, 1),
205        Among(u"\u0628\u0627", 0, -1),
206        Among(u"\u0628\u0628", 0, 2),
207        Among(u"\u0643\u0643", -1, 3)
208    ]
209
210    a_8 = [
211        Among(u"\u0633\u0623", -1, 4),
212        Among(u"\u0633\u062A", -1, 2),
213        Among(u"\u0633\u0646", -1, 3),
214        Among(u"\u0633\u064A", -1, 1)
215    ]
216
217    a_9 = [
218        Among(u"\u062A\u0633\u062A", -1, 1),
219        Among(u"\u0646\u0633\u062A", -1, 1),
220        Among(u"\u064A\u0633\u062A", -1, 1)
221    ]
222
223    a_10 = [
224        Among(u"\u0643\u0645\u0627", -1, 3),
225        Among(u"\u0647\u0645\u0627", -1, 3),
226        Among(u"\u0646\u0627", -1, 2),
227        Among(u"\u0647\u0627", -1, 2),
228        Among(u"\u0643", -1, 1),
229        Among(u"\u0643\u0645", -1, 2),
230        Among(u"\u0647\u0645", -1, 2),
231        Among(u"\u0647\u0646", -1, 2),
232        Among(u"\u0647", -1, 1),
233        Among(u"\u064A", -1, 1)
234    ]
235
236    a_11 = [
237        Among(u"\u0646", -1, 1)
238    ]
239
240    a_12 = [
241        Among(u"\u0627", -1, 1),
242        Among(u"\u0648", -1, 1),
243        Among(u"\u064A", -1, 1)
244    ]
245
246    a_13 = [
247        Among(u"\u0627\u062A", -1, 1)
248    ]
249
250    a_14 = [
251        Among(u"\u062A", -1, 1)
252    ]
253
254    a_15 = [
255        Among(u"\u0629", -1, 1)
256    ]
257
258    a_16 = [
259        Among(u"\u064A", -1, 1)
260    ]
261
262    a_17 = [
263        Among(u"\u0643\u0645\u0627", -1, 3),
264        Among(u"\u0647\u0645\u0627", -1, 3),
265        Among(u"\u0646\u0627", -1, 2),
266        Among(u"\u0647\u0627", -1, 2),
267        Among(u"\u0643", -1, 1),
268        Among(u"\u0643\u0645", -1, 2),
269        Among(u"\u0647\u0645", -1, 2),
270        Among(u"\u0643\u0646", -1, 2),
271        Among(u"\u0647\u0646", -1, 2),
272        Among(u"\u0647", -1, 1),
273        Among(u"\u0643\u0645\u0648", -1, 3),
274        Among(u"\u0646\u064A", -1, 2)
275    ]
276
277    a_18 = [
278        Among(u"\u0627", -1, 1),
279        Among(u"\u062A\u0627", 0, 2),
280        Among(u"\u062A\u0645\u0627", 0, 4),
281        Among(u"\u0646\u0627", 0, 2),
282        Among(u"\u062A", -1, 1),
283        Among(u"\u0646", -1, 1),
284        Among(u"\u0627\u0646", 5, 3),
285        Among(u"\u062A\u0646", 5, 2),
286        Among(u"\u0648\u0646", 5, 3),
287        Among(u"\u064A\u0646", 5, 3),
288        Among(u"\u064A", -1, 1)
289    ]
290
291    a_19 = [
292        Among(u"\u0648\u0627", -1, 1),
293        Among(u"\u062A\u0645", -1, 1)
294    ]
295
296    a_20 = [
297        Among(u"\u0648", -1, 1),
298        Among(u"\u062A\u0645\u0648", 0, 2)
299    ]
300
301    a_21 = [
302        Among(u"\u0649", -1, 1)
303    ]
304
305    B_is_defined = False
306    B_is_verb = False
307    B_is_noun = False
308
309    def __r_Normalize_pre(self):
310        v_1 = self.cursor
311        try:
312            while True:
313                v_2 = self.cursor
314                try:
315                    try:
316                        v_3 = self.cursor
317                        try:
318                            self.bra = self.cursor
319                            among_var = self.find_among(ArabicStemmer.a_0)
320                            if among_var == 0:
321                                raise lab3()
322                            self.ket = self.cursor
323                            if among_var == 1:
324                                if not self.slice_del():
325                                    return False
326
327                            elif among_var == 2:
328                                if not self.slice_from(u"0"):
329                                    return False
330                            elif among_var == 3:
331                                if not self.slice_from(u"1"):
332                                    return False
333                            elif among_var == 4:
334                                if not self.slice_from(u"2"):
335                                    return False
336                            elif among_var == 5:
337                                if not self.slice_from(u"3"):
338                                    return False
339                            elif among_var == 6:
340                                if not self.slice_from(u"4"):
341                                    return False
342                            elif among_var == 7:
343                                if not self.slice_from(u"5"):
344                                    return False
345                            elif among_var == 8:
346                                if not self.slice_from(u"6"):
347                                    return False
348                            elif among_var == 9:
349                                if not self.slice_from(u"7"):
350                                    return False
351                            elif among_var == 10:
352                                if not self.slice_from(u"8"):
353                                    return False
354                            elif among_var == 11:
355                                if not self.slice_from(u"9"):
356                                    return False
357                            elif among_var == 12:
358                                if not self.slice_from(u"\u0621"):
359                                    return False
360                            elif among_var == 13:
361                                if not self.slice_from(u"\u0623"):
362                                    return False
363                            elif among_var == 14:
364                                if not self.slice_from(u"\u0625"):
365                                    return False
366                            elif among_var == 15:
367                                if not self.slice_from(u"\u0626"):
368                                    return False
369                            elif among_var == 16:
370                                if not self.slice_from(u"\u0622"):
371                                    return False
372                            elif among_var == 17:
373                                if not self.slice_from(u"\u0624"):
374                                    return False
375                            elif among_var == 18:
376                                if not self.slice_from(u"\u0627"):
377                                    return False
378                            elif among_var == 19:
379                                if not self.slice_from(u"\u0628"):
380                                    return False
381                            elif among_var == 20:
382                                if not self.slice_from(u"\u0629"):
383                                    return False
384                            elif among_var == 21:
385                                if not self.slice_from(u"\u062A"):
386                                    return False
387                            elif among_var == 22:
388                                if not self.slice_from(u"\u062B"):
389                                    return False
390                            elif among_var == 23:
391                                if not self.slice_from(u"\u062C"):
392                                    return False
393                            elif among_var == 24:
394                                if not self.slice_from(u"\u062D"):
395                                    return False
396                            elif among_var == 25:
397                                if not self.slice_from(u"\u062E"):
398                                    return False
399                            elif among_var == 26:
400                                if not self.slice_from(u"\u062F"):
401                                    return False
402                            elif among_var == 27:
403                                if not self.slice_from(u"\u0630"):
404                                    return False
405                            elif among_var == 28:
406                                if not self.slice_from(u"\u0631"):
407                                    return False
408                            elif among_var == 29:
409                                if not self.slice_from(u"\u0632"):
410                                    return False
411                            elif among_var == 30:
412                                if not self.slice_from(u"\u0633"):
413                                    return False
414                            elif among_var == 31:
415                                if not self.slice_from(u"\u0634"):
416                                    return False
417                            elif among_var == 32:
418                                if not self.slice_from(u"\u0635"):
419                                    return False
420                            elif among_var == 33:
421                                if not self.slice_from(u"\u0636"):
422                                    return False
423                            elif among_var == 34:
424                                if not self.slice_from(u"\u0637"):
425                                    return False
426                            elif among_var == 35:
427                                if not self.slice_from(u"\u0638"):
428                                    return False
429                            elif among_var == 36:
430                                if not self.slice_from(u"\u0639"):
431                                    return False
432                            elif among_var == 37:
433                                if not self.slice_from(u"\u063A"):
434                                    return False
435                            elif among_var == 38:
436                                if not self.slice_from(u"\u0641"):
437                                    return False
438                            elif among_var == 39:
439                                if not self.slice_from(u"\u0642"):
440                                    return False
441                            elif among_var == 40:
442                                if not self.slice_from(u"\u0643"):
443                                    return False
444                            elif among_var == 41:
445                                if not self.slice_from(u"\u0644"):
446                                    return False
447                            elif among_var == 42:
448                                if not self.slice_from(u"\u0645"):
449                                    return False
450                            elif among_var == 43:
451                                if not self.slice_from(u"\u0646"):
452                                    return False
453                            elif among_var == 44:
454                                if not self.slice_from(u"\u0647"):
455                                    return False
456                            elif among_var == 45:
457                                if not self.slice_from(u"\u0648"):
458                                    return False
459                            elif among_var == 46:
460                                if not self.slice_from(u"\u0649"):
461                                    return False
462                            elif among_var == 47:
463                                if not self.slice_from(u"\u064A"):
464                                    return False
465                            elif among_var == 48:
466                                if not self.slice_from(u"\u0644\u0627"):
467                                    return False
468                            elif among_var == 49:
469                                if not self.slice_from(u"\u0644\u0623"):
470                                    return False
471                            elif among_var == 50:
472                                if not self.slice_from(u"\u0644\u0625"):
473                                    return False
474                            else:
475                                if not self.slice_from(u"\u0644\u0622"):
476                                    return False
477                            raise lab2()
478                        except lab3: pass
479                        self.cursor = v_3
480                        if self.cursor >= self.limit:
481                            raise lab1()
482                        self.cursor += 1
483                    except lab2: pass
484                    continue
485                except lab1: pass
486                self.cursor = v_2
487                break
488        except lab0: pass
489        self.cursor = v_1
490        return True
491
492    def __r_Normalize_post(self):
493        v_1 = self.cursor
494        try:
495            self.limit_backward = self.cursor
496            self.cursor = self.limit
497            self.ket = self.cursor
498            if self.find_among_b(ArabicStemmer.a_1) == 0:
499                raise lab0()
500            self.bra = self.cursor
501            if not self.slice_from(u"\u0621"):
502                return False
503            self.cursor = self.limit_backward
504        except lab0: pass
505        self.cursor = v_1
506        v_2 = self.cursor
507        try:
508            while True:
509                v_3 = self.cursor
510                try:
511                    try:
512                        v_4 = self.cursor
513                        try:
514                            self.bra = self.cursor
515                            among_var = self.find_among(ArabicStemmer.a_2)
516                            if among_var == 0:
517                                raise lab4()
518                            self.ket = self.cursor
519                            if among_var == 1:
520                                if not self.slice_from(u"\u0627"):
521                                    return False
522                            elif among_var == 2:
523                                if not self.slice_from(u"\u0648"):
524                                    return False
525                            else:
526                                if not self.slice_from(u"\u064A"):
527                                    return False
528                            raise lab3()
529                        except lab4: pass
530                        self.cursor = v_4
531                        if self.cursor >= self.limit:
532                            raise lab2()
533                        self.cursor += 1
534                    except lab3: pass
535                    continue
536                except lab2: pass
537                self.cursor = v_3
538                break
539        except lab1: pass
540        self.cursor = v_2
541        return True
542
543    def __r_Checks1(self):
544        self.bra = self.cursor
545        among_var = self.find_among(ArabicStemmer.a_3)
546        if among_var == 0:
547            return False
548        self.ket = self.cursor
549        if among_var == 1:
550            if not len(self.current) > 4:
551                return False
552            self.B_is_noun = True
553            self.B_is_verb = False
554            self.B_is_defined = True
555        else:
556            if not len(self.current) > 3:
557                return False
558            self.B_is_noun = True
559            self.B_is_verb = False
560            self.B_is_defined = True
561        return True
562
563    def __r_Prefix_Step1(self):
564        self.bra = self.cursor
565        among_var = self.find_among(ArabicStemmer.a_4)
566        if among_var == 0:
567            return False
568        self.ket = self.cursor
569        if among_var == 1:
570            if not len(self.current) > 3:
571                return False
572            if not self.slice_from(u"\u0623"):
573                return False
574        elif among_var == 2:
575            if not len(self.current) > 3:
576                return False
577            if not self.slice_from(u"\u0622"):
578                return False
579        elif among_var == 3:
580            if not len(self.current) > 3:
581                return False
582            if not self.slice_from(u"\u0627"):
583                return False
584        else:
585            if not len(self.current) > 3:
586                return False
587            if not self.slice_from(u"\u0625"):
588                return False
589        return True
590
591    def __r_Prefix_Step2(self):
592        self.bra = self.cursor
593        if self.find_among(ArabicStemmer.a_5) == 0:
594            return False
595        self.ket = self.cursor
596        if not len(self.current) > 3:
597            return False
598        v_1 = self.cursor
599        try:
600            if not self.eq_s(u"\u0627"):
601                raise lab0()
602            return False
603        except lab0: pass
604        self.cursor = v_1
605        if not self.slice_del():
606            return False
607
608        return True
609
610    def __r_Prefix_Step3a_Noun(self):
611        self.bra = self.cursor
612        among_var = self.find_among(ArabicStemmer.a_6)
613        if among_var == 0:
614            return False
615        self.ket = self.cursor
616        if among_var == 1:
617            if not len(self.current) > 5:
618                return False
619            if not self.slice_del():
620                return False
621
622        else:
623            if not len(self.current) > 4:
624                return False
625            if not self.slice_del():
626                return False
627
628        return True
629
630    def __r_Prefix_Step3b_Noun(self):
631        self.bra = self.cursor
632        among_var = self.find_among(ArabicStemmer.a_7)
633        if among_var == 0:
634            return False
635        self.ket = self.cursor
636        if among_var == 1:
637            if not len(self.current) > 3:
638                return False
639            if not self.slice_del():
640                return False
641
642        elif among_var == 2:
643            if not len(self.current) > 3:
644                return False
645            if not self.slice_from(u"\u0628"):
646                return False
647        elif among_var == 3:
648            if not len(self.current) > 3:
649                return False
650            if not self.slice_from(u"\u0643"):
651                return False
652        return True
653
654    def __r_Prefix_Step3_Verb(self):
655        self.bra = self.cursor
656        among_var = self.find_among(ArabicStemmer.a_8)
657        if among_var == 0:
658            return False
659        self.ket = self.cursor
660        if among_var == 1:
661            if not len(self.current) > 4:
662                return False
663            if not self.slice_from(u"\u064A"):
664                return False
665        elif among_var == 2:
666            if not len(self.current) > 4:
667                return False
668            if not self.slice_from(u"\u062A"):
669                return False
670        elif among_var == 3:
671            if not len(self.current) > 4:
672                return False
673            if not self.slice_from(u"\u0646"):
674                return False
675        else:
676            if not len(self.current) > 4:
677                return False
678            if not self.slice_from(u"\u0623"):
679                return False
680        return True
681
682    def __r_Prefix_Step4_Verb(self):
683        self.bra = self.cursor
684        if self.find_among(ArabicStemmer.a_9) == 0:
685            return False
686        self.ket = self.cursor
687        if not len(self.current) > 4:
688            return False
689        self.B_is_verb = True
690        self.B_is_noun = False
691        if not self.slice_from(u"\u0627\u0633\u062A"):
692            return False
693        return True
694
695    def __r_Suffix_Noun_Step1a(self):
696        self.ket = self.cursor
697        among_var = self.find_among_b(ArabicStemmer.a_10)
698        if among_var == 0:
699            return False
700        self.bra = self.cursor
701        if among_var == 1:
702            if not len(self.current) >= 4:
703                return False
704            if not self.slice_del():
705                return False
706
707        elif among_var == 2:
708            if not len(self.current) >= 5:
709                return False
710            if not self.slice_del():
711                return False
712
713        else:
714            if not len(self.current) >= 6:
715                return False
716            if not self.slice_del():
717                return False
718
719        return True
720
721    def __r_Suffix_Noun_Step1b(self):
722        self.ket = self.cursor
723        if self.find_among_b(ArabicStemmer.a_11) == 0:
724            return False
725        self.bra = self.cursor
726        if not len(self.current) > 5:
727            return False
728        if not self.slice_del():
729            return False
730
731        return True
732
733    def __r_Suffix_Noun_Step2a(self):
734        self.ket = self.cursor
735        if self.find_among_b(ArabicStemmer.a_12) == 0:
736            return False
737        self.bra = self.cursor
738        if not len(self.current) > 4:
739            return False
740        if not self.slice_del():
741            return False
742
743        return True
744
745    def __r_Suffix_Noun_Step2b(self):
746        self.ket = self.cursor
747        if self.find_among_b(ArabicStemmer.a_13) == 0:
748            return False
749        self.bra = self.cursor
750        if not len(self.current) >= 5:
751            return False
752        if not self.slice_del():
753            return False
754
755        return True
756
757    def __r_Suffix_Noun_Step2c1(self):
758        self.ket = self.cursor
759        if self.find_among_b(ArabicStemmer.a_14) == 0:
760            return False
761        self.bra = self.cursor
762        if not len(self.current) >= 4:
763            return False
764        if not self.slice_del():
765            return False
766
767        return True
768
769    def __r_Suffix_Noun_Step2c2(self):
770        self.ket = self.cursor
771        if self.find_among_b(ArabicStemmer.a_15) == 0:
772            return False
773        self.bra = self.cursor
774        if not len(self.current) >= 4:
775            return False
776        if not self.slice_del():
777            return False
778
779        return True
780
781    def __r_Suffix_Noun_Step3(self):
782        self.ket = self.cursor
783        if self.find_among_b(ArabicStemmer.a_16) == 0:
784            return False
785        self.bra = self.cursor
786        if not len(self.current) >= 3:
787            return False
788        if not self.slice_del():
789            return False
790
791        return True
792
793    def __r_Suffix_Verb_Step1(self):
794        self.ket = self.cursor
795        among_var = self.find_among_b(ArabicStemmer.a_17)
796        if among_var == 0:
797            return False
798        self.bra = self.cursor
799        if among_var == 1:
800            if not len(self.current) >= 4:
801                return False
802            if not self.slice_del():
803                return False
804
805        elif among_var == 2:
806            if not len(self.current) >= 5:
807                return False
808            if not self.slice_del():
809                return False
810
811        else:
812            if not len(self.current) >= 6:
813                return False
814            if not self.slice_del():
815                return False
816
817        return True
818
819    def __r_Suffix_Verb_Step2a(self):
820        self.ket = self.cursor
821        among_var = self.find_among_b(ArabicStemmer.a_18)
822        if among_var == 0:
823            return False
824        self.bra = self.cursor
825        if among_var == 1:
826            if not len(self.current) >= 4:
827                return False
828            if not self.slice_del():
829                return False
830
831        elif among_var == 2:
832            if not len(self.current) >= 5:
833                return False
834            if not self.slice_del():
835                return False
836
837        elif among_var == 3:
838            if not len(self.current) > 5:
839                return False
840            if not self.slice_del():
841                return False
842
843        else:
844            if not len(self.current) >= 6:
845                return False
846            if not self.slice_del():
847                return False
848
849        return True
850
851    def __r_Suffix_Verb_Step2b(self):
852        self.ket = self.cursor
853        if self.find_among_b(ArabicStemmer.a_19) == 0:
854            return False
855        self.bra = self.cursor
856        if not len(self.current) >= 5:
857            return False
858        if not self.slice_del():
859            return False
860
861        return True
862
863    def __r_Suffix_Verb_Step2c(self):
864        self.ket = self.cursor
865        among_var = self.find_among_b(ArabicStemmer.a_20)
866        if among_var == 0:
867            return False
868        self.bra = self.cursor
869        if among_var == 1:
870            if not len(self.current) >= 4:
871                return False
872            if not self.slice_del():
873                return False
874
875        else:
876            if not len(self.current) >= 6:
877                return False
878            if not self.slice_del():
879                return False
880
881        return True
882
883    def __r_Suffix_All_alef_maqsura(self):
884        self.ket = self.cursor
885        if self.find_among_b(ArabicStemmer.a_21) == 0:
886            return False
887        self.bra = self.cursor
888        if not self.slice_from(u"\u064A"):
889            return False
890        return True
891
892    def _stem(self):
893        self.B_is_noun = True
894        self.B_is_verb = True
895        self.B_is_defined = False
896        v_1 = self.cursor
897        self.__r_Checks1()
898        self.cursor = v_1
899        self.__r_Normalize_pre()
900        self.limit_backward = self.cursor
901        self.cursor = self.limit
902        v_3 = self.limit - self.cursor
903        try:
904            try:
905                v_4 = self.limit - self.cursor
906                try:
907                    if not self.B_is_verb:
908                        raise lab2()
909                    try:
910                        v_5 = self.limit - self.cursor
911                        try:
912                            v_6 = 1
913                            while True:
914                                v_7 = self.limit - self.cursor
915                                try:
916                                    if not self.__r_Suffix_Verb_Step1():
917                                        raise lab5()
918                                    v_6 -= 1
919                                    continue
920                                except lab5: pass
921                                self.cursor = self.limit - v_7
922                                break
923                            if v_6 > 0:
924                                raise lab4()
925                            try:
926                                v_8 = self.limit - self.cursor
927                                try:
928                                    if not self.__r_Suffix_Verb_Step2a():
929                                        raise lab7()
930                                    raise lab6()
931                                except lab7: pass
932                                self.cursor = self.limit - v_8
933                                try:
934                                    if not self.__r_Suffix_Verb_Step2c():
935                                        raise lab8()
936                                    raise lab6()
937                                except lab8: pass
938                                self.cursor = self.limit - v_8
939                                if self.cursor <= self.limit_backward:
940                                    raise lab4()
941                                self.cursor -= 1
942                            except lab6: pass
943                            raise lab3()
944                        except lab4: pass
945                        self.cursor = self.limit - v_5
946                        try:
947                            if not self.__r_Suffix_Verb_Step2b():
948                                raise lab9()
949                            raise lab3()
950                        except lab9: pass
951                        self.cursor = self.limit - v_5
952                        if not self.__r_Suffix_Verb_Step2a():
953                            raise lab2()
954                    except lab3: pass
955                    raise lab1()
956                except lab2: pass
957                self.cursor = self.limit - v_4
958                try:
959                    if not self.B_is_noun:
960                        raise lab10()
961                    v_9 = self.limit - self.cursor
962                    try:
963                        try:
964                            v_10 = self.limit - self.cursor
965                            try:
966                                if not self.__r_Suffix_Noun_Step2c2():
967                                    raise lab13()
968                                raise lab12()
969                            except lab13: pass
970                            self.cursor = self.limit - v_10
971                            try:
972                                try:
973                                    if not self.B_is_defined:
974                                        raise lab15()
975                                    raise lab14()
976                                except lab15: pass
977                                if not self.__r_Suffix_Noun_Step1a():
978                                    raise lab14()
979                                try:
980                                    v_12 = self.limit - self.cursor
981                                    try:
982                                        if not self.__r_Suffix_Noun_Step2a():
983                                            raise lab17()
984                                        raise lab16()
985                                    except lab17: pass
986                                    self.cursor = self.limit - v_12
987                                    try:
988                                        if not self.__r_Suffix_Noun_Step2b():
989                                            raise lab18()
990                                        raise lab16()
991                                    except lab18: pass
992                                    self.cursor = self.limit - v_12
993                                    try:
994                                        if not self.__r_Suffix_Noun_Step2c1():
995                                            raise lab19()
996                                        raise lab16()
997                                    except lab19: pass
998                                    self.cursor = self.limit - v_12
999                                    if self.cursor <= self.limit_backward:
1000                                        raise lab14()
1001                                    self.cursor -= 1
1002                                except lab16: pass
1003                                raise lab12()
1004                            except lab14: pass
1005                            self.cursor = self.limit - v_10
1006                            try:
1007                                if not self.__r_Suffix_Noun_Step1b():
1008                                    raise lab20()
1009                                try:
1010                                    v_13 = self.limit - self.cursor
1011                                    try:
1012                                        if not self.__r_Suffix_Noun_Step2a():
1013                                            raise lab22()
1014                                        raise lab21()
1015                                    except lab22: pass
1016                                    self.cursor = self.limit - v_13
1017                                    try:
1018                                        if not self.__r_Suffix_Noun_Step2b():
1019                                            raise lab23()
1020                                        raise lab21()
1021                                    except lab23: pass
1022                                    self.cursor = self.limit - v_13
1023                                    if not self.__r_Suffix_Noun_Step2c1():
1024                                        raise lab20()
1025                                except lab21: pass
1026                                raise lab12()
1027                            except lab20: pass
1028                            self.cursor = self.limit - v_10
1029                            try:
1030                                try:
1031                                    if not self.B_is_defined:
1032                                        raise lab25()
1033                                    raise lab24()
1034                                except lab25: pass
1035                                if not self.__r_Suffix_Noun_Step2a():
1036                                    raise lab24()
1037                                raise lab12()
1038                            except lab24: pass
1039                            self.cursor = self.limit - v_10
1040                            if not self.__r_Suffix_Noun_Step2b():
1041                                self.cursor = self.limit - v_9
1042                                raise lab11()
1043                        except lab12: pass
1044                    except lab11: pass
1045                    if not self.__r_Suffix_Noun_Step3():
1046                        raise lab10()
1047                    raise lab1()
1048                except lab10: pass
1049                self.cursor = self.limit - v_4
1050                if not self.__r_Suffix_All_alef_maqsura():
1051                    raise lab0()
1052            except lab1: pass
1053        except lab0: pass
1054        self.cursor = self.limit - v_3
1055        self.cursor = self.limit_backward
1056        v_15 = self.cursor
1057        try:
1058            v_16 = self.cursor
1059            try:
1060                if not self.__r_Prefix_Step1():
1061                    self.cursor = v_16
1062                    raise lab27()
1063            except lab27: pass
1064            v_17 = self.cursor
1065            try:
1066                if not self.__r_Prefix_Step2():
1067                    self.cursor = v_17
1068                    raise lab28()
1069            except lab28: pass
1070            try:
1071                v_18 = self.cursor
1072                try:
1073                    if not self.__r_Prefix_Step3a_Noun():
1074                        raise lab30()
1075                    raise lab29()
1076                except lab30: pass
1077                self.cursor = v_18
1078                try:
1079                    if not self.B_is_noun:
1080                        raise lab31()
1081                    if not self.__r_Prefix_Step3b_Noun():
1082                        raise lab31()
1083                    raise lab29()
1084                except lab31: pass
1085                self.cursor = v_18
1086                if not self.B_is_verb:
1087                    raise lab26()
1088                v_19 = self.cursor
1089                try:
1090                    if not self.__r_Prefix_Step3_Verb():
1091                        self.cursor = v_19
1092                        raise lab32()
1093                except lab32: pass
1094                if not self.__r_Prefix_Step4_Verb():
1095                    raise lab26()
1096            except lab29: pass
1097        except lab26: pass
1098        self.cursor = v_15
1099        self.__r_Normalize_post()
1100        return True
1101
1102
1103class lab0(BaseException): pass
1104
1105
1106class lab1(BaseException): pass
1107
1108
1109class lab2(BaseException): pass
1110
1111
1112class lab3(BaseException): pass
1113
1114
1115class lab4(BaseException): pass
1116
1117
1118class lab5(BaseException): pass
1119
1120
1121class lab6(BaseException): pass
1122
1123
1124class lab7(BaseException): pass
1125
1126
1127class lab8(BaseException): pass
1128
1129
1130class lab9(BaseException): pass
1131
1132
1133class lab10(BaseException): pass
1134
1135
1136class lab11(BaseException): pass
1137
1138
1139class lab12(BaseException): pass
1140
1141
1142class lab13(BaseException): pass
1143
1144
1145class lab14(BaseException): pass
1146
1147
1148class lab15(BaseException): pass
1149
1150
1151class lab16(BaseException): pass
1152
1153
1154class lab17(BaseException): pass
1155
1156
1157class lab18(BaseException): pass
1158
1159
1160class lab19(BaseException): pass
1161
1162
1163class lab20(BaseException): pass
1164
1165
1166class lab21(BaseException): pass
1167
1168
1169class lab22(BaseException): pass
1170
1171
1172class lab23(BaseException): pass
1173
1174
1175class lab24(BaseException): pass
1176
1177
1178class lab25(BaseException): pass
1179
1180
1181class lab26(BaseException): pass
1182
1183
1184class lab27(BaseException): pass
1185
1186
1187class lab28(BaseException): pass
1188
1189
1190class lab29(BaseException): pass
1191
1192
1193class lab30(BaseException): pass
1194
1195
1196class lab31(BaseException): pass
1197
1198
1199class lab32(BaseException): pass
1200