// Generated by Snowball 2.0.0 - https://snowballstem.org/

package org.tartarus.snowball.ext;

import org.tartarus.snowball.Among;

/**
 * This class implements the stemming algorithm defined by a snowball script.
 * <p>
 * Generated by Snowball 2.0.0 - https://snowballstem.org/
 * </p>
 */
@SuppressWarnings("unused")
public class TurkishStemmer extends org.tartarus.snowball.SnowballStemmer {

  private static final long serialVersionUID = 1L;
  private static final java.lang.invoke.MethodHandles.Lookup methodObject = java.lang.invoke.MethodHandles.lookup();

private final static Among a_0[] = {
  new Among("m", -1, -1),
  new Among("n", -1, -1),
  new Among("miz", -1, -1),
  new Among("niz", -1, -1),
  new Among("muz", -1, -1),
  new Among("nuz", -1, -1),
  new Among("m\u00FCz", -1, -1),
  new Among("n\u00FCz", -1, -1),
  new Among("m\u0131z", -1, -1),
  new Among("n\u0131z", -1, -1)
};

private final static Among a_1[] = {
  new Among("leri", -1, -1),
  new Among("lar\u0131", -1, -1)
};

private final static Among a_2[] = {
  new Among("ni", -1, -1),
  new Among("nu", -1, -1),
  new Among("n\u00FC", -1, -1),
  new Among("n\u0131", -1, -1)
};

private final static Among a_3[] = {
  new Among("in", -1, -1),
  new Among("un", -1, -1),
  new Among("\u00FCn", -1, -1),
  new Among("\u0131n", -1, -1)
};

private final static Among a_4[] = {
  new Among("a", -1, -1),
  new Among("e", -1, -1)
};

private final static Among a_5[] = {
  new Among("na", -1, -1),
  new Among("ne", -1, -1)
};

private final static Among a_6[] = {
  new Among("da", -1, -1),
  new Among("ta", -1, -1),
  new Among("de", -1, -1),
  new Among("te", -1, -1)
};

private final static Among a_7[] = {
  new Among("nda", -1, -1),
  new Among("nde", -1, -1)
};

private final static Among a_8[] = {
  new Among("dan", -1, -1),
  new Among("tan", -1, -1),
  new Among("den", -1, -1),
  new Among("ten", -1, -1)
};

private final static Among a_9[] = {
  new Among("ndan", -1, -1),
  new Among("nden", -1, -1)
};

private final static Among a_10[] = {
  new Among("la", -1, -1),
  new Among("le", -1, -1)
};

private final static Among a_11[] = {
  new Among("ca", -1, -1),
  new Among("ce", -1, -1)
};

private final static Among a_12[] = {
  new Among("im", -1, -1),
  new Among("um", -1, -1),
  new Among("\u00FCm", -1, -1),
  new Among("\u0131m", -1, -1)
};

private final static Among a_13[] = {
  new Among("sin", -1, -1),
  new Among("sun", -1, -1),
  new Among("s\u00FCn", -1, -1),
  new Among("s\u0131n", -1, -1)
};

private final static Among a_14[] = {
  new Among("iz", -1, -1),
  new Among("uz", -1, -1),
  new Among("\u00FCz", -1, -1),
  new Among("\u0131z", -1, -1)
};

private final static Among a_15[] = {
  new Among("siniz", -1, -1),
  new Among("sunuz", -1, -1),
  new Among("s\u00FCn\u00FCz", -1, -1),
  new Among("s\u0131n\u0131z", -1, -1)
};

private final static Among a_16[] = {
  new Among("lar", -1, -1),
  new Among("ler", -1, -1)
};

private final static Among a_17[] = {
  new Among("niz", -1, -1),
  new Among("nuz", -1, -1),
  new Among("n\u00FCz", -1, -1),
  new Among("n\u0131z", -1, -1)
};

private final static Among a_18[] = {
  new Among("dir", -1, -1),
  new Among("tir", -1, -1),
  new Among("dur", -1, -1),
  new Among("tur", -1, -1),
  new Among("d\u00FCr", -1, -1),
  new Among("t\u00FCr", -1, -1),
  new Among("d\u0131r", -1, -1),
  new Among("t\u0131r", -1, -1)
};

private final static Among a_19[] = {
  new Among("cas\u0131na", -1, -1),
  new Among("cesine", -1, -1)
};

private final static Among a_20[] = {
  new Among("di", -1, -1),
  new Among("ti", -1, -1),
  new Among("dik", -1, -1),
  new Among("tik", -1, -1),
  new Among("duk", -1, -1),
  new Among("tuk", -1, -1),
  new Among("d\u00FCk", -1, -1),
  new Among("t\u00FCk", -1, -1),
  new Among("d\u0131k", -1, -1),
  new Among("t\u0131k", -1, -1),
  new Among("dim", -1, -1),
  new Among("tim", -1, -1),
  new Among("dum", -1, -1),
  new Among("tum", -1, -1),
  new Among("d\u00FCm", -1, -1),
  new Among("t\u00FCm", -1, -1),
  new Among("d\u0131m", -1, -1),
  new Among("t\u0131m", -1, -1),
  new Among("din", -1, -1),
  new Among("tin", -1, -1),
  new Among("dun", -1, -1),
  new Among("tun", -1, -1),
  new Among("d\u00FCn", -1, -1),
  new Among("t\u00FCn", -1, -1),
  new Among("d\u0131n", -1, -1),
  new Among("t\u0131n", -1, -1),
  new Among("du", -1, -1),
  new Among("tu", -1, -1),
  new Among("d\u00FC", -1, -1),
  new Among("t\u00FC", -1, -1),
  new Among("d\u0131", -1, -1),
  new Among("t\u0131", -1, -1)
};

private final static Among a_21[] = {
  new Among("sa", -1, -1),
  new Among("se", -1, -1),
  new Among("sak", -1, -1),
  new Among("sek", -1, -1),
  new Among("sam", -1, -1),
  new Among("sem", -1, -1),
  new Among("san", -1, -1),
  new Among("sen", -1, -1)
};

private final static Among a_22[] = {
  new Among("mi\u015F", -1, -1),
  new Among("mu\u015F", -1, -1),
  new Among("m\u00FC\u015F", -1, -1),
  new Among("m\u0131\u015F", -1, -1)
};

private final static Among a_23[] = {
  new Among("b", -1, 1),
  new Among("c", -1, 2),
  new Among("d", -1, 3),
  new Among("\u011F", -1, 4)
};

private static final char g_vowel[] = {17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 0, 1 };

private static final char g_U[] = {1, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1 };

private static final char g_vowel1[] = {1, 64, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };

private static final char g_vowel2[] = {17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130 };

private static final char g_vowel3[] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };

private static final char g_vowel4[] = {17 };

private static final char g_vowel5[] = {65 };

private static final char g_vowel6[] = {65 };

private boolean B_continue_stemming_noun_suffixes;


private boolean r_check_vowel_harmony() {
  int v_1 = limit - cursor;
  golab0: while(true)
  {
    int v_2 = limit - cursor;
    lab1: {
      if (!(in_grouping_b(g_vowel, 97, 305)))
      {
        break lab1;
      }
      cursor = limit - v_2;
      break golab0;
    }
    cursor = limit - v_2;
    if (cursor <= limit_backward)
    {
      return false;
    }
    cursor--;
  }
  lab2: {
    int v_3 = limit - cursor;
    lab3: {
      if (!(eq_s_b("a")))
      {
        break lab3;
      }
      golab4: while(true)
      {
        int v_4 = limit - cursor;
        lab5: {
          if (!(in_grouping_b(g_vowel1, 97, 305)))
          {
            break lab5;
          }
          cursor = limit - v_4;
          break golab4;
        }
        cursor = limit - v_4;
        if (cursor <= limit_backward)
        {
          break lab3;
        }
        cursor--;
      }
      break lab2;
    }
    cursor = limit - v_3;
    lab6: {
      if (!(eq_s_b("e")))
      {
        break lab6;
      }
      golab7: while(true)
      {
        int v_5 = limit - cursor;
        lab8: {
          if (!(in_grouping_b(g_vowel2, 101, 252)))
          {
            break lab8;
          }
          cursor = limit - v_5;
          break golab7;
        }
        cursor = limit - v_5;
        if (cursor <= limit_backward)
        {
          break lab6;
        }
        cursor--;
      }
      break lab2;
    }
    cursor = limit - v_3;
    lab9: {
      if (!(eq_s_b("\u0131")))
      {
        break lab9;
      }
      golab10: while(true)
      {
        int v_6 = limit - cursor;
        lab11: {
          if (!(in_grouping_b(g_vowel3, 97, 305)))
          {
            break lab11;
          }
          cursor = limit - v_6;
          break golab10;
        }
        cursor = limit - v_6;
        if (cursor <= limit_backward)
        {
          break lab9;
        }
        cursor--;
      }
      break lab2;
    }
    cursor = limit - v_3;
    lab12: {
      if (!(eq_s_b("i")))
      {
        break lab12;
      }
      golab13: while(true)
      {
        int v_7 = limit - cursor;
        lab14: {
          if (!(in_grouping_b(g_vowel4, 101, 105)))
          {
            break lab14;
          }
          cursor = limit - v_7;
          break golab13;
        }
        cursor = limit - v_7;
        if (cursor <= limit_backward)
        {
          break lab12;
        }
        cursor--;
      }
      break lab2;
    }
    cursor = limit - v_3;
    lab15: {
      if (!(eq_s_b("o")))
      {
        break lab15;
      }
      golab16: while(true)
      {
        int v_8 = limit - cursor;
        lab17: {
          if (!(in_grouping_b(g_vowel5, 111, 117)))
          {
            break lab17;
          }
          cursor = limit - v_8;
          break golab16;
        }
        cursor = limit - v_8;
        if (cursor <= limit_backward)
        {
          break lab15;
        }
        cursor--;
      }
      break lab2;
    }
    cursor = limit - v_3;
    lab18: {
      if (!(eq_s_b("\u00F6")))
      {
        break lab18;
      }
      golab19: while(true)
      {
        int v_9 = limit - cursor;
        lab20: {
          if (!(in_grouping_b(g_vowel6, 246, 252)))
          {
            break lab20;
          }
          cursor = limit - v_9;
          break golab19;
        }
        cursor = limit - v_9;
        if (cursor <= limit_backward)
        {
          break lab18;
        }
        cursor--;
      }
      break lab2;
    }
    cursor = limit - v_3;
    lab21: {
      if (!(eq_s_b("u")))
      {
        break lab21;
      }
      golab22: while(true)
      {
        int v_10 = limit - cursor;
        lab23: {
          if (!(in_grouping_b(g_vowel5, 111, 117)))
          {
            break lab23;
          }
          cursor = limit - v_10;
          break golab22;
        }
        cursor = limit - v_10;
        if (cursor <= limit_backward)
        {
          break lab21;
        }
        cursor--;
      }
      break lab2;
    }
    cursor = limit - v_3;
    if (!(eq_s_b("\u00FC")))
    {
      return false;
    }
    golab24: while(true)
    {
      int v_11 = limit - cursor;
      lab25: {
        if (!(in_grouping_b(g_vowel6, 246, 252)))
        {
          break lab25;
        }
        cursor = limit - v_11;
        break golab24;
      }
      cursor = limit - v_11;
      if (cursor <= limit_backward)
      {
        return false;
      }
      cursor--;
    }
  }
  cursor = limit - v_1;
  return true;
}

private boolean r_mark_suffix_with_optional_n_consonant() {
  lab0: {
    int v_1 = limit - cursor;
    lab1: {
      if (!(eq_s_b("n")))
      {
        break lab1;
      }
      int v_2 = limit - cursor;
      if (!(in_grouping_b(g_vowel, 97, 305)))
      {
        break lab1;
      }
      cursor = limit - v_2;
      break lab0;
    }
    cursor = limit - v_1;
    {
      int v_3 = limit - cursor;
      lab2: {
        int v_4 = limit - cursor;
        if (!(eq_s_b("n")))
        {
          break lab2;
        }
        cursor = limit - v_4;
        return false;
      }
      cursor = limit - v_3;
    }
    int v_5 = limit - cursor;
    if (cursor <= limit_backward)
    {
      return false;
    }
    cursor--;
    if (!(in_grouping_b(g_vowel, 97, 305)))
    {
      return false;
    }
    cursor = limit - v_5;
  }
  return true;
}

private boolean r_mark_suffix_with_optional_s_consonant() {
  lab0: {
    int v_1 = limit - cursor;
    lab1: {
      if (!(eq_s_b("s")))
      {
        break lab1;
      }
      int v_2 = limit - cursor;
      if (!(in_grouping_b(g_vowel, 97, 305)))
      {
        break lab1;
      }
      cursor = limit - v_2;
      break lab0;
    }
    cursor = limit - v_1;
    {
      int v_3 = limit - cursor;
      lab2: {
        int v_4 = limit - cursor;
        if (!(eq_s_b("s")))
        {
          break lab2;
        }
        cursor = limit - v_4;
        return false;
      }
      cursor = limit - v_3;
    }
    int v_5 = limit - cursor;
    if (cursor <= limit_backward)
    {
      return false;
    }
    cursor--;
    if (!(in_grouping_b(g_vowel, 97, 305)))
    {
      return false;
    }
    cursor = limit - v_5;
  }
  return true;
}

private boolean r_mark_suffix_with_optional_y_consonant() {
  lab0: {
    int v_1 = limit - cursor;
    lab1: {
      if (!(eq_s_b("y")))
      {
        break lab1;
      }
      int v_2 = limit - cursor;
      if (!(in_grouping_b(g_vowel, 97, 305)))
      {
        break lab1;
      }
      cursor = limit - v_2;
      break lab0;
    }
    cursor = limit - v_1;
    {
      int v_3 = limit - cursor;
      lab2: {
        int v_4 = limit - cursor;
        if (!(eq_s_b("y")))
        {
          break lab2;
        }
        cursor = limit - v_4;
        return false;
      }
      cursor = limit - v_3;
    }
    int v_5 = limit - cursor;
    if (cursor <= limit_backward)
    {
      return false;
    }
    cursor--;
    if (!(in_grouping_b(g_vowel, 97, 305)))
    {
      return false;
    }
    cursor = limit - v_5;
  }
  return true;
}

private boolean r_mark_suffix_with_optional_U_vowel() {
  lab0: {
    int v_1 = limit - cursor;
    lab1: {
      if (!(in_grouping_b(g_U, 105, 305)))
      {
        break lab1;
      }
      int v_2 = limit - cursor;
      if (!(out_grouping_b(g_vowel, 97, 305)))
      {
        break lab1;
      }
      cursor = limit - v_2;
      break lab0;
    }
    cursor = limit - v_1;
    {
      int v_3 = limit - cursor;
      lab2: {
        int v_4 = limit - cursor;
        if (!(in_grouping_b(g_U, 105, 305)))
        {
          break lab2;
        }
        cursor = limit - v_4;
        return false;
      }
      cursor = limit - v_3;
    }
    int v_5 = limit - cursor;
    if (cursor <= limit_backward)
    {
      return false;
    }
    cursor--;
    if (!(out_grouping_b(g_vowel, 97, 305)))
    {
      return false;
    }
    cursor = limit - v_5;
  }
  return true;
}

private boolean r_mark_possessives() {
  if (find_among_b(a_0) == 0)
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_U_vowel())
  {
    return false;
  }
  return true;
}

private boolean r_mark_sU() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (!(in_grouping_b(g_U, 105, 305)))
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_s_consonant())
  {
    return false;
  }
  return true;
}

private boolean r_mark_lArI() {
  if (find_among_b(a_1) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_yU() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (!(in_grouping_b(g_U, 105, 305)))
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_y_consonant())
  {
    return false;
  }
  return true;
}

private boolean r_mark_nU() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_2) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_nUn() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_3) == 0)
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_n_consonant())
  {
    return false;
  }
  return true;
}

private boolean r_mark_yA() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_4) == 0)
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_y_consonant())
  {
    return false;
  }
  return true;
}

private boolean r_mark_nA() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_5) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_DA() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_6) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_ndA() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_7) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_DAn() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_8) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_ndAn() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_9) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_ylA() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_10) == 0)
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_y_consonant())
  {
    return false;
  }
  return true;
}

private boolean r_mark_ki() {
  if (!(eq_s_b("ki")))
  {
    return false;
  }
  return true;
}

private boolean r_mark_ncA() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_11) == 0)
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_n_consonant())
  {
    return false;
  }
  return true;
}

private boolean r_mark_yUm() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_12) == 0)
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_y_consonant())
  {
    return false;
  }
  return true;
}

private boolean r_mark_sUn() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_13) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_yUz() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_14) == 0)
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_y_consonant())
  {
    return false;
  }
  return true;
}

private boolean r_mark_sUnUz() {
  if (find_among_b(a_15) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_lAr() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_16) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_nUz() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_17) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_DUr() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_18) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_cAsInA() {
  if (find_among_b(a_19) == 0)
  {
    return false;
  }
  return true;
}

private boolean r_mark_yDU() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_20) == 0)
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_y_consonant())
  {
    return false;
  }
  return true;
}

private boolean r_mark_ysA() {
  if (find_among_b(a_21) == 0)
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_y_consonant())
  {
    return false;
  }
  return true;
}

private boolean r_mark_ymUs_() {
  if (!r_check_vowel_harmony())
  {
    return false;
  }
  if (find_among_b(a_22) == 0)
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_y_consonant())
  {
    return false;
  }
  return true;
}

private boolean r_mark_yken() {
  if (!(eq_s_b("ken")))
  {
    return false;
  }
  if (!r_mark_suffix_with_optional_y_consonant())
  {
    return false;
  }
  return true;
}

private boolean r_stem_nominal_verb_suffixes() {
  ket = cursor;
  B_continue_stemming_noun_suffixes = true;
  lab0: {
    int v_1 = limit - cursor;
    lab1: {
      lab2: {
        int v_2 = limit - cursor;
        lab3: {
          if (!r_mark_ymUs_())
          {
            break lab3;
          }
          break lab2;
        }
        cursor = limit - v_2;
        lab4: {
          if (!r_mark_yDU())
          {
            break lab4;
          }
          break lab2;
        }
        cursor = limit - v_2;
        lab5: {
          if (!r_mark_ysA())
          {
            break lab5;
          }
          break lab2;
        }
        cursor = limit - v_2;
        if (!r_mark_yken())
        {
          break lab1;
        }
      }
      break lab0;
    }
    cursor = limit - v_1;
    lab6: {
      if (!r_mark_cAsInA())
      {
        break lab6;
      }
      lab7: {
        int v_3 = limit - cursor;
        lab8: {
          if (!r_mark_sUnUz())
          {
            break lab8;
          }
          break lab7;
        }
        cursor = limit - v_3;
        lab9: {
          if (!r_mark_lAr())
          {
            break lab9;
          }
          break lab7;
        }
        cursor = limit - v_3;
        lab10: {
          if (!r_mark_yUm())
          {
            break lab10;
          }
          break lab7;
        }
        cursor = limit - v_3;
        lab11: {
          if (!r_mark_sUn())
          {
            break lab11;
          }
          break lab7;
        }
        cursor = limit - v_3;
        lab12: {
          if (!r_mark_yUz())
          {
            break lab12;
          }
          break lab7;
        }
        cursor = limit - v_3;
      }
      if (!r_mark_ymUs_())
      {
        break lab6;
      }
      break lab0;
    }
    cursor = limit - v_1;
    lab13: {
      if (!r_mark_lAr())
      {
        break lab13;
      }
      bra = cursor;
      slice_del();
      int v_4 = limit - cursor;
      lab14: {
        ket = cursor;
        lab15: {
          int v_5 = limit - cursor;
          lab16: {
            if (!r_mark_DUr())
            {
              break lab16;
            }
            break lab15;
          }
          cursor = limit - v_5;
          lab17: {
            if (!r_mark_yDU())
            {
              break lab17;
            }
            break lab15;
          }
          cursor = limit - v_5;
          lab18: {
            if (!r_mark_ysA())
            {
              break lab18;
            }
            break lab15;
          }
          cursor = limit - v_5;
          if (!r_mark_ymUs_())
          {
            cursor = limit - v_4;
            break lab14;
          }
        }
      }
      B_continue_stemming_noun_suffixes = false;
      break lab0;
    }
    cursor = limit - v_1;
    lab19: {
      if (!r_mark_nUz())
      {
        break lab19;
      }
      lab20: {
        int v_6 = limit - cursor;
        lab21: {
          if (!r_mark_yDU())
          {
            break lab21;
          }
          break lab20;
        }
        cursor = limit - v_6;
        if (!r_mark_ysA())
        {
          break lab19;
        }
      }
      break lab0;
    }
    cursor = limit - v_1;
    lab22: {
      lab23: {
        int v_7 = limit - cursor;
        lab24: {
          if (!r_mark_sUnUz())
          {
            break lab24;
          }
          break lab23;
        }
        cursor = limit - v_7;
        lab25: {
          if (!r_mark_yUz())
          {
            break lab25;
          }
          break lab23;
        }
        cursor = limit - v_7;
        lab26: {
          if (!r_mark_sUn())
          {
            break lab26;
          }
          break lab23;
        }
        cursor = limit - v_7;
        if (!r_mark_yUm())
        {
          break lab22;
        }
      }
      bra = cursor;
      slice_del();
      int v_8 = limit - cursor;
      lab27: {
        ket = cursor;
        if (!r_mark_ymUs_())
        {
          cursor = limit - v_8;
          break lab27;
        }
      }
      break lab0;
    }
    cursor = limit - v_1;
    if (!r_mark_DUr())
    {
      return false;
    }
    bra = cursor;
    slice_del();
    int v_9 = limit - cursor;
    lab28: {
      ket = cursor;
      lab29: {
        int v_10 = limit - cursor;
        lab30: {
          if (!r_mark_sUnUz())
          {
            break lab30;
          }
          break lab29;
        }
        cursor = limit - v_10;
        lab31: {
          if (!r_mark_lAr())
          {
            break lab31;
          }
          break lab29;
        }
        cursor = limit - v_10;
        lab32: {
          if (!r_mark_yUm())
          {
            break lab32;
          }
          break lab29;
        }
        cursor = limit - v_10;
        lab33: {
          if (!r_mark_sUn())
          {
            break lab33;
          }
          break lab29;
        }
        cursor = limit - v_10;
        lab34: {
          if (!r_mark_yUz())
          {
            break lab34;
          }
          break lab29;
        }
        cursor = limit - v_10;
      }
      if (!r_mark_ymUs_())
      {
        cursor = limit - v_9;
        break lab28;
      }
    }
  }
  bra = cursor;
  slice_del();
  return true;
}

private boolean r_stem_suffix_chain_before_ki() {
  ket = cursor;
  if (!r_mark_ki())
  {
    return false;
  }
  lab0: {
    int v_1 = limit - cursor;
    lab1: {
      if (!r_mark_DA())
      {
        break lab1;
      }
      bra = cursor;
      slice_del();
      int v_2 = limit - cursor;
      lab2: {
        ket = cursor;
        lab3: {
          int v_3 = limit - cursor;
          lab4: {
            if (!r_mark_lAr())
            {
              break lab4;
            }
            bra = cursor;
            slice_del();
            int v_4 = limit - cursor;
            lab5: {
              if (!r_stem_suffix_chain_before_ki())
              {
                cursor = limit - v_4;
                break lab5;
              }
            }
            break lab3;
          }
          cursor = limit - v_3;
          if (!r_mark_possessives())
          {
            cursor = limit - v_2;
            break lab2;
          }
          bra = cursor;
          slice_del();
          int v_5 = limit - cursor;
          lab6: {
            ket = cursor;
            if (!r_mark_lAr())
            {
              cursor = limit - v_5;
              break lab6;
            }
            bra = cursor;
            slice_del();
            if (!r_stem_suffix_chain_before_ki())
            {
              cursor = limit - v_5;
              break lab6;
            }
          }
        }
      }
      break lab0;
    }
    cursor = limit - v_1;
    lab7: {
      if (!r_mark_nUn())
      {
        break lab7;
      }
      bra = cursor;
      slice_del();
      int v_6 = limit - cursor;
      lab8: {
        ket = cursor;
        lab9: {
          int v_7 = limit - cursor;
          lab10: {
            if (!r_mark_lArI())
            {
              break lab10;
            }
            bra = cursor;
            slice_del();
            break lab9;
          }
          cursor = limit - v_7;
          lab11: {
            ket = cursor;
            lab12: {
              int v_8 = limit - cursor;
              lab13: {
                if (!r_mark_possessives())
                {
                  break lab13;
                }
                break lab12;
              }
              cursor = limit - v_8;
              if (!r_mark_sU())
              {
                break lab11;
              }
            }
            bra = cursor;
            slice_del();
            int v_9 = limit - cursor;
            lab14: {
              ket = cursor;
              if (!r_mark_lAr())
              {
                cursor = limit - v_9;
                break lab14;
              }
              bra = cursor;
              slice_del();
              if (!r_stem_suffix_chain_before_ki())
              {
                cursor = limit - v_9;
                break lab14;
              }
            }
            break lab9;
          }
          cursor = limit - v_7;
          if (!r_stem_suffix_chain_before_ki())
          {
            cursor = limit - v_6;
            break lab8;
          }
        }
      }
      break lab0;
    }
    cursor = limit - v_1;
    if (!r_mark_ndA())
    {
      return false;
    }
    lab15: {
      int v_10 = limit - cursor;
      lab16: {
        if (!r_mark_lArI())
        {
          break lab16;
        }
        bra = cursor;
        slice_del();
        break lab15;
      }
      cursor = limit - v_10;
      lab17: {
        if (!r_mark_sU())
        {
          break lab17;
        }
        bra = cursor;
        slice_del();
        int v_11 = limit - cursor;
        lab18: {
          ket = cursor;
          if (!r_mark_lAr())
          {
            cursor = limit - v_11;
            break lab18;
          }
          bra = cursor;
          slice_del();
          if (!r_stem_suffix_chain_before_ki())
          {
            cursor = limit - v_11;
            break lab18;
          }
        }
        break lab15;
      }
      cursor = limit - v_10;
      if (!r_stem_suffix_chain_before_ki())
      {
        return false;
      }
    }
  }
  return true;
}

private boolean r_stem_noun_suffixes() {
  lab0: {
    int v_1 = limit - cursor;
    lab1: {
      ket = cursor;
      if (!r_mark_lAr())
      {
        break lab1;
      }
      bra = cursor;
      slice_del();
      int v_2 = limit - cursor;
      lab2: {
        if (!r_stem_suffix_chain_before_ki())
        {
          cursor = limit - v_2;
          break lab2;
        }
      }
      break lab0;
    }
    cursor = limit - v_1;
    lab3: {
      ket = cursor;
      if (!r_mark_ncA())
      {
        break lab3;
      }
      bra = cursor;
      slice_del();
      int v_3 = limit - cursor;
      lab4: {
        lab5: {
          int v_4 = limit - cursor;
          lab6: {
            ket = cursor;
            if (!r_mark_lArI())
            {
              break lab6;
            }
            bra = cursor;
            slice_del();
            break lab5;
          }
          cursor = limit - v_4;
          lab7: {
            ket = cursor;
            lab8: {
              int v_5 = limit - cursor;
              lab9: {
                if (!r_mark_possessives())
                {
                  break lab9;
                }
                break lab8;
              }
              cursor = limit - v_5;
              if (!r_mark_sU())
              {
                break lab7;
              }
            }
            bra = cursor;
            slice_del();
            int v_6 = limit - cursor;
            lab10: {
              ket = cursor;
              if (!r_mark_lAr())
              {
                cursor = limit - v_6;
                break lab10;
              }
              bra = cursor;
              slice_del();
              if (!r_stem_suffix_chain_before_ki())
              {
                cursor = limit - v_6;
                break lab10;
              }
            }
            break lab5;
          }
          cursor = limit - v_4;
          ket = cursor;
          if (!r_mark_lAr())
          {
            cursor = limit - v_3;
            break lab4;
          }
          bra = cursor;
          slice_del();
          if (!r_stem_suffix_chain_before_ki())
          {
            cursor = limit - v_3;
            break lab4;
          }
        }
      }
      break lab0;
    }
    cursor = limit - v_1;
    lab11: {
      ket = cursor;
      lab12: {
        int v_7 = limit - cursor;
        lab13: {
          if (!r_mark_ndA())
          {
            break lab13;
          }
          break lab12;
        }
        cursor = limit - v_7;
        if (!r_mark_nA())
        {
          break lab11;
        }
      }
      lab14: {
        int v_8 = limit - cursor;
        lab15: {
          if (!r_mark_lArI())
          {
            break lab15;
          }
          bra = cursor;
          slice_del();
          break lab14;
        }
        cursor = limit - v_8;
        lab16: {
          if (!r_mark_sU())
          {
            break lab16;
          }
          bra = cursor;
          slice_del();
          int v_9 = limit - cursor;
          lab17: {
            ket = cursor;
            if (!r_mark_lAr())
            {
              cursor = limit - v_9;
              break lab17;
            }
            bra = cursor;
            slice_del();
            if (!r_stem_suffix_chain_before_ki())
            {
              cursor = limit - v_9;
              break lab17;
            }
          }
          break lab14;
        }
        cursor = limit - v_8;
        if (!r_stem_suffix_chain_before_ki())
        {
          break lab11;
        }
      }
      break lab0;
    }
    cursor = limit - v_1;
    lab18: {
      ket = cursor;
      lab19: {
        int v_10 = limit - cursor;
        lab20: {
          if (!r_mark_ndAn())
          {
            break lab20;
          }
          break lab19;
        }
        cursor = limit - v_10;
        if (!r_mark_nU())
        {
          break lab18;
        }
      }
      lab21: {
        int v_11 = limit - cursor;
        lab22: {
          if (!r_mark_sU())
          {
            break lab22;
          }
          bra = cursor;
          slice_del();
          int v_12 = limit - cursor;
          lab23: {
            ket = cursor;
            if (!r_mark_lAr())
            {
              cursor = limit - v_12;
              break lab23;
            }
            bra = cursor;
            slice_del();
            if (!r_stem_suffix_chain_before_ki())
            {
              cursor = limit - v_12;
              break lab23;
            }
          }
          break lab21;
        }
        cursor = limit - v_11;
        if (!r_mark_lArI())
        {
          break lab18;
        }
      }
      break lab0;
    }
    cursor = limit - v_1;
    lab24: {
      ket = cursor;
      if (!r_mark_DAn())
      {
        break lab24;
      }
      bra = cursor;
      slice_del();
      int v_13 = limit - cursor;
      lab25: {
        ket = cursor;
        lab26: {
          int v_14 = limit - cursor;
          lab27: {
            if (!r_mark_possessives())
            {
              break lab27;
            }
            bra = cursor;
            slice_del();
            int v_15 = limit - cursor;
            lab28: {
              ket = cursor;
              if (!r_mark_lAr())
              {
                cursor = limit - v_15;
                break lab28;
              }
              bra = cursor;
              slice_del();
              if (!r_stem_suffix_chain_before_ki())
              {
                cursor = limit - v_15;
                break lab28;
              }
            }
            break lab26;
          }
          cursor = limit - v_14;
          lab29: {
            if (!r_mark_lAr())
            {
              break lab29;
            }
            bra = cursor;
            slice_del();
            int v_16 = limit - cursor;
            lab30: {
              if (!r_stem_suffix_chain_before_ki())
              {
                cursor = limit - v_16;
                break lab30;
              }
            }
            break lab26;
          }
          cursor = limit - v_14;
          if (!r_stem_suffix_chain_before_ki())
          {
            cursor = limit - v_13;
            break lab25;
          }
        }
      }
      break lab0;
    }
    cursor = limit - v_1;
    lab31: {
      ket = cursor;
      lab32: {
        int v_17 = limit - cursor;
        lab33: {
          if (!r_mark_nUn())
          {
            break lab33;
          }
          break lab32;
        }
        cursor = limit - v_17;
        if (!r_mark_ylA())
        {
          break lab31;
        }
      }
      bra = cursor;
      slice_del();
      int v_18 = limit - cursor;
      lab34: {
        lab35: {
          int v_19 = limit - cursor;
          lab36: {
            ket = cursor;
            if (!r_mark_lAr())
            {
              break lab36;
            }
            bra = cursor;
            slice_del();
            if (!r_stem_suffix_chain_before_ki())
            {
              break lab36;
            }
            break lab35;
          }
          cursor = limit - v_19;
          lab37: {
            ket = cursor;
            lab38: {
              int v_20 = limit - cursor;
              lab39: {
                if (!r_mark_possessives())
                {
                  break lab39;
                }
                break lab38;
              }
              cursor = limit - v_20;
              if (!r_mark_sU())
              {
                break lab37;
              }
            }
            bra = cursor;
            slice_del();
            int v_21 = limit - cursor;
            lab40: {
              ket = cursor;
              if (!r_mark_lAr())
              {
                cursor = limit - v_21;
                break lab40;
              }
              bra = cursor;
              slice_del();
              if (!r_stem_suffix_chain_before_ki())
              {
                cursor = limit - v_21;
                break lab40;
              }
            }
            break lab35;
          }
          cursor = limit - v_19;
          if (!r_stem_suffix_chain_before_ki())
          {
            cursor = limit - v_18;
            break lab34;
          }
        }
      }
      break lab0;
    }
    cursor = limit - v_1;
    lab41: {
      ket = cursor;
      if (!r_mark_lArI())
      {
        break lab41;
      }
      bra = cursor;
      slice_del();
      break lab0;
    }
    cursor = limit - v_1;
    lab42: {
      if (!r_stem_suffix_chain_before_ki())
      {
        break lab42;
      }
      break lab0;
    }
    cursor = limit - v_1;
    lab43: {
      ket = cursor;
      lab44: {
        int v_22 = limit - cursor;
        lab45: {
          if (!r_mark_DA())
          {
            break lab45;
          }
          break lab44;
        }
        cursor = limit - v_22;
        lab46: {
          if (!r_mark_yU())
          {
            break lab46;
          }
          break lab44;
        }
        cursor = limit - v_22;
        if (!r_mark_yA())
        {
          break lab43;
        }
      }
      bra = cursor;
      slice_del();
      int v_23 = limit - cursor;
      lab47: {
        ket = cursor;
        lab48: {
          int v_24 = limit - cursor;
          lab49: {
            if (!r_mark_possessives())
            {
              break lab49;
            }
            bra = cursor;
            slice_del();
            int v_25 = limit - cursor;
            lab50: {
              ket = cursor;
              if (!r_mark_lAr())
              {
                cursor = limit - v_25;
                break lab50;
              }
            }
            break lab48;
          }
          cursor = limit - v_24;
          if (!r_mark_lAr())
          {
            cursor = limit - v_23;
            break lab47;
          }
        }
        bra = cursor;
        slice_del();
        ket = cursor;
        if (!r_stem_suffix_chain_before_ki())
        {
          cursor = limit - v_23;
          break lab47;
        }
      }
      break lab0;
    }
    cursor = limit - v_1;
    ket = cursor;
    lab51: {
      int v_26 = limit - cursor;
      lab52: {
        if (!r_mark_possessives())
        {
          break lab52;
        }
        break lab51;
      }
      cursor = limit - v_26;
      if (!r_mark_sU())
      {
        return false;
      }
    }
    bra = cursor;
    slice_del();
    int v_27 = limit - cursor;
    lab53: {
      ket = cursor;
      if (!r_mark_lAr())
      {
        cursor = limit - v_27;
        break lab53;
      }
      bra = cursor;
      slice_del();
      if (!r_stem_suffix_chain_before_ki())
      {
        cursor = limit - v_27;
        break lab53;
      }
    }
  }
  return true;
}

private boolean r_post_process_last_consonants() {
  int among_var;
  ket = cursor;
  among_var = find_among_b(a_23);
  if (among_var == 0)
  {
    return false;
  }
  bra = cursor;
  switch (among_var) {
    case 1:
      slice_from("p");
      break;
    case 2:
      slice_from("\u00E7");
      break;
    case 3:
      slice_from("t");
      break;
    case 4:
      slice_from("k");
      break;
  }
  return true;
}

private boolean r_append_U_to_stems_ending_with_d_or_g() {
  int v_1 = limit - cursor;
  lab0: {
    int v_2 = limit - cursor;
    lab1: {
      if (!(eq_s_b("d")))
      {
        break lab1;
      }
      break lab0;
    }
    cursor = limit - v_2;
    if (!(eq_s_b("g")))
    {
      return false;
    }
  }
  cursor = limit - v_1;
  lab2: {
    int v_3 = limit - cursor;
    lab3: {
      int v_4 = limit - cursor;
      golab4: while(true)
      {
        int v_5 = limit - cursor;
        lab5: {
          if (!(in_grouping_b(g_vowel, 97, 305)))
          {
            break lab5;
          }
          cursor = limit - v_5;
          break golab4;
        }
        cursor = limit - v_5;
        if (cursor <= limit_backward)
        {
          break lab3;
        }
        cursor--;
      }
      lab6: {
        int v_6 = limit - cursor;
        lab7: {
          if (!(eq_s_b("a")))
          {
            break lab7;
          }
          break lab6;
        }
        cursor = limit - v_6;
        if (!(eq_s_b("\u0131")))
        {
          break lab3;
        }
      }
      cursor = limit - v_4;
      {
        int c = cursor;
        insert(cursor, cursor, "\u0131");
        cursor = c;
      }
      break lab2;
    }
    cursor = limit - v_3;
    lab8: {
      int v_7 = limit - cursor;
      golab9: while(true)
      {
        int v_8 = limit - cursor;
        lab10: {
          if (!(in_grouping_b(g_vowel, 97, 305)))
          {
            break lab10;
          }
          cursor = limit - v_8;
          break golab9;
        }
        cursor = limit - v_8;
        if (cursor <= limit_backward)
        {
          break lab8;
        }
        cursor--;
      }
      lab11: {
        int v_9 = limit - cursor;
        lab12: {
          if (!(eq_s_b("e")))
          {
            break lab12;
          }
          break lab11;
        }
        cursor = limit - v_9;
        if (!(eq_s_b("i")))
        {
          break lab8;
        }
      }
      cursor = limit - v_7;
      {
        int c = cursor;
        insert(cursor, cursor, "i");
        cursor = c;
      }
      break lab2;
    }
    cursor = limit - v_3;
    lab13: {
      int v_10 = limit - cursor;
      golab14: while(true)
      {
        int v_11 = limit - cursor;
        lab15: {
          if (!(in_grouping_b(g_vowel, 97, 305)))
          {
            break lab15;
          }
          cursor = limit - v_11;
          break golab14;
        }
        cursor = limit - v_11;
        if (cursor <= limit_backward)
        {
          break lab13;
        }
        cursor--;
      }
      lab16: {
        int v_12 = limit - cursor;
        lab17: {
          if (!(eq_s_b("o")))
          {
            break lab17;
          }
          break lab16;
        }
        cursor = limit - v_12;
        if (!(eq_s_b("u")))
        {
          break lab13;
        }
      }
      cursor = limit - v_10;
      {
        int c = cursor;
        insert(cursor, cursor, "u");
        cursor = c;
      }
      break lab2;
    }
    cursor = limit - v_3;
    int v_13 = limit - cursor;
    golab18: while(true)
    {
      int v_14 = limit - cursor;
      lab19: {
        if (!(in_grouping_b(g_vowel, 97, 305)))
        {
          break lab19;
        }
        cursor = limit - v_14;
        break golab18;
      }
      cursor = limit - v_14;
      if (cursor <= limit_backward)
      {
        return false;
      }
      cursor--;
    }
    lab20: {
      int v_15 = limit - cursor;
      lab21: {
        if (!(eq_s_b("\u00F6")))
        {
          break lab21;
        }
        break lab20;
      }
      cursor = limit - v_15;
      if (!(eq_s_b("\u00FC")))
      {
        return false;
      }
    }
    cursor = limit - v_13;
    {
      int c = cursor;
      insert(cursor, cursor, "\u00FC");
      cursor = c;
    }
  }
  return true;
}

private boolean r_is_reserved_word() {
  if (!(eq_s_b("ad")))
  {
    return false;
  }
  int v_1 = limit - cursor;
  lab0: {
    if (!(eq_s_b("soy")))
    {
      cursor = limit - v_1;
      break lab0;
    }
  }
  if (cursor > limit_backward)
  {
    return false;
  }
  return true;
}

private boolean r_more_than_one_syllable_word() {
  int v_1 = cursor;
  {
    int v_2 = 2;
    while(true)
    {
      int v_3 = cursor;
      lab0: {
        golab1: while(true)
        {
          lab2: {
            if (!(in_grouping(g_vowel, 97, 305)))
            {
              break lab2;
            }
            break golab1;
          }
          if (cursor >= limit)
          {
            break lab0;
          }
          cursor++;
        }
        v_2--;
        continue;
      }
      cursor = v_3;
      break;
    }
    if (v_2 > 0)
    {
      return false;
    }
  }
  cursor = v_1;
  return true;
}

private boolean r_postlude() {
  limit_backward = cursor;
  cursor = limit;
  {
    int v_1 = limit - cursor;
    lab0: {
      if (!r_is_reserved_word())
      {
        break lab0;
      }
      return false;
    }
    cursor = limit - v_1;
  }
  int v_2 = limit - cursor;
  r_append_U_to_stems_ending_with_d_or_g();
  cursor = limit - v_2;
  int v_3 = limit - cursor;
  r_post_process_last_consonants();
  cursor = limit - v_3;
  cursor = limit_backward;
  return true;
}

public boolean stem() {
  if (!r_more_than_one_syllable_word())
  {
    return false;
  }
  limit_backward = cursor;
  cursor = limit;
  int v_1 = limit - cursor;
  r_stem_nominal_verb_suffixes();
  cursor = limit - v_1;
  if (!(B_continue_stemming_noun_suffixes))
  {
    return false;
  }
  int v_2 = limit - cursor;
  r_stem_noun_suffixes();
  cursor = limit - v_2;
  cursor = limit_backward;
  if (!r_postlude())
  {
    return false;
  }
  return true;
}

@Override
public boolean equals( Object o ) {
  return o instanceof TurkishStemmer;
}

@Override
public int hashCode() {
  return TurkishStemmer.class.getName().hashCode();
}



}

