/* The following code was generated by JFlex 1.2.2 on 5/6/09 2:12 PM */

/*******************************************************************************
 * Copyright (c) 2004, 2009 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.contenttype.BooleanStack;
import org.eclipse.jst.jsp.core.internal.Logger;
import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTokenizer;
import org.eclipse.wst.sse.core.internal.ltk.parser.TagMarker;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
import org.eclipse.wst.sse.core.internal.util.Debug;
import org.eclipse.wst.sse.core.utils.StringUtils;
import org.eclipse.wst.xml.core.internal.parser.ContextRegionContainer;
import org.eclipse.wst.xml.core.internal.parser.IntStack;


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

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

  /** lexical states */
  final public static int ST_JSP_VBL_DQUOTES = 52;
  final public static int ST_JSP_VBL_SQUOTES = 51;
  final public static int ST_JSP_VBL_SQUOTES_END = 53;
  final public static int ST_XML_COMMENT_END = 4;
  final public static int ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE = 21;
  final public static int ST_JSP_EL_SQUOTES_END = 46;
  final public static int ST_JSP_EL_DQUOTES = 45;
  final public static int ST_JSP_EL = 43;
  final public static int ST_BLOCK_TAG_SCAN = 36;
  final public static int ST_JSP_EL_SQUOTES = 44;
  final public static int ST_DHTML_ATTRIBUTE_VALUE = 14;
  final public static int ST_XML_PI_ATTRIBUTE_NAME = 8;
  final public static int ST_DHTML_TAG_CLOSE = 15;
  final public static int ST_XML_ATTRIBUTE_VALUE_DQUOTED = 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,  4473,  4544,  4615,  4473,  4544, 
     4686,  4757,  4828,  4899,  4970,  5041,  5112,  5183,  4473,  4544, 
     5254,  5325,  5396,  4473,  5467,  5467,  5538,  5609,  5680,  5254, 
     4473,  5751,  5822,  4473,  5893,  5964,  6035,  6106,  4473,  4544, 
     6177,  6248,  6319,  6390,  6461,  6532,  4473,  6603,  6603,  6674, 
     6745,  6816,  6887,  6958,  4473,  7029,  7100,  7171,  7242,  7313, 
     7384,  4473,  7455,  7526,  7597,  7668,  7739,  7810,  7881,  7952, 
     4473,  8023,  8094,  8165,  8236,  8307,  8378,  8449,  8520,  8520, 
     8591,  8662,  8733,  8804,  8804,  8875,  8946,  9017,  9088,  9088, 
     9159,  9230,  9301,  9372,  4473,  9443,  9443,  9514,  9585,  9656, 
     9727,  4473,  4473,  4544,  4473,  4544,  9798,  9869,  7526,  9940, 
    10011, 10082, 10153, 10224, 10295, 10366, 10437,  4473, 10508, 10579, 
    10650, 10721,  4473, 10792, 10863, 10934, 11005,  4473,  4473, 11076, 
     4473, 11147, 11218, 11289, 11360,  4473,  4473, 11431, 11502,  4473, 
    11573,  4473, 11644, 11715, 11786, 11857, 11928,  4473,  4473, 11999, 
     4473, 12070, 12141, 12212, 12283,  4473,  4473, 12354, 12425, 12496, 
     4473, 12567, 12638, 12709,  4473,  4473, 12780, 12851, 12922, 12993, 
    13064,  4473, 13135, 13206, 13277, 13348, 13419, 13490, 13561, 13632, 
     4473, 13703, 13774, 13845,  4473,  4473,  5467,  5609,  4473, 13916, 
     5680, 13987,  5751,  5893,  5964, 14058,  6035,  4473, 14129, 14200, 
     6106, 14271,  4473, 12851,  4473,  6603,  6674,  4473, 14342,  6745, 
    14413,  4473, 14484, 14555,  7455, 14626,  7668,  4473, 14697,  7739, 
    14768, 14839, 14910, 14981, 15052, 15123,  8236,  4473, 15194, 15265, 
     8520,  8591,  4473, 15336, 15407, 15478, 15549, 15620,  8733,  8520, 
     8804,  8875,  4473,  8946,  9017,  8804,  9088,  9159,  4473, 15691, 
    15762, 15833, 15904, 15975, 16046, 16117,  9443,  9514,  4473, 16188, 
    16259, 16330, 16401, 16472, 16543, 16614, 16685,  9869, 10011,  4473, 
    16756, 16827, 10082, 16898, 16969, 17040, 17111,  4473, 17182,  4473, 
     4473,  4473,  4473, 17253, 17324, 17395, 17466, 11147,  4473, 17537, 
    17608, 11289,  4473, 17679, 17750, 17821, 17892, 17963, 18034, 18105, 
    18176, 18247, 11857, 12070,  4473, 18318, 18389, 12212,  4473, 18460, 
    18531, 18602, 18673, 18744, 18815, 18886, 18957, 19028,  4473,  4473, 
     4473, 19099, 19170, 19241, 19312, 19383,  4473, 19454, 19525,  4473, 
     4473,  4473,  4473,  4473,  4899, 19596, 19667, 19738, 19809, 19880, 
    19951, 20022, 19951, 20093, 20164, 20093, 20235, 20306, 20377, 20448, 
    20519, 20590, 20661, 20661, 20732, 20803, 20803, 20874,  9301,  9301, 
     9301, 20945, 21016, 21087, 21087, 21158,  9656,  9656,  9656, 21229, 
    21300, 10011, 10082, 21371, 21371, 21442, 21442, 17395, 21513, 10934, 
    10934, 10934, 21584, 21655, 11147, 11147, 11147, 21726, 21797, 11289, 
    11289, 11289, 21868, 21939, 11431, 11431, 11431, 17963, 22010, 22081, 
    11644, 11644, 11644, 18176, 22152, 22223, 11857, 11857, 11857, 22294, 
    12070, 12070, 12070, 22365, 22436, 12212, 12212, 12212, 22507, 22578, 
    12354, 12354, 12354, 18744, 22649, 22720, 12567, 12567, 12567, 18957, 
    22791,  4473,  4473, 22862, 22933,  4473, 23004, 23075, 23146, 23217, 
     7455,  4473,  4473, 23288, 23359, 23430, 23501, 23572, 15549, 15904, 
     9301, 23643, 16401,  9656, 23714,  4473,  9869, 10934, 11147, 23785, 
    11289, 23856, 11431, 23927,  4473, 11644, 23998, 11857, 12070, 24069, 
    12212, 24140, 12354, 24211,  4473, 12567, 24282, 24353, 24424, 24495, 
    24566, 24637, 24708, 24779, 24850, 24921, 24992, 25063, 25134, 25205, 
    25276, 25347, 25418, 25489, 25560, 25631, 25702, 25773, 25844,  4899, 
    25915, 25986, 26057, 26128, 26199,  4473,  4473, 26270, 26341, 26412, 
    26483, 17963, 18176, 26554, 26625, 18744, 18957, 26696, 26767, 26838, 
    26909,  4473,  4473,  4473, 26980, 27051, 27122, 27193, 27264, 27335, 
    27406, 27477,  7171, 27548, 27619, 27690, 27761, 27832, 27903, 27974, 
     4473, 28045, 28116,  9301,  9656, 11147, 11289, 12070, 12212, 28187, 
    28258, 28329, 28400, 28471, 28542, 28613, 28684,  4899, 28755, 28826, 
    28897, 28968, 29039, 29110, 29181, 29252, 29323, 29394, 29465, 29536, 
    29607, 29678, 29749, 29820, 29891, 29962, 30033, 30104, 30175, 30246, 
    30317, 30388, 30459, 30530, 30601, 30672, 30743, 30814, 30885, 30956, 
    31027, 31098, 31169, 31240,  4473, 31311, 31382, 31453, 31524,  7171, 
    31595, 31666, 31737, 31808, 31879, 31950, 32021, 32092, 32163, 32234, 
    32305, 32376, 32447, 32518
  };

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

  /** 
   * 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[] = {
    "Unknown 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,  9, 
     1,  9,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1, 
     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  9,  1,  1, 
     1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
     1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1, 
     1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
     1,  9,  9,  1,  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,  3,  3,  9,  9,  1,  1,  9,  1,  9,  1,  1,  1,  1,  1,  9, 
     9,  1,  9,  3,  3,  3,  3,  9,  9,  1,  1,  1,  9,  1,  1,  1, 
     9,  9,  1,  1,  0,  1,  0,  9,  1,  2,  1,  2,  1,  0,  0,  0, 
     9,  1,  1,  1,  9,  9,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0, 
     0,  9,  1,  0,  0,  1,  9,  0,  9,  0,  0,  9,  0,  0,  0,  9, 
     1,  1,  0,  1,  0,  9,  0,  0,  0,  1,  1,  0,  0,  0,  0,  9, 
     0,  0,  0,  0,  9,  0,  0,  0,  1,  0,  0,  1,  0,  0,  9,  0, 
     0,  1,  0,  0,  9,  0,  0,  0,  1,  0,  1,  1,  0,  0,  9,  0, 
     0,  0,  1,  0,  1,  1,  0,  0,  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, 13,  9, 13,  9,  9,  1,  1,  1,  0,  0,  1, 
     3,  2,  2,  3,  2,  2,  0,  0,  0,  0,  0,  0,  1,  0,  0,  1, 
     0,  1,  1,  1,  1,  1,  0,  1,  0,  1,  1,  1,  1,  1,  0,  1, 
     1,  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,  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;

  // records the number of times we've set up new input to be parsed
  private long fInputStamp = -1;
  // records the last input iteration for which we reported an error
  private long fErroredInputstamp = -1;

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

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

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

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

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

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

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

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

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

	private JSPParserRegionFactory fRegionFactory = new JSPParserRegionFactory();

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

/**
 * Method doScan.
 * 
 * Returns a context region for all of the text from the current position upto the end of input or
 * to right *before* the first occurence of searchString
 * 
 * @param searchString - target string to search for ex.: "-->", "</tagname"
 * @param requireTailSeparator - whether the target must be immediately followed by whitespace or '>'
 * @param allowJSP - check for and allow for JSP markup <%%>
 * @param context - the context of the scanned region if non-zero length
 * @param exitState - the state to go to if the region was of non-zero length
 * @param abortState - the state to go to if the searchString was found immediately
 * @return String - the context found: the desired context on a non-zero length match, the abortContext on immediate success
 * @throws IOException
 */
private final String doScan(String searchString, boolean requireTailSeparator, boolean allowJSP, boolean allowCDATA, String searchContext, int exitState, int immediateFallbackState) throws IOException {
	boolean stillSearching = true;
	// Disable further block (probably)
	fIsBlockingEnabled = false;
	int searchStringLength = searchString.length();
	int n = 0;
	char lastCheckChar;
	int i;
	boolean same = false;
	// Check for JSP starts ("<%") if the tag is global like SCRIPT or STYLE
	boolean checkJSPs = allowJSP && !fForbidJSP;
	boolean checkedForJSPsOnce = !checkJSPs;
	boolean checkedJSPsAtStartOnce = false;
	
	while (stillSearching) {
		n = 0;
		// Ensure that enough data from the input exists to compare against the search String.
		n = yy_advance();
		while(n != YYEOF && yy_currentPos < searchStringLength)
			n = yy_advance();
//		c = (char) n;
		// If the input was too short or we've exhausted the input, stop immediately.
		if (n == YYEOF && checkedForJSPsOnce) {
			stillSearching = false;
		}
		else {
			/**
			 * Look for starting JSPs "<%"
			 */
			checkedForJSPsOnce = true;
			// 1) yy_currentPos - searchStringLength : There's at least searchStringLength of input available; once that's read, check for JSPs
			// ---
			// Look for a JSP beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
			// Ensure that we've not encountered a complete block (<%%>) that was *shorter* than the closeTagString and
			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
			if(checkJSPs && yy_currentPos > searchStringLength && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
				yy_buffer[yy_currentPos - searchStringLength] == '<' && yy_buffer[yy_currentPos - searchStringLength + 1] == '%') {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					try {
						String jspContext = primGetNextToken();
						yybegin(resumeState);
						return jspContext;
					}
					catch(IllegalStateException e) {
						start = yychar;
						while(yy_advance() != YYEOF);
						textLength = length = yylength();
					}
					yybegin(resumeState);
					return UNDEFINED;
				}
				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) {
					try {
						String jspContext = primGetNextToken();
						yybegin(resumeState);
						return jspContext;
					}
					catch(IllegalStateException e) {
						start = yychar;
						while(yy_advance() != YYEOF);
						textLength = length = yylength();
					}
					yybegin(resumeState);
					return UNDEFINED;
				}
				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) {
					try {
						String jspContext = primGetNextToken();
						yybegin(resumeState);
						return jspContext;
					}
					catch(IllegalStateException e) {
						start = yychar;
						while(yy_advance() != YYEOF);
						textLength = length = yylength();
					}
					yybegin(resumeState);
					return UNDEFINED;
				}
				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 = null;
				try {
					context = primGetNextToken();
				}
				catch(IllegalStateException e) {
					start = yychar;
					while(yy_advance() != YYEOF);
					textLength = length = yylength();
					return UNDEFINED;
				}
				if(context.equals(XMLRegionContexts.XML_CDATA_OPEN)) {
					assembleEmbeddedContainer(XMLRegionContexts.XML_CDATA_OPEN, XMLRegionContexts.XML_CDATA_CLOSE);
				}
				yybegin(resumeState);
				return searchContext;
			}
*//*
			// 2) yy_currentPos - cdataStarter.length: There's not searchStringLength of input available; check for a CDATA right here spots back in what we could read
			// ---
			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
			// spill over the end of the buffer while checking.
			else if(checkCDATA && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}
			// 3) yy_currentPos : Check at the start of the block one time
			// ---
			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
			else if(checkCDATA && !checkedForCDATAOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
				checkedForCDATAOnce = true;
				fLastInternalBlockStart = yy_markedPos = yy_startRead;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}
*/
			// Check the characters in the target versus the last targetLength characters read from the buffer
			// and see if it matches
			if (n == YYEOF) {
				stillSearching = false;
			}
			else {
				same = true;
				// safety check for array accesses
				if(yy_currentPos >= searchStringLength && yy_currentPos <= yy_buffer.length) {
					for(i = 0; i < searchStringLength; i++) {
						if(same && fIsCaseSensitiveBlocking)
							same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);
						else if(same && !fIsCaseSensitiveBlocking)
							same = Character.toLowerCase(yy_buffer[i + yy_currentPos - searchStringLength]) == Character.toLowerCase(searchString.charAt(i));
					}
				}
				// safety check failed; no match is possible right now
				else {
					same = false;
				}
			}
			if (same && requireTailSeparator && yy_currentPos < yy_buffer.length) {
				// Additional check for close tags to ensure that targetString="</script" doesn't match
				// "</scriptS"
				lastCheckChar = yy_buffer[yy_currentPos];
				// Succeed on "</script>" and "</script "
				if(lastCheckChar == '>' || Character.isWhitespace(lastCheckChar))
					stillSearching = false;
			}
			else {
				stillSearching = !same || (yy_currentPos < yy_startRead + searchStringLength);
			}
		}
	}
	if (n != YYEOF || same) {
		// We've stopped short of the end or definitely found a match
		yy_markedPos = yy_currentPos - searchStringLength;
		yy_currentPos = yy_markedPos + 1;
		// If the searchString occurs at the very beginning of what would have
		// been a Block, resume scanning normally immediately
		if (yy_markedPos == yy_startRead) {
			yybegin(immediateFallbackState);
			try {
				return primGetNextToken();
			}
			catch(IllegalStateException e) {
				start = yychar;
				while(yy_advance() != YYEOF);
				textLength = length = yylength();
			}
			return UNDEFINED;
		}
	}
	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) {
		try {
			return primGetNextToken();
		}
		catch(IllegalStateException e) {
			start = yychar;
			while(yy_advance() != YYEOF);
			textLength = length = yylength();
		}
		return UNDEFINED;
	}
	return searchContext;
}
/**
 * user method 
 * does a lookahead for the current tag name
 */
private final String doBlockTagScan() throws IOException {
	fIsCaseSensitiveBlocking = getBlockMarkerCaseSensitivity();
	return doScan("</" + fCurrentTagName, true, getBlockMarkerAllowsJSP(), true, getBlockMarkerContext(fCurrentTagName), YYINITIAL, YYINITIAL);
}
	/**
	 * user method
	 *
	 * Converts the raw context String returned by the primGetNextToken()
	 * method into a full ITextRegion by pulling in values for the
	 * current offset within the scanning text.
	 *
	 * Returns null when EOF is encountered and attaches intermittently
	 * discovered whitespace onto the end of useful regions.
	 *
	 * Note that this algorithm caches the token following the one being returned
	 * so that whitespace can be collapsed.
	 */
	public final ITextRegion getNextToken() throws IOException {
		fEmbeddedContainer = null;
		// load the starting non-whitespace token (assume that it is so)
		if (fShouldLoadBuffered) {
			if (fBufferedEmbeddedContainer != null) {
				ITextRegion container = fBufferedEmbeddedContainer;
				fBufferedEmbeddedContainer = null;
				fShouldLoadBuffered = false;
				return container;
			}
			context = fBufferedContext;
			start = fBufferedStart;
			textLength = length = fBufferedLength;
			fShouldLoadBuffered = false;
		} else {
			try {
				context = primGetNextToken();
			}
			catch(IllegalStateException e) {
				start = yychar;
				while(yy_advance() != YYEOF);
				textLength = length = yylength();
				return fRegionFactory.createToken(UNDEFINED, start, textLength, length, null, null);
			}
			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
		try {
			f_context = primGetNextToken();
		}
		catch(IllegalStateException e) {
			start = yychar;
			while(yy_advance() != YYEOF);
			textLength = length = yylength();
			return fRegionFactory.createToken(UNDEFINED, start, textLength, length, null, null);
		}
		if (f_context == PROXY_CONTEXT) {
			fBufferedEmbeddedContainer = fEmbeddedContainer;
			fShouldLoadBuffered = true;
		} else if (f_context == XML_TAG_NAME || f_context == JSP_ROOT_TAG_NAME || f_context == JSP_DIRECTIVE_NAME) {
			if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
				fCurrentTagName = yytext();
			else
				fCurrentTagName = null;
		} else if (f_context == XML_TAG_OPEN) {
			fIsBlockingEnabled = true;
		} else if (f_context == XML_END_TAG_OPEN) {
			fIsBlockingEnabled = false;
		}
		fBufferedContext = f_context;
		fBufferedStart = yychar;
		fBufferedLength = yylength();
		fShouldLoadBuffered = true;
		if (fBufferedContext == WHITE_SPACE) {
			fShouldLoadBuffered = false;
			length += fBufferedLength;
		}
		if (context == null) {
			// EOF
			if (Debug.debugTokenizer) {
				System.out.println(getClass().getName() + " discovered " + fTokenCount + " tokens."); //$NON-NLS-2$//$NON-NLS-1$
			}
			return null;
		}
		fTokenCount++;
		return fRegionFactory.createToken(context, start, textLength, length, null, fCurrentTagName);
	}
	/* user method */
	public JSPTokenizer(){
		super();
	}
	/* user method */
	public JSPTokenizer(char[] charArray){
			this(new CharArrayReader(charArray));
	}
	/* user method */
	public void reset(char[] charArray) {
		reset(new CharArrayReader(charArray), 0);
	}
	/* user method */
	public void reset(char[] charArray, int newOffset) {
		reset(new CharArrayReader(charArray), newOffset);
	}
	/* user method */
	public void reset(java.io.InputStream in) {
		reset(new java.io.InputStreamReader(in), 0);
	}
	/* user method */
	public void reset(java.io.InputStream in, int newOffset) {
		reset(new java.io.InputStreamReader(in), newOffset);
	}
	/* user method */
	public void reset(java.io.Reader in) {
		reset(in, 0);
	}
	/**
	 * user method *
	 *
	 * Reset internal counters and vars to "newly created" values, in the hopes
	 * that resetting a pre-existing tokenizer is faster than creating a new one.
	 *
	 * This method contains code blocks that were essentially duplicated from the
	 * <em>generated</em> output of this specification before this method was
	 * added.  Those code blocks were under the above copyright.
	 */
	public void reset(java.io.Reader in, int newOffset) {
		if (Debug.debugTokenizer) {
			System.out.println("resetting tokenizer");//$NON-NLS-1$
		}
		fInputStamp++;
		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();
		fJspTagStack.clear();
	
		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 fJspTagStack.empty() ? false : fJspTagStack.peek();
	}


  /**
   * 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[32589];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 8650) {
      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 occurred while scanning - method from the SSE custom JFlex skeleton
   *
   * @param   errorCode  the code of the error message to display
   */
  private void yy_ScanError(int errorCode) {
	if (fErroredInputstamp != fInputStamp) {
		IllegalStateException e = new IllegalStateException("Instance:" + System.identityHashCode(this) + " Input:" + fInputStamp + " offset:" + (fOffset + yychar) + " state:" + yystate());
		try {
			Logger.logException(YY_ERROR_MSG[errorCode], e);
			throw(e);
		}
		catch (ArrayIndexOutOfBoundsException e2) {
			Logger.logException(YY_ERROR_MSG[YY_UNKNOWN_ERROR], e2);
		}
		fErroredInputstamp = fInputStamp;
	}
	
    // 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 122: 
        case 127: 
        case 128: 
        case 277: 
        case 281: 
        case 282: 
        case 400: 
        case 403: 
        case 500: 
          {  /* 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 675: break;
        case 167: 
        case 172: 
        case 173: 
        case 329: 
        case 335: 
        case 336: 
        case 431: 
        case 432: 
        case 433: 
        case 435: 
        case 516: 
          {  /* 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 676: break;
        case 642: 
        case 647: 
        case 654: 
        case 659: 
          { 
	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 677: break;
        case 617: 
          { 
	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 678: break;
        case 600: 
        case 603: 
        case 604: 
        case 605: 
        case 606: 
        case 607: 
        case 608: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCDATA start");//$NON-NLS-1$
	fStateStack.push(yystate());
	yybegin(ST_CDATA_TEXT);
	return XML_CDATA_OPEN;
 }
        case 679: break;
        case 592: 
          { 
	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 680: break;
        case 583: 
          { 
	if(Debug.debugTokenizer)
		dump("element");//$NON-NLS-1$
	yybegin(ST_XML_ELEMENT_DECLARATION);
	return XML_ELEMENT_DECLARATION;
 }
        case 681: break;
        case 582: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist");//$NON-NLS-1$
	yybegin(ST_XML_ATTLIST_DECLARATION);
	return XML_ATTLIST_DECLARATION;
 }
        case 682: break;
        case 581: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_DECLARATION);
	return XML_DOCTYPE_DECLARATION;
 }
        case 683: break;
        case 566: 
          { 
	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 684: break;
        case 565: 
          { 
	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 685: break;
        case 559: 
          { 
	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 686: break;
        case 534: 
        case 575: 
        case 576: 
          { 
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 687: break;
        case 524: 
        case 571: 
        case 572: 
          { 
	return JSP_EL_QUOTED_CONTENT;
 }
        case 688: break;
        case 515: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment close");//$NON-NLS-1$
	yybegin(YYINITIAL);
	return JSP_COMMENT_CLOSE;
 }
        case 689: break;
        case 502: 
          { 
	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 690: break;
        case 501: 
          { 
	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 691: break;
        case 495: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCharRef");//$NON-NLS-1$
	return XML_CHAR_REFERENCE;
 }
        case 692: break;
        case 492: 
          { 
	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 693: break;
        case 491: 
        case 510: 
        case 513: 
        case 517: 
        case 518: 
        case 520: 
        case 522: 
        case 525: 
        case 527: 
        case 528: 
        case 530: 
        case 532: 
        case 535: 
          { 
	/* 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 694: break;
        case 394: 
        case 395: 
          { 
	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 695: break;
        case 393: 
          { 
	if(Debug.debugTokenizer)
		dump("comment end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	yybegin(YYINITIAL);
	return XML_COMMENT_CLOSE;
 }
        case 696: break;
        case 392: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA end");//$NON-NLS-1$
	yybegin(fStateStack.pop());
	return XML_CDATA_CLOSE;
 }
        case 697: break;
        case 391: 
          { 
	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 698: break;
        case 390: 
          { 
	if(Debug.debugTokenizer)
		dump("\nPEReference");//$NON-NLS-1$
	return XML_PE_REFERENCE;
 }
        case 699: break;
        case 389: 
          { 
	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 700: break;
        case 386: 
          { 
	if(Debug.debugTokenizer)
		dump("\nEntityRef");//$NON-NLS-1$
	return XML_ENTITY_REFERENCE;
 }
        case 701: break;
        case 380: 
        case 420: 
        case 428: 
        case 441: 
        case 446: 
        case 451: 
        case 456: 
        case 462: 
        case 468: 
        case 472: 
        case 477: 
        case 482: 
        case 488: 
          { 
	/* 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 702: break;
        case 379: 
        case 419: 
        case 427: 
        case 440: 
        case 445: 
        case 450: 
        case 455: 
        case 461: 
        case 467: 
        case 471: 
        case 476: 
        case 481: 
        case 487: 
          { 
	/* 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 703: break;
        case 378: 
        case 418: 
        case 426: 
        case 439: 
        case 444: 
        case 449: 
        case 454: 
        case 460: 
        case 466: 
        case 470: 
        case 475: 
        case 480: 
        case 486: 
          { 
	/* 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 704: break;
        case 368: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 705: break;
        case 364: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 706: break;
        case 362: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_VBL_OPEN;
	}
 }
        case 707: break;
        case 352: 
          { 
	yybegin(ST_JSP_EL_DQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 708: break;
        case 348: 
          { 
	yybegin(ST_JSP_EL_SQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 709: break;
        case 346: 
          { 
	//System.out.println(JSP_EL_CONTENT+ ":[" + yytext() + "]");
	return JSP_EL_CONTENT;
 }
        case 710: break;
        case 345: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_EL_OPEN;
	}
 }
        case 711: break;
        case 342: 
          { 
	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 712: break;
        case 341: 
          { 
	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 713: break;
        case 340: 
          { 
	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 714: break;
        case 339: 
          { 
	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 715: break;
        case 337: 
          { 
	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 716: break;
        case 287: 
        case 299: 
        case 305: 
          { 
	return XML_DOCTYPE_INTERNAL_SUBSET;
 }
        case 717: break;
        case 275: 
          { 
	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 718: break;
        case 273: 
          { 
	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 719: break;
        case 271: 
          { 
        yybegin(YYINITIAL);
	fEmbeddedHint = UNDEFINED;
	if(Debug.debugTokenizer)
		dump("empty tag close");//$NON-NLS-1$
		if (!fJspTagStack.empty())
			fJspTagStack.pop();
        return XML_EMPTY_TAG_CLOSE;
 }
        case 720: break;
        case 264: 
          { 
	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 721: break;
        case 126: 
        case 171: 
          { 
	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);
	return PROXY_CONTEXT;
 }
        case 722: break;
        case 125: 
        case 170: 
          { 
	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);
	return PROXY_CONTEXT;
 }
        case 723: break;
        case 123: 
          { 
	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 724: break;
        case 121: 
          { 
	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 725: break;
        case 120: 
          { 
	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 726: break;
        case 116: 
        case 117: 
        case 118: 
        case 272: 
        case 399: 
        case 499: 
        case 540: 
        case 541: 
        case 560: 
        case 561: 
        case 579: 
        case 580: 
        case 593: 
        case 602: 
        case 610: 
        case 612: 
        case 614: 
        case 616: 
        case 619: 
        case 625: 
        case 626: 
        case 627: 
        case 628: 
        case 629: 
        case 635: 
        case 636: 
        case 637: 
        case 638: 
        case 639: 
        case 645: 
        case 646: 
        case 648: 
        case 649: 
        case 655: 
        case 656: 
        case 657: 
        case 658: 
        case 664: 
        case 665: 
        case 666: 
        case 667: 
        case 670: 
        case 671: 
        case 673: 
          { 
	if(Debug.debugTokenizer)
		dump("tag name");//$NON-NLS-1$
    String tagname = yytext();
	fJspTagStack.push(tagname.indexOf(':') != -1);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 727: break;
        case 114: 
          { 
	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 (!fJspTagStack.empty())
			fJspTagStack.pop();
        return XML_TAG_CLOSE;
 }
        case 728: break;
        case 107: 
        case 111: 
        case 267: 
          { 
	if(Debug.debugTokenizer)
		dump("attr value");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 729: break;
        case 106: 
          { 
	if(Debug.debugTokenizer)
		dump("equals");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 730: break;
        case 105: 
          { 
	if(Debug.debugTokenizer)
		dump("attr name");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 731: break;
        case 102: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP directive name");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_NAME_WHITESPACE);
	return JSP_DIRECTIVE_NAME;
 }
        case 732: break;
        case 98: 
        case 99: 
        case 100: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP code content");//$NON-NLS-1$
	return doScan("%>", false, false, false, JSP_CONTENT, ST_JSP_CONTENT, ST_JSP_CONTENT);
 }
        case 733: break;
        case 94: 
        case 96: 
        case 97: 
        case 257: 
        case 258: 
        case 261: 
          { 
	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 734: break;
        case 93: 
          { 
	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 735: break;
        case 92: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_DHTML_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 736: break;
        case 90: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 737: break;
        case 84: 
        case 86: 
        case 248: 
          { 
	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 738: break;
        case 50: 
        case 205: 
        case 206: 
        case 209: 
        case 217: 
        case 218: 
        case 221: 
        case 222: 
        case 373: 
        case 376: 
        case 465: 
        case 479: 
        case 485: 
          { 
	return JSP_VBL_CONTENT;
 }
        case 739: break;
        case 43: 
        case 185: 
        case 186: 
        case 189: 
        case 197: 
        case 198: 
        case 202: 
        case 203: 
        case 343: 
        case 357: 
        case 360: 
        case 437: 
        case 438: 
        case 453: 
        case 459: 
          { 
	return JSP_EL_CONTENT;
 }
        case 740: break;
        case 35: 
        case 159: 
        case 160: 
        case 325: 
        case 425: 
        case 429: 
        case 514: 
        case 548: 
        case 568: 
        case 585: 
        case 595: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist contentspec");//$NON-NLS-1$
	return XML_ATTLIST_DECL_CONTENT;
 }
        case 741: break;
        case 33: 
        case 152: 
        case 153: 
        case 315: 
        case 417: 
        case 421: 
        case 511: 
        case 547: 
        case 567: 
        case 584: 
        case 594: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl contentspec");//$NON-NLS-1$
	return XML_ELEMENT_DECL_CONTENT;
 }
        case 742: break;
        case 22: 
        case 112: 
          { 
	if(Debug.debugTokenizer)
		dump("inappropriate tag name");//$NON-NLS-1$
	if(!fStateStack.empty() && (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_SQUOTED||fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_DQUOTED)) {
		yybegin(ST_ABORT_EMBEDDED);
		yypushback(yylength()-1);
		return XML_TAG_ATTRIBUTE_VALUE;
	}
	yybegin(YYINITIAL);
        return XML_CONTENT;
 }
        case 743: break;
        case 18: 
        case 104: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
	return WHITE_SPACE;
 }
        case 744: 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 72: 
        case 176: 
        case 181: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
        return WHITE_SPACE;
 }
        case 745: break;
        case 0: 
        case 57: 
        case 60: 
        case 62: 
        case 229: 
        case 231: 
        case 232: 
        case 234: 
        case 236: 
        case 383: 
        case 384: 
        case 385: 
        case 494: 
          { 
	if(Debug.debugTokenizer)
		dump("\nXML content");//$NON-NLS-1$
	return XML_CONTENT;
 }
        case 746: break;
        case 58: 
        case 101: 
        case 113: 
        case 119: 
        case 129: 
          { 
	if(Debug.debugTokenizer)
		dump("\nstart tag open");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_TAG_NAME);
        return XML_TAG_OPEN;
 }
        case 747: break;
        case 59: 
        case 61: 
        case 65: 
        case 66: 
        case 67: 
        case 70: 
        case 71: 
        case 81: 
        case 85: 
        case 87: 
        case 88: 
        case 89: 
        case 91: 
        case 95: 
        case 103: 
        case 108: 
        case 109: 
        case 110: 
        case 115: 
        case 124: 
        case 131: 
        case 132: 
        case 133: 
        case 134: 
        case 136: 
        case 137: 
        case 139: 
        case 140: 
        case 141: 
        case 144: 
        case 145: 
        case 146: 
        case 149: 
        case 150: 
        case 151: 
        case 156: 
        case 157: 
        case 158: 
        case 166: 
        case 168: 
        case 169: 
        case 191: 
        case 192: 
        case 193: 
        case 194: 
        case 200: 
        case 204: 
        case 211: 
        case 212: 
        case 213: 
        case 214: 
        case 219: 
        case 223: 
          { 
	if (Debug.debugTokenizer)
		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$
			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$
	return UNDEFINED;
 }
        case 748: break;
        case 63: 
        case 64: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA text");//$NON-NLS-1$
	fEmbeddedPostState = ST_CDATA_TEXT;
	fEmbeddedHint = XML_CDATA_TEXT;
	String returnedContext = doScan("]]>", false, true, true, XML_CDATA_TEXT, ST_CDATA_END,  ST_CDATA_END);//$NON-NLS-1$
	if(returnedContext == XML_CDATA_TEXT)
		yybegin(ST_CDATA_END);
	return returnedContext;
 }
        case 749: break;
        case 68: 
        case 69: 
          { 
	if(Debug.debugTokenizer)
		dump("comment content");//$NON-NLS-1$
	return scanXMLCommentText();
 }
        case 750: break;
        case 73: 
        case 74: 
        case 75: 
        case 76: 
        case 241: 
        case 242: 
        case 243: 
        case 396: 
        case 497: 
        case 498: 
        case 538: 
        case 539: 
        case 558: 
        case 578: 
        case 591: 
        case 601: 
        case 609: 
        case 611: 
        case 613: 
        case 615: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_CONTENT;
        yybegin(ST_PI_WS);
        return XML_TAG_NAME;
 }
        case 751: break;
        case 77: 
          { 
        yybegin(ST_PI_CONTENT);
        return WHITE_SPACE;
 }
        case 752: break;
        case 78: 
        case 79: 
        case 80: 
          { 
		// 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 753: break;
        case 82: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_XML_PI_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 754: break;
        case 83: 
          { 
	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 755: break;
        case 130: 
          { 
	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 756: break;
        case 135: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype type");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);
	return XML_DOCTYPE_NAME;
 }
        case 757: break;
        case 138: 
        case 142: 
        case 292: 
        case 296: 
        case 412: 
          { 
	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 758: break;
        case 143: 
        case 147: 
        case 302: 
          { 
	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 759: break;
        case 148: 
        case 308: 
        case 312: 
        case 415: 
          { 
	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 760: break;
        case 154: 
          { 
	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 761: break;
        case 155: 
        case 318: 
        case 322: 
        case 423: 
          { 
	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 762: break;
        case 161: 
          { 
	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 763: break;
        case 164: 
        case 165: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment text");//$NON-NLS-1$
	return scanJSPCommentText();
 }
        case 764: break;
        case 174: 
        case 178: 
        case 179: 
        case 180: 
        case 183: 
        case 184: 
        case 338: 
          { 
	return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 765: break;
        case 175: 
          { 
	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 766: break;
        case 177: 
          { 
	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
 }
        case 767: break;
        case 182: 
          { 
	return isJspTag()? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE : XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 768: break;
        case 187: 
          { 
	yybegin(ST_JSP_EL_DQUOTES);
	return JSP_EL_DQUOTE;
 }
        case 769: break;
        case 188: 
          { 
	yybegin(ST_JSP_EL_SQUOTES);
	return JSP_EL_SQUOTE;
 }
        case 770: break;
        case 190: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_EL_CLOSE;
	}
	return JSP_EL_CONTENT;
 }
        case 771: break;
        case 195: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_SQUOTE;
 }
        case 772: break;
        case 196: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_DQUOTE;
 }
        case 773: break;
        case 199: 
          { 
	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE: XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 774: break;
        case 201: 
          { 
	return JSP_EL_CLOSE;
 }
        case 775: break;
        case 207: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES);
	return JSP_VBL_DQUOTE;
 }
        case 776: break;
        case 208: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES);
	return JSP_VBL_SQUOTE;
 }
        case 777: break;
        case 210: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_VBL_CLOSE;
	}
	return JSP_VBL_CONTENT;
 }
        case 778: break;
        case 215: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_SQUOTE;
 }
        case 779: break;
        case 216: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_DQUOTE;
 }
        case 780: break;
        case 220: 
          { 
	return JSP_VBL_CLOSE;
 }
        case 781: break;
        case 224: 
          { 
	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 782: break;
        case 225: 
          { 
	if(Debug.debugTokenizer)
		dump("\nprocessing instruction start");//$NON-NLS-1$
	yybegin(ST_PI);
        return XML_PI_OPEN;
 }
        case 783: break;
        case 226: 
        case 314: 
        case 324: 
        case 344: 
        case 349: 
        case 353: 
        case 356: 
        case 359: 
        case 361: 
        case 365: 
        case 369: 
        case 372: 
        case 375: 
          { 
	/* 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 784: break;
        case 227: 
          { 
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("\ndeclaration start");//$NON-NLS-1$
        yybegin(ST_XML_DECLARATION);
	return XML_DECLARATION_OPEN;
 }
        case 785: break;
        case 240: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 786: break;
        case 244: 
          { 
		// ended with nothing inside
		fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 787: break;
        case 245: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 788: break;
        case 262: 
          { 
	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 789: break;
        case 162: 
        case 163: 
          { 
		return doBlockTagScan();
	 }
        case 790: break;
        default: 
          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
            yy_atEOF = true;
            yy_do_eof();
              return null;
          } 
          else {
            yy_ScanError(YY_NO_MATCH);
          }
      }
    }
  }    


}
