// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.

// Generated by JFlex 1.9.1 http://jflex.de/  (tweaked for IntelliJ platform)
// source: _DroolsLexer.flex

 /* It's an automatically generated code. Do not modify it. */
package com.intellij.plugins.drools.lang.lexer;

import static com.intellij.plugins.drools.lang.lexer.DroolsTokenTypes.*;
import static com.intellij.plugins.drools.lang.lexer.DroolsTokenTypeSets.*;
import com.intellij.lexer.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.TokenType;
import it.unimi.dsi.fastutil.ints.IntArrayList;


public class _DroolsLexer implements FlexLexer {

  /** This character denotes the end of file */
  public static final int YYEOF = -1;

  /** initial size of the lookahead buffer */
  private static final int ZZ_BUFFERSIZE = 16384;

  /** lexical states */
  public static final int YYINITIAL = 0;
  public static final int LHS_STATE = 2;
  public static final int RHS_STATE = 4;
  public static final int QUERY_STATE = 6;
  public static final int FQN_STATE = 8;

  /**
   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
   * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
   *                  at the beginning of a line
   * l is of the form l = 2*k, k a non negative integer
   */
  private static final int ZZ_LEXSTATE[] = {
     0,  0,  1,  1,  2,  2,  1,  1,  3, 3
  };

  /**
   * Top-level table for translating characters to character classes
   */
  private static final int [] ZZ_CMAP_TOP = zzUnpackcmap_top();

  private static final String ZZ_CMAP_TOP_PACKED_0 =
    "\1\0\1\u0100\1\u0200\1\u0300\1\u0400\1\u0500\1\u0600\1\u0700"+
    "\1\u0800\1\u0900\1\u0a00\1\u0b00\1\u0c00\1\u0d00\1\u0e00\1\u0f00"+
    "\1\u1000\1\u0100\1\u1100\1\u1200\1\u1300\1\u0100\1\u1400\1\u1500"+
    "\1\u1600\1\u1700\1\u1800\1\u1900\1\u1a00\1\u1b00\1\u0100\1\u1c00"+
    "\1\u1d00\1\u1e00\12\u1f00\1\u2000\1\u2100\1\u2200\1\u1f00\1\u2300"+
    "\1\u2400\2\u1f00\31\u0100\1\u2500\121\u0100\1\u2600\4\u0100\1\u2700"+
    "\1\u0100\1\u2800\1\u2900\1\u2a00\1\u2b00\1\u2c00\1\u2d00\53\u0100"+
    "\1\u2e00\41\u1f00\1\u0100\1\u2f00\1\u3000\1\u0100\1\u3100\1\u3200"+
    "\1\u3300\1\u3400\1\u1f00\1\u3500\1\u3600\1\u3700\1\u3800\1\u0100"+
    "\1\u3900\1\u3a00\1\u3b00\1\u3c00\1\u3d00\1\u3e00\1\u3f00\1\u1f00"+
    "\1\u4000\1\u4100\1\u4200\1\u4300\1\u4400\1\u4500\1\u4600\1\u4700"+
    "\1\u4800\1\u4900\1\u4a00\1\u4b00\1\u1f00\1\u4c00\1\u4d00\1\u4e00"+
    "\1\u1f00\3\u0100\1\u4f00\1\u5000\1\u5100\12\u1f00\4\u0100\1\u5200"+
    "\17\u1f00\2\u0100\1\u5300\41\u1f00\2\u0100\1\u5400\1\u5500\2\u1f00"+
    "\1\u5600\1\u5700\27\u0100\1\u5800\2\u0100\1\u5900\45\u1f00\1\u0100"+
    "\1\u5a00\1\u5b00\11\u1f00\1\u5c00\27\u1f00\1\u5d00\1\u5e00\1\u5f00"+
    "\1\u6000\11\u1f00\1\u6100\1\u6200\5\u1f00\1\u6300\1\u6400\4\u1f00"+
    "\1\u6500\21\u1f00\246\u0100\1\u6600\20\u0100\1\u6700\1\u6800\25\u0100"+
    "\1\u6900\34\u0100\1\u6a00\14\u1f00\2\u0100\1\u6b00\u0e05\u1f00";

  private static int [] zzUnpackcmap_top() {
    int [] result = new int[4352];
    int offset = 0;
    offset = zzUnpackcmap_top(ZZ_CMAP_TOP_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackcmap_top(String packed, int offset, int [] result) {
    int i = 0;       /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      do result[j++] = value; while (--count > 0);
    }
    return j;
  }


  /**
   * Second-level tables for translating characters to character classes
   */
  private static final int [] ZZ_CMAP_BLOCKS = zzUnpackcmap_blocks();

  private static final String ZZ_CMAP_BLOCKS_PACKED_0 =
    "\11\0\1\1\1\2\1\0\1\1\1\2\22\0\1\1"+
    "\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12"+
    "\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22"+
    "\11\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32"+
    "\1\33\3\34\1\35\1\34\5\36\1\37\2\36\1\40"+
    "\10\36\1\41\2\36\1\42\1\43\1\44\1\45\1\46"+
    "\1\0\1\47\1\50\1\51\1\52\1\53\1\54\1\55"+
    "\1\56\1\57\1\36\1\60\1\61\1\62\1\63\1\64"+
    "\1\65\1\66\1\67\1\70\1\71\1\72\1\73\1\74"+
    "\1\75\1\76\1\36\1\77\1\100\1\101\1\102\53\0"+
    "\1\36\12\0\1\36\4\0\1\36\5\0\27\36\1\0"+
    "\37\36\1\0\u01ca\36\4\0\14\36\16\0\5\36\7\0"+
    "\1\36\1\0\1\36\201\0\5\36\1\0\2\36\2\0"+
    "\4\36\1\0\1\36\6\0\1\36\1\0\3\36\1\0"+
    "\1\36\1\0\24\36\1\0\123\36\1\0\213\36\10\0"+
    "\246\36\1\0\46\36\2\0\1\36\6\0\51\36\107\0"+
    "\33\36\4\0\4\36\55\0\53\36\25\0\12\103\4\0"+
    "\2\36\1\0\143\36\1\0\1\36\17\0\2\36\7\0"+
    "\2\36\12\103\3\36\2\0\1\36\20\0\1\36\1\0"+
    "\36\36\35\0\131\36\13\0\1\36\16\0\12\103\41\36"+
    "\11\0\2\36\4\0\1\36\5\0\26\36\4\0\1\36"+
    "\11\0\1\36\3\0\1\36\27\0\31\36\7\0\13\36"+
    "\65\0\25\36\1\0\10\36\106\0\66\36\3\0\1\36"+
    "\22\0\1\36\7\0\12\36\4\0\12\103\1\0\20\36"+
    "\4\0\10\36\2\0\2\36\2\0\26\36\1\0\7\36"+
    "\1\0\1\36\3\0\4\36\3\0\1\36\20\0\1\36"+
    "\15\0\2\36\1\0\3\36\4\0\12\103\2\36\12\0"+
    "\1\36\10\0\6\36\4\0\2\36\2\0\26\36\1\0"+
    "\7\36\1\0\2\36\1\0\2\36\1\0\2\36\37\0"+
    "\4\36\1\0\1\36\7\0\12\103\2\0\3\36\20\0"+
    "\11\36\1\0\3\36\1\0\26\36\1\0\7\36\1\0"+
    "\2\36\1\0\5\36\3\0\1\36\22\0\1\36\17\0"+
    "\2\36\4\0\12\103\11\0\1\36\13\0\10\36\2\0"+
    "\2\36\2\0\26\36\1\0\7\36\1\0\2\36\1\0"+
    "\5\36\3\0\1\36\36\0\2\36\1\0\3\36\4\0"+
    "\12\103\1\0\1\36\21\0\1\36\1\0\6\36\3\0"+
    "\3\36\1\0\4\36\3\0\2\36\1\0\1\36\1\0"+
    "\2\36\3\0\2\36\3\0\3\36\3\0\14\36\26\0"+
    "\1\36\25\0\12\103\25\0\10\36\1\0\3\36\1\0"+
    "\27\36\1\0\20\36\3\0\1\36\32\0\3\36\5\0"+
    "\2\36\4\0\12\103\20\0\1\36\4\0\10\36\1\0"+
    "\3\36\1\0\27\36\1\0\12\36\1\0\5\36\3\0"+
    "\1\36\40\0\1\36\1\0\2\36\4\0\12\103\1\0"+
    "\2\36\22\0\10\36\1\0\3\36\1\0\51\36\2\0"+
    "\1\36\20\0\1\36\5\0\3\36\10\0\3\36\4\0"+
    "\12\103\12\0\6\36\5\0\22\36\3\0\30\36\1\0"+
    "\11\36\1\0\1\36\2\0\7\36\37\0\12\103\21\0"+
    "\60\36\1\0\2\36\14\0\7\36\11\0\12\103\47\0"+
    "\2\36\1\0\1\36\1\0\5\36\1\0\30\36\1\0"+
    "\1\36\1\0\12\36\1\0\2\36\11\0\1\36\2\0"+
    "\5\36\1\0\1\36\11\0\12\103\2\0\4\36\40\0"+
    "\1\36\37\0\12\103\26\0\10\36\1\0\44\36\33\0"+
    "\5\36\163\0\53\36\24\0\1\36\12\103\6\0\6\36"+
    "\4\0\4\36\3\0\1\36\3\0\2\36\7\0\3\36"+
    "\4\0\15\36\14\0\1\36\1\0\12\103\6\0\46\36"+
    "\1\0\1\36\5\0\1\36\2\0\53\36\1\0\115\36"+
    "\1\0\4\36\2\0\7\36\1\0\1\36\1\0\4\36"+
    "\2\0\51\36\1\0\4\36\2\0\41\36\1\0\4\36"+
    "\2\0\7\36\1\0\1\36\1\0\4\36\2\0\17\36"+
    "\1\0\71\36\1\0\4\36\2\0\103\36\45\0\20\36"+
    "\20\0\126\36\2\0\6\36\3\0\u016c\36\2\0\21\36"+
    "\1\0\32\36\5\0\113\36\6\0\10\36\7\0\15\36"+
    "\1\0\4\36\16\0\22\36\16\0\22\36\16\0\15\36"+
    "\1\0\3\36\17\0\64\36\43\0\1\36\4\0\1\36"+
    "\3\0\12\103\46\0\12\103\6\0\131\36\7\0\5\36"+
    "\2\0\42\36\1\0\1\36\5\0\106\36\12\0\37\36"+
    "\47\0\12\103\36\36\2\0\5\36\13\0\54\36\4\0"+
    "\32\36\6\0\12\103\46\0\27\36\11\0\65\36\53\0"+
    "\12\103\6\0\12\103\15\0\1\36\135\0\57\36\21\0"+
    "\7\36\4\0\12\103\51\0\36\36\15\0\2\36\12\103"+
    "\54\36\32\0\44\36\34\0\12\103\3\0\3\36\12\103"+
    "\44\36\2\0\11\36\7\0\53\36\2\0\3\36\51\0"+
    "\4\36\1\0\6\36\1\0\2\36\3\0\1\36\5\0"+
    "\300\36\100\0\26\36\2\0\6\36\2\0\46\36\2\0"+
    "\6\36\2\0\10\36\1\0\1\36\1\0\1\36\1\0"+
    "\1\36\1\0\37\36\2\0\65\36\1\0\7\36\1\0"+
    "\1\36\3\0\3\36\1\0\7\36\3\0\4\36\2\0"+
    "\6\36\4\0\15\36\5\0\3\36\1\0\7\36\164\0"+
    "\1\36\15\0\1\36\20\0\15\36\145\0\1\36\4\0"+
    "\1\36\2\0\12\36\1\0\1\36\3\0\5\36\6\0"+
    "\1\36\1\0\1\36\1\0\1\36\1\0\4\36\1\0"+
    "\13\36\2\0\4\36\5\0\5\36\4\0\1\36\64\0"+
    "\2\36\u017b\0\57\36\1\0\57\36\1\0\205\36\6\0"+
    "\4\36\3\0\2\36\14\0\46\36\1\0\1\36\5\0"+
    "\1\36\2\0\70\36\7\0\1\36\20\0\27\36\11\0"+
    "\7\36\1\0\7\36\1\0\7\36\1\0\7\36\1\0"+
    "\7\36\1\0\7\36\1\0\7\36\1\0\7\36\120\0"+
    "\1\36\325\0\2\36\52\0\5\36\5\0\2\36\4\0"+
    "\126\36\6\0\3\36\1\0\132\36\1\0\4\36\5\0"+
    "\53\36\1\0\136\36\21\0\33\36\65\0\306\36\112\0"+
    "\360\36\20\0\215\36\103\0\56\36\2\0\15\36\3\0"+
    "\20\36\12\103\2\36\24\0\57\36\20\0\37\36\2\0"+
    "\106\36\61\0\11\36\2\0\147\36\2\0\65\36\2\0"+
    "\5\36\60\0\13\36\1\0\3\36\1\0\4\36\1\0"+
    "\27\36\35\0\64\36\16\0\62\36\34\0\12\103\30\0"+
    "\6\36\3\0\1\36\1\0\2\36\1\0\12\103\34\36"+
    "\12\0\27\36\31\0\35\36\7\0\57\36\34\0\1\36"+
    "\12\103\6\0\5\36\1\0\12\36\12\103\5\36\1\0"+
    "\51\36\27\0\3\36\1\0\10\36\4\0\12\103\6\0"+
    "\27\36\3\0\1\36\3\0\62\36\1\0\1\36\3\0"+
    "\2\36\2\0\5\36\2\0\1\36\1\0\1\36\30\0"+
    "\3\36\2\0\13\36\7\0\3\36\14\0\6\36\2\0"+
    "\6\36\2\0\6\36\11\0\7\36\1\0\7\36\1\0"+
    "\53\36\1\0\14\36\10\0\163\36\15\0\12\103\6\0"+
    "\244\36\14\0\27\36\4\0\61\36\4\0\156\36\2\0"+
    "\152\36\46\0\7\36\14\0\5\36\5\0\1\36\1\0"+
    "\12\36\1\0\15\36\1\0\5\36\1\0\1\36\1\0"+
    "\2\36\1\0\2\36\1\0\154\36\41\0\153\36\22\0"+
    "\100\36\2\0\66\36\50\0\14\36\164\0\5\36\1\0"+
    "\207\36\23\0\12\103\7\0\32\36\6\0\32\36\13\0"+
    "\131\36\3\0\6\36\2\0\6\36\2\0\6\36\2\0"+
    "\3\36\43\0\14\36\1\0\32\36\1\0\23\36\1\0"+
    "\2\36\1\0\17\36\2\0\16\36\42\0\173\36\205\0"+
    "\35\36\3\0\61\36\57\0\40\36\15\0\24\36\1\0"+
    "\10\36\6\0\46\36\12\0\36\36\2\0\44\36\4\0"+
    "\10\36\60\0\236\36\2\0\12\103\6\0\44\36\4\0"+
    "\44\36\4\0\50\36\10\0\64\36\234\0\67\36\11\0"+
    "\26\36\12\0\10\36\230\0\6\36\2\0\1\36\1\0"+
    "\54\36\1\0\2\36\3\0\1\36\2\0\27\36\12\0"+
    "\27\36\11\0\37\36\101\0\23\36\1\0\2\36\12\0"+
    "\26\36\12\0\32\36\106\0\70\36\6\0\2\36\100\0"+
    "\1\36\17\0\4\36\1\0\3\36\1\0\35\36\52\0"+
    "\35\36\3\0\35\36\43\0\10\36\1\0\34\36\33\0"+
    "\66\36\12\0\26\36\12\0\23\36\15\0\22\36\156\0"+
    "\111\36\67\0\63\36\15\0\63\36\15\0\44\36\14\0"+
    "\12\103\306\0\35\36\12\0\1\36\10\0\26\36\232\0"+
    "\27\36\14\0\65\36\56\0\12\103\23\0\55\36\40\0"+
    "\31\36\7\0\12\103\11\0\44\36\17\0\12\103\4\0"+
    "\1\36\13\0\43\36\3\0\1\36\14\0\60\36\16\0"+
    "\4\36\13\0\12\103\1\36\1\0\1\36\43\0\22\36"+
    "\1\0\31\36\124\0\7\36\1\0\1\36\1\0\4\36"+
    "\1\0\17\36\1\0\12\36\7\0\57\36\21\0\12\103"+
    "\13\0\10\36\2\0\2\36\2\0\26\36\1\0\7\36"+
    "\1\0\2\36\1\0\5\36\3\0\1\36\22\0\1\36"+
    "\14\0\5\36\236\0\65\36\22\0\4\36\5\0\12\103"+
    "\5\0\1\36\40\0\60\36\24\0\2\36\1\0\1\36"+
    "\10\0\12\103\246\0\57\36\51\0\4\36\44\0\60\36"+
    "\24\0\1\36\13\0\12\103\46\0\53\36\15\0\1\36"+
    "\7\0\12\103\66\0\33\36\25\0\12\103\306\0\54\36"+
    "\164\0\100\36\12\103\25\0\1\36\240\0\10\36\2\0"+
    "\47\36\20\0\1\36\1\0\1\36\34\0\1\36\12\0"+
    "\50\36\7\0\1\36\25\0\1\36\13\0\56\36\23\0"+
    "\1\36\42\0\71\36\7\0\11\36\1\0\45\36\21\0"+
    "\1\36\17\0\12\103\30\0\36\36\160\0\7\36\1\0"+
    "\2\36\1\0\46\36\25\0\1\36\11\0\12\103\6\0"+
    "\6\36\1\0\2\36\1\0\40\36\16\0\1\36\7\0"+
    "\12\103\u0136\0\23\36\15\0\232\36\346\0\304\36\274\0"+
    "\57\36\321\0\107\36\271\0\71\36\7\0\37\36\1\0"+
    "\12\103\146\0\36\36\22\0\60\36\20\0\4\36\14\0"+
    "\12\103\11\0\25\36\5\0\23\36\260\0\100\36\200\0"+
    "\113\36\5\0\1\36\102\0\15\36\100\0\2\36\1\0"+
    "\1\36\34\0\370\36\10\0\363\36\15\0\37\36\61\0"+
    "\3\36\21\0\4\36\10\0\u018c\36\4\0\153\36\5\0"+
    "\15\36\3\0\11\36\7\0\12\36\146\0\125\36\1\0"+
    "\107\36\1\0\2\36\2\0\1\36\2\0\2\36\2\0"+
    "\4\36\1\0\14\36\1\0\1\36\1\0\7\36\1\0"+
    "\101\36\1\0\4\36\2\0\10\36\1\0\7\36\1\0"+
    "\34\36\1\0\4\36\1\0\5\36\1\0\1\36\3\0"+
    "\7\36\1\0\u0154\36\2\0\31\36\1\0\31\36\1\0"+
    "\37\36\1\0\31\36\1\0\37\36\1\0\31\36\1\0"+
    "\37\36\1\0\31\36\1\0\37\36\1\0\31\36\1\0"+
    "\10\36\2\0\62\103\55\36\12\0\7\36\2\0\12\103"+
    "\4\0\1\36\u0171\0\54\36\4\0\12\103\6\0\305\36"+
    "\73\0\104\36\7\0\1\36\4\0\12\103\246\0\4\36"+
    "\1\0\33\36\1\0\2\36\1\0\1\36\2\0\1\36"+
    "\1\0\12\36\1\0\4\36\1\0\1\36\1\0\1\36"+
    "\6\0\1\36\4\0\1\36\1\0\1\36\1\0\1\36"+
    "\1\0\3\36\1\0\2\36\1\0\1\36\2\0\1\36"+
    "\1\0\1\36\1\0\1\36\1\0\1\36\1\0\1\36"+
    "\1\0\2\36\1\0\1\36\2\0\4\36\1\0\7\36"+
    "\1\0\4\36\1\0\4\36\1\0\1\36\1\0\12\36"+
    "\1\0\21\36\5\0\3\36\1\0\5\36\1\0\21\36"+
    "\104\0\327\36\51\0\65\36\13\0\336\36\2\0\u0182\36"+
    "\16\0\u0131\36\37\0\36\36\342\0";

  private static int [] zzUnpackcmap_blocks() {
    int [] result = new int[27648];
    int offset = 0;
    offset = zzUnpackcmap_blocks(ZZ_CMAP_BLOCKS_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackcmap_blocks(String packed, int offset, int [] result) {
    int i = 0;       /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      do result[j++] = value; while (--count > 0);
    }
    return j;
  }

  /**
   * Translates DFA states to action switch labels.
   */
  private static final int [] ZZ_ACTION = zzUnpackAction();

  private static final String ZZ_ACTION_PACKED_0 =
    "\2\1\2\0\1\2\1\3\1\4\1\5\1\6\1\2"+
    "\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16"+
    "\1\17\1\20\1\21\2\22\1\23\1\24\1\25\1\26"+
    "\1\27\1\30\1\31\1\32\1\33\1\34\1\35\24\32"+
    "\1\36\1\37\1\40\1\41\1\1\10\32\1\2\1\20"+
    "\1\42\1\43\1\44\2\5\1\45\1\46\1\47\2\11"+
    "\1\50\1\51\1\52\1\53\1\54\1\55\1\56\1\57"+
    "\1\60\3\1\1\0\1\61\1\62\1\63\1\0\1\64"+
    "\30\32\1\65\31\32\1\66\1\67\2\32\1\70\1\32"+
    "\1\71\1\72\1\32\3\0\1\55\1\22\1\73\1\74"+
    "\1\0\21\32\1\75\16\32\1\76\1\77\5\32\1\0"+
    "\1\100\26\32\1\101\1\32\1\102\1\32\1\55\1\56"+
    "\1\103\6\32\1\104\1\32\1\105\11\32\1\106\1\107"+
    "\5\32\1\110\3\32\1\111\2\32\1\112\3\32\1\0"+
    "\1\113\1\114\5\32\1\115\5\32\1\116\1\117\1\32"+
    "\1\120\1\121\1\32\1\122\1\123\2\32\1\124\5\32"+
    "\1\0\4\32\1\0\10\32\1\125\1\126\5\32\1\0"+
    "\3\32\1\0\1\32\1\127\5\32\1\130\3\32\1\131"+
    "\2\32\1\132\1\32\1\133\3\32\1\0\4\32\1\0"+
    "\2\32\1\134\2\32\1\0\1\135\1\32\1\136\1\32"+
    "\1\137\1\140\1\141\1\0\2\32\1\142\1\0\1\32"+
    "\1\143\5\32\1\144\1\32\1\145\1\146\2\32\1\0"+
    "\1\32\1\0\1\147\1\32\1\150\1\32\2\0\1\151"+
    "\1\152\1\32\1\153\1\0\1\154\2\32\1\0\1\155"+
    "\1\32\1\156\1\157\1\160\1\161\6\32\1\0\1\32"+
    "\1\0\1\32\1\162\2\0\1\163\1\0\1\164\1\32"+
    "\1\0\1\165\1\32\1\166\1\32\1\167\2\32\1\0"+
    "\1\32\1\0\1\170\3\0\1\32\2\0\1\32\1\171"+
    "\1\32\1\0\1\172\1\173\3\0\1\32\2\0\1\174"+
    "\4\0\1\175\1\32\3\0\1\176\1\0\1\177\1\32"+
    "\4\0\1\200\3\0\1\201\1\202\1\203\1\0\1\204";

  private static int [] zzUnpackAction() {
    int [] result = new int[481];
    int offset = 0;
    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackAction(String packed, int offset, int [] result) {
    int i = 0;       /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      do result[j++] = value; while (--count > 0);
    }
    return j;
  }


  /**
   * Translates a state to a row index in the transition table
   */
  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();

  private static final String ZZ_ROWMAP_PACKED_0 =
    "\0\0\0\104\0\210\0\314\0\u0110\0\u0154\0\u0198\0\u01dc"+
    "\0\u0220\0\u0264\0\u02a8\0\u02ec\0\u0330\0\u0110\0\u0110\0\u0374"+
    "\0\u03b8\0\u0110\0\u03fc\0\u0440\0\u0484\0\u04c8\0\u050c\0\u0110"+
    "\0\u0110\0\u0550\0\u0594\0\u05d8\0\u0110\0\u0110\0\u061c\0\u0110"+
    "\0\u0110\0\u0660\0\u06a4\0\u06e8\0\u072c\0\u0770\0\u07b4\0\u07f8"+
    "\0\u083c\0\u0880\0\u08c4\0\u0908\0\u094c\0\u0990\0\u09d4\0\u0a18"+
    "\0\u0a5c\0\u0aa0\0\u0ae4\0\u0b28\0\u0b6c\0\u0bb0\0\u0110\0\u0bf4"+
    "\0\u0110\0\u0110\0\u0c38\0\u0c7c\0\u0cc0\0\u0d04\0\u0d48\0\u0d8c"+
    "\0\u0dd0\0\u0e14\0\u0e58\0\u0e9c\0\u0110\0\u0ee0\0\u0110\0\u0110"+
    "\0\u0110\0\u0f24\0\u0110\0\u0110\0\u0110\0\u0110\0\u0f68\0\u0110"+
    "\0\u0110\0\u0110\0\u0110\0\u0110\0\u0fac\0\u0ff0\0\u1034\0\u0110"+
    "\0\u1078\0\u10bc\0\u1100\0\u1144\0\u0110\0\u0110\0\u0110\0\u1188"+
    "\0\u0110\0\u11cc\0\u1210\0\u1254\0\u1298\0\u12dc\0\u1320\0\u1364"+
    "\0\u13a8\0\u13ec\0\u1430\0\u1474\0\u14b8\0\u14fc\0\u1540\0\u1584"+
    "\0\u15c8\0\u160c\0\u1650\0\u1694\0\u16d8\0\u171c\0\u1760\0\u17a4"+
    "\0\u17e8\0\u182c\0\u1870\0\u18b4\0\u18f8\0\u193c\0\u1980\0\u19c4"+
    "\0\u1a08\0\u1a4c\0\u1a90\0\u1ad4\0\u1b18\0\u1b5c\0\u1ba0\0\u1be4"+
    "\0\u1c28\0\u1c6c\0\u1cb0\0\u1cf4\0\u1d38\0\u1d7c\0\u1dc0\0\u1e04"+
    "\0\u1e48\0\u1e8c\0\u1ed0\0\u0110\0\u0110\0\u1f14\0\u1f58\0\u14fc"+
    "\0\u1f9c\0\u061c\0\u061c\0\u1fe0\0\u2024\0\u2068\0\u20ac\0\u20f0"+
    "\0\u1100\0\u0110\0\u0110\0\u2134\0\u2178\0\u21bc\0\u2200\0\u2244"+
    "\0\u2288\0\u22cc\0\u2310\0\u2354\0\u2398\0\u23dc\0\u2420\0\u2464"+
    "\0\u24a8\0\u24ec\0\u2530\0\u2574\0\u25b8\0\u061c\0\u25fc\0\u2640"+
    "\0\u2684\0\u26c8\0\u270c\0\u2750\0\u2794\0\u27d8\0\u281c\0\u2860"+
    "\0\u28a4\0\u28e8\0\u292c\0\u2970\0\u061c\0\u061c\0\u29b4\0\u29f8"+
    "\0\u2a3c\0\u2a80\0\u2ac4\0\u2b08\0\u061c\0\u2b4c\0\u2b90\0\u2bd4"+
    "\0\u2c18\0\u2c5c\0\u2ca0\0\u2ce4\0\u2d28\0\u2d6c\0\u2db0\0\u2df4"+
    "\0\u2e38\0\u2e7c\0\u2ec0\0\u2f04\0\u2f48\0\u2f8c\0\u2fd0\0\u3014"+
    "\0\u3058\0\u309c\0\u30e0\0\u061c\0\u3124\0\u061c\0\u3168\0\u20ac"+
    "\0\u0110\0\u0110\0\u31ac\0\u31f0\0\u3234\0\u3278\0\u32bc\0\u3300"+
    "\0\u061c\0\u3344\0\u061c\0\u3388\0\u33cc\0\u3410\0\u3454\0\u3498"+
    "\0\u34dc\0\u3520\0\u3564\0\u35a8\0\u061c\0\u061c\0\u35ec\0\u3630"+
    "\0\u3674\0\u36b8\0\u36fc\0\u061c\0\u3740\0\u3784\0\u37c8\0\u061c"+
    "\0\u380c\0\u3850\0\u061c\0\u3894\0\u38d8\0\u391c\0\u3960\0\u061c"+
    "\0\u061c\0\u39a4\0\u39e8\0\u3a2c\0\u3a70\0\u3ab4\0\u3af8\0\u3b3c"+
    "\0\u3b80\0\u3bc4\0\u3c08\0\u3c4c\0\u061c\0\u061c\0\u3c90\0\u061c"+
    "\0\u061c\0\u3cd4\0\u061c\0\u061c\0\u3d18\0\u3d5c\0\u061c\0\u3da0"+
    "\0\u3de4\0\u3e28\0\u3e6c\0\u3eb0\0\u3ef4\0\u3f38\0\u3f7c\0\u3fc0"+
    "\0\u4004\0\u4048\0\u408c\0\u40d0\0\u4114\0\u4158\0\u419c\0\u41e0"+
    "\0\u4224\0\u4268\0\u061c\0\u061c\0\u42ac\0\u42f0\0\u4334\0\u4378"+
    "\0\u43bc\0\u4400\0\u4444\0\u4488\0\u44cc\0\u4510\0\u4554\0\u061c"+
    "\0\u4598\0\u45dc\0\u4620\0\u4664\0\u46a8\0\u061c\0\u46ec\0\u4730"+
    "\0\u4774\0\u061c\0\u47b8\0\u47fc\0\u061c\0\u4840\0\u061c\0\u4884"+
    "\0\u48c8\0\u490c\0\u4950\0\u4994\0\u49d8\0\u4a1c\0\u4a60\0\u4aa4"+
    "\0\u4ae8\0\u4b2c\0\u061c\0\u4b70\0\u4bb4\0\u4bf8\0\u061c\0\u4c3c"+
    "\0\u061c\0\u4c80\0\u061c\0\u061c\0\u4cc4\0\u4d08\0\u4d4c\0\u4d90"+
    "\0\u061c\0\u4dd4\0\u4e18\0\u061c\0\u4e5c\0\u4ea0\0\u4ee4\0\u4f28"+
    "\0\u4f6c\0\u061c\0\u4fb0\0\u061c\0\u061c\0\u4ff4\0\u5038\0\u507c"+
    "\0\u50c0\0\u5104\0\u061c\0\u5148\0\u061c\0\u518c\0\u51d0\0\u5214"+
    "\0\u061c\0\u061c\0\u5258\0\u061c\0\u529c\0\u061c\0\u52e0\0\u5324"+
    "\0\u5368\0\u061c\0\u53ac\0\u0110\0\u061c\0\u061c\0\u061c\0\u53f0"+
    "\0\u5434\0\u5478\0\u54bc\0\u5500\0\u5544\0\u5588\0\u55cc\0\u5610"+
    "\0\u5654\0\u061c\0\u5698\0\u56dc\0\u061c\0\u5720\0\u061c\0\u5764"+
    "\0\u57a8\0\u061c\0\u57ec\0\u061c\0\u5830\0\u061c\0\u5874\0\u58b8"+
    "\0\u58fc\0\u5940\0\u5984\0\u061c\0\u59c8\0\u5a0c\0\u5a50\0\u5a94"+
    "\0\u5ad8\0\u5b1c\0\u5b60\0\u061c\0\u5ba4\0\u5be8\0\u061c\0\u0110"+
    "\0\u5c2c\0\u5c70\0\u5cb4\0\u5cf8\0\u5d3c\0\u5d80\0\u061c\0\u5dc4"+
    "\0\u5e08\0\u5e4c\0\u5e90\0\u0110\0\u5ed4\0\u5f18\0\u5f5c\0\u5fa0"+
    "\0\u0110\0\u5fe4\0\u0110\0\u6028\0\u606c\0\u60b0\0\u60f4\0\u6138"+
    "\0\u061c\0\u617c\0\u61c0\0\u6204\0\u0110\0\u0110\0\u0110\0\u6248"+
    "\0\u0110";

  private static int [] zzUnpackRowMap() {
    int [] result = new int[481];
    int offset = 0;
    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
    int i = 0;  /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length() - 1;
    while (i < l) {
      int high = packed.charAt(i++) << 16;
      result[j++] = high | packed.charAt(i++);
    }
    return j;
  }

  /**
   * The transition table of the DFA
   */
  private static final int [] ZZ_TRANS = zzUnpacktrans();

  private static final String ZZ_TRANS_PACKED_0 =
    "\1\5\2\6\1\7\1\10\1\11\1\12\1\13\1\14"+
    "\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24"+
    "\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+
    "\1\35\1\36\7\37\1\40\1\5\1\41\1\42\1\12"+
    "\1\43\1\44\1\45\1\46\1\47\1\50\1\51\1\37"+
    "\1\52\1\37\1\53\1\54\1\55\1\56\1\57\1\60"+
    "\1\61\1\62\1\63\1\64\1\65\1\66\2\37\1\67"+
    "\1\70\1\71\1\72\1\73\1\5\2\6\1\7\1\10"+
    "\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20"+
    "\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30"+
    "\1\31\1\32\1\33\1\34\1\35\1\36\7\37\1\40"+
    "\1\5\1\41\1\42\1\12\1\74\1\75\1\45\1\76"+
    "\1\77\1\50\1\51\1\37\1\100\1\37\1\53\1\54"+
    "\1\55\1\101\1\57\1\37\1\61\1\62\1\102\1\64"+
    "\1\65\1\103\2\37\1\67\1\70\1\71\1\72\1\73"+
    "\112\5\1\104\11\5\1\105\12\5\7\106\4\5\1\104"+
    "\30\106\5\5\105\0\2\6\121\0\1\107\6\0\1\110"+
    "\54\0\2\10\1\0\1\10\1\111\36\10\1\112\40\10"+
    "\2\11\1\0\101\11\33\0\7\37\5\0\30\37\34\0"+
    "\1\113\64\0\1\114\16\0\1\115\54\0\2\15\1\0"+
    "\6\15\1\116\31\15\1\117\40\15\27\0\1\120\71\0"+
    "\1\121\11\0\1\122\73\0\1\123\7\0\1\124\76\0"+
    "\2\125\57\0\1\125\14\0\1\126\4\0\1\127\5\0"+
    "\1\130\74\0\1\125\1\0\2\73\7\0\2\131\1\132"+
    "\3\131\1\133\5\0\4\131\1\132\21\131\1\133\1\131"+
    "\4\0\1\73\20\0\1\125\1\0\2\27\7\0\2\131"+
    "\1\132\4\131\5\0\4\131\1\132\23\131\4\0\1\73"+
    "\26\0\1\134\1\135\103\0\1\136\103\0\1\137\1\140"+
    "\75\0\2\37\7\0\7\37\4\0\31\37\4\0\1\37"+
    "\27\0\1\141\76\0\2\37\7\0\7\37\4\0\3\37"+
    "\1\142\3\37\1\143\13\37\1\144\1\145\4\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\16\37\1\146"+
    "\11\37\1\147\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\1\37\1\150\6\37\1\151\5\37\1\152\12\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\1\37"+
    "\1\153\3\37\1\154\3\37\1\155\4\37\1\156\5\37"+
    "\1\157\4\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\15\37\1\160\7\37\1\161\1\37\1\162\1\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\1\37"+
    "\1\163\11\37\1\164\2\37\1\165\2\37\1\166\2\37"+
    "\1\167\4\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\13\37\1\170\15\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\14\37\1\171\1\172\4\37\1\173"+
    "\6\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\16\37\1\174\12\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\1\37\1\175\3\37\1\176\10\37\1\177"+
    "\12\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\16\37\1\200\5\37\1\201\4\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\25\37\1\202\3\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\1\37\1\203"+
    "\27\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\24\37\1\204\4\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\5\37\1\205\16\37\1\206\4\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\1\37\1\207"+
    "\6\37\1\210\5\37\1\211\4\37\1\212\5\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\5\37\1\213"+
    "\2\37\1\214\1\215\7\37\1\216\7\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\15\37\1\217\1\37"+
    "\1\220\11\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\16\37\1\221\12\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\10\37\1\222\1\223\17\37\4\0"+
    "\1\37\27\0\1\224\50\0\1\225\23\0\1\125\1\0"+
    "\2\73\7\0\2\131\1\132\4\131\5\0\4\131\1\132"+
    "\23\131\4\0\1\73\22\0\2\37\7\0\7\37\4\0"+
    "\3\37\1\142\3\37\1\143\5\37\1\226\5\37\1\144"+
    "\1\145\4\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\16\37\1\146\2\37\1\227\6\37\1\147\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\1\37\1\153"+
    "\3\37\1\154\3\37\1\155\4\37\1\230\5\37\1\157"+
    "\4\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\15\37\1\231\7\37\1\161\1\37\1\162\1\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\6\37\1\232"+
    "\5\37\1\171\1\172\4\37\1\173\6\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\21\37\1\233\3\37"+
    "\1\202\3\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\5\37\1\213\2\37\1\234\1\215\7\37\1\216"+
    "\7\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\11\37\1\223\17\37\4\0\1\37\33\0\7\106\5\0"+
    "\30\106\27\0\2\106\7\0\7\106\4\0\31\106\4\0"+
    "\1\106\2\10\1\0\101\10\2\15\1\0\101\15\22\0"+
    "\2\125\11\0\1\235\15\0\1\235\27\0\1\125\14\126"+
    "\1\236\67\126\2\127\1\0\101\127\22\0\2\131\7\0"+
    "\7\131\5\0\30\131\4\0\1\131\15\0\1\237\1\0"+
    "\1\237\2\0\2\240\7\0\7\131\5\0\30\131\4\0"+
    "\1\240\22\0\2\241\7\0\3\241\4\131\5\0\6\241"+
    "\22\131\4\0\1\131\27\0\1\242\103\0\1\243\1\244"+
    "\75\0\2\37\7\0\7\37\4\0\3\37\1\245\17\37"+
    "\1\246\5\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\5\37\1\247\23\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\23\37\1\250\5\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\23\37\1\251\5\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\16\37"+
    "\1\252\12\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\23\37\1\253\5\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\13\37\1\254\15\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\1\37\1\255\27\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\13\37"+
    "\1\256\1\37\1\257\13\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\23\37\1\260\5\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\3\37\1\261\25\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\1\37"+
    "\1\262\27\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\24\37\1\263\4\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\21\37\1\264\7\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\1\37\1\265\2\37"+
    "\1\266\16\37\1\267\1\270\4\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\1\37\1\271\27\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\11\37\1\272"+
    "\11\37\1\273\5\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\13\37\1\274\15\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\16\37\1\275\12\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\21\37\1\276"+
    "\7\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\16\37\1\277\12\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\15\37\1\300\13\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\16\37\1\301\12\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\17\37\1\302"+
    "\11\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\11\37\1\303\10\37\1\304\1\305\5\37\4\0\1\37"+
    "\22\0\2\37\7\0\1\306\6\37\4\0\31\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\3\37\1\307"+
    "\11\37\1\310\13\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\23\37\1\311\5\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\14\37\1\312\14\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\4\37\1\313"+
    "\24\37\4\0\1\37\17\0\1\314\2\0\2\37\7\0"+
    "\7\37\4\0\23\37\1\315\5\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\13\37\1\316\15\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\5\37\1\317"+
    "\23\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\3\37\1\320\25\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\5\37\1\321\23\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\22\37\1\322\1\323\1\37"+
    "\1\324\3\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\13\37\1\325\15\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\13\37\1\326\15\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\16\37\1\327\12\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\24\37"+
    "\1\330\4\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\1\37\1\331\27\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\14\37\1\332\14\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\5\37\1\333\3\37"+
    "\1\334\17\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\14\37\1\335\14\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\24\37\1\336\4\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\11\37\1\337\17\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\4\37"+
    "\1\340\24\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\11\37\1\341\17\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\5\37\1\342\23\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\15\37\1\343\13\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\4\37"+
    "\1\344\24\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\5\37\1\345\23\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\1\37\1\265\2\37\1\346\16\37"+
    "\1\267\1\270\4\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\5\37\1\347\3\37\1\334\17\37\4\0"+
    "\1\37\15\0\1\237\1\0\1\237\2\0\2\350\57\0"+
    "\1\350\14\126\1\236\4\126\1\351\62\126\22\0\2\350"+
    "\57\0\1\350\22\0\2\240\7\0\7\131\5\0\30\131"+
    "\4\0\1\240\27\0\1\352\76\0\2\37\7\0\7\37"+
    "\4\0\24\37\1\353\4\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\11\37\1\354\17\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\15\37\1\355\13\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\21\37"+
    "\1\356\7\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\16\37\1\357\12\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\13\37\1\360\15\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\5\37\1\361\23\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\5\37"+
    "\1\362\23\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\21\37\1\363\7\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\13\37\1\364\15\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\23\37\1\365\5\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\5\37"+
    "\1\366\23\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\13\37\1\367\15\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\13\37\1\370\15\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\2\37\1\371\26\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\1\37"+
    "\1\372\27\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\2\37\1\373\26\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\21\37\1\374\7\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\14\37\1\375\14\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\13\37"+
    "\1\376\15\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\22\37\1\377\6\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\5\37\1\u0100\23\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\22\37\1\u0101\6\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\1\37"+
    "\1\u0102\27\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\1\37\1\u0103\27\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\14\37\1\u0104\14\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\3\37\1\u0105\25\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\2\37"+
    "\1\u0106\26\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\16\37\1\u0107\12\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\23\37\1\u0108\5\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\5\37\1\u0109\23\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\12\37"+
    "\1\u010a\16\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\7\37\1\u010b\21\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\3\37\1\u010c\25\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\2\37\1\u010d\26\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\11\37"+
    "\1\u010e\17\37\4\0\1\37\61\0\1\u010f\44\0\2\37"+
    "\7\0\7\37\4\0\13\37\1\u0110\15\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\21\37\1\u0111\7\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\12\37"+
    "\1\u0112\16\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\21\37\1\u0113\7\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\24\37\1\u0114\4\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\21\37\1\u0115\7\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\5\37"+
    "\1\u0116\23\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\5\37\1\u0117\23\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\11\37\1\u0118\17\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\21\37\1\u0119\7\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\15\37"+
    "\1\u011a\13\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\23\37\1\u011b\5\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\17\37\1\u011c\11\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\15\37\1\u011d\13\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\22\37"+
    "\1\u011e\6\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\5\37\1\u011f\23\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\5\37\1\u0120\23\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\23\37\1\u0121\5\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\1\37"+
    "\1\u0122\27\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\4\37\1\u0123\24\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\15\37\1\u0124\13\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\4\37\1\u0125\24\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\1\37"+
    "\1\u0126\27\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\15\37\1\u0127\13\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\14\37\1\u0128\14\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\16\37\1\u0129\6\37"+
    "\1\u012a\3\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\4\37\1\u012b\24\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\11\37\1\u012c\17\37\4\0\1\37"+
    "\17\0\1\u012d\2\0\2\37\7\0\7\37\4\0\31\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\5\37"+
    "\1\u012e\23\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\15\37\1\u012f\13\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\5\37\1\u0130\23\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\1\37\1\u0131\27\37"+
    "\4\0\1\37\17\0\1\u0132\2\0\2\37\7\0\7\37"+
    "\4\0\31\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\1\37\1\u0133\27\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\5\37\1\u0134\23\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\13\37\1\u0135\15\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\23\37"+
    "\1\u0136\5\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\13\37\1\u0137\15\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\30\37\1\u0138\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\23\37\1\u0139\5\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\15\37\1\u013a"+
    "\13\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\5\37\1\u013b\23\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\23\37\1\u013c\5\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\13\37\1\u013d\15\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\23\37\1\u013e"+
    "\5\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\1\37\1\u013f\27\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\21\37\1\u0140\7\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\21\37\1\u0141\7\37\4\0"+
    "\1\37\17\0\1\u0142\2\0\2\37\7\0\7\37\4\0"+
    "\31\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\10\37\1\u0143\20\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\5\37\1\u0144\23\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\6\37\1\u0145\22\37\4\0"+
    "\1\37\64\0\1\u0146\41\0\2\37\7\0\7\37\4\0"+
    "\1\37\1\u0147\27\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\30\37\1\u0148\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\13\37\1\u0149\15\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\1\37\1\u014a\27\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\21\37"+
    "\1\u014b\7\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\6\37\1\u014c\22\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\5\37\1\u014d\23\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\23\37\1\u014e\5\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\4\37"+
    "\1\u014f\24\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\11\37\1\u0150\17\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\13\37\1\u0151\15\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\21\37\1\u0152\7\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\23\37"+
    "\1\u0153\5\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\16\37\1\u0154\12\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\12\37\1\u0155\16\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\24\37\1\u0156\4\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\15\37"+
    "\1\u0157\13\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\1\37\1\u0158\27\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\1\37\1\u0159\27\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\2\37\1\u015a\26\37"+
    "\4\0\1\37\54\0\1\u015b\51\0\2\37\7\0\7\37"+
    "\4\0\1\37\1\u015c\27\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\4\37\1\u015d\24\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\3\37\1\u015e\25\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\11\37"+
    "\1\u015f\17\37\4\0\1\37\53\0\1\u0160\52\0\2\37"+
    "\7\0\7\37\4\0\21\37\1\u0161\7\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\3\37\1\u0162\25\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\5\37"+
    "\1\u0163\23\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\11\37\1\u0164\17\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\5\37\1\u0165\23\37\4\0\1\37"+
    "\17\0\1\u0166\2\0\2\37\7\0\7\37\4\0\31\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\22\37"+
    "\1\u0167\6\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\4\37\1\u0168\24\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\13\37\1\u0169\15\37\4\0\1\37"+
    "\22\0\2\37\7\0\7\37\4\0\11\37\1\u016a\17\37"+
    "\4\0\1\37\22\0\2\37\7\0\7\37\4\0\13\37"+
    "\1\u016b\15\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\23\37\1\u016c\5\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\23\37\1\u016d\5\37\4\0\1\37"+
    "\64\0\1\u016e\41\0\2\37\7\0\7\37\4\0\5\37"+
    "\1\u016f\23\37\4\0\1\37\22\0\2\37\7\0\7\37"+
    "\4\0\21\37\1\u0170\7\37\4\0\1\37\22\0\2\37"+
    "\7\0\7\37\4\0\30\37\1\u0171\4\0\1\37\64\0"+
    "\1\u0172\41\0\2\37\7\0\7\37\4\0\7\37\1\u0173"+
    "\21\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\23\37\1\u0174\5\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\3\37\1\u0175\25\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\22\37\1\u0176\6\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\13\37\1\u0177"+
    "\15\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\15\37\1\u0178\13\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\22\37\1\u0179\6\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\3\37\1\u017a\25\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\1\37\1\u017b"+
    "\27\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\5\37\1\u017c\23\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\26\37\1\u017d\2\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\13\37\1\u017e\15\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\23\37\1\u017f"+
    "\5\37\4\0\1\37\17\0\1\u0180\2\0\2\37\7\0"+
    "\7\37\4\0\31\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\24\37\1\u0181\4\37\4\0\1\37\64\0"+
    "\1\u0182\41\0\2\37\7\0\7\37\4\0\15\37\1\u0183"+
    "\13\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\1\37\1\u0184\27\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\23\37\1\u0185\5\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\15\37\1\u0186\13\37\4\0"+
    "\1\37\54\0\1\u0187\20\0\1\u0188\30\0\2\37\7\0"+
    "\7\37\4\0\5\37\1\u0189\23\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\23\37\1\u018a\5\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\16\37\1\u018b"+
    "\12\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\4\37\1\u018c\24\37\4\0\1\37\65\0\1\u018d\40\0"+
    "\2\37\7\0\7\37\4\0\22\37\1\u018e\6\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\16\37\1\u018f"+
    "\12\37\4\0\1\37\22\0\2\37\7\0\4\37\1\u0190"+
    "\2\37\4\0\31\37\4\0\1\37\63\0\1\u0191\42\0"+
    "\2\37\7\0\7\37\4\0\22\37\1\u0192\6\37\4\0"+
    "\1\37\22\0\2\37\7\0\5\37\1\u0193\1\37\4\0"+
    "\31\37\4\0\1\37\65\0\1\u0194\40\0\2\37\7\0"+
    "\7\37\4\0\5\37\1\u0195\23\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\23\37\1\u0196\5\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\5\37\1\u0197"+
    "\23\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\16\37\1\u0198\12\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\3\37\1\u0199\25\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\13\37\1\u019a\15\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\23\37\1\u019b"+
    "\5\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\1\37\1\u019c\27\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\11\37\1\u019d\17\37\4\0\1\37\55\0"+
    "\1\u019e\50\0\2\37\7\0\7\37\4\0\23\37\1\u019f"+
    "\5\37\4\0\1\37\51\0\1\u01a0\54\0\2\37\7\0"+
    "\7\37\4\0\21\37\1\u01a1\7\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\22\37\1\u01a2\6\37\4\0"+
    "\1\37\54\0\1\u01a3\114\0\1\u01a4\40\0\2\37\7\0"+
    "\7\37\4\0\15\37\1\u01a5\13\37\4\0\1\37\64\0"+
    "\1\u01a6\41\0\2\37\7\0\7\37\4\0\15\37\1\u01a7"+
    "\13\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\16\37\1\u01a8\12\37\4\0\1\37\17\0\1\u01a9\106\0"+
    "\2\37\7\0\7\37\4\0\6\37\1\u01aa\22\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\26\37\1\u01ab"+
    "\2\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\5\37\1\u01ac\23\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\11\37\1\u01ad\17\37\4\0\1\37\22\0"+
    "\2\37\7\0\7\37\4\0\5\37\1\u01ae\23\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\23\37\1\u01af"+
    "\5\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\16\37\1\u01b0\12\37\4\0\1\37\67\0\1\u01b1\36\0"+
    "\2\37\7\0\7\37\4\0\5\37\1\u01b2\23\37\4\0"+
    "\1\37\72\0\1\u01b3\33\0\2\37\7\0\7\37\4\0"+
    "\22\37\1\u01b4\6\37\4\0\1\37\53\0\1\u01b5\107\0"+
    "\1\u01b6\103\0\1\u01b7\46\0\2\37\7\0\7\37\4\0"+
    "\7\37\1\u01b8\21\37\4\0\1\37\47\0\1\u01b9\53\0"+
    "\1\u01ba\2\0\2\37\7\0\7\37\4\0\31\37\4\0"+
    "\1\37\22\0\2\37\7\0\7\37\4\0\12\37\1\u01bb"+
    "\16\37\4\0\1\37\22\0\2\37\7\0\7\37\4\0"+
    "\5\37\1\u01bc\23\37\4\0\1\37\22\0\2\37\7\0"+
    "\7\37\4\0\15\37\1\u01bd\13\37\4\0\1\37\64\0"+
    "\1\u01be\41\0\2\37\7\0\7\37\4\0\22\37\1\u01bf"+
    "\6\37\4\0\1\37\70\0\1\u01c0\64\0\1\u01c1\121\0"+
    "\1\u01c2\77\0\1\u01c3\42\0\2\37\7\0\7\37\4\0"+
    "\11\37\1\u01c4\17\37\4\0\1\37\51\0\1\u01c5\107\0"+
    "\1\u01c6\50\0\2\37\7\0\7\37\4\0\5\37\1\u01c7"+
    "\23\37\4\0\1\37\17\0\1\u01c8\2\0\2\37\7\0"+
    "\7\37\4\0\31\37\4\0\1\37\72\0\1\u01c9\102\0"+
    "\1\u01ca\65\0\1\u01cb\121\0\1\u01cc\34\0\2\37\7\0"+
    "\7\37\4\0\3\37\1\u01cd\25\37\4\0\1\37\71\0"+
    "\1\u01ce\101\0\1\u01cf\71\0\1\u01d0\113\0\1\u01d1\75\0"+
    "\1\u01d2\114\0\1\u01d3\35\0\2\37\7\0\7\37\4\0"+
    "\1\37\1\u01d4\27\37\4\0\1\37\57\0\1\u01d5\110\0"+
    "\1\u01d6\106\0\1\u01d7\107\0\1\u01d8\32\0\2\37\7\0"+
    "\7\37\4\0\13\37\1\u01d9\15\37\4\0\1\37\73\0"+
    "\1\u01da\102\0\1\u01db\75\0\1\u01dc\72\0\1\u01dd\103\0"+
    "\1\u01de\115\0\1\u01df\110\0\1\u01e0\76\0\1\u01e1\16\0";

  private static int [] zzUnpacktrans() {
    int [] result = new int[25228];
    int offset = 0;
    offset = zzUnpacktrans(ZZ_TRANS_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpacktrans(String packed, int offset, int [] result) {
    int i = 0;       /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      value--;
      do result[j++] = value; while (--count > 0);
    }
    return j;
  }


  /* error codes */
  private static final int ZZ_UNKNOWN_ERROR = 0;
  private static final int ZZ_NO_MATCH = 1;
  private static final int ZZ_PUSHBACK_2BIG = 2;

  /* error messages for the codes above */
  private static final String[] ZZ_ERROR_MSG = {
    "Unknown internal scanner error",
    "Error: could not match input",
    "Error: pushback value was too large"
  };

  /**
   * ZZ_ATTRIBUTE[aState] contains the attributes of state {@code aState}
   */
  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();

  private static final String ZZ_ATTRIBUTE_PACKED_0 =
    "\2\1\2\0\1\11\10\1\2\11\2\1\1\11\5\1"+
    "\2\11\3\1\2\11\1\1\2\11\25\1\1\11\1\1"+
    "\2\11\12\1\1\11\1\1\3\11\1\1\4\11\1\1"+
    "\5\11\3\1\1\11\3\1\1\0\3\11\1\0\1\11"+
    "\62\1\2\11\7\1\3\0\2\1\2\11\1\0\47\1"+
    "\1\0\34\1\2\11\44\1\1\0\35\1\1\0\4\1"+
    "\1\0\17\1\1\0\3\1\1\0\24\1\1\0\4\1"+
    "\1\0\5\1\1\0\7\1\1\0\3\1\1\0\15\1"+
    "\1\0\1\1\1\0\4\1\2\0\4\1\1\0\3\1"+
    "\1\0\2\1\1\11\11\1\1\0\1\1\1\0\2\1"+
    "\2\0\1\1\1\0\2\1\1\0\7\1\1\0\1\1"+
    "\1\0\1\1\3\0\1\1\2\0\3\1\1\0\1\1"+
    "\1\11\3\0\1\1\2\0\1\1\4\0\1\11\1\1"+
    "\3\0\1\11\1\0\1\11\1\1\4\0\1\1\3\0"+
    "\3\11\1\0\1\11";

  private static int [] zzUnpackAttribute() {
    int [] result = new int[481];
    int offset = 0;
    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
    int i = 0;       /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      do result[j++] = value; while (--count > 0);
    }
    return j;
  }

  /** the input device */
  private java.io.Reader zzReader;

  /** the current state of the DFA */
  private int zzState;

  /** the current lexical state */
  private int zzLexicalState = YYINITIAL;

  /** this buffer contains the current text to be matched and is
      the source of the yytext() string */
  private CharSequence zzBuffer = "";

  /** the textposition at the last accepting state */
  private int zzMarkedPos;

  /** the current text position in the buffer */
  private int zzCurrentPos;

  /** startRead marks the beginning of the yytext() string in the buffer */
  private int zzStartRead;

  /** endRead marks the last character in the buffer, that has been read
      from input */
  private int zzEndRead;

  /** zzAtEOF == true <=> the scanner is at the EOF */
  private boolean zzAtEOF;

  /** Number of newlines encountered up to the start of the matched text. */
  @SuppressWarnings("unused")
  private int yyline;

  /** Number of characters from the last newline up to the start of the matched text. */
  @SuppressWarnings("unused")
  protected int yycolumn;

  /** Number of characters up to the start of the matched text. */
  @SuppressWarnings("unused")
  private long yychar;

  /** Whether the scanner is currently at the beginning of a line. */
  @SuppressWarnings("unused")
  private boolean zzAtBOL = true;

  /** Whether the user-EOF-code has already been executed. */
  private boolean zzEOFDone;

  /* user code: */
  public _DroolsLexer() {
    this((java.io.Reader)null);
  }
  private final IntArrayList myStateStack = new IntArrayList();

  private void pushState(int newState) {
   myStateStack.add(yystate());
   yybegin(newState);
  }

  private void popState() {
   if (myStateStack.isEmpty()) return;
   int state = myStateStack.removeInt(myStateStack.size() - 1);
   yybegin(state);
  }

  protected void resetInternal() {
    myStateStack.clear();
  }


  /**
   * Creates a new scanner
   *
   * @param   in  the java.io.Reader to read input from.
   */
  public _DroolsLexer(java.io.Reader in) {
    this.zzReader = in;
  }


  /** Returns the maximum size of the scanner buffer, which limits the size of tokens. */
  private int zzMaxBufferLen() {
    return Integer.MAX_VALUE;
  }

  /**  Whether the scanner buffer can grow to accommodate a larger token. */
  private boolean zzCanGrow() {
    return true;
  }

  /**
   * Translates raw input code points to DFA table row
   */
  private static int zzCMap(int input) {
    int offset = input & 255;
    return offset == input ? ZZ_CMAP_BLOCKS[offset] : ZZ_CMAP_BLOCKS[ZZ_CMAP_TOP[input >> 8] | offset];
  }

  public final int getTokenStart() {
    return zzStartRead;
  }

  public final int getTokenEnd() {
    return getTokenStart() + yylength();
  }

  public void reset(CharSequence buffer, int start, int end, int initialState) {
    zzBuffer = buffer;
    zzCurrentPos = zzMarkedPos = zzStartRead = start;
    zzAtEOF  = false;
    zzAtBOL = true;
    zzEndRead = end;
    yybegin(initialState);
  }

  /**
   * Refills the input buffer.
   *
   * @return      {@code false}, iff there was new input.
   *
   * @exception   java.io.IOException  if any I/O-Error occurs
   */
  private boolean zzRefill() throws java.io.IOException {
    return true;
  }


  /**
   * Returns the current lexical state.
   */
  public final int yystate() {
    return zzLexicalState;
  }


  /**
   * Enters a new lexical state
   *
   * @param newState the new lexical state
   */
  public final void yybegin(int newState) {
    zzLexicalState = newState;
  }


  /**
   * Returns the text matched by the current regular expression.
   */
  public final CharSequence yytext() {
    return zzBuffer.subSequence(zzStartRead, zzMarkedPos);
  }


  /**
   * Returns the character at position {@code pos} from the
   * matched text.
   *
   * It is equivalent to yytext().charAt(pos), but faster
   *
   * @param pos the position of the character to fetch.
   *            A value from 0 to yylength()-1.
   *
   * @return the character at position pos
   */
  public final char yycharat(int pos) {
    return zzBuffer.charAt(zzStartRead+pos);
  }


  /**
   * Returns the length of the matched text region.
   */
  public final int yylength() {
    return zzMarkedPos-zzStartRead;
  }


  /**
   * Reports an error that occurred while scanning.
   *
   * In a wellformed scanner (no or only correct usage of
   * yypushback(int) and a match-all fallback rule) this method
   * will only be called with things that "Can't Possibly Happen".
   * If this method is called, something is seriously wrong
   * (e.g. a JFlex bug producing a faulty scanner etc.).
   *
   * Usual syntax/scanner level error handling should be done
   * in error fallback rules.
   *
   * @param   errorCode  the code of the errormessage to display
   */
  private void zzScanError(int errorCode) {
    String message;
    try {
      message = ZZ_ERROR_MSG[errorCode];
    }
    catch (ArrayIndexOutOfBoundsException e) {
      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
    }

    throw new Error(message);
  }


  /**
   * Pushes the specified amount of characters back into the input stream.
   *
   * They will be read again by then next call of the scanning method
   *
   * @param number  the number of characters to be read again.
   *                This number must not be greater than yylength()!
   */
  public void yypushback(int number)  {
    if ( number > yylength() )
      zzScanError(ZZ_PUSHBACK_2BIG);

    zzMarkedPos -= number;
  }


  /**
   * Contains user EOF-code, which will be executed exactly once,
   * when the end of file is reached
   */
  private void zzDoEOF() {
    if (!zzEOFDone) {
      zzEOFDone = true;
    
  resetInternal();
    }
  }


  /**
   * Resumes scanning until the next regular expression is matched,
   * the end of input is encountered or an I/O-Error occurs.
   *
   * @return      the next token
   * @exception   java.io.IOException  if any I/O-Error occurs
   */
  public IElementType advance() throws java.io.IOException
  {
    int zzInput;
    int zzAction;

    // cached fields:
    int zzCurrentPosL;
    int zzMarkedPosL;
    int zzEndReadL = zzEndRead;
    CharSequence zzBufferL = zzBuffer;

    int [] zzTransL = ZZ_TRANS;
    int [] zzRowMapL = ZZ_ROWMAP;
    int [] zzAttrL = ZZ_ATTRIBUTE;

    while (true) {
      zzMarkedPosL = zzMarkedPos;

      zzAction = -1;

      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;

      zzState = ZZ_LEXSTATE[zzLexicalState];

      // set up zzAction for empty match case:
      int zzAttributes = zzAttrL[zzState];
      if ( (zzAttributes & 1) == 1 ) {
        zzAction = zzState;
      }


      zzForAction: {
        while (true) {

          if (zzCurrentPosL < zzEndReadL) {
            zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL);
            zzCurrentPosL += Character.charCount(zzInput);
          }
          else if (zzAtEOF) {
            zzInput = YYEOF;
            break zzForAction;
          }
          else {
            // store back cached positions
            zzCurrentPos  = zzCurrentPosL;
            zzMarkedPos   = zzMarkedPosL;
            boolean eof = zzRefill();
            // get translated positions and possibly new buffer
            zzCurrentPosL  = zzCurrentPos;
            zzMarkedPosL   = zzMarkedPos;
            zzBufferL      = zzBuffer;
            zzEndReadL     = zzEndRead;
            if (eof) {
              zzInput = YYEOF;
              break zzForAction;
            }
            else {
              zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL);
              zzCurrentPosL += Character.charCount(zzInput);
            }
          }
          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMap(zzInput) ];
          if (zzNext == -1) break zzForAction;
          zzState = zzNext;

          zzAttributes = zzAttrL[zzState];
          if ( (zzAttributes & 1) == 1 ) {
            zzAction = zzState;
            zzMarkedPosL = zzCurrentPosL;
            if ( (zzAttributes & 8) == 8 ) break zzForAction;
          }

        }
      }

      // store back cached position
      zzMarkedPos = zzMarkedPosL;

      if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
        zzAtEOF = true;
            zzDoEOF();
        return null;
      }
      else {
        switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
          case 1:
            { return     STRING_IDENTIFIER ;
            }
          // fall through
          case 133: break;
          case 2:
            { if (myStateStack.isEmpty()) {
          return TokenType.BAD_CHARACTER;
        }

        yypushback(yylength());
        popState();
            }
          // fall through
          case 134: break;
          case 3:
            { return com.intellij.psi.TokenType.WHITE_SPACE;
            }
          // fall through
          case 135: break;
          case 4:
            { return       OP_NOT;
            }
          // fall through
          case 136: break;
          case 5:
            { return     STRING_TOKEN ;
            }
          // fall through
          case 137: break;
          case 6:
            { return     SINGLE_LINE_COMMENT_DEPR ;
            }
          // fall through
          case 138: break;
          case 7:
            { return       OP_REMAINDER;
            }
          // fall through
          case 139: break;
          case 8:
            { return       OP_BIT_AND;
            }
          // fall through
          case 140: break;
          case 9:
            { return     CHARACTER_LITERAL;
            }
          // fall through
          case 141: break;
          case 10:
            { return       LPAREN;
            }
          // fall through
          case 142: break;
          case 11:
            { return       RPAREN;
            }
          // fall through
          case 143: break;
          case 12:
            { return       OP_MUL;
            }
          // fall through
          case 144: break;
          case 13:
            { return       OP_PLUS;
            }
          // fall through
          case 145: break;
          case 14:
            { return       COMMA;
            }
          // fall through
          case 146: break;
          case 15:
            { return       OP_MINUS;
            }
          // fall through
          case 147: break;
          case 16:
            { return DOT;
            }
          // fall through
          case 148: break;
          case 17:
            { return       OP_DIV;
            }
          // fall through
          case 149: break;
          case 18:
            { return     INT_TOKEN ;
            }
          // fall through
          case 150: break;
          case 19:
            { return       COLON;
            }
          // fall through
          case 151: break;
          case 20:
            { return       SEMICOLON;
            }
          // fall through
          case 152: break;
          case 21:
            { return       OP_LESS;
            }
          // fall through
          case 153: break;
          case 22:
            { return       OP_ASSIGN;
            }
          // fall through
          case 154: break;
          case 23:
            { return       OP_GREATER;
            }
          // fall through
          case 155: break;
          case 24:
            { return       QUEST;
            }
          // fall through
          case 156: break;
          case 25:
            { return       OP_AT;
            }
          // fall through
          case 157: break;
          case 26:
            { pushState(FQN_STATE); return JAVA_IDENTIFIER ;
            }
          // fall through
          case 158: break;
          case 27:
            { return       LBRACKET;
            }
          // fall through
          case 159: break;
          case 28:
            { return       RBRACKET;
            }
          // fall through
          case 160: break;
          case 29:
            { return       OP_BIT_XOR;
            }
          // fall through
          case 161: break;
          case 30:
            { return       LBRACE;
            }
          // fall through
          case 162: break;
          case 31:
            { return       OP_BIT_OR;
            }
          // fall through
          case 163: break;
          case 32:
            { return       RBRACE;
            }
          // fall through
          case 164: break;
          case 33:
            { return       OP_COMPLEMENT;
            }
          // fall through
          case 165: break;
          case 34:
            { return JAVA_IDENTIFIER ;
            }
          // fall through
          case 166: break;
          case 35:
            { return       NULL_DOT;
            }
          // fall through
          case 167: break;
          case 36:
            { return       OP_NOT_EQ;
            }
          // fall through
          case 168: break;
          case 37:
            { return       OP_REMAINDER_ASSIGN;
            }
          // fall through
          case 169: break;
          case 38:
            { return       OP_COND_AND;
            }
          // fall through
          case 170: break;
          case 39:
            { return       OP_BIT_AND_ASSIGN;
            }
          // fall through
          case 171: break;
          case 40:
            { return       OP_MUL_ASSIGN;
            }
          // fall through
          case 172: break;
          case 41:
            { return       OP_PLUS_PLUS;
            }
          // fall through
          case 173: break;
          case 42:
            { return       OP_PLUS_ASSIGN;
            }
          // fall through
          case 174: break;
          case 43:
            { return       OP_MINUS_MINUS;
            }
          // fall through
          case 175: break;
          case 44:
            { return       OP_MINUS_ASSIGN;
            }
          // fall through
          case 176: break;
          case 45:
            { return     FLOAT_TOKEN ;
            }
          // fall through
          case 177: break;
          case 46:
            { return     MULTI_LINE_COMMENT ;
            }
          // fall through
          case 178: break;
          case 47:
            { return     SINGLE_LINE_COMMENT ;
            }
          // fall through
          case 179: break;
          case 48:
            { return       OP_DIV_ASSIGN;
            }
          // fall through
          case 180: break;
          case 49:
            { return       OP_LESS_OR_EQUAL;
            }
          // fall through
          case 181: break;
          case 50:
            { return       OP_EQ;
            }
          // fall through
          case 182: break;
          case 51:
            { return       OP_GREATER_OR_EQUAL;
            }
          // fall through
          case 183: break;
          case 52:
            { return       OP_BIT_XOR_ASSIGN;
            }
          // fall through
          case 184: break;
          case 53:
            { return      IN;
            }
          // fall through
          case 185: break;
          case 54:
            { return       OP_BIT_OR_ASSIGN;
            }
          // fall through
          case 186: break;
          case 55:
            { return       OP_COND_OR;
            }
          // fall through
          case 187: break;
          case 56:
            { return      DO;
            }
          // fall through
          case 188: break;
          case 57:
            { return      IF;
            }
          // fall through
          case 189: break;
          case 58:
            { return      OR;
            }
          // fall through
          case 190: break;
          case 59:
            { return       OP_SL_ASSIGN;
            }
          // fall through
          case 191: break;
          case 60:
            { return       OP_SR_ASSIGN;
            }
          // fall through
          case 192: break;
          case 61:
            { return      END;
            }
          // fall through
          case 193: break;
          case 62:
            { return       INT;
            }
          // fall through
          case 194: break;
          case 63:
            { return      IS_A;
            }
          // fall through
          case 195: break;
          case 64:
            { return      NOT;
            }
          // fall through
          case 196: break;
          case 65:
            { return      AND;
            }
          // fall through
          case 197: break;
          case 66:
            { yybegin(YYINITIAL); return END;
            }
          // fall through
          case 198: break;
          case 67:
            { return       OP_BSR_ASSIGN;
            }
          // fall through
          case 199: break;
          case 68:
            { return       BYTE;
            }
          // fall through
          case 200: break;
          case 69:
            { return       CHAR;
            }
          // fall through
          case 201: break;
          case 70:
            { return      ENUM;
            }
          // fall through
          case 202: break;
          case 71:
            { return      EVAL;
            }
          // fall through
          case 203: break;
          case 72:
            { return      FROM;
            }
          // fall through
          case 204: break;
          case 73:
            { return      INIT;
            }
          // fall through
          case 205: break;
          case 74:
            { return       LONG;
            }
          // fall through
          case 206: break;
          case 75:
            { return     NULL ;
            }
          // fall through
          case 207: break;
          case 76:
            { return      OVER;
            }
          // fall through
          case 208: break;
          case 77:
            { return      RULE;
            }
          // fall through
          case 209: break;
          case 78:
            { return      THEN;
            }
          // fall through
          case 210: break;
          case 79:
            { return      THIS;
            }
          // fall through
          case 211: break;
          case 80:
            { return     TRUE ;
            }
          // fall through
          case 212: break;
          case 81:
            { return      UNIT;
            }
          // fall through
          case 213: break;
          case 82:
            { return       VOID;
            }
          // fall through
          case 214: break;
          case 83:
            { { yybegin(LHS_STATE);  return WHEN;}
            }
          // fall through
          case 215: break;
          case 84:
            { yybegin(YYINITIAL); return THEN;
            }
          // fall through
          case 216: break;
          case 85:
            { return     FALSE ;
            }
          // fall through
          case 217: break;
          case 86:
            { return       FLOAT;
            }
          // fall through
          case 218: break;
          case 87:
            { { yybegin(QUERY_STATE);  return QUERY;}
            }
          // fall through
          case 219: break;
          case 88:
            { return       SHORT;
            }
          // fall through
          case 220: break;
          case 89:
            { return      TIMER;
            }
          // fall through
          case 221: break;
          case 90:
            { return      BREAK;
            }
          // fall through
          case 222: break;
          case 91:
            { return      ACTION;
            }
          // fall through
          case 223: break;
          case 92:
            { return       DOUBLE;
            }
          // fall through
          case 224: break;
          case 93:
            { return      EXISTS;
            }
          // fall through
          case 225: break;
          case 94:
            { return      FORALL;
            }
          // fall through
          case 226: break;
          case 95:
            { return      GLOBAL;
            }
          // fall through
          case 227: break;
          case 96:
            { return      IMPORT;
            }
          // fall through
          case 228: break;
          case 97:
            { return      INSERT;
            }
          // fall through
          case 229: break;
          case 98:
            { return      MODIFY;
            }
          // fall through
          case 230: break;
          case 99:
            { return      RESULT;
            }
          // fall through
          case 231: break;
          case 100:
            { return      STATIC;
            }
          // fall through
          case 232: break;
          case 101:
            { return      UPDATE;
            }
          // fall through
          case 233: break;
          case 102:
            { return      WINDOW;
            }
          // fall through
          case 234: break;
          case 103:
            { return       BOOLEAN;
            }
          // fall through
          case 235: break;
          case 104:
            { return      COLLECT;
            }
          // fall through
          case 236: break;
          case 105:
            { return      DECLARE;
            }
          // fall through
          case 237: break;
          case 106:
            { return      DIALECT;
            }
          // fall through
          case 238: break;
          case 107:
            { return      ENABLED;
            }
          // fall through
          case 239: break;
          case 108:
            { return      EXTENDS;
            }
          // fall through
          case 240: break;
          case 109:
            { return      MATCHES;
            }
          // fall through
          case 241: break;
          case 110:
            { return      NO_LOOP;
            }
          // fall through
          case 242: break;
          case 111:
            { return      PACKAGE;
            }
          // fall through
          case 243: break;
          case 112:
            { return      RETRACT;
            }
          // fall through
          case 244: break;
          case 113:
            { return      REVERSE;
            }
          // fall through
          case 245: break;
          case 114:
            { return      CONTAINS;
            }
          // fall through
          case 246: break;
          case 115:
            { return      DURATION;
            }
          // fall through
          case 247: break;
          case 116:
            { return      FUNCTION;
            }
          // fall through
          case 248: break;
          case 117:
            { return      MEMBEROF;
            }
          // fall through
          case 249: break;
          case 118:
            { return      SALIENCE;
            }
          // fall through
          case 250: break;
          case 119:
            { return      TEMPLATE;
            }
          // fall through
          case 251: break;
          case 120:
            { return      CALENDARS;
            }
          // fall through
          case 252: break;
          case 121:
            { return      ACCUMULATE;
            }
          // fall through
          case 253: break;
          case 122:
            { return      ATTRIBUTES;
            }
          // fall through
          case 254: break;
          case 123:
            { return      AUTO_FOCUS;
            }
          // fall through
          case 255: break;
          case 124:
            { return      SOUNDSLIKE;
            }
          // fall through
          case 256: break;
          case 125:
            { return      ENTRY_POINT;
            }
          // fall through
          case 257: break;
          case 126:
            { return      AGENDA_GROUP;
            }
          // fall through
          case 258: break;
          case 127:
            { return      DATE_EXPIRES;
            }
          // fall through
          case 259: break;
          case 128:
            { return      INSERT_LOGICAL;
            }
          // fall through
          case 260: break;
          case 129:
            { return     DATE_EFFECTIVE;
            }
          // fall through
          case 261: break;
          case 130:
            { return     LOCK_ON_ACTIVE;
            }
          // fall through
          case 262: break;
          case 131:
            { return      RULEFLOW_GROUP;
            }
          // fall through
          case 263: break;
          case 132:
            { return      ACTIVATION_GROUP;
            }
          // fall through
          case 264: break;
          default:
            zzScanError(ZZ_NO_MATCH);
          }
      }
    }
  }


}
