// This file was generated automatically by the Snowball to JSX compiler

import "base-stemmer.jsx";
import "among.jsx";

 /**
  * This class was automatically generated by a Snowball to JSX compiler
  * It implements the stemming algorithm defined by a snowball script.
  */

class FinnishStemmer extends BaseStemmer
{
    static const serialVersionUID = 1;
    static const methodObject = new FinnishStemmer();

    static const a_0 = [
        new Among("pa", -1, 1),
        new Among("sti", -1, 2),
        new Among("kaan", -1, 1),
        new Among("han", -1, 1),
        new Among("kin", -1, 1),
        new Among("h\u00E4n", -1, 1),
        new Among("k\u00E4\u00E4n", -1, 1),
        new Among("ko", -1, 1),
        new Among("p\u00E4", -1, 1),
        new Among("k\u00F6", -1, 1)
    ];

    static const a_1 = [
        new Among("lla", -1, -1),
        new Among("na", -1, -1),
        new Among("ssa", -1, -1),
        new Among("ta", -1, -1),
        new Among("lta", 3, -1),
        new Among("sta", 3, -1)
    ];

    static const a_2 = [
        new Among("ll\u00E4", -1, -1),
        new Among("n\u00E4", -1, -1),
        new Among("ss\u00E4", -1, -1),
        new Among("t\u00E4", -1, -1),
        new Among("lt\u00E4", 3, -1),
        new Among("st\u00E4", 3, -1)
    ];

    static const a_3 = [
        new Among("lle", -1, -1),
        new Among("ine", -1, -1)
    ];

    static const a_4 = [
        new Among("nsa", -1, 3),
        new Among("mme", -1, 3),
        new Among("nne", -1, 3),
        new Among("ni", -1, 2),
        new Among("si", -1, 1),
        new Among("an", -1, 4),
        new Among("en", -1, 6),
        new Among("\u00E4n", -1, 5),
        new Among("ns\u00E4", -1, 3)
    ];

    static const a_5 = [
        new Among("aa", -1, -1),
        new Among("ee", -1, -1),
        new Among("ii", -1, -1),
        new Among("oo", -1, -1),
        new Among("uu", -1, -1),
        new Among("\u00E4\u00E4", -1, -1),
        new Among("\u00F6\u00F6", -1, -1)
    ];

    static const a_6 = [
        new Among("a", -1, 8),
        new Among("lla", 0, -1),
        new Among("na", 0, -1),
        new Among("ssa", 0, -1),
        new Among("ta", 0, -1),
        new Among("lta", 4, -1),
        new Among("sta", 4, -1),
        new Among("tta", 4, 9),
        new Among("lle", -1, -1),
        new Among("ine", -1, -1),
        new Among("ksi", -1, -1),
        new Among("n", -1, 7),
        new Among("han", 11, 1),
        new Among("den", 11, -1, ((instance : BaseStemmer) : boolean -> (instance as FinnishStemmer).r_VI()), FinnishStemmer.methodObject),
        new Among("seen", 11, -1, ((instance : BaseStemmer) : boolean -> (instance as FinnishStemmer).r_LONG()), FinnishStemmer.methodObject),
        new Among("hen", 11, 2),
        new Among("tten", 11, -1, ((instance : BaseStemmer) : boolean -> (instance as FinnishStemmer).r_VI()), FinnishStemmer.methodObject),
        new Among("hin", 11, 3),
        new Among("siin", 11, -1, ((instance : BaseStemmer) : boolean -> (instance as FinnishStemmer).r_VI()), FinnishStemmer.methodObject),
        new Among("hon", 11, 4),
        new Among("h\u00E4n", 11, 5),
        new Among("h\u00F6n", 11, 6),
        new Among("\u00E4", -1, 8),
        new Among("ll\u00E4", 22, -1),
        new Among("n\u00E4", 22, -1),
        new Among("ss\u00E4", 22, -1),
        new Among("t\u00E4", 22, -1),
        new Among("lt\u00E4", 26, -1),
        new Among("st\u00E4", 26, -1),
        new Among("tt\u00E4", 26, 9)
    ];

    static const a_7 = [
        new Among("eja", -1, -1),
        new Among("mma", -1, 1),
        new Among("imma", 1, -1),
        new Among("mpa", -1, 1),
        new Among("impa", 3, -1),
        new Among("mmi", -1, 1),
        new Among("immi", 5, -1),
        new Among("mpi", -1, 1),
        new Among("impi", 7, -1),
        new Among("ej\u00E4", -1, -1),
        new Among("mm\u00E4", -1, 1),
        new Among("imm\u00E4", 10, -1),
        new Among("mp\u00E4", -1, 1),
        new Among("imp\u00E4", 12, -1)
    ];

    static const a_8 = [
        new Among("i", -1, -1),
        new Among("j", -1, -1)
    ];

    static const a_9 = [
        new Among("mma", -1, 1),
        new Among("imma", 0, -1)
    ];

    static const g_AEI = [17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8] : int[];

    static const g_V1 = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32] : int[];

    static const g_V2 = [17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32] : int[];

    static const g_particle_end = [17, 97, 24, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32] : int[];

    var B_ending_removed : boolean = false;
    var S_x : string = "";
    var I_p2 : int = 0;
    var I_p1 : int = 0;

    function copy_from (other : FinnishStemmer) : void
    {
        this.B_ending_removed = other.B_ending_removed;
        this.S_x = other.S_x;
        this.I_p2 = other.I_p2;
        this.I_p1 = other.I_p1;
        super.copy_from(other);
    }

    function r_mark_regions () : boolean
    {
        var v_1 : int;
        var v_3 : int;
        // (, line 41
        this.I_p1 = this.limit;
        this.I_p2 = this.limit;
        // goto, line 46
        golab0: while(true)
        {
            v_1 = this.cursor;
            var lab1 = true;
            lab1: while (lab1 == true)
            {
                lab1 = false;
                if (!(this.in_grouping(FinnishStemmer.g_V1, 97, 246)))
                {
                    break lab1;
                }
                this.cursor = v_1;
                break golab0;
            }
            this.cursor = v_1;
            if (this.cursor >= this.limit)
            {
                return false;
            }
            this.cursor++;
        }
        // gopast, line 46
        golab2: while(true)
        {
            var lab3 = true;
            lab3: while (lab3 == true)
            {
                lab3 = false;
                if (!(this.out_grouping(FinnishStemmer.g_V1, 97, 246)))
                {
                    break lab3;
                }
                break golab2;
            }
            if (this.cursor >= this.limit)
            {
                return false;
            }
            this.cursor++;
        }
        // setmark p1, line 46
        this.I_p1 = this.cursor;
        // goto, line 47
        golab4: while(true)
        {
            v_3 = this.cursor;
            var lab5 = true;
            lab5: while (lab5 == true)
            {
                lab5 = false;
                if (!(this.in_grouping(FinnishStemmer.g_V1, 97, 246)))
                {
                    break lab5;
                }
                this.cursor = v_3;
                break golab4;
            }
            this.cursor = v_3;
            if (this.cursor >= this.limit)
            {
                return false;
            }
            this.cursor++;
        }
        // gopast, line 47
        golab6: while(true)
        {
            var lab7 = true;
            lab7: while (lab7 == true)
            {
                lab7 = false;
                if (!(this.out_grouping(FinnishStemmer.g_V1, 97, 246)))
                {
                    break lab7;
                }
                break golab6;
            }
            if (this.cursor >= this.limit)
            {
                return false;
            }
            this.cursor++;
        }
        // setmark p2, line 47
        this.I_p2 = this.cursor;
        return true;
    }

    function r_R2 () : boolean
    {
        if (!(this.I_p2 <= this.cursor))
        {
            return false;
        }
        return true;
    }

    function r_particle_etc () : boolean
    {
        var among_var : int;
        var v_1 : int;
        var v_2 : int;
        // (, line 54
        // setlimit, line 55
        v_1 = this.limit - this.cursor;
        // tomark, line 55
        if (this.cursor < this.I_p1)
        {
            return false;
        }
        this.cursor = this.I_p1;
        v_2 = this.limit_backward;
        this.limit_backward = this.cursor;
        this.cursor = this.limit - v_1;
        // (, line 55
        // [, line 55
        this.ket = this.cursor;
        // substring, line 55
        among_var = this.find_among_b(FinnishStemmer.a_0, 10);
        if (among_var == 0)
        {
            this.limit_backward = v_2;
            return false;
        }
        // ], line 55
        this.bra = this.cursor;
        this.limit_backward = v_2;
        switch (among_var) {
            case 0:
                return false;
            case 1:
                // (, line 62
                if (!(this.in_grouping_b(FinnishStemmer.g_particle_end, 97, 246)))
                {
                    return false;
                }
                break;
            case 2:
                // (, line 64
                // call R2, line 64
                if (!this.r_R2())
                {
                    return false;
                }
                break;
        }
        // delete, line 66
        if (!this.slice_del())
        {
            return false;
        }
        return true;
    }

    function r_possessive () : boolean
    {
        var among_var : int;
        var v_1 : int;
        var v_2 : int;
        var v_3 : int;
        // (, line 68
        // setlimit, line 69
        v_1 = this.limit - this.cursor;
        // tomark, line 69
        if (this.cursor < this.I_p1)
        {
            return false;
        }
        this.cursor = this.I_p1;
        v_2 = this.limit_backward;
        this.limit_backward = this.cursor;
        this.cursor = this.limit - v_1;
        // (, line 69
        // [, line 69
        this.ket = this.cursor;
        // substring, line 69
        among_var = this.find_among_b(FinnishStemmer.a_4, 9);
        if (among_var == 0)
        {
            this.limit_backward = v_2;
            return false;
        }
        // ], line 69
        this.bra = this.cursor;
        this.limit_backward = v_2;
        switch (among_var) {
            case 0:
                return false;
            case 1:
                // (, line 72
                // not, line 72
                {
                    v_3 = this.limit - this.cursor;
                    var lab0 = true;
                    lab0: while (lab0 == true)
                    {
                        lab0 = false;
                        // literal, line 72
                        if (!(this.eq_s_b(1, "k")))
                        {
                            break lab0;
                        }
                        return false;
                    }
                    this.cursor = this.limit - v_3;
                }
                // delete, line 72
                if (!this.slice_del())
                {
                    return false;
                }
                break;
            case 2:
                // (, line 74
                // delete, line 74
                if (!this.slice_del())
                {
                    return false;
                }
                // [, line 74
                this.ket = this.cursor;
                // literal, line 74
                if (!(this.eq_s_b(3, "kse")))
                {
                    return false;
                }
                // ], line 74
                this.bra = this.cursor;
                // <-, line 74
                if (!this.slice_from("ksi"))
                {
                    return false;
                }
                break;
            case 3:
                // (, line 78
                // delete, line 78
                if (!this.slice_del())
                {
                    return false;
                }
                break;
            case 4:
                // (, line 81
                // among, line 81
                if (this.find_among_b(FinnishStemmer.a_1, 6) == 0)
                {
                    return false;
                }
                // delete, line 81
                if (!this.slice_del())
                {
                    return false;
                }
                break;
            case 5:
                // (, line 83
                // among, line 83
                if (this.find_among_b(FinnishStemmer.a_2, 6) == 0)
                {
                    return false;
                }
                // delete, line 84
                if (!this.slice_del())
                {
                    return false;
                }
                break;
            case 6:
                // (, line 86
                // among, line 86
                if (this.find_among_b(FinnishStemmer.a_3, 2) == 0)
                {
                    return false;
                }
                // delete, line 86
                if (!this.slice_del())
                {
                    return false;
                }
                break;
        }
        return true;
    }

    function r_LONG () : boolean
    {
        // among, line 91
        if (this.find_among_b(FinnishStemmer.a_5, 7) == 0)
        {
            return false;
        }
        return true;
    }

    function r_VI () : boolean
    {
        // (, line 93
        // literal, line 93
        if (!(this.eq_s_b(1, "i")))
        {
            return false;
        }
        if (!(this.in_grouping_b(FinnishStemmer.g_V2, 97, 246)))
        {
            return false;
        }
        return true;
    }

    function r_case_ending () : boolean
    {
        var among_var : int;
        var v_1 : int;
        var v_2 : int;
        var v_3 : int;
        var v_4 : int;
        var v_5 : int;
        // (, line 95
        // setlimit, line 96
        v_1 = this.limit - this.cursor;
        // tomark, line 96
        if (this.cursor < this.I_p1)
        {
            return false;
        }
        this.cursor = this.I_p1;
        v_2 = this.limit_backward;
        this.limit_backward = this.cursor;
        this.cursor = this.limit - v_1;
        // (, line 96
        // [, line 96
        this.ket = this.cursor;
        // substring, line 96
        among_var = this.find_among_b(FinnishStemmer.a_6, 30);
        if (among_var == 0)
        {
            this.limit_backward = v_2;
            return false;
        }
        // ], line 96
        this.bra = this.cursor;
        this.limit_backward = v_2;
        switch (among_var) {
            case 0:
                return false;
            case 1:
                // (, line 98
                // literal, line 98
                if (!(this.eq_s_b(1, "a")))
                {
                    return false;
                }
                break;
            case 2:
                // (, line 99
                // literal, line 99
                if (!(this.eq_s_b(1, "e")))
                {
                    return false;
                }
                break;
            case 3:
                // (, line 100
                // literal, line 100
                if (!(this.eq_s_b(1, "i")))
                {
                    return false;
                }
                break;
            case 4:
                // (, line 101
                // literal, line 101
                if (!(this.eq_s_b(1, "o")))
                {
                    return false;
                }
                break;
            case 5:
                // (, line 102
                // literal, line 102
                if (!(this.eq_s_b(1, "\u00E4")))
                {
                    return false;
                }
                break;
            case 6:
                // (, line 103
                // literal, line 103
                if (!(this.eq_s_b(1, "\u00F6")))
                {
                    return false;
                }
                break;
            case 7:
                // (, line 111
                // try, line 111
                v_3 = this.limit - this.cursor;
                var lab0 = true;
                lab0: while (lab0 == true)
                {
                    lab0 = false;
                    // (, line 111
                    // and, line 113
                    v_4 = this.limit - this.cursor;
                    // or, line 112
                    var lab1 = true;
                    lab1: while (lab1 == true)
                    {
                        lab1 = false;
                        v_5 = this.limit - this.cursor;
                        var lab2 = true;
                        lab2: while (lab2 == true)
                        {
                            lab2 = false;
                            // call LONG, line 111
                            if (!this.r_LONG())
                            {
                                break lab2;
                            }
                            break lab1;
                        }
                        this.cursor = this.limit - v_5;
                        // literal, line 112
                        if (!(this.eq_s_b(2, "ie")))
                        {
                            this.cursor = this.limit - v_3;
                            break lab0;
                        }
                    }
                    this.cursor = this.limit - v_4;
                    // next, line 113
                    if (this.cursor <= this.limit_backward)
                    {
                        this.cursor = this.limit - v_3;
                        break lab0;
                    }
                    this.cursor--;
                    // ], line 113
                    this.bra = this.cursor;
                }
                break;
            case 8:
                // (, line 119
                if (!(this.in_grouping_b(FinnishStemmer.g_V1, 97, 246)))
                {
                    return false;
                }
                if (!(this.out_grouping_b(FinnishStemmer.g_V1, 97, 246)))
                {
                    return false;
                }
                break;
            case 9:
                // (, line 121
                // literal, line 121
                if (!(this.eq_s_b(1, "e")))
                {
                    return false;
                }
                break;
        }
        // delete, line 138
        if (!this.slice_del())
        {
            return false;
        }
        // set ending_removed, line 139
        this.B_ending_removed = true;
        return true;
    }

    function r_other_endings () : boolean
    {
        var among_var : int;
        var v_1 : int;
        var v_2 : int;
        var v_3 : int;
        // (, line 141
        // setlimit, line 142
        v_1 = this.limit - this.cursor;
        // tomark, line 142
        if (this.cursor < this.I_p2)
        {
            return false;
        }
        this.cursor = this.I_p2;
        v_2 = this.limit_backward;
        this.limit_backward = this.cursor;
        this.cursor = this.limit - v_1;
        // (, line 142
        // [, line 142
        this.ket = this.cursor;
        // substring, line 142
        among_var = this.find_among_b(FinnishStemmer.a_7, 14);
        if (among_var == 0)
        {
            this.limit_backward = v_2;
            return false;
        }
        // ], line 142
        this.bra = this.cursor;
        this.limit_backward = v_2;
        switch (among_var) {
            case 0:
                return false;
            case 1:
                // (, line 146
                // not, line 146
                {
                    v_3 = this.limit - this.cursor;
                    var lab0 = true;
                    lab0: while (lab0 == true)
                    {
                        lab0 = false;
                        // literal, line 146
                        if (!(this.eq_s_b(2, "po")))
                        {
                            break lab0;
                        }
                        return false;
                    }
                    this.cursor = this.limit - v_3;
                }
                break;
        }
        // delete, line 151
        if (!this.slice_del())
        {
            return false;
        }
        return true;
    }

    function r_i_plural () : boolean
    {
        var v_1 : int;
        var v_2 : int;
        // (, line 153
        // setlimit, line 154
        v_1 = this.limit - this.cursor;
        // tomark, line 154
        if (this.cursor < this.I_p1)
        {
            return false;
        }
        this.cursor = this.I_p1;
        v_2 = this.limit_backward;
        this.limit_backward = this.cursor;
        this.cursor = this.limit - v_1;
        // (, line 154
        // [, line 154
        this.ket = this.cursor;
        // substring, line 154
        if (this.find_among_b(FinnishStemmer.a_8, 2) == 0)
        {
            this.limit_backward = v_2;
            return false;
        }
        // ], line 154
        this.bra = this.cursor;
        this.limit_backward = v_2;
        // delete, line 158
        if (!this.slice_del())
        {
            return false;
        }
        return true;
    }

    function r_t_plural () : boolean
    {
        var among_var : int;
        var v_1 : int;
        var v_2 : int;
        var v_3 : int;
        var v_4 : int;
        var v_5 : int;
        var v_6 : int;
        // (, line 160
        // setlimit, line 161
        v_1 = this.limit - this.cursor;
        // tomark, line 161
        if (this.cursor < this.I_p1)
        {
            return false;
        }
        this.cursor = this.I_p1;
        v_2 = this.limit_backward;
        this.limit_backward = this.cursor;
        this.cursor = this.limit - v_1;
        // (, line 161
        // [, line 162
        this.ket = this.cursor;
        // literal, line 162
        if (!(this.eq_s_b(1, "t")))
        {
            this.limit_backward = v_2;
            return false;
        }
        // ], line 162
        this.bra = this.cursor;
        // test, line 162
        v_3 = this.limit - this.cursor;
        if (!(this.in_grouping_b(FinnishStemmer.g_V1, 97, 246)))
        {
            this.limit_backward = v_2;
            return false;
        }
        this.cursor = this.limit - v_3;
        // delete, line 163
        if (!this.slice_del())
        {
            return false;
        }
        this.limit_backward = v_2;
        // setlimit, line 165
        v_4 = this.limit - this.cursor;
        // tomark, line 165
        if (this.cursor < this.I_p2)
        {
            return false;
        }
        this.cursor = this.I_p2;
        v_5 = this.limit_backward;
        this.limit_backward = this.cursor;
        this.cursor = this.limit - v_4;
        // (, line 165
        // [, line 165
        this.ket = this.cursor;
        // substring, line 165
        among_var = this.find_among_b(FinnishStemmer.a_9, 2);
        if (among_var == 0)
        {
            this.limit_backward = v_5;
            return false;
        }
        // ], line 165
        this.bra = this.cursor;
        this.limit_backward = v_5;
        switch (among_var) {
            case 0:
                return false;
            case 1:
                // (, line 167
                // not, line 167
                {
                    v_6 = this.limit - this.cursor;
                    var lab0 = true;
                    lab0: while (lab0 == true)
                    {
                        lab0 = false;
                        // literal, line 167
                        if (!(this.eq_s_b(2, "po")))
                        {
                            break lab0;
                        }
                        return false;
                    }
                    this.cursor = this.limit - v_6;
                }
                break;
        }
        // delete, line 170
        if (!this.slice_del())
        {
            return false;
        }
        return true;
    }

    function r_tidy () : boolean
    {
        var v_1 : int;
        var v_2 : int;
        var v_3 : int;
        var v_4 : int;
        var v_5 : int;
        var v_6 : int;
        var v_7 : int;
        var v_8 : int;
        var v_9 : int;
        // (, line 172
        // setlimit, line 173
        v_1 = this.limit - this.cursor;
        // tomark, line 173
        if (this.cursor < this.I_p1)
        {
            return false;
        }
        this.cursor = this.I_p1;
        v_2 = this.limit_backward;
        this.limit_backward = this.cursor;
        this.cursor = this.limit - v_1;
        // (, line 173
        // do, line 174
        v_3 = this.limit - this.cursor;
        var lab0 = true;
        lab0: while (lab0 == true)
        {
            lab0 = false;
            // (, line 174
            // and, line 174
            v_4 = this.limit - this.cursor;
            // call LONG, line 174
            if (!this.r_LONG())
            {
                break lab0;
            }
            this.cursor = this.limit - v_4;
            // (, line 174
            // [, line 174
            this.ket = this.cursor;
            // next, line 174
            if (this.cursor <= this.limit_backward)
            {
                break lab0;
            }
            this.cursor--;
            // ], line 174
            this.bra = this.cursor;
            // delete, line 174
            if (!this.slice_del())
            {
                return false;
            }
        }
        this.cursor = this.limit - v_3;
        // do, line 175
        v_5 = this.limit - this.cursor;
        var lab1 = true;
        lab1: while (lab1 == true)
        {
            lab1 = false;
            // (, line 175
            // [, line 175
            this.ket = this.cursor;
            if (!(this.in_grouping_b(FinnishStemmer.g_AEI, 97, 228)))
            {
                break lab1;
            }
            // ], line 175
            this.bra = this.cursor;
            if (!(this.out_grouping_b(FinnishStemmer.g_V1, 97, 246)))
            {
                break lab1;
            }
            // delete, line 175
            if (!this.slice_del())
            {
                return false;
            }
        }
        this.cursor = this.limit - v_5;
        // do, line 176
        v_6 = this.limit - this.cursor;
        var lab2 = true;
        lab2: while (lab2 == true)
        {
            lab2 = false;
            // (, line 176
            // [, line 176
            this.ket = this.cursor;
            // literal, line 176
            if (!(this.eq_s_b(1, "j")))
            {
                break lab2;
            }
            // ], line 176
            this.bra = this.cursor;
            // or, line 176
            var lab3 = true;
            lab3: while (lab3 == true)
            {
                lab3 = false;
                v_7 = this.limit - this.cursor;
                var lab4 = true;
                lab4: while (lab4 == true)
                {
                    lab4 = false;
                    // literal, line 176
                    if (!(this.eq_s_b(1, "o")))
                    {
                        break lab4;
                    }
                    break lab3;
                }
                this.cursor = this.limit - v_7;
                // literal, line 176
                if (!(this.eq_s_b(1, "u")))
                {
                    break lab2;
                }
            }
            // delete, line 176
            if (!this.slice_del())
            {
                return false;
            }
        }
        this.cursor = this.limit - v_6;
        // do, line 177
        v_8 = this.limit - this.cursor;
        var lab5 = true;
        lab5: while (lab5 == true)
        {
            lab5 = false;
            // (, line 177
            // [, line 177
            this.ket = this.cursor;
            // literal, line 177
            if (!(this.eq_s_b(1, "o")))
            {
                break lab5;
            }
            // ], line 177
            this.bra = this.cursor;
            // literal, line 177
            if (!(this.eq_s_b(1, "j")))
            {
                break lab5;
            }
            // delete, line 177
            if (!this.slice_del())
            {
                return false;
            }
        }
        this.cursor = this.limit - v_8;
        this.limit_backward = v_2;
        // goto, line 179
        golab6: while(true)
        {
            v_9 = this.limit - this.cursor;
            var lab7 = true;
            lab7: while (lab7 == true)
            {
                lab7 = false;
                if (!(this.out_grouping_b(FinnishStemmer.g_V1, 97, 246)))
                {
                    break lab7;
                }
                this.cursor = this.limit - v_9;
                break golab6;
            }
            this.cursor = this.limit - v_9;
            if (this.cursor <= this.limit_backward)
            {
                return false;
            }
            this.cursor--;
        }
        // [, line 179
        this.ket = this.cursor;
        // next, line 179
        if (this.cursor <= this.limit_backward)
        {
            return false;
        }
        this.cursor--;
        // ], line 179
        this.bra = this.cursor;
        // -> x, line 179
        this.S_x = this.slice_to(this.S_x);
        if (this.S_x == '')
        {
            return false;
        }
        // name x, line 179
        if (!(this.eq_v_b(this.S_x)))
        {
            return false;
        }
        // delete, line 179
        if (!this.slice_del())
        {
            return false;
        }
        return true;
    }

    override function stem () : boolean
    {
        var v_1 : int;
        var v_2 : int;
        var v_3 : int;
        var v_4 : int;
        var v_5 : int;
        var v_6 : int;
        var v_7 : int;
        var v_8 : int;
        var v_9 : int;
        // (, line 183
        // do, line 185
        v_1 = this.cursor;
        var lab0 = true;
        lab0: while (lab0 == true)
        {
            lab0 = false;
            // call mark_regions, line 185
            if (!this.r_mark_regions())
            {
                break lab0;
            }
        }
        this.cursor = v_1;
        // unset ending_removed, line 186
        this.B_ending_removed = false;
        // backwards, line 187
        this.limit_backward = this.cursor; this.cursor = this.limit;
        // (, line 187
        // do, line 188
        v_2 = this.limit - this.cursor;
        var lab1 = true;
        lab1: while (lab1 == true)
        {
            lab1 = false;
            // call particle_etc, line 188
            if (!this.r_particle_etc())
            {
                break lab1;
            }
        }
        this.cursor = this.limit - v_2;
        // do, line 189
        v_3 = this.limit - this.cursor;
        var lab2 = true;
        lab2: while (lab2 == true)
        {
            lab2 = false;
            // call possessive, line 189
            if (!this.r_possessive())
            {
                break lab2;
            }
        }
        this.cursor = this.limit - v_3;
        // do, line 190
        v_4 = this.limit - this.cursor;
        var lab3 = true;
        lab3: while (lab3 == true)
        {
            lab3 = false;
            // call case_ending, line 190
            if (!this.r_case_ending())
            {
                break lab3;
            }
        }
        this.cursor = this.limit - v_4;
        // do, line 191
        v_5 = this.limit - this.cursor;
        var lab4 = true;
        lab4: while (lab4 == true)
        {
            lab4 = false;
            // call other_endings, line 191
            if (!this.r_other_endings())
            {
                break lab4;
            }
        }
        this.cursor = this.limit - v_5;
        // or, line 192
        var lab5 = true;
        lab5: while (lab5 == true)
        {
            lab5 = false;
            v_6 = this.limit - this.cursor;
            var lab6 = true;
            lab6: while (lab6 == true)
            {
                lab6 = false;
                // (, line 192
                // Boolean test ending_removed, line 192
                if (!(this.B_ending_removed))
                {
                    break lab6;
                }
                // do, line 192
                v_7 = this.limit - this.cursor;
                var lab7 = true;
                lab7: while (lab7 == true)
                {
                    lab7 = false;
                    // call i_plural, line 192
                    if (!this.r_i_plural())
                    {
                        break lab7;
                    }
                }
                this.cursor = this.limit - v_7;
                break lab5;
            }
            this.cursor = this.limit - v_6;
            // do, line 192
            v_8 = this.limit - this.cursor;
            var lab8 = true;
            lab8: while (lab8 == true)
            {
                lab8 = false;
                // call t_plural, line 192
                if (!this.r_t_plural())
                {
                    break lab8;
                }
            }
            this.cursor = this.limit - v_8;
        }
        // do, line 193
        v_9 = this.limit - this.cursor;
        var lab9 = true;
        lab9: while (lab9 == true)
        {
            lab9 = false;
            // call tidy, line 193
            if (!this.r_tidy())
            {
                break lab9;
            }
        }
        this.cursor = this.limit - v_9;
        this.cursor = this.limit_backward;        return true;
    }

    function equals (o : variant) : boolean {
        return o instanceof FinnishStemmer;
    }

    function hashCode() : int
    {
        //http://stackoverflow.com/questions/194846/is-there-any-kind-of-hashcode-function-in-javascript
        var classname = "FinnishStemmer";
        var hash = 0;
        if (classname.length == 0) return hash;
        for (var i = 0; i < classname.length; i++) {
            var char = classname.charCodeAt(i);
            hash = ((hash << 5) - hash) + char;
            hash = hash & hash; // Convert to 32bit integer
        }
        return hash;
    }

}

