/* The following code was generated by JFlex 1.2.2 on 10/17/07 4:12 AM */

/*******************************************************************************
 * Copyright (c) 2004, 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.jst.jsp.core.internal.parser.internal;

import java.io.CharArrayReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jst.jsp.core.internal.Logger;
import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTokenizer;
import org.eclipse.wst.sse.core.internal.ltk.parser.TagMarker;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
import org.eclipse.wst.sse.core.internal.util.Debug;
import org.eclipse.wst.sse.core.utils.StringUtils;
import org.eclipse.wst.xml.core.internal.parser.ContextRegionContainer;
import org.eclipse.wst.xml.core.internal.parser.IntStack;


/**
 * This class is a scanner generated by 
 * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
 * on 10/17/07 4:12 AM from the specification file
 * <tt>file:/D:/eclipse.wtp/workspace/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex</tt>
 */
public class JSPTokenizer implements BlockTokenizer, DOMJSPRegionContexts {

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

  /** lexical states */
  final public static int ST_JSP_VBL_DQUOTES = 52;
  final public static int ST_JSP_VBL_SQUOTES = 51;
  final public static int ST_JSP_VBL_SQUOTES_END = 53;
  final public static int ST_XML_COMMENT_END = 4;
  final public static int ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE = 21;
  final public static int ST_JSP_EL_SQUOTES_END = 46;
  final public static int ST_JSP_EL_DQUOTES = 45;
  final public static int ST_JSP_EL = 43;
  final public static int ST_BLOCK_TAG_SCAN = 36;
  final public static int ST_JSP_EL_SQUOTES = 44;
  final public static int ST_DHTML_ATTRIBUTE_VALUE = 14;
  final public static int ST_XML_PI_ATTRIBUTE_NAME = 8;
  final public static int ST_DHTML_TAG_CLOSE = 15;
  final public static int ST_XML_ATTRIBUTE_VALUE_DQUOTED = 41;
  final public static int ST_DHTML_EQUALS = 13;
  final public static int ST_XML_PI_ATTRIBUTE_VALUE = 10;
  final public static int ST_XML_ATTRIBUTE_VALUE = 25;
  final public static int ST_JSP_VBL = 50;
  final public static int ST_JSP_SQUOTED_VBL = 56;
  final public static int ST_XML_ATTRIBUTE_VALUE_SQUOTED = 40;
  final public static int ST_XML_ATTRIBUTE_NAME = 23;
  final public static int ST_XML_EQUALS = 24;
  final public static int YYINITIAL = 0;
  final public static int ST_JSP_DIRECTIVE_ATTRIBUTE_NAME = 19;
  final public static int ST_JSP_CONTENT = 16;
  final public static int ST_XML_DOCTYPE_ID_SYSTEM = 31;
  final public static int ST_XML_ELEMENT_DECLARATION = 32;
  final public static int ST_XML_DECLARATION_CLOSE = 27;
  final public static int ST_JSP_DIRECTIVE_EQUALS = 20;
  final public static int ST_JSP_VBL_DQUOTES_END = 54;
  final public static int ST_JSP_DQUOTED_EL = 48;
  final public static int ST_XML_DOCTYPE_DECLARATION = 28;
  final public static int ST_CDATA_END = 2;
  final public static int ST_PI_WS = 6;
  final public static int ST_CDATA_TEXT = 1;
  final public static int ST_JSP_DIRECTIVE_NAME_WHITESPACE = 18;
  final public static int ST_XML_ELEMENT_DECLARATION_CONTENT = 33;
  final public static int ST_XML_ATTLIST_DECLARATION = 34;
  final public static int ST_JSP_EL_DQUOTES_END = 47;
  final public static int ST_JSP_SQUOTED_EL = 49;
  final public static int ST_JSP_COMMENT_END = 39;
  final public static int ST_XML_PI_EQUALS = 9;
  final public static int ST_XML_ATTLIST_DECLARATION_CONTENT = 35;
  final public static int ST_XML_DOCTYPE_ID_PUBLIC = 30;
  final public static int ST_JSP_DQUOTED_VBL = 55;
  final public static int ST_DHTML_ATTRIBUTE_NAME = 12;
  final public static int ST_ABORT_EMBEDDED = 42;
  final public static int ST_XML_DOCTYPE_EXTERNAL_ID = 29;
  final public static int ST_JSP_COMMENT = 38;
  final public static int ST_PI_CONTENT = 7;
  final public static int ST_BLOCK_TAG_INTERNAL_SCAN = 37;
  final public static int ST_PI = 5;
  final public static int ST_XML_DECLARATION = 26;
  final public static int ST_JSP_DIRECTIVE_NAME = 17;
  final public static int ST_XML_TAG_NAME = 22;
  final public static int ST_XML_PI_TAG_CLOSE = 11;
  final public static int ST_XML_COMMENT = 3;

  /** 
   * Translates characters to character classes
   */
  final private static String yycmap_packed = 
    "\11\0\1\5\1\26\2\0\1\17\22\0\1\17\1\25\1\12\1\65"+
    "\1\15\1\22\1\13\1\14\1\24\1\24\1\24\1\24\1\24\1\7"+
    "\1\6\1\3\12\20\1\11\1\72\1\1\1\51\1\2\1\4\1\21"+
    "\1\40\1\73\1\36\1\37\1\55\1\70\1\62\1\62\1\63\1\62"+
    "\1\62\1\33\1\31\1\64\1\52\1\54\1\62\1\67\1\66\1\41"+
    "\1\71\2\62\1\27\1\53\1\62\1\35\1\104\1\23\1\0\1\10"+
    "\1\0\1\57\1\103\1\74\1\60\1\43\1\70\1\75\1\106\1\46"+
    "\1\100\1\62\1\34\1\32\1\50\1\47\1\101\1\62\1\44\1\45"+
    "\1\56\1\102\1\42\1\62\1\30\1\61\1\62\1\16\1\0\1\105"+
    "\71\0\1\77\10\0\27\76\1\0\37\76\1\0\72\76\2\0\13\76"+
    "\2\0\10\76\1\0\65\76\1\0\104\76\11\0\44\76\3\0\2\76"+
    "\4\0\36\76\70\0\131\76\22\0\7\76\16\0\2\77\56\0\106\77"+
    "\32\0\2\77\44\0\1\76\1\77\3\76\1\0\1\76\1\0\24\76"+
    "\1\0\54\76\1\0\7\76\3\0\1\76\1\0\1\76\1\0\1\76"+
    "\1\0\1\76\1\0\22\76\15\0\14\76\1\0\102\76\1\0\14\76"+
    "\1\0\44\76\1\0\4\77\11\0\65\76\2\0\2\76\2\0\2\76"+
    "\3\0\34\76\2\0\10\76\2\0\2\76\67\0\46\76\2\0\1\76"+
    "\7\0\46\76\12\0\21\77\1\0\27\77\1\0\3\77\1\0\1\77"+
    "\1\0\2\77\1\0\1\77\13\0\33\76\5\0\3\76\56\0\32\76"+
    "\5\0\1\77\12\76\10\77\15\0\12\77\6\0\1\77\107\76\2\0"+
    "\5\76\1\0\17\76\1\0\4\76\1\0\1\76\17\77\2\76\2\77"+
    "\1\0\4\77\2\0\12\77\u0207\0\3\77\1\0\65\76\2\0\1\77"+
    "\1\76\20\77\3\0\4\77\3\0\12\76\2\77\2\0\12\77\21\0"+
    "\3\77\1\0\10\76\2\0\2\76\2\0\26\76\1\0\7\76\1\0"+
    "\1\76\3\0\4\76\2\0\1\77\1\0\7\77\2\0\2\77\2\0"+
    "\3\77\11\0\1\77\4\0\2\76\1\0\3\76\2\77\2\0\12\77"+
    "\2\76\20\0\1\77\2\0\6\76\4\0\2\76\2\0\26\76\1\0"+
    "\7\76\1\0\2\76\1\0\2\76\1\0\2\76\2\0\1\77\1\0"+
    "\5\77\4\0\2\77\2\0\3\77\13\0\4\76\1\0\1\76\7\0"+
    "\12\77\2\77\3\76\14\0\3\77\1\0\7\76\1\0\1\76\1\0"+
    "\3\76\1\0\26\76\1\0\7\76\1\0\2\76\1\0\5\76\2\0"+
    "\1\77\1\76\10\77\1\0\3\77\1\0\3\77\22\0\1\76\5\0"+
    "\12\77\21\0\3\77\1\0\10\76\2\0\2\76\2\0\26\76\1\0"+
    "\7\76\1\0\2\76\2\0\4\76\2\0\1\77\1\76\6\77\3\0"+
    "\2\77\2\0\3\77\10\0\2\77\4\0\2\76\1\0\3\76\4\0"+
    "\12\77\22\0\2\77\1\0\6\76\3\0\3\76\1\0\4\76\3\0"+
    "\2\76\1\0\1\76\1\0\2\76\3\0\2\76\3\0\3\76\3\0"+
    "\10\76\1\0\3\76\4\0\5\77\3\0\3\77\1\0\4\77\11\0"+
    "\1\77\17\0\11\77\21\0\3\77\1\0\10\76\1\0\3\76\1\0"+
    "\27\76\1\0\12\76\1\0\5\76\4\0\7\77\1\0\3\77\1\0"+
    "\4\77\7\0\2\77\11\0\2\76\4\0\12\77\22\0\2\77\1\0"+
    "\10\76\1\0\3\76\1\0\27\76\1\0\12\76\1\0\5\76\4\0"+
    "\7\77\1\0\3\77\1\0\4\77\7\0\2\77\7\0\1\76\1\0"+
    "\2\76\4\0\12\77\22\0\2\77\1\0\10\76\1\0\3\76\1\0"+
    "\27\76\1\0\20\76\4\0\6\77\2\0\3\77\1\0\4\77\11\0"+
    "\1\77\10\0\2\76\4\0\12\77\221\0\56\76\1\0\1\76\1\77"+
    "\2\76\7\77\5\0\6\76\1\77\10\77\1\0\12\77\47\0\2\76"+
    "\1\0\1\76\2\0\2\76\1\0\1\76\2\0\1\76\6\0\4\76"+
    "\1\0\7\76\1\0\3\76\1\0\1\76\1\0\1\76\2\0\2\76"+
    "\1\0\2\76\1\0\1\76\1\77\2\76\6\77\1\0\2\77\1\76"+
    "\2\0\5\76\1\0\1\77\1\0\6\77\2\0\12\77\76\0\2\77"+
    "\6\0\12\77\13\0\1\77\1\0\1\77\1\0\1\77\4\0\2\77"+
    "\10\76\1\0\41\76\7\0\24\77\1\0\6\77\4\0\6\77\1\0"+
    "\1\77\1\0\25\77\3\0\7\77\1\0\1\77\346\0\46\76\12\0"+
    "\47\76\11\0\1\76\1\0\2\76\1\0\3\76\1\0\1\76\1\0"+
    "\2\76\1\0\5\76\51\0\1\76\1\0\1\76\1\0\1\76\13\0"+
    "\1\76\1\0\1\76\1\0\1\76\3\0\2\76\3\0\1\76\5\0"+
    "\3\76\1\0\1\76\1\0\1\76\1\0\1\76\1\0\1\76\3\0"+
    "\2\76\3\0\2\76\1\0\1\76\50\0\1\76\11\0\1\76\2\0"+
    "\1\76\2\0\2\76\7\0\2\76\1\0\1\76\1\0\7\76\50\0"+
    "\1\76\4\0\1\76\10\0\1\76\u0c06\0\234\76\4\0\132\76\6\0"+
    "\26\76\2\0\6\76\2\0\46\76\2\0\6\76\2\0\10\76\1\0"+
    "\1\76\1\0\1\76\1\0\1\76\1\0\37\76\2\0\65\76\1\0"+
    "\7\76\1\0\1\76\3\0\3\76\1\0\7\76\3\0\4\76\2\0"+
    "\6\76\4\0\15\76\5\0\3\76\1\0\7\76\323\0\15\77\4\0"+
    "\1\77\104\0\1\76\3\0\2\76\2\0\1\76\121\0\3\76\u0e82\0"+
    "\1\77\1\0\1\76\31\0\11\76\6\77\1\0\5\77\13\0\124\76"+
    "\4\0\2\77\2\0\2\77\2\0\132\76\1\0\3\77\6\0\50\76"+
    "\u1cd3\0\u51a6\76\u0c5a\0\u2ba4\76\134\0\u0800\0\u1ffe\0\2\0";

  /** 
   * Translates characters to character classes
   */
  final private static char [] yycmap = yy_unpack_cmap(yycmap_packed);

  /** 
   * Translates a state to a row index in the transition table
   */
  final private static int yy_rowMap [] = { 
        0,    71,   142,   213,   284,   355,   426,   497,   568,   639, 
      710,   781,   852,   923,   994,  1065,  1136,  1207,  1278,  1349, 
     1420,  1491,  1562,  1633,  1704,  1775,  1846,  1917,  1988,  2059, 
     2130,  2201,  2272,  2343,  2414,  2485,  2556,  2627,  2698,  2769, 
     2840,  2911,  2982,  3053,  3124,  3195,  3266,  3337,  3408,  3479, 
     3550,  3621,  3692,  3763,  3834,  3905,  3976,  4047,  4118,  4189, 
     4260,  4331,  4402,  4473,  4544,  4473,  4544,  4615,  4473,  4473, 
     4544,  4686,  4757,  4828,  4899,  4970,  5041,  5112,  5183,  4473, 
     4544,  5254,  5325,  5396,  4473,  5467,  5467,  5538,  5609,  5680, 
     5254,  4473,  5751,  5822,  4473,  5893,  5964,  6035,  6106,  4473, 
     4544,  6177,  6248,  6319,  6390,  6461,  6532,  4473,  6603,  6603, 
     6674,  6745,  6816,  6887,  6958,  4473,  7029,  7100,  7171,  7242, 
     7313,  7384,  4473,  7455,  7526,  7597,  7668,  7739,  7810,  7881, 
     7952,  4473,  8023,  8094,  8165,  8236,  8307,  8378,  8449,  8520, 
     8520,  8591,  8662,  8733,  8804,  8804,  8875,  8946,  9017,  9088, 
     9088,  9159,  9230,  9301,  9372,  4473,  9443,  9443,  9514,  9585, 
     9656,  9727,  4473,  4473,  4544,  9798,  4473,  4544,  9869,  9940, 
    10011, 10082,  4473, 10153, 10224, 10295, 10366,  4473, 10437, 10508, 
    10579, 10650,  4473,  4473, 10721,  4473, 10792, 10863, 10792, 10934, 
    11005, 10934,  4473,  4473, 11076, 11147, 11218,  4473, 11289, 11360, 
    11431, 11502, 11573,  4473,  4473, 11644,  4473, 11715, 11786, 11715, 
    11857, 11928, 11857,  4473,  4473, 11999, 12070, 12141,  4473, 12212, 
    12283, 12354,  4473,  4473, 12425, 12496, 12567, 12638, 12709,  4473, 
    12780, 12851, 12922, 12993, 13064, 13135, 13206, 13277, 13348,  4473, 
    13419, 13490, 13561,  4473,  4473,  5467,  5609,  4473, 13632,  5680, 
    13703,  5751,  5893,  5964, 13774,  6035,  4473, 13845, 13916,  6106, 
    13987,  4473, 12496,  4473,  6603,  6674,  4473, 14058,  6745, 14129, 
     4473, 14200, 14271,  7455, 14342,  7668,  4473, 14413,  7739, 14484, 
    14555, 14626, 14697, 14768, 14839,  8236,  4473, 14910, 14981,  8520, 
     8591,  4473, 15052, 15123, 15194, 15265, 15336,  8733,  8520,  8804, 
     8875,  4473,  8946,  9017,  8804,  9088,  9159,  4473, 15407, 15478, 
    15549, 15620, 15691, 15762, 15833,  9443,  9514,  4473, 15904, 15975, 
    16046, 16117, 16188, 16259, 16330, 16401, 16472,  4473,  4473,  4473, 
    16543,  4473,  4473, 16614, 16685, 16756, 16827, 10792,  4473, 16898, 
    16969, 10934,  4473, 17040, 17111, 17182, 17253, 17324, 17395, 17466, 
    17537, 17608, 11502, 11715,  4473, 17679, 17750, 11857,  4473, 17821, 
    17892, 17963, 18034, 18105, 18176, 18247, 18318, 18389,  4473,  4473, 
     4473, 18460, 18531, 18602, 18673, 18744,  4473, 18815, 18886,  4473, 
     4473,  4473,  4473,  4473,  4899, 18957, 19028, 19099, 19170, 19241, 
    19312, 19383, 19312, 19454, 19525, 19454, 19596, 19667, 19738, 19809, 
    19880, 19951, 20022, 20022, 20093, 20164, 20164, 20235,  9301,  9301, 
    20306, 20377, 20448, 20448, 20519,  9656,  9656, 20590, 20661, 16756, 
    20732, 10579, 10579, 20803, 20874, 10792, 10792, 20945, 21016, 10934, 
    10934, 21087, 21158, 11076, 11076, 17324, 21229, 21300, 11289, 11289, 
    17537, 21371, 21442, 11502, 11502, 21513, 11715, 11715, 21584, 21655, 
    11857, 11857, 21726, 21797, 11999, 11999, 18105, 21868, 21939, 12212, 
    12212, 18318, 22010,  4473,  4473, 22081, 22152,  4473, 22223, 22294, 
    22365, 22436,  7455,  4473,  4473, 22507, 22578, 22649, 22720, 22791, 
    15265, 15620,  9301, 22862, 16117,  9656, 22933,  4473, 10579, 10792, 
    23004, 10934, 23075, 11076, 23146,  4473, 11289, 23217, 11502, 11715, 
    23288, 11857, 23359, 11999, 23430,  4473, 12212, 23501, 23572, 23643, 
    23714, 23785, 23856, 23927, 23998, 24069, 24140, 24211, 24282, 24353, 
    24424, 24495, 24566, 24637, 24708, 24779, 24850, 24921, 24992, 25063, 
     4899, 25134, 25205, 25276, 25347, 25418,  4473,  4473, 25489, 25560, 
    25631, 25702, 17324, 17537, 25773, 25844, 18105, 18318, 25915, 25986, 
    26057, 26128,  4473,  4473,  4473, 26199, 26270, 26341, 26412, 26483, 
    26554, 26625, 26696,  7171, 26767, 26838, 26909, 26980, 27051, 27122, 
    27193,  4473, 27264, 27335,  9301,  9656, 10792, 10934, 11715, 11857, 
    27406, 27477, 27548, 27619, 27690, 27761, 27832, 27903,  4899, 27974, 
    28045, 28116, 28187, 28258, 28329, 28400, 28471, 28542, 28613, 28684, 
    28755, 28826, 28897, 28968, 29039, 29110, 29181, 29252, 29323, 29394, 
    29465, 29536, 29607, 29678, 29749, 29820, 29891, 29962, 30033, 30104, 
    30175, 30246, 30317, 30388, 30459,  4473, 30530, 30601, 30672, 30743, 
     7171, 30814, 30885, 30956, 31027, 31098, 31169, 31240, 31311, 31382, 
    31453, 31524, 31595, 31666, 31737
  };

  /** 
   * The packed transition table of the DFA
   */
  final private static String yy_packed = 
    "\1\72\1\73\11\72\1\74\1\72\1\75\4\72\1\76"+
    "\42\72\1\77\21\72\1\100\1\101\105\100\1\102\1\103"+
    "\21\102\1\104\2\102\1\105\60\102\1\106\1\107\105\106"+
    "\1\102\1\103\5\102\1\110\16\102\1\105\61\102\1\103"+
    "\2\102\1\111\1\112\2\102\2\113\5\102\1\112\6\102"+
    "\1\112\1\114\1\115\4\113\1\102\10\113\1\116\2\113"+
    "\1\102\11\113\1\116\1\113\1\102\4\113\1\102\4\113"+
    "\1\102\4\113\2\102\1\113\1\102\1\103\2\102\1\111"+
    "\1\117\11\102\1\117\6\102\1\117\60\102\1\120\1\121"+
    "\2\120\1\122\21\120\1\105\60\120\1\102\1\103\2\102"+
    "\1\123\1\112\2\102\2\124\5\102\1\112\6\102\1\112"+
    "\6\124\1\102\13\124\1\102\13\124\1\102\4\124\1\102"+
    "\4\124\1\102\4\124\2\102\1\124\1\102\1\103\2\102"+
    "\1\123\1\112\2\102\2\124\5\102\1\112\6\102\1\112"+
    "\6\124\1\102\13\124\1\125\13\124\1\102\4\124\1\102"+
    "\4\124\1\102\4\124\2\102\1\124\1\126\1\103\1\102"+
    "\1\127\1\130\1\112\4\126\1\131\1\126\1\132\2\126"+
    "\1\112\6\126\1\112\60\126\1\102\1\103\2\102\1\133"+
    "\21\102\1\105\61\102\1\103\1\134\1\135\1\102\1\112"+
    "\2\102\2\136\5\102\1\112\6\102\1\112\6\136\1\102"+
    "\13\136\1\102\13\136\1\102\4\136\1\102\4\136\1\102"+
    "\4\136\2\102\1\136\1\102\1\103\1\134\1\135\1\102"+
    "\1\112\2\102\2\136\5\102\1\112\6\102\1\112\6\136"+
    "\1\102\13\136\1\137\13\136\1\102\4\136\1\102\4\136"+
    "\1\102\4\136\2\102\1\136\1\140\1\103\1\134\1\141"+
    "\1\140\1\112\4\140\1\142\1\140\1\143\2\140\1\112"+
    "\6\140\1\112\60\140\1\102\1\103\3\102\1\112\11\102"+
    "\1\112\6\102\1\112\60\102\1\144\1\145\20\144\1\146"+
    "\64\144\1\102\1\147\3\102\1\112\2\102\2\150\5\102"+
    "\1\112\2\102\1\151\3\102\1\112\6\150\1\102\13\150"+
    "\1\102\13\150\1\102\4\150\1\102\4\150\1\102\4\150"+
    "\2\102\1\150\1\102\1\147\3\102\1\152\11\102\1\152"+
    "\2\102\1\151\3\102\1\152\61\102\1\147\3\102\1\112"+
    "\2\102\2\153\5\102\1\112\2\102\1\151\3\102\1\112"+
    "\6\153\1\102\13\153\1\102\13\153\1\102\4\153\1\102"+
    "\4\153\1\102\4\153\2\102\1\153\1\102\1\147\3\102"+
    "\1\112\2\102\2\153\5\102\1\112\2\102\1\151\3\102"+
    "\1\112\6\153\1\102\13\153\1\154\13\153\1\102\4\153"+
    "\1\102\4\153\1\102\4\153\2\102\1\153\1\155\1\147"+
    "\1\102\1\156\1\155\1\112\4\155\1\157\1\155\1\160"+
    "\2\155\1\112\2\155\1\161\3\155\1\112\60\155\1\162"+
    "\1\163\1\164\1\165\4\162\2\166\15\162\6\167\1\162"+
    "\13\167\1\162\13\167\1\162\4\167\1\162\4\167\1\162"+
    "\1\170\3\167\2\162\1\167\1\102\1\171\1\164\1\165"+
    "\1\102\1\112\2\102\2\172\5\102\1\112\6\102\1\112"+
    "\6\172\1\102\13\172\1\102\13\172\1\102\4\172\1\102"+
    "\4\172\1\102\4\172\2\102\1\172\1\102\1\171\1\164"+
    "\1\165\1\102\1\112\2\102\2\172\5\102\1\112\6\102"+
    "\1\112\6\172\1\102\13\172\1\173\13\172\1\102\4\172"+
    "\1\102\4\172\1\102\4\172\2\102\1\172\1\174\1\175"+
    "\1\164\1\176\1\174\1\112\4\174\1\177\1\174\1\200"+
    "\1\201\1\174\1\112\6\174\1\112\36\174\1\202\21\174"+
    "\1\102\1\203\1\204\2\102\1\112\11\102\1\112\6\102"+
    "\1\112\10\102\1\205\1\206\2\102\1\207\11\102\1\207"+
    "\1\102\1\206\1\205\27\102\1\103\1\204\2\102\1\112"+
    "\11\102\1\112\6\102\1\112\6\102\1\210\52\102\1\103"+
    "\1\204\2\102\1\112\2\102\2\211\5\102\1\112\6\102"+
    "\1\112\6\211\1\210\13\211\1\102\13\211\1\102\4\211"+
    "\1\102\4\211\1\102\4\211\2\102\1\211\1\102\1\103"+
    "\1\204\2\102\1\112\11\102\1\112\6\102\1\112\6\102"+
    "\1\210\7\102\1\212\6\102\1\213\11\102\1\212\12\102"+
    "\1\213\5\102\1\214\1\103\1\204\1\215\1\214\1\112"+
    "\4\214\1\216\1\214\1\217\2\214\1\112\6\214\1\112"+
    "\6\214\1\220\51\214\1\221\1\103\1\204\1\222\1\221"+
    "\1\112\4\221\1\223\1\221\1\224\2\221\1\112\6\221"+
    "\1\112\6\221\1\225\51\221\1\226\1\103\1\204\1\227"+
    "\1\226\1\112\4\226\1\230\1\226\1\231\2\226\1\112"+
    "\6\226\1\112\60\226\1\232\1\233\1\234\104\232\1\235"+
    "\1\103\1\204\1\236\1\235\1\112\4\235\1\237\1\235"+
    "\1\240\2\235\1\112\6\235\1\112\60\235\1\241\1\242"+
    "\1\243\104\241\1\244\1\245\105\244\1\102\1\246\24\102"+
    "\1\105\60\102\1\247\1\250\105\247\1\102\1\103\5\102"+
    "\1\251\16\102\1\105\60\102\1\252\1\253\3\252\1\254"+
    "\6\252\1\255\1\256\1\252\1\254\6\252\1\254\36\252"+
    "\1\257\21\252\1\260\1\253\3\260\1\261\4\260\1\262"+
    "\2\260\1\263\1\260\1\261\6\260\1\261\36\260\1\264"+
    "\21\260\1\102\1\103\24\102\1\105\60\102\1\265\1\266"+
    "\10\265\1\267\1\265\1\270\1\271\67\265\1\272\1\265"+
    "\1\273\1\274\12\273\1\102\11\273\1\275\60\273\1\276"+
    "\1\277\10\276\1\102\13\276\1\300\60\276\1\102\1\103"+
    "\12\102\1\301\11\102\1\105\61\102\1\103\10\102\1\302"+
    "\13\102\1\105\60\102\1\303\1\304\10\303\1\262\71\303"+
    "\1\305\1\306\1\303\1\307\1\310\12\307\1\255\67\307"+
    "\1\311\1\306\1\307\1\312\1\313\10\312\1\314\1\312"+
    "\1\315\50\312\1\316\17\312\1\317\1\312\1\320\1\321"+
    "\12\320\1\102\11\320\1\322\60\320\1\323\1\324\10\323"+
    "\1\102\13\323\1\325\60\323\1\102\1\103\12\102\1\326"+
    "\11\102\1\105\61\102\1\103\10\102\1\327\13\102\1\105"+
    "\60\102\1\330\1\331\10\330\1\262\71\330\1\332\1\333"+
    "\1\330\1\334\1\335\12\334\1\255\67\334\1\336\1\333"+
    "\1\334\1\72\1\0\11\72\1\0\1\72\1\0\4\72"+
    "\1\0\42\72\1\0\21\72\3\0\1\337\1\340\15\0"+
    "\1\341\2\0\1\342\66\0\1\343\2\0\2\344\5\0"+
    "\1\343\6\0\1\343\6\344\1\0\13\344\1\0\13\344"+
    "\1\345\4\344\1\0\4\344\1\0\4\344\2\0\1\344"+
    "\1\346\1\0\11\346\1\0\1\346\1\347\1\350\3\346"+
    "\1\0\64\346\5\0\1\343\2\0\2\351\5\0\1\343"+
    "\6\0\1\343\6\351\1\0\13\351\1\0\13\351\1\0"+
    "\4\351\1\0\4\351\1\0\4\351\2\0\1\351\1\346"+
    "\1\0\11\346\1\0\2\346\1\352\3\346\1\0\42\346"+
    "\1\353\21\346\131\0\1\354\2\0\1\355\104\0\1\356"+
    "\72\0\1\357\101\0\1\360\111\0\1\112\11\0\1\112"+
    "\6\0\1\112\66\0\4\113\6\0\1\113\6\0\6\113"+
    "\1\0\13\113\1\0\13\113\1\0\4\113\1\0\11\113"+
    "\2\0\1\113\6\0\4\113\6\0\1\113\6\0\2\113"+
    "\2\361\2\113\1\0\13\113\1\0\13\113\1\0\4\113"+
    "\1\0\11\113\2\0\1\113\6\0\4\113\6\0\1\113"+
    "\6\0\2\113\1\361\1\362\2\113\1\0\13\113\1\0"+
    "\13\113\1\0\4\113\1\0\11\113\2\0\1\113\6\0"+
    "\4\113\6\0\1\113\6\0\2\113\2\363\2\113\1\0"+
    "\13\113\1\0\13\113\1\0\4\113\1\0\11\113\2\0"+
    "\1\113\5\0\1\117\11\0\1\117\6\0\1\117\62\0"+
    "\1\364\106\0\1\365\112\0\4\124\6\0\1\124\6\0"+
    "\6\124\1\0\13\124\1\0\13\124\1\0\4\124\1\0"+
    "\11\124\2\0\1\124\1\126\2\0\1\366\1\126\1\0"+
    "\4\126\1\0\1\126\1\0\2\126\1\0\6\126\1\0"+
    "\61\126\1\0\1\365\1\366\1\126\1\0\4\126\1\0"+
    "\1\126\1\0\2\126\1\0\6\126\1\0\60\126\1\367"+
    "\1\0\10\367\1\370\2\367\1\371\47\367\1\371\21\367"+
    "\1\372\1\0\12\372\1\370\1\373\47\372\1\373\21\372"+
    "\2\0\1\134\1\374\111\0\4\136\6\0\1\136\6\0"+
    "\6\136\1\0\13\136\1\0\13\136\1\0\4\136\1\0"+
    "\11\136\2\0\1\136\1\140\2\0\1\375\1\140\1\0"+
    "\4\140\1\0\1\140\1\0\2\140\1\0\6\140\1\0"+
    "\61\140\1\0\1\134\1\376\1\140\1\0\4\140\1\0"+
    "\1\140\1\0\2\140\1\0\6\140\1\0\60\140\1\142"+
    "\1\0\1\377\1\u0100\1\142\1\377\4\142\1\u0101\1\142"+
    "\1\377\1\u0102\1\142\1\377\6\142\1\377\36\142\1\u0102"+
    "\21\142\1\143\1\0\1\u0103\1\u0104\1\143\1\u0103\4\143"+
    "\1\u0103\1\143\1\u0101\1\u0105\1\143\1\u0103\6\143\1\u0103"+
    "\36\143\1\u0105\21\143\2\0\1\u0106\126\0\1\354\2\0"+
    "\1\u0107\67\0\4\150\6\0\1\150\6\0\6\150\1\0"+
    "\13\150\1\0\13\150\1\0\4\150\1\0\11\150\2\0"+
    "\1\150\2\0\1\u0108\111\0\1\152\11\0\1\152\6\0"+
    "\1\152\66\0\4\153\6\0\1\153\6\0\6\153\1\0"+
    "\13\153\1\0\13\153\1\0\4\153\1\0\11\153\2\0"+
    "\1\153\1\155\2\0\1\u0109\1\155\1\0\4\155\1\0"+
    "\1\155\1\0\2\155\1\0\6\155\1\0\60\155\1\u010a"+
    "\1\0\10\u010a\1\u010b\2\u010a\1\u010c\47\u010a\1\u010c\21\u010a"+
    "\1\u010d\1\0\12\u010d\1\u010b\1\u010e\47\u010d\1\u010e\21\u010d"+
    "\1\155\1\0\1\u0108\1\u0109\1\155\1\0\4\155\1\0"+
    "\1\155\1\0\2\155\1\0\6\155\1\0\60\155\1\162"+
    "\3\0\23\162\6\0\1\162\13\0\1\162\13\0\1\162"+
    "\4\0\1\162\4\0\1\162\4\0\2\162\4\0\1\337"+
    "\16\0\1\354\2\0\1\342\63\0\1\u010f\104\0\1\162"+
    "\3\0\2\162\4\166\6\162\1\166\6\162\6\167\1\162"+
    "\13\167\1\162\13\167\1\162\4\167\1\162\4\167\1\166"+
    "\4\167\2\162\1\167\6\0\4\167\6\0\1\167\6\0"+
    "\6\167\1\0\13\167\1\0\13\167\1\0\4\167\1\0"+
    "\11\167\2\0\1\167\6\0\4\167\6\0\1\167\6\0"+
    "\6\167\1\0\7\167\1\u0110\3\167\1\0\13\167\1\0"+
    "\4\167\1\0\11\167\2\0\1\167\3\0\1\337\4\0"+
    "\2\u0111\10\0\1\354\2\0\1\342\1\0\6\u0111\1\0"+
    "\13\u0111\1\0\13\u0111\1\0\4\u0111\1\0\4\u0111\1\0"+
    "\4\u0111\2\0\1\u0111\6\0\4\172\6\0\1\172\6\0"+
    "\6\172\1\0\13\172\1\0\13\172\1\0\4\172\1\0"+
    "\11\172\2\0\1\172\1\174\2\0\1\u0112\1\174\1\0"+
    "\4\174\1\0\1\174\1\0\2\174\1\0\6\174\1\0"+
    "\60\174\3\0\1\337\4\0\2\u0113\10\0\1\354\2\0"+
    "\1\342\1\0\6\u0113\1\0\13\u0113\1\0\13\u0113\1\0"+
    "\4\u0113\1\0\4\u0113\1\0\4\u0113\2\0\1\u0113\1\174"+
    "\1\0\1\u010f\1\u0112\1\174\1\0\4\174\1\0\1\174"+
    "\1\0\2\174\1\0\6\174\1\0\60\174\1\u0114\1\0"+
    "\10\u0114\1\u0115\2\u0114\1\u0116\47\u0114\1\u0116\21\u0114\1\u0117"+
    "\1\0\12\u0117\1\u0115\1\u0118\47\u0117\1\u0118\21\u0117\1\174"+
    "\2\0\1\u0112\1\174\1\0\4\174\1\0\1\174\1\0"+
    "\1\174\1\u0119\1\0\6\174\1\0\61\174\2\0\1\u0112"+
    "\1\174\1\0\4\174\1\0\1\174\1\0\1\174\1\u011a"+
    "\1\0\6\174\1\0\60\174\3\0\1\337\16\0\1\354"+
    "\2\0\1\u0107\130\0\1\u011b\2\0\1\u011b\75\0\1\u011c"+
    "\14\0\1\u011c\63\0\2\u011d\52\0\23\u011e\1\u011f\63\u011e"+
    "\6\0\4\211\6\0\1\211\6\0\6\211\1\0\13\211"+
    "\1\0\13\211\1\0\4\211\1\0\11\211\2\0\1\211"+
    "\53\0\1\u0120\5\0\1\u0120\116\0\1\u0121\10\0\1\u0121"+
    "\4\0\1\214\2\0\1\u0122\1\214\1\0\4\214\1\0"+
    "\1\214\1\0\2\214\1\0\6\214\1\0\60\214\1\u0123"+
    "\1\0\10\u0123\1\u0124\2\u0123\1\u0125\47\u0123\1\u0125\21\u0123"+
    "\1\u0126\1\0\1\u0126\2\u0127\1\u0126\4\u0127\2\u0126\1\u0128"+
    "\1\u0129\1\u0126\4\u0127\1\u0126\11\u0127\1\u0126\27\u0127\1\u0129"+
    "\10\u0127\2\u0126\4\u0127\2\u0126\1\u0127\1\220\2\u011e\1\u012a"+
    "\1\220\1\u011e\4\220\1\u011e\1\220\1\u011e\2\220\1\u011e"+
    "\3\220\1\u012b\2\220\1\u011e\60\220\1\221\2\0\1\u012c"+
    "\1\221\1\0\4\221\1\0\1\221\1\0\2\221\1\0"+
    "\6\221\1\0\60\221\12\u012d\1\u012e\74\u012d\14\u012f\1\u012e"+
    "\72\u012f\1\225\2\u011e\1\u0130\1\225\1\u011e\4\225\1\u011e"+
    "\1\225\1\u011e\2\225\1\u011e\3\225\1\u0131\2\225\1\u011e"+
    "\60\225\1\226\2\0\1\u0132\1\226\1\0\4\226\1\0"+
    "\1\226\1\0\2\226\1\0\6\226\1\0\60\226\1\u0133"+
    "\1\0\10\u0133\1\u0134\2\u0133\1\u0135\47\u0133\1\u0135\21\u0133"+
    "\1\u0136\1\0\1\u0136\2\u0137\1\u0136\4\u0137\2\u0136\1\u0138"+
    "\1\u0139\1\u0136\4\u0137\1\u0136\11\u0137\1\u0136\27\u0137\1\u0139"+
    "\10\u0137\2\u0136\4\u0137\2\u0136\1\u0137\2\232\1\0\106\232"+
    "\1\0\17\232\1\u013a\2\232\1\u013b\61\232\1\235\2\0"+
    "\1\u013c\1\235\1\0\4\235\1\0\1\235\1\0\2\235"+
    "\1\0\6\235\1\0\60\235\1\u013d\1\0\10\u013d\1\u013e"+
    "\2\u013d\1\u013f\47\u013d\1\u013f\21\u013d\1\u0140\1\0\1\u0140"+
    "\2\u0141\1\u0140\4\u0141\2\u0140\1\u0142\1\u0143\1\u0140\4\u0141"+
    "\1\u0140\11\u0141\1\u0140\27\u0141\1\u0143\10\u0141\2\u0140\4\u0141"+
    "\2\u0140\1\u0141\2\241\1\0\106\241\1\0\17\241\1\u0144"+
    "\2\241\1\u0145\61\241\22\0\1\341\2\0\1\355\70\0"+
    "\1\u0146\77\0\1\252\1\0\12\252\1\0\1\u0147\47\252"+
    "\1\u0147\21\252\3\0\1\u0148\16\0\1\354\2\0\1\355"+
    "\61\0\1\252\1\0\3\252\1\254\6\252\1\0\1\u0147"+
    "\1\252\1\254\6\252\1\254\36\252\1\u0147\37\252\1\u0149"+
    "\106\252\1\u014a\70\252\1\260\1\0\10\260\1\0\2\260"+
    "\1\u014b\47\260\1\u014b\22\260\1\0\3\260\1\261\4\260"+
    "\1\0\2\260\1\u014b\1\260\1\261\6\260\1\261\36\260"+
    "\1\u014b\37\260\1\u014c\106\260\1\u014d\70\260\12\265\1\0"+
    "\1\265\1\0\1\u014e\67\265\1\0\13\265\1\0\1\265"+
    "\1\0\1\u014e\4\265\1\u014f\62\265\1\0\13\265\1\0"+
    "\1\265\1\0\1\265\1\u0150\66\265\1\u0151\1\265\14\u0152"+
    "\1\u0153\106\u0152\1\u0153\5\u0152\1\u0154\2\u0152\1\u0155\61\u0152"+
    "\12\u0156\1\u0157\106\u0156\1\u0157\7\u0156\1\u0158\2\u0156\1\u0159"+
    "\61\u0156\12\303\1\0\71\303\1\u015a\1\0\13\303\1\0"+
    "\7\303\1\u015b\61\303\1\u015a\1\0\13\303\1\u015c\74\303"+
    "\14\307\1\0\67\307\1\u015d\1\0\15\307\1\0\5\307"+
    "\1\u015e\61\307\1\u015d\1\0\15\307\1\u015f\72\307\12\312"+
    "\1\0\1\312\1\0\70\312\1\0\13\312\1\0\1\312"+
    "\1\0\5\312\1\u0160\62\312\1\0\13\312\1\0\1\312"+
    "\1\0\1\312\1\u0161\66\312\1\0\1\312\14\u0162\1\u0163"+
    "\106\u0162\1\u0163\5\u0162\1\u0164\2\u0162\1\u0165\61\u0162\12\u0166"+
    "\1\u0167\106\u0166\1\u0167\7\u0166\1\u0168\2\u0166\1\u0169\61\u0166"+
    "\12\330\1\0\71\330\1\u016a\1\0\13\330\1\0\7\330"+
    "\1\u016b\61\330\1\u016a\1\0\13\330\1\u016c\74\330\14\334"+
    "\1\0\67\334\1\u016d\1\0\15\334\1\0\5\334\1\u016e"+
    "\61\334\1\u016d\1\0\15\334\1\u016f\72\334\7\0\1\u0170"+
    "\11\0\1\u0171\3\0\1\u0172\23\0\1\u0173\44\0\1\u0174"+
    "\25\0\1\u0175\56\0\1\343\2\0\2\u0176\5\0\1\343"+
    "\6\0\1\343\6\u0176\1\0\13\u0176\1\0\13\u0176\1\0"+
    "\4\u0176\1\0\4\u0176\1\0\4\u0176\2\0\1\u0176\1\u0177"+
    "\1\0\3\u0177\1\u0178\4\344\1\u0177\1\0\3\u0177\1\u0178"+
    "\1\344\1\u0177\1\0\3\u0177\1\u0178\6\344\1\u0177\13\344"+
    "\1\u0177\13\344\1\u0177\4\344\1\u0179\11\344\2\u0177\1\344"+
    "\20\0\1\u017a\7\0\1\u017b\73\0\1\347\71\0\105\350"+
    "\1\u017c\1\350\1\u0177\1\0\3\u0177\1\u0178\4\351\1\u0177"+
    "\1\0\3\u0177\1\u0178\1\351\1\u0177\1\0\3\u0177\1\u0178"+
    "\6\351\1\u0177\13\351\1\u0177\13\351\1\u0177\4\351\1\u017d"+
    "\11\351\2\u0177\1\351\105\352\1\u017e\1\352\65\0\1\353"+
    "\30\0\1\u0170\15\0\1\u0172\23\0\1\u0173\72\0\1\u0175"+
    "\53\0\1\u017f\106\0\1\u0180\112\0\4\113\6\0\1\113"+
    "\6\0\4\113\2\u0181\1\0\13\113\1\0\13\113\1\0"+
    "\4\113\1\0\11\113\2\0\1\113\6\0\4\113\6\0"+
    "\1\113\6\0\4\113\1\u0181\1\u0182\1\0\13\113\1\0"+
    "\13\113\1\0\4\113\1\0\11\113\2\0\1\113\6\0"+
    "\4\113\6\0\1\113\6\0\6\113\1\0\13\113\1\0"+
    "\2\113\1\u0183\10\113\1\0\4\113\1\0\6\113\1\u0183"+
    "\2\113\2\0\1\113\12\367\1\370\3\367\1\0\70\367"+
    "\14\372\1\370\1\372\1\0\70\372\1\377\1\0\10\377"+
    "\1\u0101\2\377\1\u0184\47\377\1\u0184\21\377\1\142\2\377"+
    "\1\u0100\1\142\1\377\4\142\1\u0101\1\142\1\377\1\142"+
    "\1\140\1\377\6\142\1\377\60\142\1\u0103\1\0\12\u0103"+
    "\1\u0101\1\u0185\47\u0103\1\u0185\21\u0103\1\143\2\u0103\1\u0104"+
    "\1\143\1\u0103\4\143\1\u0103\1\143\1\u0101\1\143\1\140"+
    "\1\u0103\6\143\1\u0103\60\143\12\u010a\1\u010b\3\u010a\1\0"+
    "\70\u010a\14\u010d\1\u010b\1\u010d\1\0\70\u010d\6\0\4\167"+
    "\6\0\1\167\6\0\6\167\1\0\13\167\1\0\13\167"+
    "\1\0\4\167\1\0\6\167\1\u0186\2\167\2\0\1\167"+
    "\6\0\4\u0111\6\0\1\u0111\6\0\6\u0111\1\0\13\u0111"+
    "\1\0\13\u0111\1\0\4\u0111\1\0\11\u0111\2\0\1\u0111"+
    "\6\0\4\u0113\6\0\1\u0113\6\0\6\u0113\1\0\13\u0113"+
    "\1\0\13\u0113\1\0\4\u0113\1\0\11\u0113\2\0\1\u0113"+
    "\12\u0114\1\u0115\3\u0114\1\0\70\u0114\14\u0117\1\u0115\1\u0117"+
    "\1\0\70\u0117\1\u0187\2\u0188\1\u0189\1\u0187\1\u0188\4\u0187"+
    "\1\u0188\1\u0187\1\u0188\2\u0187\1\u0188\6\u0187\1\u0188\56\u0187"+
    "\1\174\1\u0187\1\u018a\2\u018b\1\u018c\1\u018a\1\u018b\4\u018a"+
    "\1\u018b\1\u018a\1\u018b\2\u018a\1\u018b\6\u018a\1\u018b\56\u018a"+
    "\1\174\1\u018a\36\0\1\u018d\35\0\1\u018d\53\0\1\u018e"+
    "\14\0\1\u018e\73\0\1\u018f\11\0\1\u018f\76\0\1\u0190"+
    "\20\0\1\u0190\113\0\1\u0191\7\0\1\u0191\3\0\12\u0123"+
    "\1\u0124\3\u0123\1\0\70\u0123\1\u0126\1\0\12\u0126\1\u0124"+
    "\1\u0192\47\u0126\1\u0192\22\u0126\1\0\12\u0126\1\u0193\1\u0192"+
    "\47\u0126\1\u0192\21\u0126\14\0\1\u0194\72\0\14\u0126\1\u0193"+
    "\1\u0126\1\0\70\u0126\12\u0133\1\u0134\3\u0133\1\0\70\u0133"+
    "\1\u0136\1\0\12\u0136\1\u0134\1\u0195\47\u0136\1\u0195\22\u0136"+
    "\1\0\12\u0136\1\u0196\1\u0195\47\u0136\1\u0195\21\u0136\14\0"+
    "\1\u0197\72\0\14\u0136\1\u0196\1\u0136\1\0\70\u0136\2\232"+
    "\1\0\4\232\1\u0198\15\232\1\u0199\23\232\1\u019a\37\232"+
    "\1\0\32\232\1\u019b\51\232\12\u013d\1\u013e\3\u013d\1\0"+
    "\70\u013d\1\u0140\1\0\12\u0140\1\u013e\1\u019c\47\u0140\1\u019c"+
    "\22\u0140\1\0\12\u0140\1\u019d\1\u019c\47\u0140\1\u019c\21\u0140"+
    "\14\0\1\u019e\72\0\14\u0140\1\u019d\1\u0140\1\0\70\u0140"+
    "\2\241\1\0\4\241\1\u019f\15\241\1\u01a0\23\241\1\u01a1"+
    "\37\241\1\0\32\241\1\u01a2\51\241\22\0\1\u01a3\64\0"+
    "\16\252\1\0\70\252\16\260\1\0\70\260\12\265\1\0"+
    "\1\265\1\0\1\265\1\u01a4\66\265\1\u0151\10\265\1\u01a5"+
    "\2\265\1\0\1\265\1\0\1\u014e\7\265\1\u01a6\23\265"+
    "\1\u01a7\33\265\1\0\1\265\12\u01a4\1\0\1\u01a4\1\0"+
    "\70\u01a4\1\0\1\u01a4\12\u0151\1\0\1\u0151\1\0\1\u01a8"+
    "\67\u0151\1\0\1\u0151\7\u0152\1\u01a9\4\u0152\1\u0153\10\u0152"+
    "\1\u01aa\23\u0152\1\u01ab\51\u0152\1\u0153\20\u0152\1\u01ac\51\u0152"+
    "\7\u0156\1\u01ad\2\u0156\1\u0157\12\u0156\1\u01ae\23\u0156\1\u01af"+
    "\47\u0156\1\u0157\22\u0156\1\u01b0\51\u0156\12\303\1\0\103\303"+
    "\1\u01b1\2\303\1\0\12\303\1\u01b2\23\303\1\u01b3\32\303"+
    "\1\u015a\1\0\1\303\104\u01b4\1\u01b5\2\u01b4\14\307\1\0"+
    "\101\307\1\u01b6\4\307\1\0\10\307\1\u01b7\23\307\1\u01b8"+
    "\32\307\1\u015d\1\0\1\307\104\u01b9\1\u01ba\2\u01b9\7\312"+
    "\1\u01bb\2\312\1\0\1\312\1\0\10\312\1\u01bc\23\312"+
    "\1\u01bd\33\312\1\0\1\312\7\u0162\1\u01be\4\u0162\1\u0163"+
    "\10\u0162\1\u01bf\23\u0162\1\u01c0\51\u0162\1\u0163\20\u0162\1\u01c1"+
    "\51\u0162\7\u0166\1\u01c2\2\u0166\1\u0167\12\u0166\1\u01c3\23\u0166"+
    "\1\u01c4\47\u0166\1\u0167\22\u0166\1\u01c5\51\u0166\12\330\1\0"+
    "\103\330\1\u01c6\2\330\1\0\12\330\1\u01c7\23\330\1\u01c8"+
    "\32\330\1\u016a\1\0\1\330\104\u01c9\1\u01ca\2\u01c9\14\334"+
    "\1\0\101\334\1\u01cb\4\334\1\0\10\334\1\u01cc\23\334"+
    "\1\u01cd\32\334\1\u016d\1\0\1\334\104\u01ce\1\u01cf\2\u01ce"+
    "\7\0\1\u01d0\106\0\1\u01d1\135\0\1\u01d2\50\0\1\u0176"+
    "\1\0\11\u0176\1\0\6\u0176\1\0\64\u0176\1\u0177\1\0"+
    "\11\u0177\1\0\6\u0177\1\0\47\u0177\1\0\15\u0177\1\0"+
    "\3\u0177\1\u0178\5\u0177\1\0\3\u0177\1\u0178\2\u0177\1\0"+
    "\3\u0177\1\u0178\43\u0177\1\u01d3\14\u0177\20\0\1\u017a\51\0"+
    "\1\u01d4\34\0\1\u01d5\15\0\3\u01d5\2\0\1\u01d5\11\0"+
    "\1\u01d5\1\0\2\u01d5\7\0\1\u01d5\2\0\2\u01d5\6\0"+
    "\1\u01d5\11\0\1\113\1\u01d6\2\113\6\0\1\113\6\0"+
    "\6\113\1\0\13\113\1\0\13\113\1\0\4\113\1\0"+
    "\11\113\2\0\1\113\6\0\4\113\6\0\1\113\6\0"+
    "\6\113\1\0\11\113\1\u01d7\1\113\1\0\1\u01d7\12\113"+
    "\1\0\4\113\1\0\11\113\2\0\1\113\12\377\1\u0101"+
    "\3\377\1\0\70\377\14\u0103\1\u0101\1\u0103\1\0\70\u0103"+
    "\6\0\3\167\1\u01d8\6\0\1\167\6\0\6\167\1\0"+
    "\13\167\1\0\13\167\1\0\4\167\1\0\11\167\2\0"+
    "\1\167\1\u0187\2\u0188\1\u0189\1\u0187\1\u0188\4\u0187\1\u0188"+
    "\1\u0187\1\u0188\2\u0187\1\u0188\6\u0187\1\u0188\56\u0187\1\u01d9"+
    "\1\u0187\105\u0188\1\u01da\1\u0188\1\u018a\2\u018b\1\u018c\1\u018a"+
    "\1\u018b\4\u018a\1\u018b\1\u018a\1\u018b\2\u018a\1\u018b\6\u018a"+
    "\1\u018b\56\u018a\1\u01d9\1\u018a\105\u018b\1\u01db\1\u018b\41\0"+
    "\1\u01dc\14\0\1\u01dc\63\0\2\u01dd\103\0\2\u01de\115\0"+
    "\1\u01df\14\0\1\u01df\63\0\2\u01e0\52\0\14\u0126\1\u0124"+
    "\1\u0126\1\0\70\u0126\3\0\2\u01e1\1\0\4\u01e1\2\0"+
    "\1\u0128\1\u01e1\1\0\4\u01e1\1\0\11\u01e1\1\0\40\u01e1"+
    "\2\0\4\u01e1\2\0\1\u01e1\14\u0136\1\u0134\1\u0136\1\0"+
    "\70\u0136\3\0\2\u01e2\1\0\4\u01e2\2\0\1\u0138\1\u01e2"+
    "\1\0\4\u01e2\1\0\11\u01e2\1\0\40\u01e2\2\0\4\u01e2"+
    "\2\0\1\u01e2\2\232\1\0\4\232\1\u01e3\101\232\1\0"+
    "\33\232\1\u01e4\50\232\14\u0140\1\u013e\1\u0140\1\0\70\u0140"+
    "\3\0\2\u01e5\1\0\4\u01e5\2\0\1\u0142\1\u01e5\1\0"+
    "\4\u01e5\1\0\11\u01e5\1\0\40\u01e5\2\0\4\u01e5\2\0"+
    "\1\u01e5\2\241\1\0\4\241\1\u01e6\101\241\1\0\33\241"+
    "\1\u01e7\50\241\2\0\1\u01e8\104\0\7\265\1\u01e9\2\265"+
    "\1\0\1\265\1\0\1\u014e\67\265\1\0\1\265\12\u0151"+
    "\1\0\1\u0151\1\0\1\u0151\1\0\70\u0151\7\u0152\1\u01ea"+
    "\4\u0152\1\u0153\106\u0152\1\u0153\21\u0152\1\u01eb\50\u0152\7\u0156"+
    "\1\u01ec\2\u0156\1\u0157\106\u0156\1\u0157\23\u0156\1\u01ed\50\u0156"+
    "\7\303\1\u01ee\2\303\1\0\71\303\1\u015a\1\0\1\303"+
    "\12\u01ef\1\u01f0\72\u01ef\1\0\1\u01ef\7\307\1\u01f1\4\307"+
    "\1\0\67\307\1\u015d\1\0\1\307\14\u01f2\1\u01f0\70\u01f2"+
    "\1\0\1\u01f2\7\312\1\u01f3\2\312\1\0\1\312\1\0"+
    "\70\312\1\0\1\312\7\u0162\1\u01f4\4\u0162\1\u0163\106\u0162"+
    "\1\u0163\21\u0162\1\u01f5\50\u0162\7\u0166\1\u01f6\2\u0166\1\u0167"+
    "\106\u0166\1\u0167\23\u0166\1\u01f7\50\u0166\7\330\1\u01f8\2\330"+
    "\1\0\71\330\1\u016a\1\0\1\330\12\u01f9\1\u01fa\72\u01f9"+
    "\1\0\1\u01f9\7\334\1\u01fb\4\334\1\0\67\334\1\u016d"+
    "\1\0\1\334\14\u01fc\1\u01fa\70\u01fc\1\0\1\u01fc\37\0"+
    "\1\u01fd\141\0\1\u01d3\34\0\1\u01d5\15\0\3\u01d5\2\0"+
    "\1\u01d5\11\0\1\u01d5\1\0\2\u01d5\7\0\1\u01d5\1\0"+
    "\1\u01d4\2\u01d5\6\0\1\u01d5\11\0\4\113\6\0\1\113"+
    "\6\0\6\113\1\0\7\113\1\u01fe\3\113\1\0\13\113"+
    "\1\0\4\113\1\0\11\113\2\0\1\113\6\0\4\113"+
    "\6\0\1\113\6\0\6\113\1\0\6\113\1\u01ff\4\113"+
    "\1\0\13\113\1\0\1\113\1\u01ff\2\113\1\0\11\113"+
    "\2\0\1\113\6\0\4\167\6\0\1\167\6\0\6\167"+
    "\1\0\6\167\1\u0200\4\167\1\0\6\167\1\u0201\4\167"+
    "\1\0\4\167\1\0\11\167\2\0\1\167\53\0\1\u0202"+
    "\5\0\1\u0202\73\0\1\u0203\14\0\1\u0203\66\0\1\u0204"+
    "\11\0\1\u0204\74\0\1\u0205\11\0\1\u0205\77\0\1\u0206"+
    "\14\0\1\u0206\23\0\2\232\1\0\34\232\1\u0207\47\232"+
    "\2\241\1\0\34\241\1\u0208\47\241\14\u0152\1\u0153\22\u0152"+
    "\1\u0209\47\u0152\12\u0156\1\u0157\24\u0156\1\u020a\47\u0156\12\u01ef"+
    "\1\u01b4\71\u01ef\1\u020b\1\u01b4\1\u01ef\14\u01f2\1\u01b9\67\u01f2"+
    "\1\u020c\1\u01b9\1\u01f2\14\u0162\1\u0163\22\u0162\1\u020d\47\u0162"+
    "\12\u0166\1\u0167\24\u0166\1\u020e\47\u0166\12\u01f9\1\u01c9\71\u01f9"+
    "\1\u020f\1\u01c9\1\u01f9\14\u01fc\1\u01ce\67\u01fc\1\u0210\1\u01ce"+
    "\1\u01fc\40\0\1\u0211\54\0\4\113\6\0\1\113\6\0"+
    "\6\113\1\0\13\113\1\0\4\113\1\u0212\6\113\1\0"+
    "\4\113\1\0\11\113\2\0\1\113\6\0\4\113\6\0"+
    "\1\113\6\0\6\113\1\0\3\113\1\u0213\7\113\1\0"+
    "\4\113\1\u0213\6\113\1\0\4\113\1\0\11\113\2\0"+
    "\1\113\6\0\4\167\6\0\1\167\6\0\6\167\1\0"+
    "\11\167\1\u0214\1\167\1\0\13\167\1\0\4\167\1\0"+
    "\11\167\2\0\1\167\6\0\4\167\6\0\1\167\6\0"+
    "\6\167\1\0\10\167\1\u0215\2\167\1\0\13\167\1\0"+
    "\4\167\1\0\11\167\2\0\1\167\54\0\1\u0216\24\0"+
    "\1\u0216\52\0\1\u0217\20\0\1\u0217\70\0\1\u0218\13\0"+
    "\1\u0218\53\0\2\u0219\112\0\1\u021a\35\0\1\u021a\12\0"+
    "\2\232\1\0\35\232\1\u021b\46\232\2\241\1\0\35\241"+
    "\1\u021c\46\241\14\u0152\1\u0153\23\u0152\1\u021d\46\u0152\12\u0156"+
    "\1\u0157\25\u0156\1\u021e\46\u0156\12\u01ef\1\u021f\71\u01ef\1\u020b"+
    "\1\u01b4\1\u01ef\14\u01f2\1\u0220\67\u01f2\1\u020c\1\u01b9\1\u01f2"+
    "\14\u0162\1\u0163\23\u0162\1\u0221\46\u0162\12\u0166\1\u0167\25\u0166"+
    "\1\u0222\46\u0166\12\u01f9\1\u0223\71\u01f9\1\u020f\1\u01c9\1\u01f9"+
    "\14\u01fc\1\u0224\67\u01fc\1\u0210\1\u01ce\1\u01fc\41\0\1\u0225"+
    "\53\0\4\113\6\0\1\113\6\0\6\113\1\0\13\113"+
    "\1\0\7\113\1\u0226\3\113\1\0\4\113\1\0\11\113"+
    "\2\0\1\113\6\0\4\167\6\0\1\167\6\0\6\167"+
    "\1\0\11\167\1\u0227\1\167\1\0\13\167\1\0\4\167"+
    "\1\0\11\167\2\0\1\167\6\0\4\167\6\0\1\167"+
    "\6\0\6\167\1\0\6\167\1\u0228\4\167\1\0\13\167"+
    "\1\0\4\167\1\0\11\167\2\0\1\167\43\0\1\u0229"+
    "\11\0\1\u0229\72\0\1\u022a\14\0\1\u022a\71\0\1\u022b"+
    "\14\0\1\u022b\30\0\2\232\1\0\36\232\1\u022c\45\232"+
    "\2\241\1\0\36\241\1\u022d\45\241\14\u0152\1\u0153\24\u0152"+
    "\1\u022e\45\u0152\12\u0156\1\u0157\26\u0156\1\u022f\45\u0156\14\u0162"+
    "\1\u0163\24\u0162\1\u0230\45\u0162\12\u0166\1\u0167\26\u0166\1\u0231"+
    "\45\u0166\40\0\1\u0232\54\0\4\113\6\0\1\113\6\0"+
    "\5\113\1\u0233\1\0\13\113\1\0\13\113\1\0\4\113"+
    "\1\0\11\113\2\0\1\113\6\0\4\167\6\0\1\167"+
    "\6\0\6\167\1\0\13\167\1\0\4\167\1\u0234\6\167"+
    "\1\0\4\167\1\0\11\167\2\0\1\167\6\0\4\167"+
    "\6\0\1\167\6\0\6\167\1\0\5\167\1\u0235\5\167"+
    "\1\0\13\167\1\0\4\167\1\0\11\167\2\0\1\167"+
    "\2\232\1\0\35\232\1\u0236\46\232\2\241\1\0\35\241"+
    "\1\u0237\46\241\14\u0152\1\u0153\23\u0152\1\u0238\46\u0152\12\u0156"+
    "\1\u0157\25\u0156\1\u0239\46\u0156\14\u0162\1\u0163\23\u0162\1\u023a"+
    "\46\u0162\12\u0166\1\u0167\25\u0166\1\u023b\46\u0166\35\0\1\u023c"+
    "\57\0\4\113\6\0\1\113\6\0\6\113\1\0\5\113"+
    "\1\u023d\5\113\1\0\13\113\1\0\4\113\1\0\11\113"+
    "\2\0\1\113\6\0\4\167\6\0\1\167\6\0\6\167"+
    "\1\0\13\167\1\0\13\167\1\0\4\167\1\0\1\167"+
    "\1\u023e\7\167\2\0\1\167\2\232\1\0\32\232\1\u023f"+
    "\51\232\2\241\1\0\32\241\1\u0240\51\241\14\u0152\1\u0153"+
    "\20\u0152\1\u0241\51\u0152\12\u0156\1\u0157\22\u0156\1\u0242\51\u0156"+
    "\14\u0162\1\u0163\20\u0162\1\u0243\51\u0162\12\u0166\1\u0167\22\u0166"+
    "\1\u0244\51\u0166\6\0\4\113\6\0\1\113\6\0\6\113"+
    "\1\0\7\113\1\u0245\3\113\1\0\13\113\1\0\4\113"+
    "\1\0\11\113\2\0\1\113\6\0\4\167\6\0\1\167"+
    "\6\0\6\167\1\0\13\167\1\0\4\167\1\u0246\6\167"+
    "\1\0\4\167\1\0\11\167\2\0\1\167\6\0\4\113"+
    "\6\0\1\113\6\0\6\113\1\0\13\113\1\0\13\113"+
    "\1\0\4\113\1\0\11\113\2\0\1\u0247\6\0\4\167"+
    "\6\0\1\167\6\0\6\167\1\0\10\167\1\u0248\2\167"+
    "\1\0\13\167\1\0\4\167\1\0\11\167\2\0\1\167"+
    "\6\0\4\113\6\0\1\113\6\0\6\113\1\0\5\113"+
    "\1\u0249\5\113\1\0\13\113\1\0\4\113\1\0\11\113"+
    "\2\0\1\113\6\0\4\167\6\0\1\167\6\0\6\167"+
    "\1\0\4\167\1\u024a\6\167\1\0\13\167\1\0\4\167"+
    "\1\0\11\167\2\0\1\167\6\0\4\113\6\0\1\113"+
    "\6\0\6\113\1\0\5\113\1\u024b\5\113\1\0\13\113"+
    "\1\0\4\113\1\0\11\113\2\0\1\113\6\0\4\167"+
    "\6\0\1\167\6\0\6\167\1\0\5\167\1\u024c\5\167"+
    "\1\0\13\167\1\0\4\167\1\0\11\167\2\0\1\167"+
    "\6\0\4\113\6\0\1\113\6\0\6\113\1\0\13\113"+
    "\1\0\4\113\1\u024d\6\113\1\0\4\113\1\0\11\113"+
    "\2\0\1\113\6\u024e\4\u024f\6\u024e\1\u024f\5\u024e\1\0"+
    "\6\u024f\1\u024e\13\u024f\1\u024e\13\u024f\1\u024e\4\u024f\1\u024e"+
    "\11\u024f\2\u024e\1\u024f\42\0\1\u0250\3\0\1\u0251\7\0"+
    "\1\u0252\1\u0253\21\0\1\u0254\13\0\4\167\6\0\1\167"+
    "\6\0\6\167\1\0\4\167\1\u0255\3\167\1\u0256\2\167"+
    "\1\0\4\167\1\u0257\1\u0258\5\167\1\0\4\167\1\0"+
    "\6\167\1\u0259\2\167\2\0\1\167\57\0\1\u025a\77\0"+
    "\1\u025b\115\0\1\u025c\105\0\1\u025d\107\0\1\u025e\35\0"+
    "\4\167\6\0\1\167\6\0\6\167\1\0\13\167\1\0"+
    "\5\167\1\u025f\5\167\1\0\4\167\1\0\11\167\2\0"+
    "\1\167\6\0\4\167\6\0\1\167\6\0\6\167\1\0"+
    "\12\167\1\u0260\1\0\13\167\1\0\4\167\1\0\11\167"+
    "\2\0\1\167\6\0\4\167\6\0\1\167\6\0\6\167"+
    "\1\0\13\167\1\0\5\167\1\u0261\5\167\1\0\4\167"+
    "\1\0\11\167\2\0\1\167\6\0\4\167\6\0\1\167"+
    "\6\0\6\167\1\0\13\167\1\0\4\167\1\u0262\6\167"+
    "\1\0\4\167\1\0\11\167\2\0\1\167\6\0\4\167"+
    "\6\0\1\167\6\0\6\167\1\0\13\167\1\0\5\167"+
    "\1\u0263\5\167\1\0\4\167\1\0\11\167\2\0\1\167"+
    "\44\0\1\u0264\136\0\1\u0265\107\0\1\u0266\67\0\1\u0267"+
    "\125\0\1\u0268\17\0\4\167\6\0\1\167\6\0\6\167"+
    "\1\0\6\167\1\u0269\4\167\1\0\13\167\1\0\4\167"+
    "\1\0\11\167\2\0\1\167\6\0\4\167\6\0\1\167"+
    "\6\0\6\167\1\0\13\167\1\0\13\167\1\0\4\167"+
    "\1\0\1\167\1\u026a\7\167\2\0\1\167\6\0\4\167"+
    "\6\0\1\167\6\0\6\167\1\0\13\167\1\0\13\167"+
    "\1\0\4\167\1\0\2\167\1\u026b\6\167\2\0\1\167"+
    "\6\0\4\167\6\0\1\167\6\0\6\167\1\0\13\167"+
    "\1\0\4\167\1\u026c\6\167\1\0\4\167\1\0\11\167"+
    "\2\0\1\167\6\0\4\167\6\0\1\167\6\0\6\167"+
    "\1\0\13\167\1\0\13\167\1\0\4\167\1\0\2\167"+
    "\1\u026d\6\167\2\0\1\167\46\0\1\u026e\74\0\1\u026f"+
    "\106\0\1\u0270\116\0\1\u0271\105\0\1\u0272\51\0\4\167"+
    "\6\0\1\167\6\0\6\167\1\0\10\167\1\u0273\2\167"+
    "\1\0\13\167\1\0\4\167\1\0\11\167\2\0\1\167"+
    "\6\0\4\167\6\0\1\167\6\0\5\167\1\u0274\1\0"+
    "\13\167\1\0\13\167\1\0\4\167\1\0\11\167\2\0"+
    "\1\167\6\0\4\167\6\0\1\167\6\0\5\167\1\u0275"+
    "\1\0\13\167\1\0\13\167\1\0\4\167\1\0\11\167"+
    "\2\0\1\167\6\0\4\167\6\0\1\167\6\0\6\167"+
    "\1\0\6\167\1\u0276\4\167\1\0\13\167\1\0\4\167"+
    "\1\0\11\167\2\0\1\167\6\0\4\167\6\0\1\167"+
    "\6\0\6\167\1\0\5\167\1\u0277\5\167\1\0\13\167"+
    "\1\0\4\167\1\0\11\167\2\0\1\167\57\0\1\u0278"+
    "\131\0\1\u0279\52\0\1\u027a\106\0\1\u027b\46\0\4\167"+
    "\6\0\1\167\6\0\6\167\1\0\13\167\1\0\5\167"+
    "\1\u027c\5\167\1\0\4\167\1\0\11\167\2\0\1\167"+
    "\6\0\4\167\6\0\1\167\6\0\6\167\1\0\13\167"+
    "\1\0\13\167\1\0\4\167\1\0\7\167\1\u027d\1\167"+
    "\2\0\1\167\6\0\4\167\6\0\1\167\6\0\6\167"+
    "\1\0\10\167\1\u027e\2\167\1\0\13\167\1\0\4\167"+
    "\1\0\11\167\2\0\1\167\6\0\4\167\6\0\1\167"+
    "\6\0\6\167\1\0\10\167\1\u027f\2\167\1\0\13\167"+
    "\1\0\4\167\1\0\11\167\2\0\1\167\103\0\1\u0280"+
    "\63\0\1\u0268\131\0\1\u0272\106\0\1\u0281\11\0\4\167"+
    "\6\0\1\167\6\0\6\167\1\0\13\167\1\0\13\167"+
    "\1\0\4\167\1\0\10\167\1\u0282\2\0\1\167\6\0"+
    "\4\167\6\0\1\167\6\0\6\167\1\0\13\167\1\0"+
    "\6\167\1\u026d\4\167\1\0\4\167\1\0\11\167\2\0"+
    "\1\167\6\0\4\167\6\0\1\167\6\0\6\167\1\0"+
    "\13\167\1\0\13\167\1\0\4\167\1\0\10\167\1\u0277"+
    "\2\0\1\167\6\0\4\167\6\0\1\167\6\0\6\167"+
    "\1\0\13\167\1\0\13\167\1\0\4\167\1\0\10\167"+
    "\1\u0283\2\0\1\167\34\0\1\u0268\154\0\1\u0284\12\0"+
    "\4\167\6\0\1\167\6\0\5\167\1\u026d\1\0\13\167"+
    "\1\0\13\167\1\0\4\167\1\0\11\167\2\0\1\167"+
    "\6\0\4\167\6\0\1\167\6\0\6\167\1\0\13\167"+
    "\1\0\13\167\1\0\4\167\1\0\7\167\1\u0285\1\167"+
    "\2\0\1\167\56\0\1\u0268\36\0\4\167\6\0\1\167"+
    "\6\0\6\167\1\0\13\167\1\0\4\167\1\u026d\6\167"+
    "\1\0\4\167\1\0\11\167\2\0\1\167";

  /** 
   * The transition table of the DFA
   */
  final private static int yytrans [] = yy_unpack(yy_packed);


  /* error codes */
  final private static int YY_UNKNOWN_ERROR = 0;
  // final private static int YY_ILLEGAL_STATE = 1;
  final private static int YY_NO_MATCH = 2;
  final private static int YY_PUSHBACK_2BIG = 3;

  /* error messages for the codes above */
  final private static String YY_ERROR_MSG[] = {
    "Unkown internal scanner error",		//$NON-NLS-1$
    "Internal error: unknown state",		//$NON-NLS-1$
    "Error: could not match input",		//$NON-NLS-1$
    "Error: pushback value was too large"	//$NON-NLS-1$
  };

  /**
   * YY_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
   */
  private final static byte YY_ATTRIBUTE[] = {
     1,  0,  0,  0,  0,  1,  0,  0,  1,  1,  1,  0,  1,  1,  1,  1, 
     0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
     1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  0,  1,  0,  0,  0,  0, 
     0,  0,  1,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  9, 
     1,  9,  1,  1,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9, 
     1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  9,  1, 
     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1, 
     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1, 
     1,  1,  9,  9,  1,  1,  9,  1,  1,  1,  1,  1,  9,  1,  1,  1, 
     1,  9,  1,  1,  1,  1,  9,  9,  1,  9,  3,  3,  3,  3,  3,  3, 
     9,  9,  1,  1,  1,  9,  1,  1,  1,  1,  1,  9,  9,  1,  9,  3, 
     3,  3,  3,  3,  3,  9,  9,  1,  1,  1,  9,  1,  1,  1,  9,  9, 
     1,  1,  0,  1,  0,  9,  1,  2,  1,  2,  1,  1,  0,  0,  0,  9, 
     1,  1,  1,  9,  9,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0, 
     9,  1,  0,  0,  1,  9,  0,  9,  0,  0,  9,  0,  0,  0,  9,  1, 
     1,  0,  1,  0,  9,  0,  0,  0,  1,  1,  0,  0,  0,  0,  9,  0, 
     0,  0,  0,  9,  0,  0,  0,  1,  0,  0,  1,  0,  0,  9,  0,  0, 
     1,  0,  0,  9,  0,  0,  0,  1,  0,  1,  1,  0,  0,  9,  0,  0, 
     0,  1,  0,  1,  1,  0,  0,  9,  9,  9,  0,  9,  9,  1,  1,  1, 
     1,  2, 13,  3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  1, 
     1,  2, 13,  3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  0, 
     9,  9,  9,  0,  0,  1,  1,  1,  9,  0,  0, 13,  9, 13,  9,  9, 
     1,  1,  1,  0,  0,  1,  3,  2,  2,  3,  2,  2,  0,  0,  0,  0, 
     0,  0,  1,  0,  0,  1,  0,  1,  1,  1,  1,  0,  1,  0,  1,  1, 
     1,  1,  0,  1,  1,  1,  1,  0,  2,  3,  3,  2,  2,  3,  3,  2, 
     1,  1,  1,  0,  0,  1,  1,  1,  0,  0,  1,  1,  1,  2,  3,  3, 
     2,  2,  3,  3,  2,  1,  1,  1,  0,  0,  1,  1,  1,  0,  0,  9, 
     9,  0,  1,  9,  0,  1,  1,  1,  5, 13, 13,  0,  0,  0,  0,  0, 
     0,  0,  1,  1,  0,  1,  1,  9,  1,  3,  2,  3,  2,  1,  0,  9, 
     1,  0,  1,  3,  2,  3,  2,  1,  0,  9,  1,  0,  0,  1,  1,  1, 
     1,  0,  0,  0,  0,  0,  1,  1,  2,  2,  0,  0,  2,  2,  0,  0, 
     0,  1,  1,  1,  1,  0,  0,  0,  9,  9,  1,  1,  2,  2,  1,  1, 
     2,  2,  1,  1,  0,  1,  1,  1,  9,  9,  9,  1,  1,  2,  2,  2, 
     2,  0,  1,  1,  1,  1,  1,  2,  2,  2,  2,  9,  1,  1,  1,  1, 
     3,  3,  3,  3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  0, 
     0,  0,  0,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  1,  1, 
     1,  1,  1,  0,  0,  1,  0,  0,  1,  1,  1,  1,  1,  0,  0,  0, 
     0,  9,  1,  1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1,  1,  0, 
     0,  1,  1,  0,  1
  };

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

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

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

  /** this buffer contains the current text to be matched and is
      the source of the yytext() string */
  private char yy_buffer[] = new char[16384];

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

  /** the textposition at the last state to be included in yytext */
  private int yy_pushbackPos;

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

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

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

  /** number of newlines encountered up to the start of the matched text */
  private int yyline;

  /** the number of characters up to the start of the matched text */
  private int yychar;

  /**
   * the number of characters from the last newline up to the start of the 
   * matched text
   */
  // private int yycolumn; 

  /** 
   * yy_atBOL == true <=> the scanner is currently at the beginning of a line
   */
  // private boolean yy_atBOL;

  /** yy_atEOF == true <=> the scanner has returned a value for EOF */
  private boolean yy_atEOF;

  /** denotes if the user-EOF-code has already been executed */
  private boolean yy_eof_done;

  /* user code: */
	private int fTokenCount = 0;
 
	// required holders for white-space compacting
	private boolean fShouldLoadBuffered = false;
	private String fBufferedContext = null;
	private int fBufferedStart = 1;
	private int fBufferedLength = 0;
	private ContextRegionContainer fBufferedEmbeddedContainer = null;
	private String f_context = null;

	// state stack for handling embedded regions
	private IntStack fStateStack = new IntStack();
	// a "hint" as to what an embedded region should be evaluated
	private String fEmbeddedHint = UNDEFINED;
	// a "hint" as to what state to enter once an embedded region has
	//   been completed
	private int fEmbeddedPostState = YYINITIAL;
	// the container used to create embedded regions
	private ContextRegionContainer fEmbeddedContainer = null;
	private static final String PROXY_CONTEXT = "PROXY_CONTEXT";

	private String context = null;
	private int start = 0;
	private int textLength = 0;
	private int length = 0;

	// offset for tracking position specific block tags
	private int fOffset = 0;
	
	// the name of the current tag being opened
	private String fCurrentTagName = null;

	// the name of the current tag inside of an embedded region
	private String internalTagName = null;
	private String internalContext = null;

	// the list of tag name BlockMarkers
	private List fBlockMarkers = new ArrayList(0);
	private List fNestablePrefixes = new ArrayList(1);
	
	// where the last internal container block was found
	private int fLastInternalBlockStart = -1;

	// required to not seek text blocks on an end tag
	private boolean fIsBlockingEnabled = false;
	private boolean fIsCaseSensitiveBlocking = true;

	private static final boolean fForbidJSP = false;
	
	private int fELlevel = 0;

	private JSPParserRegionFactory fRegionFactory = new JSPParserRegionFactory();

	/**
	 * user method 
	 */
	public final void addBlockMarker(BlockMarker marker) {
		if(containsTagName(marker.getTagName()))
			return;
		fBlockMarkers.add(marker);
	}
	/**
	 * user method
	 */
	public final void addNestablePrefix(TagMarker marker) {
		fNestablePrefixes.add(marker);
	}
	/* user method */
	public List getNestablePrefixes() {
		return fNestablePrefixes;
	}
	/**
	 * user method
	 */
	private boolean isNestable(String tagName) {
		//Iterator blocks = fNestablePrefixes.iterator();
		//while(blocks.hasNext()) {
		//	TagMarker marker = (TagMarker)blocks.next();
		//	String markerName = marker.getTagName();
		//	if(tagName.length() > markerName.length() + 1 && tagName.startsWith(markerName) && tagName.charAt(markerName.length()) == ':') {
		//		return marker.isGlobal() || getOffset() >= marker.getMarker().getStart();
		//	}
		//}
		//return false;
		return true;
	}
	/**
	 * user method 
	 */
	public final void removeNestablePrefix(String name) {
		if (fNestablePrefixes != null) {
			Iterator nestables = fNestablePrefixes.iterator();
			while (nestables.hasNext()) {
				if (((TagMarker) nestables.next()).getTagName().equalsIgnoreCase(name))
					nestables.remove();
			}
		}
	}
	/**
	 * user method 
	 */
	public final void removeBlockMarker(BlockMarker marker) {
		fBlockMarkers.remove(marker);
	}
	/**
	 * user method 
	 */
	public final void removeBlockMarker(String tagname) {
		if (fBlockMarkers != null) {
			Iterator blocks = fBlockMarkers.iterator();
			while (blocks.hasNext()) {
				if (((BlockMarker) blocks.next()).getTagName().equals(tagname))
					blocks.remove();
			}
		}
	}
	/* user method */
	private final void assembleEmbeddedTagSequence(String startType, String endTagName) {
		assembleEmbeddedContainer(startType, null, endTagName);
	}
	/* user method */
	private final void assembleEmbeddedContainer(String startType, String[] endTypes) {
		assembleEmbeddedContainer(startType, endTypes, null);
	}
	/* user method */
	private final void assembleEmbeddedContainer(String startType, String endType) {
		assembleEmbeddedContainer(startType, new String[]{endType}, null);
	}
	/**
	 *  user method 
	 * 
	 * Assembles an embedded container beginning with the given startType as
	 * the first ContextRegion within it and of the type fEmbeddedHint.  The
	 * endTypes[] array contains the context types that will cause a successful
	 * exit.  Use of the endTagName parameter alters this behavior to force an
	 * exit on an XML_TAG_CLOSE after seeing an XML_TAG_NAME whose significant
	 * text matches the endTagName String.  All contents in between are
	 * insignificant, and yes, this means comments are allowed inside.
	 **/
	private final void assembleEmbeddedContainer(String startType, String[] endTypes, String endTagName) {
		// the context of the region being added to the embedded container
		internalContext = startType;
		// keep track of where this container began; to provide relative indeces for the regions
		int containerStart = yychar;
		boolean notFinished = true;
		// keep track of where we seem to be so that the endTagName can be checked
		boolean isInEndTag = false;
		boolean isInFirstTag = true;
		// create the embedded container and setup its "type"
		if (fEmbeddedContainer == null) {
			fEmbeddedContainer = new ContextRegionContainer();
			fEmbeddedContainer.setType(fEmbeddedHint);
			fEmbeddedContainer.setStart(containerStart);
			// TODO: parent region needs to be set .... but not sure where to get it from 
			//		fEmbeddedContainer.setParent(parentRegion);
		}
		containerStart = fEmbeddedContainer.getStart();
		while (notFinished) {
			// add the region to the container
			if (internalContext != null && internalContext != PROXY_CONTEXT) {
				ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());
				fEmbeddedContainer.getRegions().add(newToken);
				fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
				fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
				// DW, 4/16/2003 token regions no longer have parents
				//newToken.setParent(fEmbeddedContainer);
			}
			try {
				// longscan determines whether to attempt a blockTagScan within the embedded container
				boolean longscan = false;
				// save the tokenizer state in case of a block tag scan
				int previousState = yystate();
				String previousCurrentTagName = fCurrentTagName;
				int previousPostState = fEmbeddedPostState;
				String previousEmbeddedHint = fEmbeddedHint;
				// determine if a block tag scan is necessary
				if (internalContext == XML_TAG_NAME) {
					internalTagName = yytext();
					if(!isNestable(internalTagName)) {
						internalTagName = null;
						// snagged a tag name we shouldn't have
						fEmbeddedPostState = ST_ABORT_EMBEDDED;
						notFinished = false;
					}
				}
				else if (internalContext == XML_TAG_OPEN || internalContext == XML_END_TAG_OPEN) {
					internalTagName = null;
				}
				// do upkeep for endTagName usage; must be here since the next token could be the close
				if (internalContext == XML_END_TAG_OPEN) {
					isInEndTag = true;
				} else if (internalContext == XML_TAG_CLOSE) {
					isInFirstTag = isInEndTag = false;
				} else {
				 	ITextRegionList embeddedRegions = fEmbeddedContainer.getRegions();
					if (embeddedRegions.size() > 2 && (embeddedRegions.get(embeddedRegions.size()-1)).getType() == XML_TAG_CLOSE && (embeddedRegions.get(embeddedRegions.size() - 3)).getType() == XML_TAG_OPEN && internalTagName != null) {
						if (containsTagName(internalTagName)) {
							longscan = true;
							yybegin(ST_BLOCK_TAG_SCAN);
						}
					}
				}
				if (longscan)
					fCurrentTagName = internalTagName;
				// read the next region and context
				internalContext = primGetNextToken();
				if (longscan) {
					// Returning from a block tag scan requires restoring some state variables
					// as well as handling the block region and setting up for normal scanning
					// inside the embedded container
					ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());
					fEmbeddedContainer.getRegions().add(newToken);
					fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
					fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
					// DW, 4/16/2003 token regions no longer have parents
					// newToken.setParent(fEmbeddedContainer);
					longscan = false;
					fEmbeddedPostState = previousPostState;
					fEmbeddedHint = previousEmbeddedHint;
					fCurrentTagName = previousCurrentTagName;
					yybegin(previousState);
					internalContext = primGetNextToken();
				}
			} catch (IOException e) {
				// primGetNextToken() calls may throw an IOException
				// catch and do nothing since the isEOF check below
				// will properly exit if the input was too short
			} catch (Exception f) {
				// some other exception happened; never should
				Logger.logException(f);
			}
			boolean isEndingType = yystate() == ST_ABORT_EMBEDDED;
			if(!isEndingType) {
				// check for ending context
				if (endTagName == null) {
					for (int i = 0; i < endTypes.length; i++) {
						isEndingType = isEndingType || (internalContext == endTypes[i]);
					}
				}
				else {
					isEndingType = ((isInEndTag && internalContext == XML_TAG_CLOSE) || (isInFirstTag && internalContext == XML_EMPTY_TAG_CLOSE)) && internalTagName != null && internalTagName.equals(endTagName);
				}
			}
			ITextRegionList embeddedList = fEmbeddedContainer.getRegions();
			notFinished = notFinished && ((!isEndingType) && !isEOF() && (endTagName != null || internalContext != UNDEFINED) && !(internalContext == PROXY_CONTEXT && (embeddedList.get(embeddedList.size()-1)).getType() == UNDEFINED));
		}
		// finish adding the last context
		if (internalContext != null && internalContext != PROXY_CONTEXT) {
			ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());
			fEmbeddedContainer.getRegions().add(newToken);
			// DW, 4/16/2003 token regions no longer have parents
			//newToken.setParent(fEmbeddedContainer);
			fEmbeddedContainer.setLength(yychar - containerStart + yylength());
			fEmbeddedContainer.setTextLength(yychar - containerStart + yylength());
		}
		yybegin(fEmbeddedPostState);
	}
	/* user method */
	public final boolean isCaseSensitiveBlocking() {
		return fIsCaseSensitiveBlocking;
	}
	/* user method */
	public final void setCaseSensitiveBlocking(boolean newValue) {
		fIsCaseSensitiveBlocking = newValue;
	}
	/* user method */
	public boolean getBlockMarkerAllowsJSP() {
		return getBlockMarkerAllowsJSP(fCurrentTagName);
	}
	/* user method */
	public boolean getBlockMarkerAllowsJSP(String name) {
		Iterator iterator = fBlockMarkers.iterator();
		while(iterator.hasNext()) {
			BlockMarker marker = (BlockMarker)iterator.next();
			boolean casesensitive = marker.isCaseSensitive();
			if(casesensitive && marker.getTagName().equals(name))
				return marker.allowsJSP();
			else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))
				return marker.allowsJSP();
		}
		return true;
	}
	/* user method */
	public boolean getBlockMarkerCaseSensitivity() {
		return getBlockMarkerCaseSensitivity(fCurrentTagName);
	}
	public boolean getBlockMarkerCaseSensitivity(String name) {
		Iterator iterator = fBlockMarkers.iterator();
		while(iterator.hasNext()) {
			BlockMarker marker = (BlockMarker)iterator.next();
			boolean casesensitive = marker.isCaseSensitive();
			if(casesensitive && marker.getTagName().equals(name))
				return casesensitive;
			else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))
				return casesensitive;
		}
		return true;
	}
	/* user method */
	public String getBlockMarkerContext() {
		return getBlockMarkerContext(fCurrentTagName);
	}
	/* user method */
	public String getBlockMarkerContext(String name) {
		Iterator iterator = fBlockMarkers.iterator();
		while(iterator.hasNext()) {
			BlockMarker marker = (BlockMarker)iterator.next();
			if(marker.getTagName().equals(name))
				return marker.getContext();
		}
		return BLOCK_TEXT;
	}
	/* user method */
	public List getBlockMarkers() {
		return fBlockMarkers;
	}
	/* user method */
	public final int getOffset() {
		return fOffset + yychar;
	}
	private final boolean isBlockMarker() {
		return isBlockMarker(fCurrentTagName);
	}
	private final boolean isBlockMarker(String tagName) {
		if (!fIsBlockingEnabled)
			return false;
		return containsTagName(tagName);
	}
	/**
	 * user method
	 */
	public final void beginBlockTagScan(String newTagName) {
		beginBlockMarkerScan(newTagName, BLOCK_TEXT);
	}
	/**
	 * user method
	 *
	 * Special tokenizer setup.  Allows tokenization to be initiated at the
	 * start of a text block within a "newTagName" tag.
	 *
	 * Example: 
	 *	Tokenizer toker = new Tokenizer();
	 *	toker.setCaseSensitiveBlocking(false);
	 *	toker.reset(new java.io.StringReader("afiuhqwkejhtasihgalkwhtq</scripter></scr></script>asgdasga"));
	 *	toker.beginBlockMarkerScan("script", BLOCK_TEXT);
	 *	toker.getRegions(); 
	 *
	 * Returns:
	 *	BLOCK_TEXT: 0-40
	 *	XML_END_TAG_OPEN: 41-42
	 *	XML_TAG_NAME: 43-48
	 *	XML_TAG_CLOSE: 49-49
	 *	XML_CONTENT: 50-57
	 *
	 */
	public final void beginBlockMarkerScan(String newTagName, String blockcontext) {
		yybegin(ST_BLOCK_TAG_SCAN);
		fCurrentTagName = newTagName;
	}

/**
 * Method doScan.
 * 
 * Returns a context region for all of the text from the current position upto the end of input or
 * to right *before* the first occurence of searchString
 * 
 * @param searchString - target string to search for ex.: "-->", "</tagname"
 * @param requireTailSeparator - whether the target must be immediately followed by whitespace or '>'
 * @param allowJSP - check for and allow for JSP markup <%%>
 * @param context - the context of the scanned region if non-zero length
 * @param exitState - the state to go to if the region was of non-zero length
 * @param abortState - the state to go to if the searchString was found immediately
 * @return String - the context found: the desired context on a non-zero length match, the abortContext on immediate success
 * @throws IOException
 */
private final String doScan(String searchString, boolean requireTailSeparator, boolean allowJSP, boolean allowCDATA, String searchContext, int exitState, int immediateFallbackState) throws IOException {
	boolean stillSearching = true;
	// Disable further block (probably)
	fIsBlockingEnabled = false;
	int searchStringLength = searchString.length();
	int n = 0;
	char lastCheckChar;
	int i;
	boolean same = false;
	// Check for JSP starts ("<%") if the tag is global like SCRIPT or STYLE
	boolean checkJSPs = allowJSP && !fForbidJSP;
	boolean checkedForJSPsOnce = !checkJSPs;
	boolean checkedJSPsAtStartOnce = false;
	
	while (stillSearching) {
		n = 0;
		// Ensure that enough data from the input exists to compare against the search String.
		n = yy_advance();
		while(n != YYEOF && yy_currentPos < searchStringLength)
			n = yy_advance();
//		c = (char) n;
		// If the input was too short or we've exhausted the input, stop immediately.
		if (n == YYEOF && checkedForJSPsOnce) {
			stillSearching = false;
		}
		else {
			/**
			 * Look for starting JSPs "<%"
			 */
			checkedForJSPsOnce = true;
			// 1) yy_currentPos - searchStringLength : There's at least searchStringLength of input available; once that's read, check for JSPs
			// ---
			// Look for a JSP beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
			// Ensure that we've not encountered a complete block (<%%>) that was *shorter* than the closeTagString and
			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
			if(checkJSPs && yy_currentPos > searchStringLength && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
				yy_buffer[yy_currentPos - searchStringLength] == '<' && yy_buffer[yy_currentPos - searchStringLength + 1] == '%') {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}
			// 2) yy_currentPos - jspstarter.length : There's not searchStringLength of input available; check for a JSP 2 spots back in what we could read
			// ---
			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
			// spill over the end of the buffer while checking.
			else if(checkJSPs && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}
			// 3) yy_currentPos..(yy_currentPos+jspStartlength-1) : Check at the start of the block one time
			// ---
			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
			else if(checkJSPs && !checkedJSPsAtStartOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
				checkedJSPsAtStartOnce = true;
				fLastInternalBlockStart = yy_markedPos = yy_startRead;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}


			/**
			 * Look for starting CDATA "<![CDATA["
			 */
			// 1) yy_currentPos - searchStringLength: There's at least searchStringLength of input available; once that's read, check for CDATA
			// ---
			// Look for a CDATA beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
			// Ensure that we've not encountered a complete block (<[!CDATA[]]>) that was *shorter* than the closeTagString and
			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
/*			if(checkCDATA && yy_currentPos > searchStringLength && yy_currentPos + searchStringLength < yy_buffer.length && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
				charsMatch(cdataStarter, yy_buffer, 0, yy_currentPos - searchStringLength)) {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				// go to a state where CDATA can be found
				if (fEmbeddedContainer == null) {
					fEmbeddedContainer = new ContextRegionContainer();
					fEmbeddedContainer.setType(searchContext);
					fEmbeddedContainer.setStart(yychar);
				}
				ITextRegion newToken = fRegionFactory.createToken(searchContext, yychar, yylength(), yylength());
				fEmbeddedContainer.getRegions().add(newToken);
				fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
				fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
				yybegin(YYINITIAL);
				String context = primGetNextToken();
				if(context.equals(XMLRegionContexts.XML_CDATA_OPEN)) {
					assembleEmbeddedContainer(XMLRegionContexts.XML_CDATA_OPEN, XMLRegionContexts.XML_CDATA_CLOSE);
				}
				yybegin(resumeState);
				return searchContext;
			}
*//*
			// 2) yy_currentPos - cdataStarter.length: There's not searchStringLength of input available; check for a CDATA right here spots back in what we could read
			// ---
			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
			// spill over the end of the buffer while checking.
			else if(checkCDATA && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}
			// 3) yy_currentPos : Check at the start of the block one time
			// ---
			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
			else if(checkCDATA && !checkedForCDATAOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
				checkedForCDATAOnce = true;
				fLastInternalBlockStart = yy_markedPos = yy_startRead;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}
*/
			// Check the characters in the target versus the last targetLength characters read from the buffer
			// and see if it matches
			if (n == YYEOF) {
				stillSearching = false;
			}
			else {
				same = true;
				// safety check for array accesses
				if(yy_currentPos >= searchStringLength && yy_currentPos <= yy_buffer.length) {
					for(i = 0; i < searchStringLength; i++) {
						if(same && fIsCaseSensitiveBlocking)
							same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);
						else if(same && !fIsCaseSensitiveBlocking)
							same = Character.toLowerCase(yy_buffer[i + yy_currentPos - searchStringLength]) == Character.toLowerCase(searchString.charAt(i));
					}
				}
				// safety check failed; no match is possible right now
				else {
					same = false;
				}
			}
			if (same && requireTailSeparator && yy_currentPos < yy_buffer.length) {
				// Additional check for close tags to ensure that targetString="</script" doesn't match
				// "</scriptS"
				lastCheckChar = yy_buffer[yy_currentPos];
				// Succeed on "</script>" and "</script "
				if(lastCheckChar == '>' || Character.isWhitespace(lastCheckChar))
					stillSearching = false;
			}
			else {
				stillSearching = !same || (yy_currentPos < yy_startRead + searchStringLength);
			}
		}
	}
	if (n != YYEOF || same) {
		// We've stopped short of the end or definitely found a match
		yy_markedPos = yy_currentPos - searchStringLength;
		yy_currentPos = yy_markedPos + 1;
		// If the searchString occurs at the very beginning of what would have
		// been a Block, resume scanning normally immediately
		if (yy_markedPos == yy_startRead) {
			yybegin(immediateFallbackState);
			return primGetNextToken();
		}
	}
	else {
		// We ran through the rest of the input
		yy_markedPos = yy_currentPos;
		yy_currentPos++;
	}
	yybegin(exitState);
	// If the ending occurs at the very beginning of what would have
	// been a Block, resume scanning normally immediately
	if(yy_markedPos == yy_startRead)
		return primGetNextToken();
	return searchContext;
}
/**
 * user method 
 * does a lookahead for the current tag name
 */
private final String doBlockTagScan() throws IOException {
	fIsCaseSensitiveBlocking = getBlockMarkerCaseSensitivity();
	return doScan("</" + fCurrentTagName, true, getBlockMarkerAllowsJSP(), true, getBlockMarkerContext(fCurrentTagName), YYINITIAL, YYINITIAL);
}
	/**
	 * user method
	 *
	 * Converts the raw context String returned by the primGetNextToken()
	 * method into a full ITextRegion by pulling in values for the
	 * current offset within the scanning text.
	 *
	 * Returns null when EOF is encountered and attaches intermittently
	 * discovered whitespace onto the end of useful regions.
	 *
	 * Note that this algorithm caches the token following the one being returned
	 * so that whitespace can be collapsed.
	 */
	public final ITextRegion getNextToken() throws IOException {
		fEmbeddedContainer = null;
		// load the starting non-whitespace token (assume that it is so)
		if (fShouldLoadBuffered) {
			if (fBufferedEmbeddedContainer != null) {
				ITextRegion container = fBufferedEmbeddedContainer;
				fBufferedEmbeddedContainer = null;
				fShouldLoadBuffered = false;
				return container;
			}
			context = fBufferedContext;
			start = fBufferedStart;
			textLength = length = fBufferedLength;
			fShouldLoadBuffered = false;
		} else {
			context = primGetNextToken();
			if (context == PROXY_CONTEXT) {
				return fEmbeddedContainer;
			} else if (context == XML_TAG_NAME || f_context == JSP_ROOT_TAG_NAME || f_context == JSP_DIRECTIVE_NAME) {
				if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
					fCurrentTagName = yytext();
				else
					fCurrentTagName = null;
			} else if (context == XML_TAG_OPEN) {
				fIsBlockingEnabled = true;
			} else if (context == XML_END_TAG_OPEN) {
				fIsBlockingEnabled = false;
			}
			start = yychar;
			textLength = length = yylength();
			if (yy_atEOF) {
				fTokenCount++;
				return null;
			}
		}
		// store the next token
		f_context = primGetNextToken();
		if (f_context == PROXY_CONTEXT) {
			fBufferedEmbeddedContainer = fEmbeddedContainer;
			fShouldLoadBuffered = true;
		} else if (f_context == XML_TAG_NAME || f_context == JSP_ROOT_TAG_NAME || f_context == JSP_DIRECTIVE_NAME) {
			if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
				fCurrentTagName = yytext();
			else
				fCurrentTagName = null;
		} else if (f_context == XML_TAG_OPEN) {
			fIsBlockingEnabled = true;
		} else if (f_context == XML_END_TAG_OPEN) {
			fIsBlockingEnabled = false;
		}
		fBufferedContext = f_context;
		fBufferedStart = yychar;
		fBufferedLength = yylength();
		fShouldLoadBuffered = true;
		if (fBufferedContext == WHITE_SPACE) {
			fShouldLoadBuffered = false;
			length += fBufferedLength;
		}
		if (context == null) {
			// EOF
			if (Debug.debugTokenizer) {
				System.out.println(getClass().getName() + " discovered " + fTokenCount + " tokens."); //$NON-NLS-2$//$NON-NLS-1$
			}
			return null;
		}
		fTokenCount++;
		return fRegionFactory.createToken(context, start, textLength, length, null, fCurrentTagName);
	}
	/* user method */
	public JSPTokenizer(){
		super();
	}
	/* user method */
	public JSPTokenizer(char[] charArray){
			this(new CharArrayReader(charArray));
	}
	/* user method */
	public void reset(char[] charArray) {
		reset(new CharArrayReader(charArray), 0);
	}
	/* user method */
	public void reset(char[] charArray, int newOffset) {
		reset(new CharArrayReader(charArray), newOffset);
	}
	/* user method */
	public void reset(java.io.InputStream in) {
		reset(new java.io.InputStreamReader(in), 0);
	}
	/* user method */
	public void reset(java.io.InputStream in, int newOffset) {
		reset(new java.io.InputStreamReader(in), newOffset);
	}
	/* user method */
	public void reset(java.io.Reader in) {
		reset(in, 0);
	}
	/**
	 * user method *
	 *
	 * Reset internal counters and vars to "newly created" values, in the hopes
	 * that resetting a pre-existing tokenizer is faster than creating a new one.
	 *
	 * This method contains code blocks that were essentially duplicated from the
	 * <em>generated</em> output of this specification before this method was
	 * added.  Those code blocks were under the above copyright.
	 */
	public void reset(java.io.Reader in, int newOffset) {
		if (Debug.debugTokenizer) {
			System.out.println("resetting tokenizer");//$NON-NLS-1$
		}
		fOffset = newOffset;
	
		/* the input device */
		yy_reader = in;
	
		/* the current state of the DFA */
		yy_state = 0;
	
		/* the current lexical state */
		yy_lexical_state = YYINITIAL;
	
		/* this buffer contains the current text to be matched and is
		the source of the yytext() string */
		java.util.Arrays.fill(yy_buffer, (char)0);
	
		/* the textposition at the last accepting state */
		yy_markedPos = 0;
	
		/* the textposition at the last state to be included in yytext */
		yy_pushbackPos = 0;
	
		/* the current text position in the buffer */
		yy_currentPos = 0;
	
		/* startRead marks the beginning of the yytext() string in the buffer */
		yy_startRead = 0;
	
		/** 
		 * endRead marks the last character in the buffer, that has been read
		 * from input 
		 */
		yy_endRead = 0;
	
		/* number of newlines encountered up to the start of the matched text */
		yyline = 0;
	
		/* the number of characters up to the start of the matched text */
		yychar = 0;
	
		/* yy_atEOF == true <=> the scanner has returned a value for EOF */
		yy_atEOF = false;
	
		/* denotes if the user-EOF-code has already been executed */
		yy_eof_done = false;
	
	
		/* user vars: */
		fTokenCount = 0;
	 
		fShouldLoadBuffered = false;
		fBufferedContext = null;
		fBufferedStart = 1;
		fBufferedLength = 0;
		fStateStack = new IntStack();
	
		fLastInternalBlockStart = -1;
	
		context = null;
		start = 0;
		textLength = 0;
		length = 0;
	
		fEmbeddedContainer = null;
		
		fELlevel = 0;
	}
	/**
	 * user method
	 *
	 */
	public BlockTokenizer newInstance() {
		JSPTokenizer newInstance = new JSPTokenizer();
		// global tagmarkers can be shared; they have no state and 
		// are never destroyed (e.g. 'release')
		for(int i = 0; i < fBlockMarkers.size(); i++) {
			BlockMarker blockMarker = (BlockMarker) fBlockMarkers.get(i);
			if(blockMarker.isGlobal())
				newInstance.addBlockMarker(blockMarker);
		}
		for(int i = 0; i < fNestablePrefixes.size(); i++) {
			TagMarker marker = (TagMarker) fNestablePrefixes.get(i);
			if(marker.isGlobal())
				newInstance.addNestablePrefix(marker);
		}
		return newInstance;
	}
	/* user method */
	private final String scanXMLCommentText() throws IOException {
		// Scan for '-->' and return the text up to that point as
		//   XML_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which
		//  case change to the ST_XML_COMMENT_END state and return the next
		//  context as usual.
		return doScan("-->", false, true, true, XML_COMMENT_TEXT, ST_XML_COMMENT_END, ST_XML_COMMENT_END);
	}
	/* user method */
	private final String scanJSPCommentText() throws IOException {
		// Scan for '--%>' and return the text up to that point as
		//   JSP_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which
		//  case change to the ST_JSP_COMMENT_END state and return the next
		//  context as usual.
		return doScan("--%>", false, false, true, JSP_COMMENT_TEXT, ST_JSP_COMMENT_END, ST_JSP_COMMENT_END);
	}


  /**
   * Creates a new scanner
   * There is also a java.io.InputStream version of this constructor.
   *
   * @param   in  the java.io.Reader to read input from.
   */
  public JSPTokenizer(java.io.Reader in) {
    this.yy_reader = in;
  }

  /**
   * Creates a new scanner.
   * There is also java.io.Reader version of this constructor.
   *
   * @param   in  the java.io.Inputstream to read input from.
   */
  public JSPTokenizer(java.io.InputStream in) {
    this(new java.io.InputStreamReader(in));
  }

  /** 
   * Unpacks the compressed DFA transition table.
   *
   * @param packed   the packed transition table
   * @return         the unpacked transition table
   */
  private static int [] yy_unpack(String packed) {
    int [] trans = new int[31808];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 8188) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      value--;
      do trans[j++] = value; while (--count > 0);
    }
    return trans;
  }

  /** 
   * Unpacks the compressed character translation table.
   *
   * @param packed   the packed character translation table
   * @return         the unpacked character translation table
   */
  private static char [] yy_unpack_cmap(String packed) {
    char [] map = new char[0x10000];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 1376) {
      int  count = packed.charAt(i++);
      char value = packed.charAt(i++);
      do map[j++] = value; while (--count > 0);
    }
    return map;
  }


  /**
   * Gets the next input character.
   *
   * @return      the next character of the input stream, EOF if the
   *              end of the stream is reached.
   * @exception   IOException  if any I/O-Error occurs
   */
  private int yy_advance() throws java.io.IOException {

    /* standard case */
    if (yy_currentPos < yy_endRead) return yy_buffer[yy_currentPos++];

    /* if the eof is reached, we don't need to work hard */ 
    if (yy_atEOF) return YYEOF;

    /* otherwise: need to refill the buffer */

    /* first: make room (if you can) */
    if (yy_startRead > 0) {
      System.arraycopy(yy_buffer, yy_startRead, 
                       yy_buffer, 0, 
                       yy_endRead-yy_startRead);

      /* translate stored positions */
      yy_endRead-= yy_startRead;
      yy_currentPos-= yy_startRead;
      yy_markedPos-= yy_startRead;
      yy_pushbackPos-= yy_startRead;
      yy_startRead = 0;
    }

    /* is the buffer big enough? */
    if (yy_currentPos >= yy_buffer.length) {
      /* if not: blow it up */
      char newBuffer[] = new char[yy_currentPos*2];
      System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);
      yy_buffer = newBuffer;
    }

    /* finally: fill the buffer with new input */
    int numRead = yy_reader.read(yy_buffer, yy_endRead, 
                                            yy_buffer.length-yy_endRead);

    if ( numRead == -1 ) return YYEOF;

    yy_endRead+= numRead;

    return yy_buffer[yy_currentPos++];
  }

    
  /**
   * Closes the input stream.
   */
  final public void yyclose() throws java.io.IOException {
    yy_atEOF = true;            /* indicate end of file */
    yy_endRead = yy_startRead;  /* invalidate buffer    */
    yy_reader.close();
  }


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

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


  /**
   * Returns the text matched by the current regular expression.
   */
  final public String yytext() {
    return new String( yy_buffer, yy_startRead, yy_markedPos-yy_startRead );
  }

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


  /**
   * Reports an error that occured while scanning - from the SED JFlex skeleton
   *
   * @param   errorCode  the code of the errormessage to display
   */
  private void yy_ScanError(int errorCode) {
    try {
      Logger.log(Logger.ERROR, YY_ERROR_MSG[errorCode]);
    }
    catch (ArrayIndexOutOfBoundsException e) {
      Logger.log(Logger.ERROR, YY_ERROR_MSG[YY_UNKNOWN_ERROR]);
    }
    // DO NOT EXIT the VM on an error
    // System.exit(1);
  } 


  /**
   * 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()!
   */
  void yypushback(int number) {
    if ( number > yylength() )
      yy_ScanError(YY_PUSHBACK_2BIG);

    yy_markedPos -= number;
  }

	/**
	 * user method - skeleton.sed
	 */
	protected final boolean containsTagName(char[] markerTagName, int offset, int tagnameLength) {
		for(int j = 0; j < fBlockMarkers.size(); j++) {
			BlockMarker marker = (BlockMarker)fBlockMarkers.get(j);
			if(marker.getTagName().length() == tagnameLength) {
				boolean matchesSoFar = true;
				for(int i = 0; i < tagnameLength && matchesSoFar; i++) {
					if(marker.isCaseSensitive()) {
						if(marker.getTagName().charAt(i) != markerTagName[i + offset])
							matchesSoFar = false;
					}
					else {
						if(Character.toLowerCase(marker.getTagName().charAt(i)) != Character.toLowerCase(markerTagName[i + offset]))
							matchesSoFar = false;
					}
				}
				if(matchesSoFar)
					return true;
			}
		}
		return false;
	}

	/**
	 * user method - skeleton.sed
	 *
	 * Return ALL of the regions scannable within the remaining text
	 * Note: for verification use
	 */
	public final List getRegions() {
		List tokens = new ArrayList();
		ITextRegion region = null;
		try {
			region = getNextToken();
			while(region != null) {
				if (region != null) {
					tokens.add(region);
				}
				region = getNextToken();
			}
		}
		catch (StackOverflowError e) {
			Logger.logException(getClass().getName()+": input could not be tokenized correctly at position " + getOffset(), e);//$NON-NLS-1$
			throw e;
		}
		catch (Exception e) {
			// Since this is convenience method and NOT the recommended 
			// way of getting tokens, many errors are simply hidden
			Logger.logException("Exception not handled retrieving regions: " + e.getLocalizedMessage(), e);//$NON-NLS-1$
		}
		return tokens;
	}
	/**
	 * user method - skeleton.sed
	 */
	private final void dump(String s) {
		if (Debug.debugTokenizer) {
			System.out.println(s + " (" + yychar + "-" + //$NON-NLS-2$//$NON-NLS-1$
				(yylength() + yychar) + "):\'" +//$NON-NLS-1$
					StringUtils.escape(yytext()) + "\'");//$NON-NLS-1$
		}
	}
	/* user method  - skeleton.sed */
	public final boolean isEOF() {
		return yy_atEOF;
	}
/* user method - skeleton.sed */
protected final boolean containsTagName(String markerTagName) {
	Iterator blocks = fBlockMarkers.iterator();
	while(blocks.hasNext()) {
		BlockMarker marker = (BlockMarker)blocks.next();
		if(marker.isCaseSensitive()) {
			if(marker.getTagName().equals(markerTagName))
				return true;
		}
		else {
			if(marker.getTagName().equalsIgnoreCase(markerTagName))
				return true;
		}
	}
	return false;
}

  /**
   * Contains user EOF-code, which will be executed exactly once,
   * when the end of file is reached
   */
  private void yy_do_eof() {
    if (!yy_eof_done) {
      yy_eof_done = true;
    // do nothing, this is the downstream parser's job

    }
  }


  /**
   * 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   IOException  if any I/O-Error occurs
   */
  public String primGetNextToken() throws java.io.IOException {
    int yy_input;
    int yy_action;

    yy_pushbackPos = -1;
    boolean yy_was_pushback;

    while (true) {

      yychar+= yylength();

      boolean yy_counted = false;
      for (yy_currentPos = yy_startRead; yy_currentPos < yy_markedPos;
                                                      yy_currentPos++) {
        switch (yy_buffer[yy_currentPos]) {
        case '\r':
          yyline++;
          yy_counted = true;
          break;
        case '\n':
          if (yy_counted)
            yy_counted = false;
          else {
            yyline++;
          }
          break;
        default:
          yy_counted = false;
        }
      }

      if (yy_counted) {
        if ( yy_advance() == '\n' ) yyline--;
        if ( !yy_atEOF ) yy_currentPos--;
      }

      yy_action = -1;

      yy_currentPos = yy_startRead = yy_markedPos;

      yy_state = yy_lexical_state;

      yy_was_pushback = false;

      yy_forAction: {
        while (true) {
    
          yy_input = yy_advance();

          if ( yy_input == YYEOF ) break yy_forAction;

          int yy_next = yytrans[ yy_rowMap[yy_state] + yycmap[yy_input] ];
          if (yy_next == -1) break yy_forAction;
          yy_state = yy_next;

          int yy_attributes = YY_ATTRIBUTE[yy_state];
          if ( (yy_attributes & 2) > 0 )
            yy_pushbackPos = yy_currentPos;

          if ( (yy_attributes & 1) > 0 ) {
            yy_was_pushback = (yy_attributes & 4) > 0;
            yy_action = yy_state; 
            yy_markedPos = yy_currentPos; 
            if ( (yy_attributes & 8) > 0 ) break yy_forAction;
          }

        }
      }

      if (yy_was_pushback)
        yy_markedPos = yy_pushbackPos;

      switch (yy_action) {    

        case 613: 
        case 618: 
        case 625: 
        case 630: 
          { 
	if(Debug.debugTokenizer)
		dump("jsp directive tag name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return JSP_DIRECTIVE_NAME;
 }
        case 646: break;
        case 588: 
          { 
	if(Debug.debugTokenizer)
		dump("XSL processing instruction target");//$NON-NLS-1$
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 647: break;
        case 571: 
        case 574: 
        case 575: 
        case 576: 
        case 577: 
        case 578: 
        case 579: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCDATA start");//$NON-NLS-1$
	fStateStack.push(yystate());
	yybegin(ST_CDATA_TEXT);
	return XML_CDATA_OPEN;
 }
        case 648: break;
        case 563: 
          { 
	if(Debug.debugTokenizer)
		dump("jsp:root tag name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return JSP_ROOT_TAG_NAME;
 }
        case 649: break;
        case 554: 
          { 
	if(Debug.debugTokenizer)
		dump("element");//$NON-NLS-1$
	yybegin(ST_XML_ELEMENT_DECLARATION);
	return XML_ELEMENT_DECLARATION;
 }
        case 650: break;
        case 553: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist");//$NON-NLS-1$
	yybegin(ST_XML_ATTLIST_DECLARATION);
	return XML_ATTLIST_DECLARATION;
 }
        case 651: break;
        case 552: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_DECLARATION);
	return XML_DOCTYPE_DECLARATION;
 }
        case 652: break;
        case 537: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype external id");//$NON-NLS-1$
	fEmbeddedHint = XML_DOCTYPE_EXTERNAL_ID_PUBREF;
	yybegin(ST_XML_DOCTYPE_ID_PUBLIC);
	return XML_DOCTYPE_EXTERNAL_ID_PUBLIC;
 }
        case 653: break;
        case 536: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype external id");//$NON-NLS-1$
	fEmbeddedHint = XML_DOCTYPE_EXTERNAL_ID_SYSREF;
	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
	return XML_DOCTYPE_EXTERNAL_ID_SYSTEM;
 }
        case 654: break;
        case 530: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_DHTML_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 655: break;
        case 505: 
        case 546: 
        case 547: 
          { 
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 656: break;
        case 495: 
        case 542: 
        case 543: 
          { 
	return JSP_EL_QUOTED_CONTENT;
 }
        case 657: break;
        case 487: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment close");//$NON-NLS-1$
	yybegin(YYINITIAL);
	return JSP_COMMENT_CLOSE;
 }
        case 658: break;
        case 474: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	if(yylength() > 2)
		yypushback(yylength() -2);
	if(Debug.debugTokenizer)
		dump("VBL in attr value");//$NON-NLS-1$
	yybegin(ST_JSP_VBL);
	fELlevel++;
	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE});
	fStateStack.pop();
	yybegin(ST_XML_ATTRIBUTE_NAME);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	return PROXY_CONTEXT;
 }
        case 659: break;
        case 473: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	if(yylength() > 2)
		yypushback(yylength() -2);
	if(Debug.debugTokenizer)
		dump("EL in attr value");//$NON-NLS-1$
	yybegin(ST_JSP_EL);
	fELlevel++;
	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE});
	fStateStack.pop();
	yybegin(ST_XML_ATTRIBUTE_NAME);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	return PROXY_CONTEXT;
 }
        case 660: break;
        case 467: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCharRef");//$NON-NLS-1$
	return XML_CHAR_REFERENCE;
 }
        case 661: break;
        case 464: 
          { 
	if(Debug.debugTokenizer)
		dump("\ncomment start");//$NON-NLS-1$
	fEmbeddedHint = XML_COMMENT_TEXT;
	fEmbeddedPostState = ST_XML_COMMENT;
	yybegin(ST_XML_COMMENT);
	return XML_COMMENT_OPEN;
 }
        case 662: break;
        case 463: 
        case 482: 
        case 485: 
        case 488: 
        case 489: 
        case 491: 
        case 493: 
        case 496: 
        case 498: 
        case 499: 
        case 501: 
        case 503: 
        case 506: 
          { 
	/* JSP comment begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(3);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(4);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(4);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(4);
		return scanJSPCommentText();
	}
	else if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN)  {
		yybegin(ST_JSP_COMMENT);
		assembleEmbeddedContainer(JSP_COMMENT_OPEN, JSP_COMMENT_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN)
			yybegin(ST_BLOCK_TAG_SCAN);
		return PROXY_CONTEXT;
	}
	// finished sanity checks
	if(yystate()==YYINITIAL) {
		// the simple case, just a regular scriptlet out in content
		if(Debug.debugTokenizer)
			dump("\nJSP comment start");//$NON-NLS-1$
		yybegin(ST_JSP_COMMENT);
		return JSP_COMMENT_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP comment start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_COMMENT);
		// the comment container itself will act as comment text
		fEmbeddedHint = JSP_COMMENT_TEXT;
		assembleEmbeddedContainer(JSP_COMMENT_OPEN, JSP_COMMENT_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		/*
		 * required help for successive embedded regions; mark this one as a
		 * comment so it will be otherwise ignored but preserved (which is why
		 * we can't use white-space)
		 */
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		return PROXY_CONTEXT;
	}
 }
        case 663: break;
        case 384: 
        case 385: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 664: break;
        case 383: 
          { 
	if(Debug.debugTokenizer)
		dump("comment end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	yybegin(YYINITIAL);
	return XML_COMMENT_CLOSE;
 }
        case 665: break;
        case 382: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA end");//$NON-NLS-1$
	yybegin(fStateStack.pop());
	return XML_CDATA_CLOSE;
 }
        case 666: break;
        case 381: 
          { 
	yybegin(ST_JSP_VBL);
	if(yylength() > 2)
		yypushback(yylength() - 2);
	fELlevel++;
	fEmbeddedHint = XML_CONTENT;
	fEmbeddedPostState = YYINITIAL;
	assembleEmbeddedContainer(JSP_VBL_OPEN, JSP_VBL_CLOSE);
	fEmbeddedHint = XML_CONTENT;
	yybegin(YYINITIAL);
	return PROXY_CONTEXT;
 }
        case 667: break;
        case 380: 
          { 
	if(Debug.debugTokenizer)
		dump("\nPEReference");//$NON-NLS-1$
	return XML_PE_REFERENCE;
 }
        case 668: break;
        case 379: 
          { 
	yybegin(ST_JSP_EL);
	if(yylength() > 2)
		yypushback(yylength() - 2);
	fELlevel++;
	fEmbeddedHint = XML_CONTENT;
	fEmbeddedPostState = YYINITIAL;
	assembleEmbeddedContainer(JSP_EL_OPEN, JSP_EL_CLOSE);
	fEmbeddedHint = XML_CONTENT;
	yybegin(YYINITIAL);
	return PROXY_CONTEXT;
 }
        case 669: break;
        case 376: 
          { 
	if(Debug.debugTokenizer)
		dump("\nEntityRef");//$NON-NLS-1$
	return XML_ENTITY_REFERENCE;
 }
        case 670: break;
        case 370: 
        case 409: 
        case 416: 
        case 422: 
        case 426: 
        case 430: 
        case 434: 
        case 439: 
        case 444: 
        case 447: 
        case 451: 
        case 455: 
        case 460: 
          { 
	/* JSP expression begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(2);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(3);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(3);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(3);
		return scanJSPCommentText();
	}
	// end sanity checks
	fStateStack.push(yystate());
	if(fStateStack.peek()==YYINITIAL) {
		// the simple case, just an expression out in content
		if(Debug.debugTokenizer)
			dump("\nJSP expression start");//$NON-NLS-1$
		yybegin(ST_JSP_CONTENT);
		return JSP_EXPRESSION_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP expression start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_CONTENT);
		assembleEmbeddedContainer(JSP_EXPRESSION_OPEN, JSP_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		// required help for successive embedded regions
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		return PROXY_CONTEXT;
	}
 }
        case 671: break;
        case 369: 
        case 408: 
        case 415: 
        case 421: 
        case 425: 
        case 429: 
        case 433: 
        case 438: 
        case 443: 
        case 446: 
        case 450: 
        case 454: 
        case 459: 
          { 
	/* JSP declaration begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(2);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(3);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(3);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(3);
		return scanJSPCommentText();
	}
	// end sanity checks
	fStateStack.push(yystate());
	if(fStateStack.peek()==YYINITIAL) {
		// the simple case, just a declaration out in content
		if(Debug.debugTokenizer)
			dump("\nJSP declaration start");//$NON-NLS-1$
		yybegin(ST_JSP_CONTENT);
		return JSP_DECLARATION_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP declaration start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_CONTENT);
		assembleEmbeddedContainer(JSP_DECLARATION_OPEN, JSP_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		// required help for successive embedded regions
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		return PROXY_CONTEXT;
	}
 }
        case 672: break;
        case 368: 
          { 
	fStateStack.push(yystate());
	if(fStateStack.peek()==YYINITIAL) {
		if(Debug.debugTokenizer)
			dump("\nJSP directive start");//$NON-NLS-1$
		yybegin(ST_JSP_DIRECTIVE_NAME);
		return JSP_DIRECTIVE_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP directive start");//$NON-NLS-1$
		yybegin(ST_JSP_DIRECTIVE_NAME);
		assembleEmbeddedContainer(JSP_DIRECTIVE_OPEN, new String[]{JSP_DIRECTIVE_CLOSE, JSP_CLOSE});
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		return PROXY_CONTEXT;
	}
 }
        case 673: break;
        case 358: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 674: break;
        case 354: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 675: break;
        case 352: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_VBL_OPEN;
	}
 }
        case 676: break;
        case 342: 
          { 
	yybegin(ST_JSP_EL_DQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 677: break;
        case 338: 
          { 
	yybegin(ST_JSP_EL_SQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 678: break;
        case 336: 
          { 
	//System.out.println(JSP_EL_CONTENT+ ":[" + yytext() + "]");
	return JSP_EL_CONTENT;
 }
        case 679: break;
        case 335: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_EL_OPEN;
	}
 }
        case 680: break;
        case 332: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_DQUOTED_VBL);
	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE});
	// abort early when an unescaped double quote is found in the VBL
	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 681: break;
        case 331: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_DQUOTED_EL);
	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE});
	// abort early when an unescaped double quote is found in the EL
	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 682: break;
        case 329: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_SQUOTED_VBL);
	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE});
	// abort early when an unescaped single quote is found in the VBL
	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 683: break;
        case 328: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_SQUOTED_EL);
	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE});
	// abort early when an unescaped single quote is found in the EL
	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 684: break;
        case 327: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
	}
	int incomingState = yystate();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	if(Debug.debugTokenizer)
		dump("JSP attribute value start - end tag");//$NON-NLS-1$
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedContainer(XML_END_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});
	if(yystate() != ST_ABORT_EMBEDDED)
        yybegin(incomingState);
	return PROXY_CONTEXT;
 }
        case 685: break;
        case 286: 
        case 298: 
        case 304: 
          { 
	return XML_DOCTYPE_INTERNAL_SUBSET;
 }
        case 686: break;
        case 274: 
          { 
	String tagName = yytext().substring(1);
	// pushback to just after the opening bracket
	yypushback(yylength() - 1);
	/*
	 * If this tag can not be nested or we're already searching for an
	 * attribute name, equals, or value, return immediately.
	 */
	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE))) {
		yybegin(ST_XML_TAG_NAME);
		return XML_TAG_OPEN;
	}
	if(Debug.debugTokenizer)
		dump("tag in place of attr value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	// embedded container should be looking for the name (again) next
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?
	fStateStack.pop();
	yybegin(ST_XML_ATTRIBUTE_NAME);
	return PROXY_CONTEXT;
 }
        case 687: break;
        case 272: 
          { 
	String tagName = yytext().substring(1);
	// pushback to just after the opening bracket
	yypushback(yylength() - 1);
	/*
	 * If this tag can not be nested or we're already searching for an
	 * attribute name, equals, or value, return immediately.
	 */
	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE))) {
		yybegin(ST_XML_TAG_NAME);
		return XML_TAG_OPEN;
	}
	if(Debug.debugTokenizer)
		dump("tag in place of attr name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	// embedded container should be looking for the name (again) next
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?
	fStateStack.pop();
	yybegin(ST_XML_EQUALS);
	return PROXY_CONTEXT;
 }
        case 688: break;
        case 270: 
          { 
        yybegin(YYINITIAL);
	fEmbeddedHint = UNDEFINED;
	if(Debug.debugTokenizer)
		dump("empty tag close");//$NON-NLS-1$
        return XML_EMPTY_TAG_CLOSE;
 }
        case 689: break;
        case 126: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
	yybegin(ST_XML_ATTRIBUTE_VALUE_DQUOTED);
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("JSP attribute value start - complex double quoted");//$NON-NLS-1$
	assembleEmbeddedContainer(XML_TAG_ATTRIBUTE_VALUE_DQUOTE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE);
	fStateStack.pop();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	yybegin(ST_XML_ATTRIBUTE_NAME);
	return PROXY_CONTEXT;
 }
        case 690: break;
        case 124: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("JSP tag embedded name start - start tag");//$NON-NLS-1$
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedContainer(XML_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});
	fStateStack.pop();
        yybegin(ST_XML_ATTRIBUTE_NAME);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	return PROXY_CONTEXT;
 }
        case 691: break;
        case 123: 
        case 128: 
        case 129: 
        case 276: 
        case 280: 
        case 281: 
        case 390: 
        case 393: 
        case 472: 
          { 
	if(Debug.debugTokenizer)
		dump("attr value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 692: break;
        case 122: 
          { 
	if(Debug.debugTokenizer)
		dump("equals");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 693: break;
        case 121: 
          { 
	if(Debug.debugTokenizer)
		dump("attr name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 694: break;
        case 117: 
        case 118: 
        case 119: 
        case 271: 
        case 389: 
        case 471: 
        case 511: 
        case 512: 
        case 531: 
        case 532: 
        case 550: 
        case 551: 
        case 564: 
        case 573: 
        case 581: 
        case 583: 
        case 585: 
        case 587: 
        case 590: 
        case 596: 
        case 597: 
        case 598: 
        case 599: 
        case 600: 
        case 606: 
        case 607: 
        case 608: 
        case 609: 
        case 610: 
        case 616: 
        case 617: 
        case 619: 
        case 620: 
        case 626: 
        case 627: 
        case 628: 
        case 629: 
        case 635: 
        case 636: 
        case 637: 
        case 638: 
        case 641: 
        case 642: 
        case 644: 
          { 
	if(Debug.debugTokenizer)
		dump("tag name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 695: break;
        case 115: 
          { 
	if(Debug.debugTokenizer)
		dump("tag close");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	if(isBlockMarker()) {
		fEmbeddedHint = getBlockMarkerContext();
		fEmbeddedPostState = ST_BLOCK_TAG_SCAN;
        	yybegin(ST_BLOCK_TAG_SCAN);
	}
	else
        	yybegin(YYINITIAL);
        return XML_TAG_CLOSE;
 }
        case 696: break;
        case 108: 
        case 112: 
        case 266: 
          { 
	if(Debug.debugTokenizer)
		dump("attr value");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 697: break;
        case 107: 
          { 
	if(Debug.debugTokenizer)
		dump("equals");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 698: break;
        case 106: 
          { 
	if(Debug.debugTokenizer)
		dump("attr name");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 699: break;
        case 103: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP directive name");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_NAME_WHITESPACE);
	return JSP_DIRECTIVE_NAME;
 }
        case 700: break;
        case 99: 
        case 100: 
        case 101: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP code content");//$NON-NLS-1$
	return doScan("%>", false, false, false, JSP_CONTENT, ST_JSP_CONTENT, ST_JSP_CONTENT);
 }
        case 701: break;
        case 95: 
        case 97: 
        case 98: 
        case 256: 
        case 257: 
        case 260: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction attribute value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_DHTML_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 702: break;
        case 94: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction '='");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_DHTML_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 703: break;
        case 93: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_DHTML_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 704: break;
        case 91: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 705: break;
        case 85: 
        case 87: 
        case 247: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction attribute value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 706: break;
        case 84: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction '='");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_PI_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 707: break;
        case 50: 
        case 201: 
        case 202: 
        case 205: 
        case 215: 
        case 216: 
        case 219: 
        case 220: 
        case 363: 
        case 366: 
        case 442: 
        case 453: 
        case 458: 
          { 
	return JSP_VBL_CONTENT;
 }
        case 708: break;
        case 43: 
        case 180: 
        case 181: 
        case 184: 
        case 194: 
        case 195: 
        case 198: 
        case 199: 
        case 333: 
        case 347: 
        case 350: 
        case 419: 
        case 420: 
        case 432: 
        case 437: 
          { 
	return JSP_EL_CONTENT;
 }
        case 709: break;
        case 35: 
        case 160: 
        case 161: 
        case 324: 
        case 414: 
        case 417: 
        case 486: 
        case 519: 
        case 539: 
        case 556: 
        case 566: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist contentspec");//$NON-NLS-1$
	return XML_ATTLIST_DECL_CONTENT;
 }
        case 710: break;
        case 33: 
        case 153: 
        case 154: 
        case 314: 
        case 407: 
        case 410: 
        case 483: 
        case 518: 
        case 538: 
        case 555: 
        case 565: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl contentspec");//$NON-NLS-1$
	return XML_ELEMENT_DECL_CONTENT;
 }
        case 711: break;
        case 22: 
        case 113: 
          { 
	if(Debug.debugTokenizer)
		dump("inappropriate tag name");//$NON-NLS-1$
	if(!fStateStack.empty() && (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_SQUOTED||fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_DQUOTED)) {
		yybegin(ST_ABORT_EMBEDDED);
		yypushback(yylength()-1);
		return XML_TAG_ATTRIBUTE_VALUE;
	}
	yybegin(YYINITIAL);
        return XML_CONTENT;
 }
        case 712: break;
        case 18: 
        case 105: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
	return WHITE_SPACE;
 }
        case 713: break;
        case 5: 
        case 8: 
        case 9: 
        case 10: 
        case 12: 
        case 13: 
        case 14: 
        case 15: 
        case 17: 
        case 19: 
        case 20: 
        case 21: 
        case 23: 
        case 24: 
        case 25: 
        case 26: 
        case 27: 
        case 28: 
        case 29: 
        case 30: 
        case 31: 
        case 32: 
        case 34: 
        case 40: 
        case 41: 
        case 73: 
        case 171: 
        case 176: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
        return WHITE_SPACE;
 }
        case 714: break;
        case 0: 
        case 57: 
        case 60: 
        case 62: 
        case 227: 
        case 229: 
        case 230: 
        case 232: 
        case 234: 
        case 373: 
        case 374: 
        case 375: 
        case 466: 
          { 
	if(Debug.debugTokenizer)
		dump("\nXML content");//$NON-NLS-1$
	return XML_CONTENT;
 }
        case 715: break;
        case 58: 
        case 102: 
        case 114: 
        case 120: 
        case 130: 
          { 
	if(Debug.debugTokenizer)
		dump("\nstart tag open");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_TAG_NAME);
        return XML_TAG_OPEN;
 }
        case 716: break;
        case 59: 
        case 61: 
        case 65: 
        case 66: 
        case 67: 
        case 71: 
        case 72: 
        case 82: 
        case 86: 
        case 88: 
        case 89: 
        case 90: 
        case 92: 
        case 96: 
        case 104: 
        case 109: 
        case 110: 
        case 111: 
        case 116: 
        case 125: 
        case 132: 
        case 133: 
        case 134: 
        case 135: 
        case 137: 
        case 138: 
        case 140: 
        case 141: 
        case 142: 
        case 145: 
        case 146: 
        case 147: 
        case 150: 
        case 151: 
        case 152: 
        case 157: 
        case 158: 
        case 159: 
        case 165: 
        case 168: 
        case 173: 
        case 174: 
        case 178: 
        case 179: 
        case 186: 
        case 187: 
        case 189: 
        case 190: 
        case 196: 
        case 200: 
        case 207: 
        case 208: 
        case 210: 
        case 211: 
        case 217: 
        case 221: 
          { 
	if (Debug.debugTokenizer)
		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$
			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$
	return UNDEFINED;
 }
        case 717: break;
        case 63: 
        case 64: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA text");//$NON-NLS-1$
	fEmbeddedPostState = ST_CDATA_TEXT;
	fEmbeddedHint = XML_CDATA_TEXT;
	String returnedContext = doScan("]]>", false, true, true, XML_CDATA_TEXT, ST_CDATA_END,  ST_CDATA_END);//$NON-NLS-1$
	if(returnedContext == XML_CDATA_TEXT)
		yybegin(ST_CDATA_END);
	return returnedContext;
 }
        case 718: break;
        case 68: 
        case 188: 
        case 191: 
        case 209: 
        case 212: 
          { 
	if(Debug.debugTokenizer)
		dump("LINE FEED");//$NON-NLS-1$
	return WHITE_SPACE;
 }
        case 719: break;
        case 69: 
        case 70: 
          { 
	if(Debug.debugTokenizer)
		dump("comment content");//$NON-NLS-1$
	return scanXMLCommentText();
 }
        case 720: break;
        case 74: 
        case 75: 
        case 76: 
        case 77: 
        case 240: 
        case 241: 
        case 242: 
        case 386: 
        case 469: 
        case 470: 
        case 509: 
        case 510: 
        case 529: 
        case 549: 
        case 562: 
        case 572: 
        case 580: 
        case 582: 
        case 584: 
        case 586: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_CONTENT;
        yybegin(ST_PI_WS);
        return XML_TAG_NAME;
 }
        case 721: break;
        case 78: 
          { 
        yybegin(ST_PI_CONTENT);
        return WHITE_SPACE;
 }
        case 722: break;
        case 79: 
        case 80: 
        case 81: 
          { 
		// block scan until close is found
	return doScan("?>", false, false, false, XML_PI_CONTENT, ST_XML_PI_TAG_CLOSE, ST_XML_PI_TAG_CLOSE);
 }
        case 723: break;
        case 83: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_XML_PI_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 724: break;
        case 127: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
	yybegin(ST_XML_ATTRIBUTE_VALUE_SQUOTED);
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("JSP attribute value start - complex single quoted");//$NON-NLS-1$
	assembleEmbeddedContainer(XML_TAG_ATTRIBUTE_VALUE_SQUOTE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE);
	fStateStack.pop();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
	return PROXY_CONTEXT;
 }
        case 725: break;
        case 131: 
          { 
	if(Debug.debugTokenizer)
		dump("declaration end");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return XML_DECLARATION_CLOSE;
 }
        case 726: break;
        case 136: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype type");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);
	return XML_DOCTYPE_NAME;
 }
        case 727: break;
        case 139: 
        case 143: 
        case 291: 
        case 295: 
        case 402: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype public reference");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	fEmbeddedPostState = YYINITIAL;
	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
	return XML_DOCTYPE_EXTERNAL_ID_PUBREF;
 }
        case 728: break;
        case 144: 
        case 148: 
        case 301: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype system reference");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	fEmbeddedPostState = YYINITIAL;
	yybegin(ST_XML_DECLARATION_CLOSE);
	return XML_DOCTYPE_EXTERNAL_ID_SYSREF;
 }
        case 729: break;
        case 149: 
        case 307: 
        case 311: 
        case 405: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl name");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	fEmbeddedPostState = YYINITIAL;
	yybegin(ST_XML_ELEMENT_DECLARATION_CONTENT);
	return XML_ELEMENT_DECL_NAME;
 }
        case 730: break;
        case 155: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl close");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return XML_DECLARATION_CLOSE;
 }
        case 731: break;
        case 156: 
        case 317: 
        case 321: 
        case 412: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist name");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	fEmbeddedPostState = YYINITIAL;
	yybegin(ST_XML_ATTLIST_DECLARATION_CONTENT);
	return XML_ATTLIST_DECL_NAME;
 }
        case 732: break;
        case 162: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist close");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return XML_DECLARATION_CLOSE;
 }
        case 733: break;
        case 166: 
        case 167: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment text");//$NON-NLS-1$
	return scanJSPCommentText();
 }
        case 734: break;
        case 169: 
        case 175: 
          { 
	return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 735: break;
        case 170: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
	}
	int incomingState = yystate();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	if(Debug.debugTokenizer)
		dump("tag inside of JSP attribute value start");//$NON-NLS-1$
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedContainer(XML_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});
	if(yystate() != ST_ABORT_EMBEDDED)
        yybegin(incomingState);
	return PROXY_CONTEXT;
 }
        case 736: break;
        case 172: 
          { 
	return XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
 }
        case 737: break;
        case 177: 
          { 
	return XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 738: break;
        case 182: 
          { 
	yybegin(ST_JSP_EL_DQUOTES);
	return JSP_EL_DQUOTE;
 }
        case 739: break;
        case 183: 
          { 
	yybegin(ST_JSP_EL_SQUOTES);
	return JSP_EL_SQUOTE;
 }
        case 740: break;
        case 185: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_EL_CLOSE;
	}
	return JSP_EL_CONTENT;
 }
        case 741: break;
        case 192: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_SQUOTE;
 }
        case 742: break;
        case 193: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_DQUOTE;
 }
        case 743: break;
        case 197: 
          { 
	return JSP_EL_CLOSE;
 }
        case 744: break;
        case 203: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES);
	return JSP_VBL_DQUOTE;
 }
        case 745: break;
        case 204: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES);
	return JSP_VBL_SQUOTE;
 }
        case 746: break;
        case 206: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_VBL_CLOSE;
	}
	return JSP_VBL_CONTENT;
 }
        case 747: break;
        case 213: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_SQUOTE;
 }
        case 748: break;
        case 214: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_DQUOTE;
 }
        case 749: break;
        case 218: 
          { 
	return JSP_VBL_CLOSE;
 }
        case 750: break;
        case 222: 
          { 
	if(Debug.debugTokenizer)
		dump("\nend tag open");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_TAG_NAME);
        return XML_END_TAG_OPEN;
 }
        case 751: break;
        case 223: 
          { 
	if(Debug.debugTokenizer)
		dump("\nprocessing instruction start");//$NON-NLS-1$
	yybegin(ST_PI);
        return XML_PI_OPEN;
 }
        case 752: break;
        case 224: 
        case 235: 
        case 313: 
        case 323: 
        case 334: 
        case 339: 
        case 343: 
        case 346: 
        case 349: 
        case 351: 
        case 355: 
        case 359: 
        case 362: 
        case 365: 
          { 
	/* JSP scriptlet begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(1);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(2);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(2);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(2);
		return scanJSPCommentText();
	}
	// finished sanity checks
	fStateStack.push(yystate());
	if(fStateStack.peek()==YYINITIAL) {
		// the simple case, just a regular scriptlet out in content
		if(Debug.debugTokenizer)
			dump("\nJSP scriptlet start");//$NON-NLS-1$
		yybegin(ST_JSP_CONTENT);
		return JSP_SCRIPTLET_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP scriptlet start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_CONTENT);
		assembleEmbeddedContainer(JSP_SCRIPTLET_OPEN, JSP_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		// required help for successive embedded regions
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		return PROXY_CONTEXT;
	}
 }
        case 753: break;
        case 225: 
          { 
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("\ndeclaration start");//$NON-NLS-1$
        yybegin(ST_XML_DECLARATION);
	return XML_DECLARATION_OPEN;
 }
        case 754: break;
        case 239: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 755: break;
        case 243: 
          { 
		// ended with nothing inside
		fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 756: break;
        case 244: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 757: break;
        case 261: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP end");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return JSP_CLOSE;
 }
        case 758: break;
        case 263: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP end");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return JSP_DIRECTIVE_CLOSE;
 }
        case 759: break;
        case 163: 
        case 164: 
          { 
		return doBlockTagScan();
	 }
        case 760: break;
        default: 
          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
            yy_atEOF = true;
            yy_do_eof();
              return null;
          } 
          else {
            yy_ScanError(YY_NO_MATCH);
          }
      }
    }
  }    


}
