/* The following code was generated by JFlex 1.2.2 on 11/29/12 5:08 PM */

/*******************************************************************************
 * Copyright (c) 2004, 2012 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
 *     Frits Jalvingh - contributions for bug 150794
 *******************************************************************************/

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.contenttype.IntStack;
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;


/**
 * This class is a scanner generated by 
 * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
 * on 11/29/12 5:08 PM from the specification file
 * <tt>file:/Users/dev/git/wtp/webtools.sourceediting/bundles/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 = 42;
  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 = 41;
  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 = 37;
  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;
  final public static int ST_JSP_ATTRIBUTE_VALUE = 40;

  /** 
   * Translates characters to character classes
   */
  final private static String yycmap_packed = 
    "\11\0\1\5\1\27\2\0\1\20\22\0\1\20\1\26\1\12\1\66"+
    "\1\15\1\23\1\13\1\14\1\25\1\25\1\25\1\25\1\25\1\7"+
    "\1\6\1\3\12\21\1\11\1\73\1\1\1\52\1\2\1\4\1\22"+
    "\1\41\1\74\1\37\1\40\1\56\1\71\1\63\1\63\1\64\1\63"+
    "\1\63\1\34\1\32\1\65\1\53\1\55\1\63\1\70\1\67\1\42"+
    "\1\72\2\63\1\30\1\54\1\63\1\36\1\17\1\24\1\0\1\10"+
    "\1\0\1\60\1\104\1\75\1\61\1\44\1\71\1\76\1\106\1\47"+
    "\1\101\1\63\1\35\1\33\1\51\1\50\1\102\1\63\1\45\1\46"+
    "\1\57\1\103\1\43\1\63\1\31\1\62\1\63\1\16\1\0\1\105"+
    "\71\0\1\100\10\0\27\77\1\0\37\77\1\0\72\77\2\0\13\77"+
    "\2\0\10\77\1\0\65\77\1\0\104\77\11\0\44\77\3\0\2\77"+
    "\4\0\36\77\70\0\131\77\22\0\7\77\16\0\2\100\56\0\106\100"+
    "\32\0\2\100\44\0\1\77\1\100\3\77\1\0\1\77\1\0\24\77"+
    "\1\0\54\77\1\0\7\77\3\0\1\77\1\0\1\77\1\0\1\77"+
    "\1\0\1\77\1\0\22\77\15\0\14\77\1\0\102\77\1\0\14\77"+
    "\1\0\44\77\1\0\4\100\11\0\65\77\2\0\2\77\2\0\2\77"+
    "\3\0\34\77\2\0\10\77\2\0\2\77\67\0\46\77\2\0\1\77"+
    "\7\0\46\77\12\0\21\100\1\0\27\100\1\0\3\100\1\0\1\100"+
    "\1\0\2\100\1\0\1\100\13\0\33\77\5\0\3\77\56\0\32\77"+
    "\5\0\1\100\12\77\10\100\15\0\12\100\6\0\1\100\107\77\2\0"+
    "\5\77\1\0\17\77\1\0\4\77\1\0\1\77\17\100\2\77\2\100"+
    "\1\0\4\100\2\0\12\100\u0207\0\3\100\1\0\65\77\2\0\1\100"+
    "\1\77\20\100\3\0\4\100\3\0\12\77\2\100\2\0\12\100\21\0"+
    "\3\100\1\0\10\77\2\0\2\77\2\0\26\77\1\0\7\77\1\0"+
    "\1\77\3\0\4\77\2\0\1\100\1\0\7\100\2\0\2\100\2\0"+
    "\3\100\11\0\1\100\4\0\2\77\1\0\3\77\2\100\2\0\12\100"+
    "\2\77\20\0\1\100\2\0\6\77\4\0\2\77\2\0\26\77\1\0"+
    "\7\77\1\0\2\77\1\0\2\77\1\0\2\77\2\0\1\100\1\0"+
    "\5\100\4\0\2\100\2\0\3\100\13\0\4\77\1\0\1\77\7\0"+
    "\12\100\2\100\3\77\14\0\3\100\1\0\7\77\1\0\1\77\1\0"+
    "\3\77\1\0\26\77\1\0\7\77\1\0\2\77\1\0\5\77\2\0"+
    "\1\100\1\77\10\100\1\0\3\100\1\0\3\100\22\0\1\77\5\0"+
    "\12\100\21\0\3\100\1\0\10\77\2\0\2\77\2\0\26\77\1\0"+
    "\7\77\1\0\2\77\2\0\4\77\2\0\1\100\1\77\6\100\3\0"+
    "\2\100\2\0\3\100\10\0\2\100\4\0\2\77\1\0\3\77\4\0"+
    "\12\100\22\0\2\100\1\0\6\77\3\0\3\77\1\0\4\77\3\0"+
    "\2\77\1\0\1\77\1\0\2\77\3\0\2\77\3\0\3\77\3\0"+
    "\10\77\1\0\3\77\4\0\5\100\3\0\3\100\1\0\4\100\11\0"+
    "\1\100\17\0\11\100\21\0\3\100\1\0\10\77\1\0\3\77\1\0"+
    "\27\77\1\0\12\77\1\0\5\77\4\0\7\100\1\0\3\100\1\0"+
    "\4\100\7\0\2\100\11\0\2\77\4\0\12\100\22\0\2\100\1\0"+
    "\10\77\1\0\3\77\1\0\27\77\1\0\12\77\1\0\5\77\4\0"+
    "\7\100\1\0\3\100\1\0\4\100\7\0\2\100\7\0\1\77\1\0"+
    "\2\77\4\0\12\100\22\0\2\100\1\0\10\77\1\0\3\77\1\0"+
    "\27\77\1\0\20\77\4\0\6\100\2\0\3\100\1\0\4\100\11\0"+
    "\1\100\10\0\2\77\4\0\12\100\221\0\56\77\1\0\1\77\1\100"+
    "\2\77\7\100\5\0\6\77\1\100\10\100\1\0\12\100\47\0\2\77"+
    "\1\0\1\77\2\0\2\77\1\0\1\77\2\0\1\77\6\0\4\77"+
    "\1\0\7\77\1\0\3\77\1\0\1\77\1\0\1\77\2\0\2\77"+
    "\1\0\2\77\1\0\1\77\1\100\2\77\6\100\1\0\2\100\1\77"+
    "\2\0\5\77\1\0\1\100\1\0\6\100\2\0\12\100\76\0\2\100"+
    "\6\0\12\100\13\0\1\100\1\0\1\100\1\0\1\100\4\0\2\100"+
    "\10\77\1\0\41\77\7\0\24\100\1\0\6\100\4\0\6\100\1\0"+
    "\1\100\1\0\25\100\3\0\7\100\1\0\1\100\346\0\46\77\12\0"+
    "\47\77\11\0\1\77\1\0\2\77\1\0\3\77\1\0\1\77\1\0"+
    "\2\77\1\0\5\77\51\0\1\77\1\0\1\77\1\0\1\77\13\0"+
    "\1\77\1\0\1\77\1\0\1\77\3\0\2\77\3\0\1\77\5\0"+
    "\3\77\1\0\1\77\1\0\1\77\1\0\1\77\1\0\1\77\3\0"+
    "\2\77\3\0\2\77\1\0\1\77\50\0\1\77\11\0\1\77\2\0"+
    "\1\77\2\0\2\77\7\0\2\77\1\0\1\77\1\0\7\77\50\0"+
    "\1\77\4\0\1\77\10\0\1\77\u0c06\0\234\77\4\0\132\77\6\0"+
    "\26\77\2\0\6\77\2\0\46\77\2\0\6\77\2\0\10\77\1\0"+
    "\1\77\1\0\1\77\1\0\1\77\1\0\37\77\2\0\65\77\1\0"+
    "\7\77\1\0\1\77\3\0\3\77\1\0\7\77\3\0\4\77\2\0"+
    "\6\77\4\0\15\77\5\0\3\77\1\0\7\77\323\0\15\100\4\0"+
    "\1\100\104\0\1\77\3\0\2\77\2\0\1\77\121\0\3\77\u0e82\0"+
    "\1\100\1\0\1\77\31\0\11\77\6\100\1\0\5\100\13\0\124\77"+
    "\4\0\2\100\2\0\2\100\2\0\132\77\1\0\3\100\6\0\50\77"+
    "\u1cd3\0\u51a6\77\u0c5a\0\u2ba4\77\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,  4615,  4544,  4615,  4686,  4544, 
     4544,  4615,  4757,  4828,  4899,  4970,  5041,  5112,  5183,  5254, 
     4544,  4615,  5325,  5396,  5467,  4544,  5538,  5538,  5609,  5680, 
     5751,  5325,  4544,  5822,  5893,  4544,  5964,  6035,  6106,  6177, 
     4544,  4615,  6248,  6319,  6390,  6461,  6532,  6603,  4544,  6674, 
     6674,  6745,  6816,  6887,  6958,  7029,  4544,  7100,  7171,  7242, 
     7313,  7384,  7455,  7526,  7597,  4544,  7668,  7739,  7810,  7881, 
     7952,  8023,  8094,  8165,  4544,  8236,  8307,  8378,  8449,  8520, 
     8591,  8662,  8733,  8733,  8804,  8875,  8946,  9017,  9017,  9088, 
     9159,  9230,  9301,  9301,  9372,  9443,  9514,  9585,  4544,  9656, 
     9656,  9727,  9798,  9869,  9940,  4544,  4544,  4615,  4544,  4615, 
    10011, 10082,  7739, 10153, 10224, 10295, 10366, 10437, 10508, 10579, 
    10650,  4544, 10721, 10792, 10863, 10934,  4544, 11005, 11076, 11147, 
    11218,  4544,  4544, 11289,  4544, 11360, 11431,  4544, 11360, 11502, 
    11573,  4544, 11502, 11644, 11715,  4544, 11786,  4544, 11857, 11928, 
    11999, 12070, 12141,  4544,  4544, 12212,  4544, 12283, 12354,  4544, 
    12283, 12425, 12496,  4544, 12425, 12567, 12638, 12709,  4544, 12780, 
    12851, 12922,  4544,  4544, 12993, 13064, 13135, 13206, 13277, 13348, 
    13419, 13490, 13561, 13632, 13703, 13774, 13845, 13916, 13987,  4544, 
    14058, 14129, 14200,  4544,  4544,  5538,  5680,  4544, 14271, 14342, 
     5751, 14413, 14484,  5822,  5964,  6035, 14555,  6106,  4544, 14626, 
    14697, 14768,  6177, 14839, 14910,  4544, 13064,  4544,  6674,  6745, 
     4544, 14981, 15052,  6816, 15123, 15194,  4544, 15265, 15336, 15407, 
    15478,  7668, 15549,  7881,  4544, 15620, 15691,  7952, 15762, 15833, 
    15904, 15975, 16046, 16117, 16188,  8449,  4544, 16259, 16330,  8733, 
     8804,  4544, 16401, 16472, 16543, 16614, 16685, 16756, 16827,  8946, 
     8733,  9017,  9088,  4544,  9159,  9230,  9017,  9301,  9372,  4544, 
    16898, 16969, 17040, 17111, 17182, 17253, 17324, 17395, 17466,  9656, 
     9727,  4544, 17537, 17608, 17679, 17750, 17821, 17892, 17963, 18034, 
    18105, 18176, 10082, 10224,  4544, 18247, 18318, 10295, 18389, 18460, 
    18531, 18602,  4544, 18673,  4544,  4544,  4544,  4544, 18744, 18815, 
    18886, 18957, 11360,  4544, 19028, 19099, 11502,  4544, 19170, 19241, 
    19312, 19383, 19454, 19525, 19596, 19667, 19738, 12070, 12283,  4544, 
    19809, 19880, 12425,  4544, 19951, 20022, 20093, 20164, 20235, 20306, 
    20377, 20448, 20519,  4544,  4544,  4544, 20590, 20661, 20732, 20803, 
    20874,  4544, 20945, 21016, 21087,  4544,  4544,  4544,  4544, 21158, 
     4544,  4544,  4970, 21229, 21300, 21371, 21442, 21513, 21584, 21655, 
    21726, 21797, 21868, 21939, 22010, 22081,  4544,  4544, 22152, 22223, 
    22294, 22365, 22294, 22436, 22507, 22436, 22578, 22649, 22720, 22791, 
    22862, 22933, 23004, 23075, 23075, 23146, 23217, 23288, 23359, 23359, 
    23430, 23501,  9514,  9514,  9514, 23572, 23643, 23714, 23785, 23785, 
    23856, 23927,  9869,  9869,  9869, 23998, 24069, 10224, 24140, 10295, 
    24211, 24282, 24282, 24353, 24353, 18886, 24424, 11147, 11147, 11147, 
    24495, 24566, 11360, 11360, 11360, 24637, 24708, 11502, 11502, 11502, 
    24779, 24850, 11644, 11644, 11644, 19454, 24921, 24992, 11857, 11857, 
    11857, 19667, 25063, 25134, 12070, 12070, 12070, 25205, 12283, 12283, 
    12283, 25276, 25347, 12425, 12425, 12425, 25418, 25489, 12567, 12567, 
    12567, 20235, 25560, 25631, 12780, 12780, 12780, 20448, 25702,  4544, 
     4544, 25773, 25844,  4544, 25915, 25986, 26057, 26128, 26199, 26270, 
     7668,  4544,  4544, 26341, 26412, 26483, 26554, 26625, 16685, 17182, 
     9514, 26696, 17821,  9869, 26767,  4544, 10082, 11147, 11360, 26838, 
    11502, 26909, 11644, 26980,  4544, 11857, 27051, 12070, 12283, 27122, 
    12425, 27193, 12567, 27264,  4544, 12780, 27335, 27406, 27477, 27548, 
    27619, 27690, 27761, 27832, 27903, 27974, 28045, 28116, 28187, 28258, 
    28329, 28400, 28471, 28542, 28613, 28684, 28755, 28826, 28897,  4970, 
    28968, 29039, 29110, 29181, 29252,  4544,  4544, 29323, 29394, 29465, 
    29536, 19454, 19667, 29607, 29678, 20235, 20448, 29749, 29820, 29891, 
    29962,  4544,  4544,  4544, 30033, 30104, 30175, 30246, 30317, 30388, 
    30459, 30530,  7242, 30601, 30672, 30743, 30814, 30885, 30956, 31027, 
     4544, 31098, 31169,  9514,  9869, 11360, 11502, 12283, 12425, 31240, 
    31311, 31382, 31453, 31524, 31595, 31666, 31737,  4970, 31808, 31879, 
    31950, 32021, 32092, 32163, 32234, 32305, 32376, 32447, 32518, 32589, 
    32660, 32731, 32802, 32873, 32944, 33015, 33086, 33157, 33228, 33299, 
    33370, 33441, 33512, 33583, 33654, 33725, 33796, 33867, 33938, 34009, 
    34080, 34151, 34222, 34293,  4544, 34364, 34435, 34506, 34577,  7242, 
    34648, 34719, 34790, 34861, 34932, 35003, 35074, 35145, 35216, 35287, 
    35358, 35429, 35500, 35571
  };

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

  /** 
   * 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,  1,  1,  0,  0,  0,  0, 
     0,  0,  1,  0,  0,  0,  0,  0,  0,  1,  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,  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,  9,  1,  1,  1,  1,  1,  1,  1, 
     1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  9,  1,  1,  1,  1,  9, 
     9,  1,  9,  3,  3,  9,  3,  3,  3,  9,  3,  1,  1,  9,  1,  9, 
     1,  1,  1,  1,  1,  9,  9,  1,  9,  3,  3,  9,  3,  3,  3,  9, 
     3,  1,  1,  1,  9,  1,  1,  1,  9,  9,  1,  1,  0,  1,  0,  1, 
     2,  0,  1,  1,  2,  1,  0,  0,  0,  9,  1,  1,  1,  9,  9,  0, 
     0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  1,  1,  0, 
     0,  1,  1,  9,  0,  9,  0,  0,  9,  0,  0,  0,  0,  0,  9,  1, 
     1,  2,  2,  0,  1,  0,  9,  0,  0,  0,  0,  0,  1,  1,  0,  0, 
     0,  0,  9,  0,  0,  0,  0,  9,  0,  0,  0,  0,  1,  0,  0,  0, 
     1,  0,  0,  9,  0,  0,  1,  0,  0,  9,  0,  0,  0,  0,  1,  0, 
     0,  1,  1,  0,  0,  9,  0,  0,  0,  0,  1,  0,  0,  1,  1,  0, 
     0,  0,  9,  0,  0,  0,  0,  0,  1,  1,  9,  1,  9,  9,  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,  1, 13, 
     9,  9, 13,  1,  9,  9,  1,  1,  1,  0,  0,  0,  0,  1,  0,  0, 
     1,  0,  0,  1, 13, 13,  0,  0,  3,  2,  2,  3,  2,  2,  0,  0, 
     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1,  0,  0,  1,  1,  1, 
     1,  1,  0,  0,  1,  0,  0,  1,  1,  1,  1,  1,  0,  1,  0,  1, 
     0,  3,  2,  3,  2,  1,  1,  1,  1,  1,  0,  2,  3,  3,  3,  2, 
     2,  3,  3,  3,  2,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  0, 
     0,  1,  1,  1,  1,  2,  3,  3,  3,  2,  2,  3,  3,  3,  2,  1, 
     1,  1,  1,  0,  0,  1,  1,  1,  1,  0,  0,  9,  9,  0,  1,  9, 
     0,  1,  1,  0,  0,  1,  5, 13, 13,  0,  0,  0,  0,  0,  0,  0, 
     1,  1,  0,  1,  1,  9,  5,  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 ITextRegion fBufferedEmbeddedContainer = null;
	private ITextRegion fProxyUnknownRegion = 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 static final String PROXY_UNKNOWN_CONTEXT = "PROXY_UNKNOWN_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();

	// Is the embedded tag a JSP tag
	private boolean fEmbeddedTag = false;
	// Is the non-embedded tag a JSP tag
	private boolean fContainerTag = false;
	// Is the tokenizer in a non-embedded tag (between < and >)
	private boolean fInTagContainer = false;
	// Is the tokenizer in an embedded tag (between < and >)
	private boolean fInTagEmbedded = false;

	/**
	 * 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);
		}
		int initialLength = fEmbeddedContainer.getRegions().size();
		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 (endTagName != null && endTagName.length() == 0){
						endTagName = internalTagName;
					}
					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;
			ITextRegionList embeddedList = fEmbeddedContainer.getRegions();
			if(!isEndingType) {
				// check for ending context
				if (endTagName == null) {
					for (int i = 0; i < endTypes.length; i++) {
						isEndingType = isEndingType || (internalContext == endTypes[i]) || (embeddedList.size() - initialLength) >= 2 && (embeddedList.get(embeddedList.size()-1)).getType() == endTypes[i];
					}
				}
				else {
					isEndingType = ((isInEndTag && internalContext == XML_TAG_CLOSE) || (isInFirstTag && internalContext == XML_EMPTY_TAG_CLOSE)) && internalTagName != null && internalTagName.equals(endTagName);
				}
			}
			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;
	boolean wasBlockingEnabled = fIsBlockingEnabled;
	try {
		// 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_currentPos - searchStringLength > yy_startRead &&
					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 && same; i++) {
							if(fIsCaseSensitiveBlocking)
								same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);
							else
								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;
	}
	finally {
		fIsBlockingEnabled = wasBlockingEnabled;
	}
}
/**
 * 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;
		} else if (f_context == PROXY_UNKNOWN_CONTEXT) {
			fBufferedEmbeddedContainer = fProxyUnknownRegion;
		}
		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);
	}
	
	/* user method */
	private boolean isJspTag() {
		return (fContainerTag && fEmbeddedContainer != null) || (fContainerTag && fInTagContainer) || (fEmbeddedTag && fInTagEmbedded);
	}


  /**
   * 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[35642];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 9512) {
      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();

      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 126: 
        case 131: 
        case 132: 
        case 294: 
        case 300: 
        case 301: 
        case 440: 
        case 443: 
        case 550: 
          {  /* only allow for non-JSP tags for this does not obey JSP quoting rules */
	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 725: break;
        case 171: 
        case 176: 
        case 177: 
        case 354: 
        case 360: 
        case 361: 
        case 477: 
        case 479: 
        case 481: 
        case 483: 
        case 566: 
          {  /* JSP attribute values have escape semantics */
	if(Debug.debugTokenizer)
		dump("jsp 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 726: break;
        case 692: 
        case 697: 
        case 704: 
        case 709: 
          { 
	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 727: break;
        case 667: 
          { 
	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 728: break;
        case 650: 
        case 653: 
        case 654: 
        case 655: 
        case 656: 
        case 657: 
        case 658: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCDATA start");//$NON-NLS-1$
	fStateStack.push(yystate());
	yybegin(ST_CDATA_TEXT);
	return XML_CDATA_OPEN;
 }
        case 729: break;
        case 642: 
          { 
	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 730: break;
        case 633: 
          { 
	if(Debug.debugTokenizer)
		dump("element");//$NON-NLS-1$
	yybegin(ST_XML_ELEMENT_DECLARATION);
	return XML_ELEMENT_DECLARATION;
 }
        case 731: break;
        case 632: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist");//$NON-NLS-1$
	yybegin(ST_XML_ATTLIST_DECLARATION);
	return XML_ATTLIST_DECLARATION;
 }
        case 732: break;
        case 631: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_DECLARATION);
	return XML_DOCTYPE_DECLARATION;
 }
        case 733: break;
        case 616: 
          { 
	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 734: break;
        case 615: 
          { 
	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 735: break;
        case 609: 
          { 
	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 736: break;
        case 584: 
        case 625: 
        case 626: 
          { 
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 737: break;
        case 574: 
        case 621: 
        case 622: 
          { 
	return JSP_EL_QUOTED_CONTENT;
 }
        case 738: break;
        case 565: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment close");//$NON-NLS-1$
	yybegin(YYINITIAL);
	return JSP_COMMENT_CLOSE;
 }
        case 739: break;
        case 552: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", el-unquoted");//$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 740: break;
        case 551: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", el-unquoted");//$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 741: break;
        case 543: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCharRef");//$NON-NLS-1$
	return XML_CHAR_REFERENCE;
 }
        case 742: break;
        case 540: 
          { 
	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 743: break;
        case 539: 
        case 560: 
        case 563: 
        case 567: 
        case 568: 
        case 570: 
        case 572: 
        case 575: 
        case 577: 
        case 578: 
        case 580: 
        case 582: 
        case 585: 
          { 
	/* 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+", jspCommentStart");//$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;
		}
		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		return PROXY_CONTEXT;
	}
 }
        case 744: break;
        case 437: 
          { 
	yybegin(ST_JSP_VBL);
	if(yylength() > 2)
		yypushback(yylength() - 2);
	fELlevel++;
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	assembleEmbeddedContainer(JSP_VBL_OPEN, JSP_VBL_CLOSE);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	yybegin(ST_XML_ATTRIBUTE_NAME);
	return PROXY_CONTEXT;
 }
        case 745: break;
        case 436: 
          { 
	yybegin(ST_JSP_EL);
	if(yylength() > 2)
		yypushback(yylength() - 2);
	fELlevel++;
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	assembleEmbeddedContainer(JSP_EL_OPEN, JSP_EL_CLOSE);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	yybegin(ST_XML_ATTRIBUTE_NAME);
	return PROXY_CONTEXT;
 }
        case 746: break;
        case 422: 
        case 423: 
          { 
	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 747: break;
        case 421: 
          { 
	if(Debug.debugTokenizer)
		dump("comment end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	yybegin(YYINITIAL);
	return XML_COMMENT_CLOSE;
 }
        case 748: break;
        case 420: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA end");//$NON-NLS-1$
	yybegin(fStateStack.pop());
	return XML_CDATA_CLOSE;
 }
        case 749: break;
        case 418: 
          { 
	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 750: break;
        case 417: 
          { 
	if(Debug.debugTokenizer)
		dump("\nPEReference");//$NON-NLS-1$
	return XML_PE_REFERENCE;
 }
        case 751: break;
        case 415: 
          { 
	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 752: break;
        case 411: 
          { 
	if(Debug.debugTokenizer)
		dump("\nEntityRef");//$NON-NLS-1$
	return XML_ENTITY_REFERENCE;
 }
        case 753: break;
        case 405: 
        case 464: 
        case 474: 
        case 489: 
        case 494: 
        case 499: 
        case 504: 
        case 510: 
        case 516: 
        case 520: 
        case 525: 
        case 530: 
        case 536: 
          { 
	/* 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+", jspExpressionStart");//$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;
		}
		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		
		return PROXY_CONTEXT;
	}
 }
        case 754: break;
        case 404: 
        case 463: 
        case 473: 
        case 488: 
        case 493: 
        case 498: 
        case 503: 
        case 509: 
        case 515: 
        case 519: 
        case 524: 
        case 529: 
        case 535: 
          { 
	/* 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+", jspDeclarationStart");//$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;
		}
		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		return PROXY_CONTEXT;
	}
 }
        case 755: break;
        case 403: 
        case 462: 
        case 472: 
        case 487: 
        case 492: 
        case 497: 
        case 502: 
        case 508: 
        case 514: 
        case 518: 
        case 523: 
        case 528: 
        case 534: 
          { 
	/* JSP directive 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 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+", jspDirectiveStart");//$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_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;
		}
		// 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 756: break;
        case 393: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 757: break;
        case 389: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 758: break;
        case 387: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_VBL_OPEN;
	}
 }
        case 759: break;
        case 377: 
          { 
	yybegin(ST_JSP_EL_DQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 760: break;
        case 373: 
          { 
	yybegin(ST_JSP_EL_SQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 761: break;
        case 371: 
          { 
	//System.out.println(JSP_EL_CONTENT+ ":[" + yytext() + "]");
	return JSP_EL_CONTENT;
 }
        case 762: break;
        case 370: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_EL_OPEN;
	}
 }
        case 763: break;
        case 367: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_DQUOTED_VBL);
	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE, JSP_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) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 764: break;
        case 366: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_DQUOTED_EL);
	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE, JSP_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) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 765: break;
        case 365: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_SQUOTED_VBL);
	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE, JSP_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) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 766: break;
        case 364: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_SQUOTED_EL);
	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE, JSP_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) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 767: break;
        case 362: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", genericEndTagOpen");//$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 768: break;
        case 306: 
        case 320: 
        case 326: 
          { 
	return XML_DOCTYPE_INTERNAL_SUBSET;
 }
        case 769: break;
        case 292: 
          { 
	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 || fStateStack.peek() == ST_JSP_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 770: break;
        case 288: 
          { 
	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 || fStateStack.peek() == ST_JSP_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 771: break;
        case 286: 
          { 
        yybegin(YYINITIAL);
	fEmbeddedHint = UNDEFINED;
	if(Debug.debugTokenizer)
		dump("empty tag close");//$NON-NLS-1$

	if (fEmbeddedContainer != null)
		fInTagEmbedded = false;
	else
		fInTagContainer = false;

	return XML_EMPTY_TAG_CLOSE;
 }
        case 772: break;
        case 277: 
          { 
	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 773: break;
        case 275: 
          { 
	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 774: break;
        case 254: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 775: break;
        case 127: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", unquoted genericTagOpen");//$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 776: break;
        case 125: 
          { 
	if(Debug.debugTokenizer)
		dump("equals");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(isJspTag() ? ST_JSP_ATTRIBUTE_VALUE : ST_XML_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 777: break;
        case 122: 
          { 
	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 778: break;
        case 118: 
        case 119: 
        case 120: 
        case 287: 
        case 435: 
        case 549: 
        case 590: 
        case 591: 
        case 610: 
        case 611: 
        case 629: 
        case 630: 
        case 643: 
        case 652: 
        case 660: 
        case 662: 
        case 664: 
        case 666: 
        case 669: 
        case 675: 
        case 676: 
        case 677: 
        case 678: 
        case 679: 
        case 685: 
        case 686: 
        case 687: 
        case 688: 
        case 689: 
        case 695: 
        case 696: 
        case 698: 
        case 699: 
        case 705: 
        case 706: 
        case 707: 
        case 708: 
        case 714: 
        case 715: 
        case 716: 
        case 717: 
        case 720: 
        case 721: 
        case 723: 
          { 
	if(Debug.debugTokenizer)
		dump("tag name");//$NON-NLS-1$
    String tagname = yytext();
    boolean jspTag = tagname.indexOf(':') != -1;
	if (fEmbeddedContainer != null) {
    	fEmbeddedTag = jspTag;
		fInTagEmbedded = true;
    }
	else {
		fContainerTag = jspTag;
		fInTagContainer = true;
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 779: break;
        case 116: 
          { 
	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);

	if (fEmbeddedContainer != null)
		fInTagEmbedded = false;
	else
		fInTagContainer = false;

	return XML_TAG_CLOSE;
 }
        case 780: break;
        case 109: 
        case 113: 
        case 280: 
          { 
	if(Debug.debugTokenizer)
		dump("attr value");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 781: break;
        case 108: 
          { 
	if(Debug.debugTokenizer)
		dump("equals");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 782: break;
        case 107: 
          { 
	if(Debug.debugTokenizer)
		dump("attr name");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 783: break;
        case 104: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP directive name");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_NAME_WHITESPACE);
	return JSP_DIRECTIVE_NAME;
 }
        case 784: break;
        case 100: 
        case 101: 
        case 102: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP code content");//$NON-NLS-1$
	return doScan("%>", false, false, false, JSP_CONTENT, ST_JSP_CONTENT, ST_JSP_CONTENT);
 }
        case 785: break;
        case 96: 
        case 98: 
        case 99: 
        case 268: 
        case 269: 
        case 270: 
        case 273: 
        case 274: 
        case 429: 
        case 432: 
          { 
	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 786: break;
        case 95: 
          { 
	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 787: break;
        case 94: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_DHTML_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 788: break;
        case 92: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 789: break;
        case 86: 
        case 88: 
        case 257: 
          { 
	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 790: break;
        case 85: 
          { 
	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 791: break;
        case 84: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_XML_PI_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 792: break;
        case 50: 
        case 211: 
        case 212: 
        case 215: 
        case 225: 
        case 226: 
        case 229: 
        case 230: 
        case 398: 
        case 401: 
        case 513: 
        case 527: 
        case 533: 
          { 
	return JSP_VBL_CONTENT;
 }
        case 793: break;
        case 43: 
        case 189: 
        case 190: 
        case 193: 
        case 203: 
        case 204: 
        case 208: 
        case 209: 
        case 368: 
        case 382: 
        case 385: 
        case 485: 
        case 486: 
        case 501: 
        case 507: 
          { 
	return JSP_EL_CONTENT;
 }
        case 794: break;
        case 35: 
        case 163: 
        case 164: 
        case 350: 
        case 471: 
        case 475: 
        case 564: 
        case 598: 
        case 618: 
        case 635: 
        case 645: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist contentspec");//$NON-NLS-1$
	return XML_ATTLIST_DECL_CONTENT;
 }
        case 795: break;
        case 33: 
        case 156: 
        case 157: 
        case 338: 
        case 461: 
        case 465: 
        case 561: 
        case 597: 
        case 617: 
        case 634: 
        case 644: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl contentspec");//$NON-NLS-1$
	return XML_ELEMENT_DECL_CONTENT;
 }
        case 796: break;
        case 22: 
        case 114: 
          { 
	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);
		char c = yy_buffer[yy_markedPos - 1];
		if (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_DQUOTED && c == '\"') {
			return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE : XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
		}		
		if (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_SQUOTED && c == '\'') {
			return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
		}
		yypushback(yylength()-1);
		return XML_TAG_ATTRIBUTE_VALUE;
	}
	yybegin(YYINITIAL);
        return XML_CONTENT;
 }
        case 797: break;
        case 18: 
        case 106: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
	return WHITE_SPACE;
 }
        case 798: 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 42: 
        case 74: 
        case 180: 
        case 185: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
        return WHITE_SPACE;
 }
        case 799: break;
        case 0: 
        case 57: 
        case 60: 
        case 61: 
        case 63: 
        case 237: 
        case 239: 
        case 242: 
        case 245: 
        case 408: 
        case 409: 
        case 410: 
        case 414: 
        case 416: 
        case 419: 
        case 542: 
          { 
	if(Debug.debugTokenizer)
		dump("\nXML content");//$NON-NLS-1$
	return XML_CONTENT;
 }
        case 800: break;
        case 58: 
        case 103: 
        case 115: 
        case 121: 
        case 133: 
          { 
	if(Debug.debugTokenizer)
		dump("\nstart tag open");//$NON-NLS-1$
	if (!fStateStack.empty() && fStateStack.peek()== ST_XML_COMMENT){
		fStateStack.pop();
		fEmbeddedHint = XML_COMMENT_TEXT;
		yybegin(ST_XML_TAG_NAME);
		String tagName = "";
		assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?
		return PROXY_CONTEXT;
	}
	fEmbeddedHint = XML_TAG_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_TAG_NAME);
        return XML_TAG_OPEN;
 }
        case 801: break;
        case 59: 
        case 66: 
        case 67: 
        case 68: 
        case 72: 
        case 73: 
        case 83: 
        case 87: 
        case 89: 
        case 90: 
        case 91: 
        case 93: 
        case 97: 
        case 105: 
        case 110: 
        case 111: 
        case 112: 
        case 117: 
        case 123: 
        case 124: 
        case 128: 
        case 135: 
        case 136: 
        case 137: 
        case 138: 
        case 140: 
        case 141: 
        case 143: 
        case 144: 
        case 145: 
        case 148: 
        case 149: 
        case 150: 
        case 153: 
        case 154: 
        case 155: 
        case 160: 
        case 161: 
        case 162: 
        case 170: 
        case 172: 
        case 173: 
        case 195: 
        case 196: 
        case 199: 
        case 200: 
        case 206: 
        case 210: 
        case 217: 
        case 218: 
        case 221: 
        case 222: 
        case 227: 
        case 231: 
          { 
	if (Debug.debugTokenizer)
		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$
			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$
	return UNDEFINED;
 }
        case 802: break;
        case 62: 
        case 243: 
          { 
	if(Debug.debugTokenizer)
		dump("non-reference %");//$NON-NLS-1$
	return XML_CONTENT;
 }
        case 803: break;
        case 64: 
        case 65: 
          { 
	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 804: break;
        case 69: 
        case 198: 
        case 202: 
        case 220: 
        case 224: 
          { 
	if(Debug.debugTokenizer)
		dump("LINE FEED");//$NON-NLS-1$
	return WHITE_SPACE;
 }
        case 805: break;
        case 70: 
        case 71: 
          { 
	if(Debug.debugTokenizer)
		dump("comment content");//$NON-NLS-1$
	return scanXMLCommentText();
 }
        case 806: break;
        case 75: 
        case 76: 
        case 77: 
        case 78: 
        case 250: 
        case 251: 
        case 252: 
        case 424: 
        case 545: 
        case 546: 
        case 588: 
        case 589: 
        case 608: 
        case 628: 
        case 641: 
        case 651: 
        case 659: 
        case 661: 
        case 663: 
        case 665: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_CONTENT;
        yybegin(ST_PI_WS);
        return XML_TAG_NAME;
 }
        case 807: break;
        case 79: 
          { 
        yybegin(ST_PI_CONTENT);
        return WHITE_SPACE;
 }
        case 808: break;
        case 80: 
        case 81: 
        case 82: 
          { 
		// 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 809: break;
        case 129: 
        case 174: 
          { 
	String type = yy_lexical_state == ST_XML_ATTRIBUTE_VALUE ? XML_TAG_ATTRIBUTE_VALUE_DQUOTE : JSP_TAG_ATTRIBUTE_VALUE_DQUOTE;

	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", "+type);//$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(type, type);
	fStateStack.pop();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	yybegin(ST_XML_ATTRIBUTE_NAME);
	if (fEmbeddedContainer.getLastRegion().getType() == UNDEFINED) {
		fProxyUnknownRegion = fRegionFactory.createToken(XML_TAG_ATTRIBUTE_VALUE, fEmbeddedContainer.getStart(), fEmbeddedContainer.getTextLength(), fEmbeddedContainer.getLength());
		return PROXY_UNKNOWN_CONTEXT;
	}
	return PROXY_CONTEXT;
 }
        case 810: break;
        case 130: 
        case 175: 
          { 
	String type = yy_lexical_state == ST_XML_ATTRIBUTE_VALUE ? XML_TAG_ATTRIBUTE_VALUE_SQUOTE : JSP_TAG_ATTRIBUTE_VALUE_SQUOTE;
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", "+type);//$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(type, type);
	fStateStack.pop();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
    if (fEmbeddedContainer.getLastRegion().getType() == UNDEFINED) {
		fProxyUnknownRegion = fRegionFactory.createToken(XML_TAG_ATTRIBUTE_VALUE, fEmbeddedContainer.getStart(), fEmbeddedContainer.getTextLength(), fEmbeddedContainer.getLength());
		return PROXY_UNKNOWN_CONTEXT;
	}
	return PROXY_CONTEXT;
 }
        case 811: break;
        case 134: 
          { 
	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 812: break;
        case 139: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype type");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);
	return XML_DOCTYPE_NAME;
 }
        case 813: break;
        case 142: 
        case 146: 
        case 311: 
        case 316: 
        case 453: 
          { 
	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 814: break;
        case 147: 
        case 151: 
        case 323: 
          { 
	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 815: break;
        case 152: 
        case 329: 
        case 334: 
        case 458: 
          { 
	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 816: break;
        case 158: 
          { 
	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 817: break;
        case 159: 
        case 341: 
        case 346: 
        case 468: 
          { 
	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 818: break;
        case 165: 
          { 
	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 819: break;
        case 168: 
        case 169: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment text");//$NON-NLS-1$
	return scanJSPCommentText();
 }
        case 820: break;
        case 178: 
        case 182: 
        case 183: 
        case 184: 
        case 187: 
        case 188: 
        case 363: 
          { 
	return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 821: break;
        case 179: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", genericTagOpen");//$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 822: break;
        case 181: 
          { 
	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
 }
        case 823: break;
        case 186: 
          { 
	return isJspTag()? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE : XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 824: break;
        case 191: 
          { 
	yybegin(ST_JSP_EL_DQUOTES);
	return JSP_EL_DQUOTE;
 }
        case 825: break;
        case 192: 
          { 
	yybegin(ST_JSP_EL_SQUOTES);
	return JSP_EL_SQUOTE;
 }
        case 826: break;
        case 194: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_EL_CLOSE;
	}
	return JSP_EL_CONTENT;
 }
        case 827: break;
        case 197: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_SQUOTE;
 }
        case 828: break;
        case 201: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_DQUOTE;
 }
        case 829: break;
        case 205: 
          { 
	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE: XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 830: break;
        case 207: 
          { 
	return JSP_EL_CLOSE;
 }
        case 831: break;
        case 213: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES);
	return JSP_VBL_DQUOTE;
 }
        case 832: break;
        case 214: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES);
	return JSP_VBL_SQUOTE;
 }
        case 833: break;
        case 216: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_VBL_CLOSE;
	}
	return JSP_VBL_CONTENT;
 }
        case 834: break;
        case 219: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_SQUOTE;
 }
        case 835: break;
        case 223: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_DQUOTE;
 }
        case 836: break;
        case 228: 
          { 
	return JSP_VBL_CLOSE;
 }
        case 837: break;
        case 232: 
          { 
	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 838: break;
        case 233: 
          { 
	if(Debug.debugTokenizer)
		dump("\nprocessing instruction start");//$NON-NLS-1$
	yybegin(ST_PI);
        return XML_PI_OPEN;
 }
        case 839: break;
        case 234: 
        case 337: 
        case 349: 
        case 369: 
        case 374: 
        case 378: 
        case 381: 
        case 384: 
        case 386: 
        case 390: 
        case 394: 
        case 397: 
        case 400: 
          { 
	/* 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+", jspScriptletStart");//$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;
		}
        else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
            fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
            fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        }
		
		return PROXY_CONTEXT;
	}
 }
        case 840: break;
        case 235: 
          { 
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("\ndeclaration start");//$NON-NLS-1$
        yybegin(ST_XML_DECLARATION);
	return XML_DECLARATION_OPEN;
 }
        case 841: break;
        case 249: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 842: break;
        case 253: 
          { 
		// ended with nothing inside
		fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 843: break;
        case 166: 
        case 167: 
          { 
		return doBlockTagScan();
	 }
        case 844: break;
        default: 
          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
            yy_atEOF = true;
            yy_do_eof();
              return null;
          } 
          else {
            yy_ScanError(YY_NO_MATCH);
          }
      }
    }
  }    


}
