
#line 3 "<stdout>"

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

#define yy_create_buffer parse_events__create_buffer
#define yy_delete_buffer parse_events__delete_buffer
#define yy_flex_debug parse_events__flex_debug
#define yy_init_buffer parse_events__init_buffer
#define yy_flush_buffer parse_events__flush_buffer
#define yy_load_buffer_state parse_events__load_buffer_state
#define yy_switch_to_buffer parse_events__switch_to_buffer
#define yyin parse_events_in
#define yyleng parse_events_leng
#define yylex parse_events_lex
#define yylineno parse_events_lineno
#define yyout parse_events_out
#define yyrestart parse_events_restart
#define yytext parse_events_text
#define yywrap parse_events_wrap
#define yyalloc parse_events_alloc
#define yyrealloc parse_events_realloc
#define yyfree parse_events_free

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 35
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif

/* First, we deal with  platform-specific or compiler-specific issues. */

/* begin standard C headers. */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

/* end standard C headers. */

/* flex integer type definitions */

#ifndef FLEXINT_H
#define FLEXINT_H

/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */

#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L

/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
 * if you want the limit (max/min) macros for int types. 
 */
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
#endif

#include <inttypes.h>
typedef int8_t flex_int8_t;
typedef uint8_t flex_uint8_t;
typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
typedef unsigned char flex_uint8_t; 
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
#endif /* ! C99 */

/* Limits of integral types. */
#ifndef INT8_MIN
#define INT8_MIN               (-128)
#endif
#ifndef INT16_MIN
#define INT16_MIN              (-32767-1)
#endif
#ifndef INT32_MIN
#define INT32_MIN              (-2147483647-1)
#endif
#ifndef INT8_MAX
#define INT8_MAX               (127)
#endif
#ifndef INT16_MAX
#define INT16_MAX              (32767)
#endif
#ifndef INT32_MAX
#define INT32_MAX              (2147483647)
#endif
#ifndef UINT8_MAX
#define UINT8_MAX              (255U)
#endif
#ifndef UINT16_MAX
#define UINT16_MAX             (65535U)
#endif
#ifndef UINT32_MAX
#define UINT32_MAX             (4294967295U)
#endif

#endif /* ! FLEXINT_H */

#ifdef __cplusplus

/* The "const" storage-class-modifier is valid. */
#define YY_USE_CONST

#else	/* ! __cplusplus */

/* C99 requires __STDC__ to be defined as 1. */
#if defined (__STDC__)

#define YY_USE_CONST

#endif	/* defined (__STDC__) */
#endif	/* ! __cplusplus */

#ifdef YY_USE_CONST
#define yyconst const
#else
#define yyconst
#endif

/* Returned upon end-of-file. */
#define YY_NULL 0

/* Promotes a possibly negative, possibly signed char to an unsigned
 * integer for use as an array index.  If the signed char is negative,
 * we want to instead treat it as an 8-bit unsigned char, hence the
 * double cast.
 */
#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)

/* Enter a start condition.  This macro really ought to take a parameter,
 * but we do it the disgusting crufty way forced on us by the ()-less
 * definition of BEGIN.
 */
#define BEGIN (yy_start) = 1 + 2 *

/* Translate the current start state into a value that can be later handed
 * to BEGIN to return to the state.  The YYSTATE alias is for lex
 * compatibility.
 */
#define YY_START (((yy_start) - 1) / 2)
#define YYSTATE YY_START

/* Action number for EOF rule of a given start state. */
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)

/* Special action meaning "start processing a new file". */
#define YY_NEW_FILE parse_events_restart(parse_events_in  )

#define YY_END_OF_BUFFER_CHAR 0

/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
#define YY_BUF_SIZE 16384
#endif

/* The state buf must be large enough to hold one state per character in the main buffer.
 */
#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))

#ifndef YY_TYPEDEF_YY_BUFFER_STATE
#define YY_TYPEDEF_YY_BUFFER_STATE
typedef struct yy_buffer_state *YY_BUFFER_STATE;
#endif

extern int parse_events_leng;

extern FILE *parse_events_in, *parse_events_out;

#define EOB_ACT_CONTINUE_SCAN 0
#define EOB_ACT_END_OF_FILE 1
#define EOB_ACT_LAST_MATCH 2

    #define YY_LESS_LINENO(n)
    
/* Return all but the first "n" matched characters back to the input stream. */
#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up parse_events_text. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
		*yy_cp = (yy_hold_char); \
		YY_RESTORE_YY_MORE_OFFSET \
		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
		YY_DO_BEFORE_ACTION; /* set up parse_events_text again */ \
		} \
	while ( 0 )

#define unput(c) yyunput( c, (yytext_ptr)  )

#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
#endif

#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
	{
	FILE *yy_input_file;

	char *yy_ch_buf;		/* input buffer */
	char *yy_buf_pos;		/* current position in input buffer */

	/* Size of input buffer in bytes, not including room for EOB
	 * characters.
	 */
	yy_size_t yy_buf_size;

	/* Number of characters read into yy_ch_buf, not including EOB
	 * characters.
	 */
	int yy_n_chars;

	/* Whether we "own" the buffer - i.e., we know we created it,
	 * and can realloc() it to grow it, and should free() it to
	 * delete it.
	 */
	int yy_is_our_buffer;

	/* Whether this is an "interactive" input source; if so, and
	 * if we're using stdio for input, then we want to use getc()
	 * instead of fread(), to make sure we stop fetching input after
	 * each newline.
	 */
	int yy_is_interactive;

	/* Whether we're considered to be at the beginning of a line.
	 * If so, '^' rules will be active on the next match, otherwise
	 * not.
	 */
	int yy_at_bol;

    int yy_bs_lineno; /**< The line count. */
    int yy_bs_column; /**< The column count. */
    
	/* Whether to try to fill the input buffer when we reach the
	 * end of it.
	 */
	int yy_fill_buffer;

	int yy_buffer_status;

#define YY_BUFFER_NEW 0
#define YY_BUFFER_NORMAL 1
	/* When an EOF's been seen but there's still some text to process
	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
	 * shouldn't try reading from the input source any more.  We might
	 * still have a bunch of tokens to match, though, because of
	 * possible backing-up.
	 *
	 * When we actually see the EOF, we change the status to "new"
	 * (via parse_events_restart()), so that the user can continue scanning by
	 * just pointing parse_events_in at a new input file.
	 */
#define YY_BUFFER_EOF_PENDING 2

	};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */

/* Stack of input buffers. */
static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */

/* We provide macros for accessing buffer states in case in the
 * future we want to put the buffer states in a more general
 * "scanner state".
 *
 * Returns the top of the stack, or NULL.
 */
#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
                          : NULL)

/* Same as previous macro, but useful when we know that the buffer stack is not
 * NULL or when we need an lvalue. For internal use only.
 */
#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]

/* yy_hold_char holds the character lost when parse_events_text is formed. */
static char yy_hold_char;
static int yy_n_chars;		/* number of characters read into yy_ch_buf */
int parse_events_leng;

/* Points to current character in buffer. */
static char *yy_c_buf_p = (char *) 0;
static int yy_init = 0;		/* whether we need to initialize */
static int yy_start = 0;	/* start state number */

/* Flag which is used to allow parse_events_wrap()'s to do buffer switches
 * instead of setting up a fresh parse_events_in.  A bit of a hack ...
 */
static int yy_did_buffer_switch_on_eof;

void parse_events_restart (FILE *input_file  );
void parse_events__switch_to_buffer (YY_BUFFER_STATE new_buffer  );
YY_BUFFER_STATE parse_events__create_buffer (FILE *file,int size  );
void parse_events__delete_buffer (YY_BUFFER_STATE b  );
void parse_events__flush_buffer (YY_BUFFER_STATE b  );
void parse_events_push_buffer_state (YY_BUFFER_STATE new_buffer  );
void parse_events_pop_buffer_state (void );

static void parse_events_ensure_buffer_stack (void );
static void parse_events__load_buffer_state (void );
static void parse_events__init_buffer (YY_BUFFER_STATE b,FILE *file  );

#define YY_FLUSH_BUFFER parse_events__flush_buffer(YY_CURRENT_BUFFER )

YY_BUFFER_STATE parse_events__scan_buffer (char *base,yy_size_t size  );
YY_BUFFER_STATE parse_events__scan_string (yyconst char *yy_str  );
YY_BUFFER_STATE parse_events__scan_bytes (yyconst char *bytes,int len  );

void *parse_events_alloc (yy_size_t  );
void *parse_events_realloc (void *,yy_size_t  );
void parse_events_free (void *  );

#define yy_new_buffer parse_events__create_buffer

#define yy_set_interactive(is_interactive) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){ \
        parse_events_ensure_buffer_stack (); \
		YY_CURRENT_BUFFER_LVALUE =    \
            parse_events__create_buffer(parse_events_in,YY_BUF_SIZE ); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
	}

#define yy_set_bol(at_bol) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){\
        parse_events_ensure_buffer_stack (); \
		YY_CURRENT_BUFFER_LVALUE =    \
            parse_events__create_buffer(parse_events_in,YY_BUF_SIZE ); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
	}

#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)

/* Begin user sect3 */

typedef unsigned char YY_CHAR;

FILE *parse_events_in = (FILE *) 0, *parse_events_out = (FILE *) 0;

typedef int yy_state_type;

extern int parse_events_lineno;

int parse_events_lineno = 1;

extern char *parse_events_text;
#define yytext_ptr parse_events_text

static yy_state_type yy_get_previous_state (void );
static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
static int yy_get_next_buffer (void );
static void yy_fatal_error (yyconst char msg[]  );

/* Done after the current pattern has been matched and before the
 * corresponding action - sets up parse_events_text.
 */
#define YY_DO_BEFORE_ACTION \
	(yytext_ptr) = yy_bp; \
	parse_events_leng = (size_t) (yy_cp - yy_bp); \
	(yy_hold_char) = *yy_cp; \
	*yy_cp = '\0'; \
	(yy_c_buf_p) = yy_cp;

#define YY_NUM_RULES 49
#define YY_END_OF_BUFFER 50
/* This struct is not used in this scanner,
   but its presence is necessary. */
struct yy_trans_info
	{
	flex_int32_t yy_verify;
	flex_int32_t yy_nxt;
	};
static yyconst flex_int16_t yy_accept[440] =
    {   0,
        0,    0,   50,   49,   43,   46,   45,   44,   39,   39,
       47,   48,   43,   43,   43,   43,   43,   43,   43,   43,
       43,   43,   41,   43,   43,   43,   43,   43,   41,   42,
       43,   43,   42,   42,   43,   39,    0,   43,   43,   43,
       21,   43,   43,   43,   43,   43,   43,   43,   43,   43,
       43,   43,   15,   43,    0,   43,   43,   43,   41,    0,
       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
       43,   43,   43,   38,   38,   43,   43,   43,   43,   40,
       43,   43,    0,   43,   43,   43,   24,   43,   43,   43,
       43,   43,   43,    0,   43,   43,   43,   41,    0,   43,

       43,   43,    0,   19,   20,   43,   43,   43,   43,   43,
       43,   43,   30,   43,   43,   43,   38,   38,   43,   43,
       43,   43,   43,   43,   43,    0,    0,   43,   43,   43,
       43,    0,   43,   43,   43,    0,   43,    0,   22,   43,
       43,   41,    0,   23,   43,   43,   19,   20,   26,   43,
       37,   43,   43,   31,   25,   43,   43,   43,   26,   43,
       43,   43,   43,   43,    0,   43,    0,    0,    0,    0,
       43,   43,   43,   43,    0,   43,   43,   43,    0,    0,
       43,   22,   43,   43,   41,   23,    0,   43,   26,   43,
       43,   43,   43,    0,   43,   43,   43,   43,   27,    0,

       27,    0,   43,    0,    0,    0,    0,   43,   43,   24,
        0,    0,   32,   43,    0,    0,    0,    1,   43,   12,
        0,   43,    0,   43,    0,   31,    0,   35,   43,   43,
       43,    0,    0,   43,    0,    0,    0,   43,   43,    0,
       43,   43,    0,    0,    0,   33,   34,   43,    0,    0,
        0,   43,    0,   43,    0,   43,    0,    0,   43,   43,
       43,    0,   43,    0,    0,    0,   43,   43,    0,    0,
       43,    7,    0,    0,    0,    0,    0,    0,    0,   43,
        0,   43,    0,   43,    0,    0,   28,   43,    0,    0,
       43,    0,   43,    0,    0,   43,    0,    0,    0,    0,

       10,    0,    0,   43,    0,   43,    0,   43,    0,    0,
       43,   43,    0,    0,   43,    0,    0,    0,    0,   43,
        9,    0,    0,    0,    1,    0,    0,    0,   43,    0,
       16,    0,    0,   28,   43,    0,   11,   43,    0,    0,
        0,    0,   36,    0,    0,    0,    0,    0,    0,   43,
        0,    0,   12,   43,    0,    0,    0,    0,    0,    0,
        6,    0,    0,    0,    0,    0,    4,   14,   13,    0,
        0,    0,    0,    0,    0,    8,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
       16,    0,    0,    0,    0,    0,    0,    0,    0,    0,

        0,    0,    0,    0,    0,    0,    0,   17,    0,    5,
       15,   18,    0,    0,   29,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    7,    3,    0,
        0,    0,    2,    0,    0,    0,    0,    0,    0
    } ;

static yyconst flex_int32_t yy_ec[256] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    2,    1,    3,    4,    1,    5,    6,    7,    8,
        9,    9,    9,    9,    9,    9,    9,   10,    1,    1,
       11,    1,    2,    1,   12,   13,   14,   15,   12,   12,
        2,    2,   16,    2,    2,   17,    2,    2,    2,    2,
        2,   18,    2,   19,    2,    2,    2,    2,    2,    2,
        1,    1,    1,    1,   20,    1,   21,   22,   23,   24,

       25,   26,   27,   28,   29,   30,   31,   32,   33,   34,
       35,   36,    2,   37,   38,   39,   40,   41,   42,   43,
       44,    2,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1
    } ;

static yyconst flex_int32_t yy_meta[45] =
    {   0,
        1,    2,    1,    1,    1,    3,    3,    3,    3,    1,
        1,    3,    3,    3,    3,    2,    2,    2,    2,    2,
        3,    3,    3,    3,    3,    3,    2,    2,    2,    2,
        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
        2,    2,    2,    2
    } ;

static yyconst flex_int16_t yy_base[442] =
    {   0,
        0,    0,  510,  511,    0,  511,  511,  511,   39,   43,
      511,  511,  488,  474,   46,  482,   32,   20,   37,   57,
      473,  484,   34,   64,   59,   64,  469,  467,   78,  113,
       41,  481,  464,    0,    0,  104,    0,  461,  461,  494,
        0,  483,  470,  472,  465,   44,  472,  470,  453,  467,
      455,  448,    0,  464,  447,  468,  444,  443,   64,  443,
      464,  448,  441,   67,  457,  447,  443,   52,  451,  436,
      446,  435,  446,  445,   76,  444,   95,  430,  438,    0,
      445,  426,  100,  439,  438,  435,    0,  427,  456,  431,
      105,  454,  425,  424,  442,  422,  421,  112,  420,  438,

      425,  410,  117,    0,    0,  424,  412,  436,  408,  409,
      405,  417,    0,  416,  411,  413,   83,  107,  415,  405,
      399,  404,  395,  429,  395,  126,  119,  394,  392,  395,
      405,  404,  401,  396,  399,  100,  398,  400,    0,  400,
      381,  123,  397,    0,  414,  380,  511,  511,  378,  378,
      511,  393,  376,  387,    0,  407,  375,  384,  383,  367,
      374,  380,  400,  378,  383,  361,  361,  378,  377,  359,
      371,  357,  361,  365,  348,  387,  363,  346,   73,  359,
      349,  511,  347,  347,    0,  511,  361,  343,    0,  378,
      342,  376,  341,  352,  353,  337,  343,  349,  335,  349,

        0,  354,  347,  348,  345,  344,  327,  331,  339,  146,
      340,  123,  150,  323,  326,  337,  332,    0,  329,    0,
      313,  333,  329,  325,  327,    0,  331,    0,  328,  329,
      325,  316,  334,  307,  317,  316,  306,  319,  307,  132,
      301,  301,  306,  308,  311,    0,    0,  331,  311,  301,
      295,  296,  307,  290,  307,  292,  305,  285,  296,  284,
      318,  286,  291,  294,  293,  277,  291,  276,  280,  284,
      268,    0,  286,  272,  283,  270,  276,  281,  284,  270,
      271,  273,  261,  266,  259,  266,  272,  267,  272,  271,
      258,  269,  287,  252,  251,  252,  249,  248,  260,  242,

      511,  245,  243,  277,  255,  244,  246,  239,  244,  236,
      236,  232,  228,  240,  236,  230,  242,  228,  228,  240,
      511,  239,  226,  233,  511,  232,  234,  221,  224,  218,
        0,  217,  217,    0,  229,  230,  511,  248,  222,  229,
      212,  223,    0,  209,  221,  206,  209,  222,  238,  203,
      202,  201,  511,  234,  205,  217,  200,  194,  193,  194,
      511,  197,  207,  195,  188,  142,    0,  511,  511,  130,
      202,  209,  191,  192,  200,  511,  199,  193,  182,  187,
      197,  180,  181,  190,  176,  200,  173,  172,  185,  184,
      511,  169,  184,  171,  184,  183,  199,  164,  172,  162,

      161,  160,  166,  162,  171,  170,  147,  511,  158,  511,
      511,  511,  167,  152,  511,  169,  152,  154,  153,  161,
      162,  149,  145,  158,  147,  149,  145,  511,  511,  154,
      152,  137,  511,  138,  145,  131,   53,   54,  511,  172,
       66
    } ;

static yyconst flex_int16_t yy_def[442] =
    {   0,
      439,    1,  439,  439,  440,  439,  439,  439,  439,  439,
      439,  439,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  440,  440,  439,  441,  440,  440,  440,
      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  440,  439,  440,  440,  440,  440,  439,
      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,   30,   30,  440,  440,  440,  440,  441,
      440,  440,  439,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  439,  440,  440,  440,  440,  439,  440,

      440,  440,  439,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  440,  440,  440,   30,   30,  440,  440,
      440,  440,  440,  440,  440,  439,  439,  440,  440,  440,
      440,  439,  440,  440,  440,  439,  440,  439,  440,  440,
      440,  440,  439,  440,  440,  440,  439,  439,  440,  440,
      439,  440,  440,  440,  440,  440,  440,  440,   30,  440,
      440,  440,  440,  440,  439,  440,  439,  439,  439,  439,
      440,  440,  440,  440,  439,  440,  440,  440,  439,  439,
      440,  439,  440,  440,  440,  439,  439,  440,  440,  440,
      440,  440,  440,  439,  440,  440,  440,  440,  440,  439,

      440,  439,  440,  439,  439,  439,  439,  440,  440,  440,
      439,  439,  440,  440,  439,  439,  439,  440,  440,  440,
      439,  440,  439,  440,  439,  440,  439,  440,  440,  440,
      440,  439,  439,  440,  439,  439,  439,  440,  440,  439,
      440,  440,  439,  439,  439,  440,  440,  440,  439,  439,
      439,  440,  439,  440,  439,  440,  439,  439,  440,  440,
      440,  439,  440,  439,  439,  439,  440,  440,  439,  439,
      440,  440,  439,  439,  439,  439,  439,  439,  439,  440,
      439,  440,  439,  440,  439,  439,  440,  440,  439,  439,
      440,  439,  440,  439,  439,  440,  439,  439,  439,  439,

      439,  439,  439,  440,  439,  440,  439,  440,  439,  439,
      440,  440,  439,  439,  440,  439,  439,  439,  439,  440,
      439,  439,  439,  439,  439,  439,  439,  439,  440,  439,
      440,  439,  439,  440,  440,  439,  439,  440,  439,  439,
      439,  439,  440,  439,  439,  439,  439,  439,  439,  440,
      439,  439,  439,  440,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  440,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,

      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,    0,  439,
      439
    } ;

static yyconst flex_int16_t yy_nxt[556] =
    {   0,
        4,    5,    6,    7,    8,    9,   10,   10,   10,   11,
       12,    5,    5,    5,   13,   14,   15,   16,    5,    5,
       17,   18,   19,   20,   21,   22,    5,   23,   24,    5,
       23,   25,   26,   27,   28,   29,   30,   31,   32,   23,
        5,   33,   34,    5,   36,   36,   36,   36,   36,   36,
       36,   36,   40,   41,   44,   46,   47,   50,   48,   49,
       55,   59,   42,   45,   59,   64,   87,   60,   80,   59,
      103,   51,   52,   59,   53,   56,   76,  433,  109,   77,
       54,   37,   61,   87,   66,  110,  438,   62,   67,  111,
      104,   98,   68,   65,   98,  105,  117,   63,   71,   98,

       74,  118,   72,   98,  215,   59,  159,   74,   59,   36,
       36,   36,   36,   59,   73,  120,  216,   59,   74,   74,
       74,   74,  179,  126,   74,   74,   74,   74,  127,  121,
      134,   74,  180,   74,   74,   74,   74,   75,   74,  142,
      147,  169,  142,  135,  113,  148,  167,  142,  168,  240,
      185,  142,  170,  185,  429,  244,  246,  247,  185,  245,
      269,  383,  185,  381,  270,  241,  384,  382,  416,  437,
      242,  436,  417,   35,   35,  435,  434,  433,  432,  431,
      430,  429,  428,  427,  426,  425,  424,  423,  422,  421,
      420,  419,  418,  415,  415,  414,  413,  412,  411,  410,

      409,  408,  407,  406,  405,  404,  403,  402,  401,  400,
      399,  398,  186,  397,  396,  395,  394,  393,  392,  391,
      390,  389,  388,  387,  148,  386,  385,  380,  379,  378,
      377,  376,  375,  374,  373,  372,  371,  370,  369,  368,
      367,  366,  365,  364,  363,  362,  361,  360,  359,  358,
      357,  356,  355,  354,  353,  352,  351,  350,  349,  348,
      347,  346,  345,  344,  343,  342,  341,  340,  339,  338,
      337,  336,  335,  334,  333,  332,  331,  330,  329,  328,
      327,  326,  325,  324,  323,  322,  321,  320,  319,  318,
      317,  316,  315,  314,  313,  312,  311,  310,  309,  308,

      307,  306,  305,  304,  303,  302,  301,  300,  299,  298,
      297,  296,  295,  294,  293,  113,  292,  148,  147,  291,
      290,  289,  288,  287,  286,  285,  284,  283,  282,  281,
      280,  279,  278,  277,  276,  275,  274,  273,  272,  271,
      268,  267,  266,  265,  264,  263,  182,  262,  261,  260,
      259,  258,  257,  256,  255,  254,  253,  252,  251,  250,
      249,  248,  243,  239,  238,  237,  236,  235,  147,  234,
      233,  232,  201,  231,  230,  229,  228,  227,  226,  225,
      224,  223,  222,  221,  220,  219,  218,  217,  214,  213,
      212,  211,  210,  209,  113,  208,  207,  206,  205,  204,

      203,  202,  201,  200,  199,  198,  197,   74,  196,  195,
      194,  193,  192,  191,  190,  189,  188,  187,  186,  184,
      183,  182,  181,  178,  177,  176,  175,  174,  173,  172,
      171,  166,  165,  164,  163,  162,  161,  160,  158,  157,
      156,  155,  154,  153,  152,  151,  150,  149,  146,  145,
      144,  143,  141,  140,  139,  138,  137,  136,  133,  132,
      131,  130,  129,  128,  125,  124,  123,  122,  119,   74,
      116,  115,  114,  113,  112,  108,  107,  106,  102,  101,
      100,   99,   97,   96,   95,   94,   93,   92,   91,   90,
       89,   87,   88,   86,   85,   84,   41,   83,   82,   81,

       79,   78,   70,   69,   58,   57,   43,   39,   38,  439,
        3,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439
    } ;

static yyconst flex_int16_t yy_chk[556] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    9,    9,    9,    9,   10,   10,
       10,   10,   15,   15,   17,   18,   18,   19,   18,   18,
       20,   23,   15,   17,   23,   25,   46,   24,  441,   23,
       64,   19,   19,   23,   19,   20,   31,  438,   68,   31,
       19,    9,   24,   46,   26,   68,  437,   24,   26,   68,
       64,   59,   26,   25,   59,   64,   75,   24,   29,   59,

       75,   75,   29,   59,  179,   29,  117,  117,   29,   36,
       36,   36,   36,   29,   29,   77,  179,   29,   30,   30,
       30,   30,  136,   83,   30,   30,   30,   30,   83,   77,
       91,  118,  136,   30,   30,   30,   30,   30,   30,   98,
      103,  127,   98,   91,  118,  103,  126,   98,  126,  210,
      142,   98,  127,  142,  436,  212,  213,  213,  142,  212,
      240,  370,  142,  366,  240,  210,  370,  366,  407,  435,
      210,  434,  407,  440,  440,  432,  431,  430,  427,  426,
      425,  424,  423,  422,  421,  420,  419,  418,  417,  416,
      414,  413,  409,  406,  405,  404,  403,  402,  401,  400,

      399,  398,  397,  396,  395,  394,  393,  392,  390,  389,
      388,  387,  386,  385,  384,  383,  382,  381,  380,  379,
      378,  377,  375,  374,  373,  372,  371,  365,  364,  363,
      362,  360,  359,  358,  357,  356,  355,  354,  352,  351,
      350,  349,  348,  347,  346,  345,  344,  342,  341,  340,
      339,  338,  336,  335,  333,  332,  330,  329,  328,  327,
      326,  324,  323,  322,  320,  319,  318,  317,  316,  315,
      314,  313,  312,  311,  310,  309,  308,  307,  306,  305,
      304,  303,  302,  300,  299,  298,  297,  296,  295,  294,
      293,  292,  291,  290,  289,  288,  287,  286,  285,  284,

      283,  282,  281,  280,  279,  278,  277,  276,  275,  274,
      273,  271,  270,  269,  268,  267,  266,  265,  264,  263,
      262,  261,  260,  259,  258,  257,  256,  255,  254,  253,
      252,  251,  250,  249,  248,  245,  244,  243,  242,  241,
      239,  238,  237,  236,  235,  234,  233,  232,  231,  230,
      229,  227,  225,  224,  223,  222,  221,  219,  217,  216,
      215,  214,  211,  209,  208,  207,  206,  205,  204,  203,
      202,  200,  199,  198,  197,  196,  195,  194,  193,  192,
      191,  190,  188,  187,  184,  183,  181,  180,  178,  177,
      176,  175,  174,  173,  172,  171,  170,  169,  168,  167,

      166,  165,  164,  163,  162,  161,  160,  159,  158,  157,
      156,  154,  153,  152,  150,  149,  146,  145,  143,  141,
      140,  138,  137,  135,  134,  133,  132,  131,  130,  129,
      128,  125,  124,  123,  122,  121,  120,  119,  116,  115,
      114,  112,  111,  110,  109,  108,  107,  106,  102,  101,
      100,   99,   97,   96,   95,   94,   93,   92,   90,   89,
       88,   86,   85,   84,   82,   81,   79,   78,   76,   74,
       73,   72,   71,   70,   69,   67,   66,   65,   63,   62,
       61,   60,   58,   57,   56,   55,   54,   52,   51,   50,
       49,   48,   47,   45,   44,   43,   42,   40,   39,   38,

       33,   32,   28,   27,   22,   21,   16,   14,   13,    3,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439
    } ;

static yy_state_type yy_last_accepting_state;
static char *yy_last_accepting_cpos;

extern int parse_events__flex_debug;
int parse_events__flex_debug = 0;

/* The intent behind this definition is that it'll catch
 * any uses of REJECT which flex missed.
 */
#define REJECT reject_used_but_not_detected
#define yymore() yymore_used_but_not_detected
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
char *parse_events_text;
#line 1 "util/parse-events.l"
#line 5 "util/parse-events.l"
#include <errno.h>
#include "../perf.h"
#include "parse-events-bison.h"
#include "parse-events.h"

static int __value(char *str, int base, int token)
{
	long num;

	errno = 0;
	num = strtoul(str, NULL, base);
	if (errno)
		return PE_ERROR;

	parse_events_lval.num = num;
	return token;
}

static int value(int base)
{
	return __value(parse_events_text, base, PE_VALUE);
}

static int raw(void)
{
	return __value(parse_events_text + 1, 16, PE_RAW);
}

static int str(int token)
{
	parse_events_lval.str = strdup(parse_events_text);
	return token;
}

static int sym(int type, int config)
{
	parse_events_lval.num = (type << 16) + config;
	return PE_VALUE_SYM;
}

static int term(int type)
{
	parse_events_lval.num = type;
	return PE_TERM;
}

#line 782 "<stdout>"

#define INITIAL 0

#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
 * down here because we want the user's section 1 to have been scanned first.
 * The user has a chance to override it with an option.
 */
#include <unistd.h>
#endif

#ifndef YY_EXTRA_TYPE
#define YY_EXTRA_TYPE void *
#endif

static int yy_init_globals (void );

/* Accessor methods to globals.
   These are made visible to non-reentrant scanners for convenience. */

int parse_events_lex_destroy (void );

int parse_events_get_debug (void );

void parse_events_set_debug (int debug_flag  );

YY_EXTRA_TYPE parse_events_get_extra (void );

void parse_events_set_extra (YY_EXTRA_TYPE user_defined  );

FILE *parse_events_get_in (void );

void parse_events_set_in  (FILE * in_str  );

FILE *parse_events_get_out (void );

void parse_events_set_out  (FILE * out_str  );

int parse_events_get_leng (void );

char *parse_events_get_text (void );

int parse_events_get_lineno (void );

void parse_events_set_lineno (int line_number  );

/* Macros after this point can all be overridden by user definitions in
 * section 1.
 */

#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
extern "C" int parse_events_wrap (void );
#else
extern int parse_events_wrap (void );
#endif
#endif

    static void yyunput (int c,char *buf_ptr  );
    
#ifndef yytext_ptr
static void yy_flex_strncpy (char *,yyconst char *,int );
#endif

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (yyconst char * );
#endif

#ifndef YY_NO_INPUT

#ifdef __cplusplus
static int yyinput (void );
#else
static int input (void );
#endif

#endif

/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#define YY_READ_BUF_SIZE 8192
#endif

/* Copy whatever the last rule matched to the standard output. */
#ifndef ECHO
/* This used to be an fputs(), but since the string might contain NUL's,
 * we now use fwrite().
 */
#define ECHO do { if (fwrite( parse_events_text, parse_events_leng, 1, parse_events_out )) {} } while (0)
#endif

/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
 * is returned in "result".
 */
#ifndef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
		{ \
		int c = '*'; \
		unsigned n; \
		for ( n = 0; n < max_size && \
			     (c = getc( parse_events_in )) != EOF && c != '\n'; ++n ) \
			buf[n] = (char) c; \
		if ( c == '\n' ) \
			buf[n++] = (char) c; \
		if ( c == EOF && ferror( parse_events_in ) ) \
			YY_FATAL_ERROR( "input in flex scanner failed" ); \
		result = n; \
		} \
	else \
		{ \
		errno=0; \
		while ( (result = fread(buf, 1, max_size, parse_events_in))==0 && ferror(parse_events_in)) \
			{ \
			if( errno != EINTR) \
				{ \
				YY_FATAL_ERROR( "input in flex scanner failed" ); \
				break; \
				} \
			errno=0; \
			clearerr(parse_events_in); \
			} \
		}\
\

#endif

/* No semi-colon after return; correct usage is to write "yyterminate();" -
 * we don't want an extra ';' after the "return" because that will cause
 * some compilers to complain about unreachable statements.
 */
#ifndef yyterminate
#define yyterminate() return YY_NULL
#endif

/* Number of entries by which start-condition stack grows. */
#ifndef YY_START_STACK_INCR
#define YY_START_STACK_INCR 25
#endif

/* Report a fatal error. */
#ifndef YY_FATAL_ERROR
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
#endif

/* end tables serialization structures and prototypes */

/* Default declaration of generated scanner - a define so the user can
 * easily add parameters.
 */
#ifndef YY_DECL
#define YY_DECL_IS_OURS 1

extern int parse_events_lex (void);

#define YY_DECL int parse_events_lex (void)
#endif /* !YY_DECL */

/* Code executed at the beginning of each rule, after parse_events_text and parse_events_leng
 * have been set up.
 */
#ifndef YY_USER_ACTION
#define YY_USER_ACTION
#endif

/* Code executed at the end of each rule. */
#ifndef YY_BREAK
#define YY_BREAK break;
#endif

#define YY_RULE_SETUP \
	YY_USER_ACTION

/** The main scanner function which does all the work.
 */
YY_DECL
{
	register yy_state_type yy_current_state;
	register char *yy_cp, *yy_bp;
	register int yy_act;
    
#line 60 "util/parse-events.l"

#line 966 "<stdout>"

	if ( !(yy_init) )
		{
		(yy_init) = 1;

#ifdef YY_USER_INIT
		YY_USER_INIT;
#endif

		if ( ! (yy_start) )
			(yy_start) = 1;	/* first start state */

		if ( ! parse_events_in )
			parse_events_in = stdin;

		if ( ! parse_events_out )
			parse_events_out = stdout;

		if ( ! YY_CURRENT_BUFFER ) {
			parse_events_ensure_buffer_stack ();
			YY_CURRENT_BUFFER_LVALUE =
				parse_events__create_buffer(parse_events_in,YY_BUF_SIZE );
		}

		parse_events__load_buffer_state( );
		}

	while ( 1 )		/* loops until end-of-file is reached */
		{
		yy_cp = (yy_c_buf_p);

		/* Support of parse_events_text. */
		*yy_cp = (yy_hold_char);

		/* yy_bp points to the position in yy_ch_buf of the start of
		 * the current run.
		 */
		yy_bp = yy_cp;

		yy_current_state = (yy_start);
yy_match:
		do
			{
			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
			if ( yy_accept[yy_current_state] )
				{
				(yy_last_accepting_state) = yy_current_state;
				(yy_last_accepting_cpos) = yy_cp;
				}
			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
				{
				yy_current_state = (int) yy_def[yy_current_state];
				if ( yy_current_state >= 440 )
					yy_c = yy_meta[(unsigned int) yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
			++yy_cp;
			}
		while ( yy_base[yy_current_state] != 511 );

yy_find_action:
		yy_act = yy_accept[yy_current_state];
		if ( yy_act == 0 )
			{ /* have to back up */
			yy_cp = (yy_last_accepting_cpos);
			yy_current_state = (yy_last_accepting_state);
			yy_act = yy_accept[yy_current_state];
			}

		YY_DO_BEFORE_ACTION;

do_action:	/* This label is used only to access EOF actions. */

		switch ( yy_act )
	{ /* beginning of action switch */
			case 0: /* must back up */
			/* undo the effects of YY_DO_BEFORE_ACTION */
			*yy_cp = (yy_hold_char);
			yy_cp = (yy_last_accepting_cpos);
			yy_current_state = (yy_last_accepting_state);
			goto yy_find_action;

case 1:
YY_RULE_SETUP
#line 61 "util/parse-events.l"
{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); }
	YY_BREAK
case 2:
YY_RULE_SETUP
#line 62 "util/parse-events.l"
{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
	YY_BREAK
case 3:
YY_RULE_SETUP
#line 63 "util/parse-events.l"
{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
	YY_BREAK
case 4:
YY_RULE_SETUP
#line 64 "util/parse-events.l"
{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); }
	YY_BREAK
case 5:
YY_RULE_SETUP
#line 65 "util/parse-events.l"
{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); }
	YY_BREAK
case 6:
YY_RULE_SETUP
#line 66 "util/parse-events.l"
{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); }
	YY_BREAK
case 7:
YY_RULE_SETUP
#line 67 "util/parse-events.l"
{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
	YY_BREAK
case 8:
YY_RULE_SETUP
#line 68 "util/parse-events.l"
{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); }
	YY_BREAK
case 9:
YY_RULE_SETUP
#line 69 "util/parse-events.l"
{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); }
	YY_BREAK
case 10:
YY_RULE_SETUP
#line 70 "util/parse-events.l"
{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); }
	YY_BREAK
case 11:
YY_RULE_SETUP
#line 71 "util/parse-events.l"
{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); }
	YY_BREAK
case 12:
YY_RULE_SETUP
#line 72 "util/parse-events.l"
{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); }
	YY_BREAK
case 13:
YY_RULE_SETUP
#line 73 "util/parse-events.l"
{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); }
	YY_BREAK
case 14:
YY_RULE_SETUP
#line 74 "util/parse-events.l"
{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); }
	YY_BREAK
case 15:
YY_RULE_SETUP
#line 75 "util/parse-events.l"
{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); }
	YY_BREAK
case 16:
YY_RULE_SETUP
#line 76 "util/parse-events.l"
{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); }
	YY_BREAK
case 17:
YY_RULE_SETUP
#line 77 "util/parse-events.l"
{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
	YY_BREAK
case 18:
YY_RULE_SETUP
#line 78 "util/parse-events.l"
{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
	YY_BREAK
case 19:
#line 81 "util/parse-events.l"
case 20:
#line 82 "util/parse-events.l"
case 21:
#line 83 "util/parse-events.l"
case 22:
#line 84 "util/parse-events.l"
case 23:
#line 85 "util/parse-events.l"
case 24:
#line 86 "util/parse-events.l"
case 25:
YY_RULE_SETUP
#line 86 "util/parse-events.l"
{ return str(PE_NAME_CACHE_TYPE); }
	YY_BREAK
case 26:
#line 89 "util/parse-events.l"
case 27:
#line 90 "util/parse-events.l"
case 28:
#line 91 "util/parse-events.l"
case 29:
#line 92 "util/parse-events.l"
case 30:
#line 93 "util/parse-events.l"
case 31:
YY_RULE_SETUP
#line 93 "util/parse-events.l"
{ return str(PE_NAME_CACHE_OP_RESULT); }
	YY_BREAK
/*
	 * These are event config hardcoded term names to be specified
	 * within xxx/.../ syntax. So far we dont clash with other names,
	 * so we can put them here directly. In case the we have a conflict
	 * in future, this needs to go into '//' condition block.
	 */
case 32:
YY_RULE_SETUP
#line 101 "util/parse-events.l"
{ return term(PARSE_EVENTS__TERM_TYPE_CONFIG); }
	YY_BREAK
case 33:
YY_RULE_SETUP
#line 102 "util/parse-events.l"
{ return term(PARSE_EVENTS__TERM_TYPE_CONFIG1); }
	YY_BREAK
case 34:
YY_RULE_SETUP
#line 103 "util/parse-events.l"
{ return term(PARSE_EVENTS__TERM_TYPE_CONFIG2); }
	YY_BREAK
case 35:
YY_RULE_SETUP
#line 104 "util/parse-events.l"
{ return term(PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); }
	YY_BREAK
case 36:
YY_RULE_SETUP
#line 105 "util/parse-events.l"
{ return term(PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); }
	YY_BREAK
case 37:
YY_RULE_SETUP
#line 107 "util/parse-events.l"
{ return PE_PREFIX_MEM; }
	YY_BREAK
case 38:
YY_RULE_SETUP
#line 108 "util/parse-events.l"
{ return raw(); }
	YY_BREAK
case 39:
YY_RULE_SETUP
#line 109 "util/parse-events.l"
{ return value(10); }
	YY_BREAK
case 40:
YY_RULE_SETUP
#line 110 "util/parse-events.l"
{ return value(16); }
	YY_BREAK
case 41:
YY_RULE_SETUP
#line 112 "util/parse-events.l"
{ return str(PE_MODIFIER_EVENT); }
	YY_BREAK
case 42:
YY_RULE_SETUP
#line 113 "util/parse-events.l"
{ return str(PE_MODIFIER_BP); }
	YY_BREAK
case 43:
YY_RULE_SETUP
#line 114 "util/parse-events.l"
{ return str(PE_NAME); }
	YY_BREAK
case 44:
YY_RULE_SETUP
#line 115 "util/parse-events.l"
{ return '/'; }
	YY_BREAK
case 45:
YY_RULE_SETUP
#line 116 "util/parse-events.l"
{ return '-'; }
	YY_BREAK
case 46:
YY_RULE_SETUP
#line 117 "util/parse-events.l"
{ return ','; }
	YY_BREAK
case 47:
YY_RULE_SETUP
#line 118 "util/parse-events.l"
{ return ':'; }
	YY_BREAK
case 48:
YY_RULE_SETUP
#line 119 "util/parse-events.l"
{ return '='; }
	YY_BREAK
case 49:
YY_RULE_SETUP
#line 121 "util/parse-events.l"
ECHO;
	YY_BREAK
#line 1267 "<stdout>"
case YY_STATE_EOF(INITIAL):
	yyterminate();

	case YY_END_OF_BUFFER:
		{
		/* Amount of text matched not including the EOB char. */
		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;

		/* Undo the effects of YY_DO_BEFORE_ACTION. */
		*yy_cp = (yy_hold_char);
		YY_RESTORE_YY_MORE_OFFSET

		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
			{
			/* We're scanning a new file or input source.  It's
			 * possible that this happened because the user
			 * just pointed parse_events_in at a new source and called
			 * parse_events_lex().  If so, then we have to assure
			 * consistency between YY_CURRENT_BUFFER and our
			 * globals.  Here is the right place to do so, because
			 * this is the first action (other than possibly a
			 * back-up) that will match for the new input source.
			 */
			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
			YY_CURRENT_BUFFER_LVALUE->yy_input_file = parse_events_in;
			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
			}

		/* Note that here we test for yy_c_buf_p "<=" to the position
		 * of the first EOB in the buffer, since yy_c_buf_p will
		 * already have been incremented past the NUL character
		 * (since all states make transitions on EOB to the
		 * end-of-buffer state).  Contrast this with the test
		 * in input().
		 */
		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
			{ /* This was really a NUL. */
			yy_state_type yy_next_state;

			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;

			yy_current_state = yy_get_previous_state(  );

			/* Okay, we're now positioned to make the NUL
			 * transition.  We couldn't have
			 * yy_get_previous_state() go ahead and do it
			 * for us because it doesn't know how to deal
			 * with the possibility of jamming (and we don't
			 * want to build jamming into it because then it
			 * will run more slowly).
			 */

			yy_next_state = yy_try_NUL_trans( yy_current_state );

			yy_bp = (yytext_ptr) + YY_MORE_ADJ;

			if ( yy_next_state )
				{
				/* Consume the NUL. */
				yy_cp = ++(yy_c_buf_p);
				yy_current_state = yy_next_state;
				goto yy_match;
				}

			else
				{
				yy_cp = (yy_c_buf_p);
				goto yy_find_action;
				}
			}

		else switch ( yy_get_next_buffer(  ) )
			{
			case EOB_ACT_END_OF_FILE:
				{
				(yy_did_buffer_switch_on_eof) = 0;

				if ( parse_events_wrap( ) )
					{
					/* Note: because we've taken care in
					 * yy_get_next_buffer() to have set up
					 * parse_events_text, we can now set up
					 * yy_c_buf_p so that if some total
					 * hoser (like flex itself) wants to
					 * call the scanner after we return the
					 * YY_NULL, it'll still work - another
					 * YY_NULL will get returned.
					 */
					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;

					yy_act = YY_STATE_EOF(YY_START);
					goto do_action;
					}

				else
					{
					if ( ! (yy_did_buffer_switch_on_eof) )
						YY_NEW_FILE;
					}
				break;
				}

			case EOB_ACT_CONTINUE_SCAN:
				(yy_c_buf_p) =
					(yytext_ptr) + yy_amount_of_matched_text;

				yy_current_state = yy_get_previous_state(  );

				yy_cp = (yy_c_buf_p);
				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
				goto yy_match;

			case EOB_ACT_LAST_MATCH:
				(yy_c_buf_p) =
				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];

				yy_current_state = yy_get_previous_state(  );

				yy_cp = (yy_c_buf_p);
				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
				goto yy_find_action;
			}
		break;
		}

	default:
		YY_FATAL_ERROR(
			"fatal flex scanner internal error--no action found" );
	} /* end of action switch */
		} /* end of scanning one token */
} /* end of parse_events_lex */

/* yy_get_next_buffer - try to read in a new buffer
 *
 * Returns a code representing an action:
 *	EOB_ACT_LAST_MATCH -
 *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
 *	EOB_ACT_END_OF_FILE - end of file
 */
static int yy_get_next_buffer (void)
{
    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
	register char *source = (yytext_ptr);
	register int number_to_move, i;
	int ret_val;

	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
		YY_FATAL_ERROR(
		"fatal flex scanner internal error--end of buffer missed" );

	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
		{ /* Don't try to fill the buffer, so this is an EOF. */
		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
			{
			/* We matched a single character, the EOB, so
			 * treat this as a final EOF.
			 */
			return EOB_ACT_END_OF_FILE;
			}

		else
			{
			/* We matched some text prior to the EOB, first
			 * process it.
			 */
			return EOB_ACT_LAST_MATCH;
			}
		}

	/* Try to read more data. */

	/* First move last chars to start of buffer. */
	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;

	for ( i = 0; i < number_to_move; ++i )
		*(dest++) = *(source++);

	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
		/* don't do the read, it's not guaranteed to return an EOF,
		 * just force an EOF
		 */
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;

	else
		{
			int num_to_read =
			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;

		while ( num_to_read <= 0 )
			{ /* Not enough room in the buffer - grow it. */

			/* just a shorter name for the current buffer */
			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;

			int yy_c_buf_p_offset =
				(int) ((yy_c_buf_p) - b->yy_ch_buf);

			if ( b->yy_is_our_buffer )
				{
				int new_size = b->yy_buf_size * 2;

				if ( new_size <= 0 )
					b->yy_buf_size += b->yy_buf_size / 8;
				else
					b->yy_buf_size *= 2;

				b->yy_ch_buf = (char *)
					/* Include room in for 2 EOB chars. */
					parse_events_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
				}
			else
				/* Can't grow it, we don't own it. */
				b->yy_ch_buf = 0;

			if ( ! b->yy_ch_buf )
				YY_FATAL_ERROR(
				"fatal error - scanner input buffer overflow" );

			(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];

			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
						number_to_move - 1;

			}

		if ( num_to_read > YY_READ_BUF_SIZE )
			num_to_read = YY_READ_BUF_SIZE;

		/* Read in more data. */
		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
			(yy_n_chars), (size_t) num_to_read );

		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
		}

	if ( (yy_n_chars) == 0 )
		{
		if ( number_to_move == YY_MORE_ADJ )
			{
			ret_val = EOB_ACT_END_OF_FILE;
			parse_events_restart(parse_events_in  );
			}

		else
			{
			ret_val = EOB_ACT_LAST_MATCH;
			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
				YY_BUFFER_EOF_PENDING;
			}
		}

	else
		ret_val = EOB_ACT_CONTINUE_SCAN;

	if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
		/* Extend the array by 50%, plus the number we really need. */
		yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) parse_events_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
	}

	(yy_n_chars) += number_to_move;
	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;

	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];

	return ret_val;
}

/* yy_get_previous_state - get the state just before the EOB char was reached */

    static yy_state_type yy_get_previous_state (void)
{
	register yy_state_type yy_current_state;
	register char *yy_cp;
    
	yy_current_state = (yy_start);

	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
		{
		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
		if ( yy_accept[yy_current_state] )
			{
			(yy_last_accepting_state) = yy_current_state;
			(yy_last_accepting_cpos) = yy_cp;
			}
		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
			{
			yy_current_state = (int) yy_def[yy_current_state];
			if ( yy_current_state >= 440 )
				yy_c = yy_meta[(unsigned int) yy_c];
			}
		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
		}

	return yy_current_state;
}

/* yy_try_NUL_trans - try to make a transition on the NUL character
 *
 * synopsis
 *	next_state = yy_try_NUL_trans( current_state );
 */
    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
{
	register int yy_is_jam;
    	register char *yy_cp = (yy_c_buf_p);

	register YY_CHAR yy_c = 1;
	if ( yy_accept[yy_current_state] )
		{
		(yy_last_accepting_state) = yy_current_state;
		(yy_last_accepting_cpos) = yy_cp;
		}
	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
		{
		yy_current_state = (int) yy_def[yy_current_state];
		if ( yy_current_state >= 440 )
			yy_c = yy_meta[(unsigned int) yy_c];
		}
	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
	yy_is_jam = (yy_current_state == 439);

	return yy_is_jam ? 0 : yy_current_state;
}

    static void yyunput (int c, register char * yy_bp )
{
	register char *yy_cp;
    
    yy_cp = (yy_c_buf_p);

	/* undo effects of setting up parse_events_text */
	*yy_cp = (yy_hold_char);

	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
		{ /* need to shift things up to make room */
		/* +2 for EOB chars. */
		register int number_to_move = (yy_n_chars) + 2;
		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
		register char *source =
				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];

		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
			*--dest = *--source;

		yy_cp += (int) (dest - source);
		yy_bp += (int) (dest - source);
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;

		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
			YY_FATAL_ERROR( "flex scanner push-back overflow" );
		}

	*--yy_cp = (char) c;

	(yytext_ptr) = yy_bp;
	(yy_hold_char) = *yy_cp;
	(yy_c_buf_p) = yy_cp;
}

#ifndef YY_NO_INPUT
#ifdef __cplusplus
    static int yyinput (void)
#else
    static int input  (void)
#endif

{
	int c;
    
	*(yy_c_buf_p) = (yy_hold_char);

	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
		{
		/* yy_c_buf_p now points to the character we want to return.
		 * If this occurs *before* the EOB characters, then it's a
		 * valid NUL; if not, then we've hit the end of the buffer.
		 */
		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
			/* This was really a NUL. */
			*(yy_c_buf_p) = '\0';

		else
			{ /* need more input */
			int offset = (yy_c_buf_p) - (yytext_ptr);
			++(yy_c_buf_p);

			switch ( yy_get_next_buffer(  ) )
				{
				case EOB_ACT_LAST_MATCH:
					/* This happens because yy_g_n_b()
					 * sees that we've accumulated a
					 * token and flags that we need to
					 * try matching the token before
					 * proceeding.  But for input(),
					 * there's no matching to consider.
					 * So convert the EOB_ACT_LAST_MATCH
					 * to EOB_ACT_END_OF_FILE.
					 */

					/* Reset buffer status. */
					parse_events_restart(parse_events_in );

					/*FALLTHROUGH*/

				case EOB_ACT_END_OF_FILE:
					{
					if ( parse_events_wrap( ) )
						return EOF;

					if ( ! (yy_did_buffer_switch_on_eof) )
						YY_NEW_FILE;
#ifdef __cplusplus
					return yyinput();
#else
					return input();
#endif
					}

				case EOB_ACT_CONTINUE_SCAN:
					(yy_c_buf_p) = (yytext_ptr) + offset;
					break;
				}
			}
		}

	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
	*(yy_c_buf_p) = '\0';	/* preserve parse_events_text */
	(yy_hold_char) = *++(yy_c_buf_p);

	return c;
}
#endif	/* ifndef YY_NO_INPUT */

/** Immediately switch to a different input stream.
 * @param input_file A readable stream.
 * 
 * @note This function does not reset the start condition to @c INITIAL .
 */
    void parse_events_restart  (FILE * input_file )
{
    
	if ( ! YY_CURRENT_BUFFER ){
        parse_events_ensure_buffer_stack ();
		YY_CURRENT_BUFFER_LVALUE =
            parse_events__create_buffer(parse_events_in,YY_BUF_SIZE );
	}

	parse_events__init_buffer(YY_CURRENT_BUFFER,input_file );
	parse_events__load_buffer_state( );
}

/** Switch to a different input buffer.
 * @param new_buffer The new input buffer.
 * 
 */
    void parse_events__switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
{
    
	/* TODO. We should be able to replace this entire function body
	 * with
	 *		parse_events_pop_buffer_state();
	 *		parse_events_push_buffer_state(new_buffer);
     */
	parse_events_ensure_buffer_stack ();
	if ( YY_CURRENT_BUFFER == new_buffer )
		return;

	if ( YY_CURRENT_BUFFER )
		{
		/* Flush out information for old buffer. */
		*(yy_c_buf_p) = (yy_hold_char);
		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
		}

	YY_CURRENT_BUFFER_LVALUE = new_buffer;
	parse_events__load_buffer_state( );

	/* We don't actually know whether we did this switch during
	 * EOF (parse_events_wrap()) processing, but the only time this flag
	 * is looked at is after parse_events_wrap() is called, so it's safe
	 * to go ahead and always set it.
	 */
	(yy_did_buffer_switch_on_eof) = 1;
}

static void parse_events__load_buffer_state  (void)
{
    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
	parse_events_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
	(yy_hold_char) = *(yy_c_buf_p);
}

/** Allocate and initialize an input buffer state.
 * @param file A readable stream.
 * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
 * 
 * @return the allocated buffer state.
 */
    YY_BUFFER_STATE parse_events__create_buffer  (FILE * file, int  size )
{
	YY_BUFFER_STATE b;
    
	b = (YY_BUFFER_STATE) parse_events_alloc(sizeof( struct yy_buffer_state )  );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in parse_events__create_buffer()" );

	b->yy_buf_size = size;

	/* yy_ch_buf has to be 2 characters longer than the size given because
	 * we need to put in 2 end-of-buffer characters.
	 */
	b->yy_ch_buf = (char *) parse_events_alloc(b->yy_buf_size + 2  );
	if ( ! b->yy_ch_buf )
		YY_FATAL_ERROR( "out of dynamic memory in parse_events__create_buffer()" );

	b->yy_is_our_buffer = 1;

	parse_events__init_buffer(b,file );

	return b;
}

/** Destroy the buffer.
 * @param b a buffer created with parse_events__create_buffer()
 * 
 */
    void parse_events__delete_buffer (YY_BUFFER_STATE  b )
{
    
	if ( ! b )
		return;

	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;

	if ( b->yy_is_our_buffer )
		parse_events_free((void *) b->yy_ch_buf  );

	parse_events_free((void *) b  );
}

#ifndef __cplusplus
extern int isatty (int );
#endif /* __cplusplus */
    
/* Initializes or reinitializes a buffer.
 * This function is sometimes called more than once on the same buffer,
 * such as during a parse_events_restart() or at EOF.
 */
    static void parse_events__init_buffer  (YY_BUFFER_STATE  b, FILE * file )

{
	int oerrno = errno;
    
	parse_events__flush_buffer(b );

	b->yy_input_file = file;
	b->yy_fill_buffer = 1;

    /* If b is the current buffer, then parse_events__init_buffer was _probably_
     * called from parse_events_restart() or through yy_get_next_buffer.
     * In that case, we don't want to reset the lineno or column.
     */
    if (b != YY_CURRENT_BUFFER){
        b->yy_bs_lineno = 1;
        b->yy_bs_column = 0;
    }

        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
    
	errno = oerrno;
}

/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
 * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
 * 
 */
    void parse_events__flush_buffer (YY_BUFFER_STATE  b )
{
    	if ( ! b )
		return;

	b->yy_n_chars = 0;

	/* We always need two end-of-buffer characters.  The first causes
	 * a transition to the end-of-buffer state.  The second causes
	 * a jam in that state.
	 */
	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;

	b->yy_buf_pos = &b->yy_ch_buf[0];

	b->yy_at_bol = 1;
	b->yy_buffer_status = YY_BUFFER_NEW;

	if ( b == YY_CURRENT_BUFFER )
		parse_events__load_buffer_state( );
}

/** Pushes the new state onto the stack. The new state becomes
 *  the current state. This function will allocate the stack
 *  if necessary.
 *  @param new_buffer The new state.
 *  
 */
void parse_events_push_buffer_state (YY_BUFFER_STATE new_buffer )
{
    	if (new_buffer == NULL)
		return;

	parse_events_ensure_buffer_stack();

	/* This block is copied from parse_events__switch_to_buffer. */
	if ( YY_CURRENT_BUFFER )
		{
		/* Flush out information for old buffer. */
		*(yy_c_buf_p) = (yy_hold_char);
		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
		}

	/* Only push if top exists. Otherwise, replace top. */
	if (YY_CURRENT_BUFFER)
		(yy_buffer_stack_top)++;
	YY_CURRENT_BUFFER_LVALUE = new_buffer;

	/* copied from parse_events__switch_to_buffer. */
	parse_events__load_buffer_state( );
	(yy_did_buffer_switch_on_eof) = 1;
}

/** Removes and deletes the top of the stack, if present.
 *  The next element becomes the new top.
 *  
 */
void parse_events_pop_buffer_state (void)
{
    	if (!YY_CURRENT_BUFFER)
		return;

	parse_events__delete_buffer(YY_CURRENT_BUFFER );
	YY_CURRENT_BUFFER_LVALUE = NULL;
	if ((yy_buffer_stack_top) > 0)
		--(yy_buffer_stack_top);

	if (YY_CURRENT_BUFFER) {
		parse_events__load_buffer_state( );
		(yy_did_buffer_switch_on_eof) = 1;
	}
}

/* Allocates the stack if it does not exist.
 *  Guarantees space for at least one push.
 */
static void parse_events_ensure_buffer_stack (void)
{
	int num_to_alloc;
    
	if (!(yy_buffer_stack)) {

		/* First allocation is just for 2 elements, since we don't know if this
		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
		 * immediate realloc on the next call.
         */
		num_to_alloc = 1;
		(yy_buffer_stack) = (struct yy_buffer_state**)parse_events_alloc
								(num_to_alloc * sizeof(struct yy_buffer_state*)
								);
		if ( ! (yy_buffer_stack) )
			YY_FATAL_ERROR( "out of dynamic memory in parse_events_ensure_buffer_stack()" );
								  
		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
				
		(yy_buffer_stack_max) = num_to_alloc;
		(yy_buffer_stack_top) = 0;
		return;
	}

	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){

		/* Increase the buffer to prepare for a possible push. */
		int grow_size = 8 /* arbitrary grow size */;

		num_to_alloc = (yy_buffer_stack_max) + grow_size;
		(yy_buffer_stack) = (struct yy_buffer_state**)parse_events_realloc
								((yy_buffer_stack),
								num_to_alloc * sizeof(struct yy_buffer_state*)
								);
		if ( ! (yy_buffer_stack) )
			YY_FATAL_ERROR( "out of dynamic memory in parse_events_ensure_buffer_stack()" );

		/* zero only the new slots.*/
		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
		(yy_buffer_stack_max) = num_to_alloc;
	}
}

/** Setup the input buffer state to scan directly from a user-specified character buffer.
 * @param base the character buffer
 * @param size the size in bytes of the character buffer
 * 
 * @return the newly allocated buffer state object. 
 */
YY_BUFFER_STATE parse_events__scan_buffer  (char * base, yy_size_t  size )
{
	YY_BUFFER_STATE b;
    
	if ( size < 2 ||
	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
	     base[size-1] != YY_END_OF_BUFFER_CHAR )
		/* They forgot to leave room for the EOB's. */
		return 0;

	b = (YY_BUFFER_STATE) parse_events_alloc(sizeof( struct yy_buffer_state )  );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in parse_events__scan_buffer()" );

	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
	b->yy_buf_pos = b->yy_ch_buf = base;
	b->yy_is_our_buffer = 0;
	b->yy_input_file = 0;
	b->yy_n_chars = b->yy_buf_size;
	b->yy_is_interactive = 0;
	b->yy_at_bol = 1;
	b->yy_fill_buffer = 0;
	b->yy_buffer_status = YY_BUFFER_NEW;

	parse_events__switch_to_buffer(b  );

	return b;
}

/** Setup the input buffer state to scan a string. The next call to parse_events_lex() will
 * scan from a @e copy of @a str.
 * @param yystr a NUL-terminated string to scan
 * 
 * @return the newly allocated buffer state object.
 * @note If you want to scan bytes that may contain NUL values, then use
 *       parse_events__scan_bytes() instead.
 */
YY_BUFFER_STATE parse_events__scan_string (yyconst char * yystr )
{
    
	return parse_events__scan_bytes(yystr,strlen(yystr) );
}

/** Setup the input buffer state to scan the given bytes. The next call to parse_events_lex() will
 * scan from a @e copy of @a bytes.
 * @param bytes the byte buffer to scan
 * @param len the number of bytes in the buffer pointed to by @a bytes.
 * 
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE parse_events__scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
{
	YY_BUFFER_STATE b;
	char *buf;
	yy_size_t n;
	int i;
    
	/* Get memory for full buffer, including space for trailing EOB's. */
	n = _yybytes_len + 2;
	buf = (char *) parse_events_alloc(n  );
	if ( ! buf )
		YY_FATAL_ERROR( "out of dynamic memory in parse_events__scan_bytes()" );

	for ( i = 0; i < _yybytes_len; ++i )
		buf[i] = yybytes[i];

	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;

	b = parse_events__scan_buffer(buf,n );
	if ( ! b )
		YY_FATAL_ERROR( "bad buffer in parse_events__scan_bytes()" );

	/* It's okay to grow etc. this buffer, and we should throw it
	 * away when we're done.
	 */
	b->yy_is_our_buffer = 1;

	return b;
}

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

static void yy_fatal_error (yyconst char* msg )
{
    	(void) fprintf( stderr, "%s\n", msg );
	exit( YY_EXIT_FAILURE );
}

/* Redefine yyless() so it works in section 3 code. */

#undef yyless
#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up parse_events_text. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
		parse_events_text[parse_events_leng] = (yy_hold_char); \
		(yy_c_buf_p) = parse_events_text + yyless_macro_arg; \
		(yy_hold_char) = *(yy_c_buf_p); \
		*(yy_c_buf_p) = '\0'; \
		parse_events_leng = yyless_macro_arg; \
		} \
	while ( 0 )

/* Accessor  methods (get/set functions) to struct members. */

/** Get the current line number.
 * 
 */
int parse_events_get_lineno  (void)
{
        
    return parse_events_lineno;
}

/** Get the input stream.
 * 
 */
FILE *parse_events_get_in  (void)
{
        return parse_events_in;
}

/** Get the output stream.
 * 
 */
FILE *parse_events_get_out  (void)
{
        return parse_events_out;
}

/** Get the length of the current token.
 * 
 */
int parse_events_get_leng  (void)
{
        return parse_events_leng;
}

/** Get the current token.
 * 
 */

char *parse_events_get_text  (void)
{
        return parse_events_text;
}

/** Set the current line number.
 * @param line_number
 * 
 */
void parse_events_set_lineno (int  line_number )
{
    
    parse_events_lineno = line_number;
}

/** Set the input stream. This does not discard the current
 * input buffer.
 * @param in_str A readable stream.
 * 
 * @see parse_events__switch_to_buffer
 */
void parse_events_set_in (FILE *  in_str )
{
        parse_events_in = in_str ;
}

void parse_events_set_out (FILE *  out_str )
{
        parse_events_out = out_str ;
}

int parse_events_get_debug  (void)
{
        return parse_events__flex_debug;
}

void parse_events_set_debug (int  bdebug )
{
        parse_events__flex_debug = bdebug ;
}

static int yy_init_globals (void)
{
        /* Initialization is the same as for the non-reentrant scanner.
     * This function is called from parse_events_lex_destroy(), so don't allocate here.
     */

    (yy_buffer_stack) = 0;
    (yy_buffer_stack_top) = 0;
    (yy_buffer_stack_max) = 0;
    (yy_c_buf_p) = (char *) 0;
    (yy_init) = 0;
    (yy_start) = 0;

/* Defined in main.c */
#ifdef YY_STDINIT
    parse_events_in = stdin;
    parse_events_out = stdout;
#else
    parse_events_in = (FILE *) 0;
    parse_events_out = (FILE *) 0;
#endif

    /* For future reference: Set errno on error, since we are called by
     * parse_events_lex_init()
     */
    return 0;
}

/* parse_events_lex_destroy is for both reentrant and non-reentrant scanners. */
int parse_events_lex_destroy  (void)
{
    
    /* Pop the buffer stack, destroying each element. */
	while(YY_CURRENT_BUFFER){
		parse_events__delete_buffer(YY_CURRENT_BUFFER  );
		YY_CURRENT_BUFFER_LVALUE = NULL;
		parse_events_pop_buffer_state();
	}

	/* Destroy the stack itself. */
	parse_events_free((yy_buffer_stack) );
	(yy_buffer_stack) = NULL;

    /* Reset the globals. This is important in a non-reentrant scanner so the next time
     * parse_events_lex() is called, initialization will occur. */
    yy_init_globals( );

    return 0;
}

/*
 * Internal utility routines.
 */

#ifndef yytext_ptr
static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
{
	register int i;
	for ( i = 0; i < n; ++i )
		s1[i] = s2[i];
}
#endif

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (yyconst char * s )
{
	register int n;
	for ( n = 0; s[n]; ++n )
		;

	return n;
}
#endif

void *parse_events_alloc (yy_size_t  size )
{
	return (void *) malloc( size );
}

void *parse_events_realloc  (void * ptr, yy_size_t  size )
{
	/* The cast to (char *) in the following accommodates both
	 * implementations that use char* generic pointers, and those
	 * that use void* generic pointers.  It works with the latter
	 * because both ANSI C and C++ allow castless assignment from
	 * any pointer type to void*, and deal with argument conversions
	 * as though doing an assignment.
	 */
	return (void *) realloc( (char *) ptr, size );
}

void parse_events_free (void * ptr )
{
	free( (char *) ptr );	/* see parse_events_realloc() for (char *) cast */
}

#define YYTABLES_NAME "yytables"

#line 121 "util/parse-events.l"



int parse_events_wrap(void)
{
	return 1;
}

