#line 1 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
#include <assert.h>
#include <ruby.h>

#if defined(_WIN32)
#include <stddef.h>
#endif

#ifdef HAVE_RUBY_RE_H
#include <ruby/re.h>
#else
#include <re.h>
#endif

#ifdef HAVE_RUBY_ENCODING_H
#include <ruby/encoding.h>
#define ENCODED_STR_NEW(ptr, len) \
    rb_enc_str_new(ptr, len, rb_utf8_encoding())
#else
#define ENCODED_STR_NEW(ptr, len) \
    rb_str_new(ptr, len)
#endif

#ifndef RSTRING_PTR
#define RSTRING_PTR(s) (RSTRING(s)->ptr)
#endif

#ifndef RSTRING_LEN
#define RSTRING_LEN(s) (RSTRING(s)->len)
#endif

#define DATA_GET(FROM, TYPE, NAME) \
  Data_Get_Struct(FROM, TYPE, NAME); \
  if (NAME == NULL) { \
    rb_raise(rb_eArgError, "NULL found for " # NAME " when it shouldn't be."); \
  }
 
typedef struct lexer_state {
  int content_len;
  int line_number;
  int current_line;
  int start_col;
  size_t mark;
  size_t keyword_start;
  size_t keyword_end;
  size_t next_keyword_start;
  size_t content_start;
  size_t content_end;
  size_t query_start;
  size_t last_newline;
  size_t final_newline;
} lexer_state;

static VALUE mGherkin;
static VALUE mGherkinLexer;
static VALUE mCLexer;
static VALUE cI18nLexer;
static VALUE rb_eGherkinLexingError;

#define LEN(AT, P) (P - data - lexer->AT)
#define MARK(M, P) (lexer->M = (P) - data)
#define PTR_TO(P) (data + lexer->P)

#define STORE_KW_END_CON(EVENT) \
  store_multiline_kw_con(listener, # EVENT, \
    PTR_TO(keyword_start), LEN(keyword_start, PTR_TO(keyword_end - 1)), \
    PTR_TO(content_start), LEN(content_start, PTR_TO(content_end)), \
    lexer->current_line, lexer->start_col); \
    if (lexer->content_end != 0) { \
      p = PTR_TO(content_end - 1); \
    } \
    lexer->content_end = 0

#define STORE_ATTR(ATTR) \
    store_attr(listener, # ATTR, \
      PTR_TO(content_start), LEN(content_start, p), \
      lexer->line_number)


#line 242 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"


/** Data **/

#line 87 "ext/gherkin_lexer_ar/gherkin_lexer_ar.c"
static const char _lexer_actions[] = {
	0, 1, 0, 1, 1, 1, 2, 1, 
	3, 1, 4, 1, 5, 1, 6, 1, 
	7, 1, 8, 1, 9, 1, 10, 1, 
	11, 1, 14, 1, 15, 1, 16, 1, 
	17, 1, 18, 1, 19, 1, 20, 1, 
	21, 2, 1, 16, 2, 11, 0, 2, 
	12, 13, 2, 15, 0, 2, 15, 2, 
	2, 15, 14, 2, 15, 17, 2, 16, 
	4, 2, 16, 5, 2, 16, 6, 2, 
	16, 7, 2, 16, 8, 2, 16, 14, 
	2, 18, 19, 2, 20, 0, 2, 20, 
	2, 2, 20, 14, 2, 20, 17, 3, 
	3, 12, 13, 3, 9, 12, 13, 3, 
	10, 12, 13, 3, 11, 12, 13, 3, 
	12, 13, 16, 3, 15, 12, 13, 4, 
	1, 12, 13, 16, 4, 15, 0, 12, 
	13
};

static const short _lexer_key_offsets[] = {
	0, 0, 13, 19, 21, 22, 23, 24, 
	25, 26, 27, 28, 30, 42, 45, 46, 
	47, 48, 49, 50, 51, 52, 53, 54, 
	55, 59, 64, 69, 74, 79, 83, 87, 
	89, 90, 91, 92, 93, 94, 95, 96, 
	97, 98, 99, 100, 101, 102, 103, 104, 
	109, 116, 121, 125, 131, 134, 136, 142, 
	154, 156, 157, 158, 159, 160, 161, 162, 
	163, 164, 165, 166, 167, 168, 169, 179, 
	186, 188, 190, 192, 194, 196, 198, 200, 
	212, 214, 216, 218, 220, 222, 224, 226, 
	228, 230, 232, 234, 236, 238, 240, 242, 
	244, 246, 248, 250, 252, 254, 256, 258, 
	260, 262, 264, 266, 268, 270, 273, 275, 
	277, 279, 281, 283, 285, 287, 289, 291, 
	293, 295, 297, 299, 301, 303, 305, 309, 
	311, 313, 315, 317, 319, 321, 323, 325, 
	327, 329, 331, 333, 335, 337, 339, 341, 
	343, 345, 347, 349, 351, 353, 354, 355, 
	356, 357, 358, 359, 360, 361, 362, 369, 
	371, 373, 375, 377, 379, 381, 383, 385, 
	387, 389, 390, 391, 392, 393, 394, 395, 
	396, 397, 398, 399, 400, 401, 402, 403, 
	404, 405, 406, 407, 408, 416, 420, 422, 
	425, 427, 429, 431, 433, 435, 437, 439, 
	441, 443, 445, 447, 449, 451, 453, 455, 
	457, 459, 461, 463, 465, 467, 469, 471, 
	473, 475, 477, 479, 481, 483, 485, 487, 
	490, 492, 494, 496, 498, 500, 502, 504, 
	506, 508, 510, 512, 514, 516, 518, 520, 
	522, 524, 526, 528, 530, 532, 534, 535, 
	536, 537, 538, 539, 540, 541, 542, 543, 
	544, 545, 546, 548, 549, 550, 551, 552, 
	553, 554, 555, 556, 557, 558, 559, 569, 
	576, 578, 580, 582, 584, 586, 588, 590, 
	592, 594, 596, 598, 600, 602, 604, 606, 
	608, 610, 612, 614, 616, 618, 620, 622, 
	624, 626, 628, 630, 632, 634, 636, 638, 
	640, 642, 644, 646, 648, 650, 652, 654, 
	656, 658, 660, 662, 664, 668, 670, 672, 
	674, 676, 678, 680, 682, 684, 686, 688, 
	690, 692, 694, 696, 698, 700, 702, 704, 
	706, 708, 710, 712, 713, 714, 724, 731, 
	734, 736, 738, 740, 742, 744, 746, 748, 
	750, 752, 754, 756, 758, 760, 762, 764, 
	766, 768, 770, 772, 774, 776, 778, 780, 
	782, 784, 786, 788, 790, 792, 794, 796, 
	798, 800, 802, 804, 806, 808, 810, 812, 
	814, 816, 818, 821, 823, 825, 827, 829, 
	831, 833, 835, 837, 839, 841, 843, 845, 
	847, 849, 851, 853, 857, 859, 861, 863, 
	865, 867, 869, 871, 873, 875, 877, 879, 
	881, 883, 885, 887, 889, 891, 893, 895, 
	897, 899, 901, 902, 903, 904, 905, 906, 
	907, 908, 909, 910, 911
};

static const char _lexer_trans_keys[] = {
	-40, -39, -17, 10, 32, 34, 35, 37, 
	42, 64, 124, 9, 13, -89, -88, -85, 
	-82, -77, -71, -40, -39, -80, -40, -89, 
	-39, -117, 32, 10, 10, 13, -40, -39, 
	10, 32, 34, 35, 37, 42, 64, 124, 
	9, 13, -124, -123, -120, -39, -125, -39, 
	-122, -40, -86, -39, -119, 34, 34, 10, 
	32, 9, 13, 10, 32, 34, 9, 13, 
	10, 32, 34, 9, 13, 10, 32, 34, 
	9, 13, 10, 32, 34, 9, 13, 10, 
	32, 9, 13, 10, 32, 9, 13, 10, 
	13, 10, 95, 70, 69, 65, 84, 85, 
	82, 69, 95, 69, 78, 68, 95, 37, 
	13, 32, 64, 9, 10, 9, 10, 13, 
	32, 64, 11, 12, 10, 32, 64, 9, 
	13, 32, 124, 9, 13, 10, 32, 92, 
	124, 9, 13, 10, 92, 124, 10, 92, 
	10, 32, 92, 124, 9, 13, -40, -39, 
	10, 32, 34, 35, 37, 42, 64, 124, 
	9, 13, -124, -123, -40, -82, -39, -124, 
	-39, -127, -39, -118, -40, -87, 58, 10, 
	10, -40, -39, 10, 32, 35, 37, 42, 
	64, 9, 13, -89, -88, -85, -82, -77, 
	-71, 10, -40, 10, -80, 10, -40, 10, 
	-89, 10, -39, 10, -117, 10, 10, 32, 
	-40, -39, 10, 32, 34, 35, 37, 42, 
	64, 124, 9, 13, -39, 10, -127, 10, 
	-40, 10, -79, 10, -40, 10, -74, 10, 
	-39, 10, -123, 10, -40, 10, -89, 10, 
	-40, 10, -75, 10, -39, 10, -118, 10, 
	-40, 10, -87, 10, 10, 58, -39, 10, 
	-118, 10, -39, 10, -122, 10, -40, 10, 
	-89, 10, -40, 10, -79, 10, -39, 10, 
	-118, 10, -39, 10, -120, 10, 10, 32, 
	58, -39, 10, -123, 10, -40, 10, -82, 
	10, -40, 10, -73, 10, -40, 10, -73, 
	10, -39, 10, -122, 10, -40, 10, -81, 
	10, -39, 10, -123, 10, -40, 10, -89, 
	10, -124, -123, -120, 10, -39, 10, -125, 
	10, -39, 10, -122, 10, -40, 10, -86, 
	10, -39, 10, -119, 10, 10, 95, 10, 
	70, 10, 69, 10, 65, 10, 84, 10, 
	85, 10, 82, 10, 69, 10, 95, 10, 
	69, 10, 78, 10, 68, 10, 95, 10, 
	37, -40, -85, -39, -124, -40, -87, 58, 
	10, 10, -40, 10, 32, 35, 124, 9, 
	13, -82, 10, -40, 10, -89, 10, -40, 
	10, -75, 10, -39, 10, -118, 10, -40, 
	10, -87, 10, 10, 58, -39, -127, -40, 
	-79, -40, -74, -39, -123, -40, -89, -40, 
	-75, -39, -118, -40, -87, 58, 10, 10, 
	-40, 10, 32, 35, 37, 64, 9, 13, 
	-89, -82, -77, 10, -39, 10, -124, -123, 
	10, -40, 10, -82, 10, -39, 10, -124, 
	10, -39, 10, -127, 10, -39, 10, -118, 
	10, -40, 10, -87, 10, 10, 58, -40, 
	10, -85, 10, -39, 10, -124, 10, -40, 
	10, -89, 10, -40, 10, -75, 10, -39, 
	10, -118, 10, -39, 10, -122, 10, -40, 
	10, -89, 10, -40, 10, -79, 10, -39, 
	10, -118, 10, -39, 10, -120, 10, 10, 
	32, 58, -39, 10, -123, 10, -40, 10, 
	-82, 10, -40, 10, -73, 10, -40, 10, 
	-73, 10, 10, 95, 10, 70, 10, 69, 
	10, 65, 10, 84, 10, 85, 10, 82, 
	10, 69, 10, 95, 10, 69, 10, 78, 
	10, 68, 10, 95, 10, 37, -39, -118, 
	-39, -122, -40, -89, -40, -79, -39, -118, 
	-39, -120, 32, 58, -39, -123, -40, -82, 
	-40, -73, -40, -73, 58, 10, 10, -40, 
	-39, 10, 32, 35, 37, 42, 64, 9, 
	13, -89, -88, -85, -82, -77, -71, 10, 
	-40, 10, -80, 10, -40, 10, -89, 10, 
	-39, 10, -117, 10, 10, 32, -39, 10, 
	-127, 10, -40, 10, -79, 10, -40, 10, 
	-74, 10, -39, 10, -123, 10, -40, 10, 
	-89, 10, -40, 10, -75, 10, -39, 10, 
	-118, 10, -40, 10, -87, 10, 10, 58, 
	-39, 10, -118, 10, -39, 10, -122, 10, 
	-40, 10, -89, 10, -40, 10, -79, 10, 
	-39, 10, -118, 10, -39, 10, -120, 10, 
	-39, 10, -122, 10, -40, 10, -81, 10, 
	-39, 10, -123, 10, -40, 10, -89, 10, 
	-124, -123, -120, 10, -39, 10, -125, 10, 
	-39, 10, -122, 10, -40, 10, -86, 10, 
	-39, 10, -119, 10, 10, 95, 10, 70, 
	10, 69, 10, 65, 10, 84, 10, 85, 
	10, 82, 10, 69, 10, 95, 10, 69, 
	10, 78, 10, 68, 10, 95, 10, 37, 
	10, 10, -40, -39, 10, 32, 35, 37, 
	42, 64, 9, 13, -89, -88, -85, -82, 
	-77, -71, 10, -40, -39, 10, -80, 10, 
	-40, 10, -89, 10, -39, 10, -117, 10, 
	10, 32, -124, 10, -40, 10, -82, 10, 
	-39, 10, -124, 10, -39, 10, -127, 10, 
	-39, 10, -118, 10, -40, 10, -87, 10, 
	10, 58, -39, 10, -127, 10, -40, 10, 
	-79, 10, -40, 10, -74, 10, -39, 10, 
	-123, 10, -40, 10, -89, 10, -40, 10, 
	-75, 10, -39, 10, -118, 10, -39, 10, 
	-122, 10, -40, 10, -89, 10, -40, 10, 
	-79, 10, -39, 10, -118, 10, -39, 10, 
	-120, 10, 10, 32, 58, -39, 10, -123, 
	10, -40, 10, -82, 10, -40, 10, -73, 
	10, -40, 10, -73, 10, -39, 10, -122, 
	10, -40, 10, -81, 10, -39, 10, -123, 
	10, -40, 10, -89, 10, -124, -123, -120, 
	10, -39, 10, -125, 10, -39, 10, -122, 
	10, -40, 10, -86, 10, -39, 10, -119, 
	10, 10, 95, 10, 70, 10, 69, 10, 
	65, 10, 84, 10, 85, 10, 82, 10, 
	69, 10, 95, 10, 69, 10, 78, 10, 
	68, 10, 95, 10, 37, -39, -122, -40, 
	-81, -39, -123, -40, -89, -69, -65, 0
};

static const char _lexer_single_lengths[] = {
	0, 11, 6, 2, 1, 1, 1, 1, 
	1, 1, 1, 2, 10, 3, 1, 1, 
	1, 1, 1, 1, 1, 1, 1, 1, 
	2, 3, 3, 3, 3, 2, 2, 2, 
	1, 1, 1, 1, 1, 1, 1, 1, 
	1, 1, 1, 1, 1, 1, 1, 3, 
	5, 3, 2, 4, 3, 2, 4, 10, 
	2, 1, 1, 1, 1, 1, 1, 1, 
	1, 1, 1, 1, 1, 1, 8, 7, 
	2, 2, 2, 2, 2, 2, 2, 10, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 3, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 4, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 1, 1, 1, 
	1, 1, 1, 1, 1, 1, 5, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 1, 1, 1, 1, 1, 1, 1, 
	1, 1, 1, 1, 1, 1, 1, 1, 
	1, 1, 1, 1, 6, 4, 2, 3, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 3, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 1, 1, 
	1, 1, 1, 1, 1, 1, 1, 1, 
	1, 1, 2, 1, 1, 1, 1, 1, 
	1, 1, 1, 1, 1, 1, 8, 7, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 4, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 1, 1, 8, 7, 3, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 3, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 4, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 2, 2, 2, 2, 2, 2, 
	2, 2, 1, 1, 1, 1, 1, 1, 
	1, 1, 1, 1, 0
};

static const char _lexer_range_lengths[] = {
	0, 1, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 1, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	1, 1, 1, 1, 1, 1, 1, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 1, 
	1, 1, 1, 1, 0, 0, 1, 1, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 1, 0, 
	0, 0, 0, 0, 0, 0, 0, 1, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 1, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 1, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 1, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 1, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	0, 0, 0, 0, 0
};

static const short _lexer_index_offsets[] = {
	0, 0, 13, 20, 23, 25, 27, 29, 
	31, 33, 35, 37, 40, 52, 56, 58, 
	60, 62, 64, 66, 68, 70, 72, 74, 
	76, 80, 85, 90, 95, 100, 104, 108, 
	111, 113, 115, 117, 119, 121, 123, 125, 
	127, 129, 131, 133, 135, 137, 139, 141, 
	146, 153, 158, 162, 168, 172, 175, 181, 
	193, 196, 198, 200, 202, 204, 206, 208, 
	210, 212, 214, 216, 218, 220, 222, 232, 
	240, 243, 246, 249, 252, 255, 258, 261, 
	273, 276, 279, 282, 285, 288, 291, 294, 
	297, 300, 303, 306, 309, 312, 315, 318, 
	321, 324, 327, 330, 333, 336, 339, 342, 
	345, 348, 351, 354, 357, 360, 364, 367, 
	370, 373, 376, 379, 382, 385, 388, 391, 
	394, 397, 400, 403, 406, 409, 412, 417, 
	420, 423, 426, 429, 432, 435, 438, 441, 
	444, 447, 450, 453, 456, 459, 462, 465, 
	468, 471, 474, 477, 480, 483, 485, 487, 
	489, 491, 493, 495, 497, 499, 501, 508, 
	511, 514, 517, 520, 523, 526, 529, 532, 
	535, 538, 540, 542, 544, 546, 548, 550, 
	552, 554, 556, 558, 560, 562, 564, 566, 
	568, 570, 572, 574, 576, 584, 589, 592, 
	596, 599, 602, 605, 608, 611, 614, 617, 
	620, 623, 626, 629, 632, 635, 638, 641, 
	644, 647, 650, 653, 656, 659, 662, 665, 
	668, 671, 674, 677, 680, 683, 686, 689, 
	693, 696, 699, 702, 705, 708, 711, 714, 
	717, 720, 723, 726, 729, 732, 735, 738, 
	741, 744, 747, 750, 753, 756, 759, 761, 
	763, 765, 767, 769, 771, 773, 775, 777, 
	779, 781, 783, 786, 788, 790, 792, 794, 
	796, 798, 800, 802, 804, 806, 808, 818, 
	826, 829, 832, 835, 838, 841, 844, 847, 
	850, 853, 856, 859, 862, 865, 868, 871, 
	874, 877, 880, 883, 886, 889, 892, 895, 
	898, 901, 904, 907, 910, 913, 916, 919, 
	922, 925, 928, 931, 934, 937, 940, 943, 
	946, 949, 952, 955, 958, 963, 966, 969, 
	972, 975, 978, 981, 984, 987, 990, 993, 
	996, 999, 1002, 1005, 1008, 1011, 1014, 1017, 
	1020, 1023, 1026, 1029, 1031, 1033, 1043, 1051, 
	1055, 1058, 1061, 1064, 1067, 1070, 1073, 1076, 
	1079, 1082, 1085, 1088, 1091, 1094, 1097, 1100, 
	1103, 1106, 1109, 1112, 1115, 1118, 1121, 1124, 
	1127, 1130, 1133, 1136, 1139, 1142, 1145, 1148, 
	1151, 1154, 1157, 1160, 1163, 1166, 1169, 1172, 
	1175, 1178, 1181, 1185, 1188, 1191, 1194, 1197, 
	1200, 1203, 1206, 1209, 1212, 1215, 1218, 1221, 
	1224, 1227, 1230, 1233, 1238, 1241, 1244, 1247, 
	1250, 1253, 1256, 1259, 1262, 1265, 1268, 1271, 
	1274, 1277, 1280, 1283, 1286, 1289, 1292, 1295, 
	1298, 1301, 1304, 1306, 1308, 1310, 1312, 1314, 
	1316, 1318, 1320, 1322, 1324
};

static const short _lexer_trans_targs[] = {
	2, 13, 434, 12, 12, 22, 31, 33, 
	9, 47, 50, 12, 0, 3, 169, 175, 
	177, 246, 426, 0, 4, 56, 0, 5, 
	0, 6, 0, 7, 0, 8, 0, 9, 
	0, 10, 0, 0, 11, 12, 32, 11, 
	2, 13, 12, 12, 22, 31, 33, 9, 
	47, 50, 12, 0, 14, 18, 9, 0, 
	15, 0, 16, 0, 17, 0, 9, 0, 
	19, 0, 20, 0, 21, 0, 9, 0, 
	23, 0, 24, 0, 25, 24, 24, 0, 
	26, 26, 27, 26, 26, 26, 26, 27, 
	26, 26, 26, 26, 28, 26, 26, 26, 
	26, 29, 26, 26, 12, 30, 30, 0, 
	12, 30, 30, 0, 12, 32, 31, 12, 
	0, 34, 0, 35, 0, 36, 0, 37, 
	0, 38, 0, 39, 0, 40, 0, 41, 
	0, 42, 0, 43, 0, 44, 0, 45, 
	0, 46, 0, 436, 0, 0, 0, 0, 
	0, 48, 49, 12, 49, 49, 47, 48, 
	48, 12, 49, 47, 49, 0, 50, 51, 
	50, 0, 55, 54, 53, 51, 54, 52, 
	0, 53, 51, 52, 0, 53, 52, 55, 
	54, 53, 51, 54, 52, 2, 13, 55, 
	55, 22, 31, 33, 9, 47, 50, 55, 
	0, 57, 149, 0, 58, 0, 59, 0, 
	60, 0, 61, 0, 62, 0, 63, 0, 
	64, 0, 65, 0, 66, 0, 67, 0, 
	68, 0, 70, 69, 70, 69, 71, 126, 
	70, 70, 12, 135, 78, 12, 70, 69, 
	72, 80, 86, 88, 97, 118, 70, 69, 
	73, 70, 69, 74, 70, 69, 75, 70, 
	69, 76, 70, 69, 77, 70, 69, 78, 
	70, 69, 70, 79, 69, 2, 13, 12, 
	12, 22, 31, 33, 9, 47, 50, 12, 
	0, 81, 70, 69, 82, 70, 69, 83, 
	70, 69, 84, 70, 69, 85, 70, 69, 
	78, 70, 69, 87, 70, 69, 78, 70, 
	69, 89, 70, 69, 90, 70, 69, 91, 
	70, 69, 92, 70, 69, 93, 70, 69, 
	94, 70, 69, 95, 70, 69, 96, 70, 
	69, 70, 79, 69, 98, 70, 69, 99, 
	70, 69, 100, 70, 69, 101, 70, 69, 
	102, 70, 69, 103, 70, 69, 104, 70, 
	69, 105, 70, 69, 106, 70, 69, 107, 
	70, 69, 108, 70, 69, 109, 70, 69, 
	70, 110, 79, 69, 111, 70, 69, 112, 
	70, 69, 113, 70, 69, 114, 70, 69, 
	115, 70, 69, 116, 70, 69, 117, 70, 
	69, 96, 70, 69, 119, 70, 69, 120, 
	70, 69, 121, 70, 69, 122, 70, 69, 
	123, 70, 69, 124, 70, 69, 125, 70, 
	69, 78, 70, 69, 127, 131, 78, 70, 
	69, 128, 70, 69, 129, 70, 69, 130, 
	70, 69, 78, 70, 69, 132, 70, 69, 
	133, 70, 69, 134, 70, 69, 78, 70, 
	69, 70, 136, 69, 70, 137, 69, 70, 
	138, 69, 70, 139, 69, 70, 140, 69, 
	70, 141, 69, 70, 142, 69, 70, 143, 
	69, 70, 144, 69, 70, 145, 69, 70, 
	146, 69, 70, 147, 69, 70, 148, 69, 
	70, 12, 69, 150, 0, 151, 0, 152, 
	0, 153, 0, 154, 0, 155, 0, 156, 
	0, 158, 157, 158, 157, 159, 158, 158, 
	12, 12, 158, 157, 160, 158, 157, 161, 
	158, 157, 162, 158, 157, 163, 158, 157, 
	164, 158, 157, 165, 158, 157, 166, 158, 
	157, 167, 158, 157, 168, 158, 157, 158, 
	79, 157, 170, 0, 171, 0, 172, 0, 
	173, 0, 174, 0, 9, 0, 176, 0, 
	9, 0, 178, 0, 179, 0, 180, 0, 
	181, 0, 182, 0, 183, 0, 184, 0, 
	185, 0, 186, 0, 188, 187, 188, 187, 
	189, 188, 188, 12, 232, 12, 188, 187, 
	190, 207, 211, 188, 187, 191, 188, 187, 
	192, 203, 188, 187, 193, 188, 187, 194, 
	188, 187, 195, 188, 187, 196, 188, 187, 
	197, 188, 187, 198, 188, 187, 199, 188, 
	187, 200, 188, 187, 201, 188, 187, 202, 
	188, 187, 188, 79, 187, 204, 188, 187, 
	205, 188, 187, 206, 188, 187, 200, 188, 
	187, 208, 188, 187, 209, 188, 187, 210, 
	188, 187, 198, 188, 187, 212, 188, 187, 
	213, 188, 187, 214, 188, 187, 215, 188, 
	187, 216, 188, 187, 217, 188, 187, 218, 
	188, 187, 219, 188, 187, 220, 188, 187, 
	221, 188, 187, 222, 188, 187, 223, 188, 
	187, 188, 224, 79, 187, 225, 188, 187, 
	226, 188, 187, 227, 188, 187, 228, 188, 
	187, 229, 188, 187, 230, 188, 187, 231, 
	188, 187, 202, 188, 187, 188, 233, 187, 
	188, 234, 187, 188, 235, 187, 188, 236, 
	187, 188, 237, 187, 188, 238, 187, 188, 
	239, 187, 188, 240, 187, 188, 241, 187, 
	188, 242, 187, 188, 243, 187, 188, 244, 
	187, 188, 245, 187, 188, 12, 187, 247, 
	0, 248, 0, 249, 0, 250, 0, 251, 
	0, 252, 0, 253, 0, 254, 0, 255, 
	0, 256, 0, 257, 0, 258, 0, 259, 
	339, 0, 260, 0, 261, 0, 262, 0, 
	263, 0, 264, 0, 265, 0, 266, 0, 
	267, 0, 268, 0, 270, 269, 270, 269, 
	271, 316, 270, 270, 12, 325, 278, 12, 
	270, 269, 272, 279, 285, 287, 296, 308, 
	270, 269, 273, 270, 269, 274, 270, 269, 
	275, 270, 269, 276, 270, 269, 277, 270, 
	269, 278, 270, 269, 270, 79, 269, 280, 
	270, 269, 281, 270, 269, 282, 270, 269, 
	283, 270, 269, 284, 270, 269, 278, 270, 
	269, 286, 270, 269, 278, 270, 269, 288, 
	270, 269, 289, 270, 269, 290, 270, 269, 
	291, 270, 269, 292, 270, 269, 293, 270, 
	269, 294, 270, 269, 295, 270, 269, 270, 
	79, 269, 297, 270, 269, 298, 270, 269, 
	299, 270, 269, 300, 270, 269, 301, 270, 
	269, 302, 270, 269, 303, 270, 269, 304, 
	270, 269, 305, 270, 269, 306, 270, 269, 
	307, 270, 269, 295, 270, 269, 309, 270, 
	269, 310, 270, 269, 311, 270, 269, 312, 
	270, 269, 313, 270, 269, 314, 270, 269, 
	315, 270, 269, 278, 270, 269, 317, 321, 
	278, 270, 269, 318, 270, 269, 319, 270, 
	269, 320, 270, 269, 278, 270, 269, 322, 
	270, 269, 323, 270, 269, 324, 270, 269, 
	278, 270, 269, 270, 326, 269, 270, 327, 
	269, 270, 328, 269, 270, 329, 269, 270, 
	330, 269, 270, 331, 269, 270, 332, 269, 
	270, 333, 269, 270, 334, 269, 270, 335, 
	269, 270, 336, 269, 270, 337, 269, 270, 
	338, 269, 270, 12, 269, 341, 340, 341, 
	340, 342, 403, 341, 341, 12, 412, 349, 
	12, 341, 340, 343, 362, 368, 370, 374, 
	395, 341, 340, 344, 350, 341, 340, 345, 
	341, 340, 346, 341, 340, 347, 341, 340, 
	348, 341, 340, 349, 341, 340, 341, 79, 
	340, 351, 341, 340, 352, 341, 340, 353, 
	341, 340, 354, 341, 340, 355, 341, 340, 
	356, 341, 340, 357, 341, 340, 358, 341, 
	340, 359, 341, 340, 360, 341, 340, 361, 
	341, 340, 341, 79, 340, 363, 341, 340, 
	364, 341, 340, 365, 341, 340, 366, 341, 
	340, 367, 341, 340, 349, 341, 340, 369, 
	341, 340, 349, 341, 340, 371, 341, 340, 
	372, 341, 340, 373, 341, 340, 357, 341, 
	340, 375, 341, 340, 376, 341, 340, 377, 
	341, 340, 378, 341, 340, 379, 341, 340, 
	380, 341, 340, 381, 341, 340, 382, 341, 
	340, 383, 341, 340, 384, 341, 340, 385, 
	341, 340, 386, 341, 340, 341, 387, 79, 
	340, 388, 341, 340, 389, 341, 340, 390, 
	341, 340, 391, 341, 340, 392, 341, 340, 
	393, 341, 340, 394, 341, 340, 361, 341, 
	340, 396, 341, 340, 397, 341, 340, 398, 
	341, 340, 399, 341, 340, 400, 341, 340, 
	401, 341, 340, 402, 341, 340, 349, 341, 
	340, 404, 408, 349, 341, 340, 405, 341, 
	340, 406, 341, 340, 407, 341, 340, 349, 
	341, 340, 409, 341, 340, 410, 341, 340, 
	411, 341, 340, 349, 341, 340, 341, 413, 
	340, 341, 414, 340, 341, 415, 340, 341, 
	416, 340, 341, 417, 340, 341, 418, 340, 
	341, 419, 340, 341, 420, 340, 341, 421, 
	340, 341, 422, 340, 341, 423, 340, 341, 
	424, 340, 341, 425, 340, 341, 12, 340, 
	427, 0, 428, 0, 429, 0, 430, 0, 
	431, 0, 432, 0, 433, 0, 9, 0, 
	435, 0, 12, 0, 0, 0
};

static const char _lexer_trans_actions[] = {
	25, 25, 0, 47, 0, 5, 1, 0, 
	25, 1, 31, 0, 39, 0, 0, 0, 
	0, 0, 0, 39, 0, 0, 39, 0, 
	39, 0, 39, 0, 39, 0, 39, 0, 
	39, 0, 39, 39, 50, 99, 19, 0, 
	25, 25, 47, 0, 5, 1, 0, 25, 
	1, 31, 0, 39, 0, 0, 0, 39, 
	0, 39, 0, 39, 0, 39, 0, 39, 
	0, 39, 0, 39, 0, 39, 0, 39, 
	0, 39, 0, 39, 47, 0, 0, 39, 
	119, 41, 41, 41, 3, 111, 29, 29, 
	29, 0, 111, 29, 29, 29, 0, 111, 
	29, 0, 29, 0, 95, 7, 7, 39, 
	47, 0, 0, 39, 103, 21, 0, 47, 
	39, 0, 39, 0, 39, 0, 39, 0, 
	39, 0, 39, 0, 39, 0, 39, 0, 
	39, 0, 39, 0, 39, 0, 39, 0, 
	39, 0, 39, 0, 39, 39, 39, 39, 
	39, 0, 23, 107, 23, 23, 44, 23, 
	0, 47, 0, 1, 0, 39, 0, 0, 
	0, 39, 47, 33, 33, 80, 33, 33, 
	39, 0, 35, 0, 39, 0, 0, 47, 
	0, 0, 35, 0, 0, 89, 89, 47, 
	0, 86, 83, 37, 89, 83, 92, 0, 
	39, 0, 0, 39, 0, 39, 0, 39, 
	0, 39, 0, 39, 0, 39, 0, 39, 
	0, 39, 0, 39, 0, 39, 0, 39, 
	0, 39, 124, 50, 47, 0, 77, 77, 
	47, 0, 65, 29, 77, 65, 0, 0, 
	0, 0, 0, 0, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 47, 11, 0, 56, 56, 115, 
	27, 53, 50, 27, 56, 50, 59, 27, 
	39, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 47, 11, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	47, 0, 11, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 11, 0, 0, 39, 0, 39, 0, 
	39, 0, 39, 0, 39, 0, 39, 0, 
	39, 124, 50, 47, 0, 77, 47, 0, 
	74, 74, 0, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 47, 
	17, 0, 0, 39, 0, 39, 0, 39, 
	0, 39, 0, 39, 0, 39, 0, 39, 
	0, 39, 0, 39, 0, 39, 0, 39, 
	0, 39, 0, 39, 0, 39, 0, 39, 
	0, 39, 0, 39, 124, 50, 47, 0, 
	77, 47, 0, 62, 29, 62, 0, 0, 
	0, 0, 0, 47, 0, 0, 47, 0, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 47, 9, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 47, 0, 9, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 9, 0, 0, 
	39, 0, 39, 0, 39, 0, 39, 0, 
	39, 0, 39, 0, 39, 0, 39, 0, 
	39, 0, 39, 0, 39, 0, 39, 0, 
	0, 39, 0, 39, 0, 39, 0, 39, 
	0, 39, 0, 39, 0, 39, 0, 39, 
	0, 39, 0, 39, 124, 50, 47, 0, 
	77, 77, 47, 0, 71, 29, 77, 71, 
	0, 0, 0, 0, 0, 0, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 47, 15, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 47, 
	15, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 15, 0, 124, 50, 47, 
	0, 77, 77, 47, 0, 68, 29, 77, 
	68, 0, 0, 0, 0, 0, 0, 0, 
	0, 47, 0, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 47, 13, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 47, 13, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 47, 0, 13, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 0, 0, 
	47, 0, 0, 47, 0, 0, 47, 0, 
	0, 47, 0, 0, 47, 0, 0, 47, 
	0, 0, 47, 0, 0, 47, 13, 0, 
	0, 39, 0, 39, 0, 39, 0, 39, 
	0, 39, 0, 39, 0, 39, 0, 39, 
	0, 39, 0, 39, 0, 0
};

static const char _lexer_eof_actions[] = {
	0, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39, 39, 39, 39, 
	39, 39, 39, 39, 39
};

static const int lexer_start = 1;
static const int lexer_first_final = 436;
static const int lexer_error = 0;

static const int lexer_en_main = 1;


#line 246 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"

static VALUE 
unindent(VALUE con, int start_col)
{
  VALUE re;
  // Gherkin will crash gracefully if the string representation of start_col pushes the pattern past 32 characters
  char pat[32]; 
  snprintf(pat, 32, "^[\t ]{0,%d}", start_col); 
  re = rb_reg_regcomp(rb_str_new2(pat));
  rb_funcall(con, rb_intern("gsub!"), 2, re, rb_str_new2(""));

  return Qnil;

}

static void 
store_kw_con(VALUE listener, const char * event_name, 
             const char * keyword_at, size_t keyword_length, 
             const char * at,         size_t length, 
             int current_line)
{
  VALUE con = Qnil, kw = Qnil;
  kw = ENCODED_STR_NEW(keyword_at, keyword_length);
  con = ENCODED_STR_NEW(at, length);
  rb_funcall(con, rb_intern("strip!"), 0);
  rb_funcall(listener, rb_intern(event_name), 3, kw, con, INT2FIX(current_line)); 
}

static void
store_multiline_kw_con(VALUE listener, const char * event_name,
                      const char * keyword_at, size_t keyword_length,
                      const char * at,         size_t length,
                      int current_line, int start_col)
{
  VALUE split;
  VALUE con = Qnil, kw = Qnil, name = Qnil, desc = Qnil;

  kw = ENCODED_STR_NEW(keyword_at, keyword_length);
  con = ENCODED_STR_NEW(at, length);

  unindent(con, start_col);
  
  split = rb_str_split(con, "\n");

  name = rb_funcall(split, rb_intern("shift"), 0);
  desc = rb_ary_join(split, rb_str_new2( "\n" ));

  if( name == Qnil ) 
  {
    name = rb_str_new2("");
  }
  if( rb_funcall(desc, rb_intern("size"), 0) == 0) 
  {
    desc = rb_str_new2("");
  }
  rb_funcall(name, rb_intern("strip!"), 0);
  rb_funcall(desc, rb_intern("rstrip!"), 0);
  rb_funcall(listener, rb_intern(event_name), 4, kw, name, desc, INT2FIX(current_line)); 
}

static void 
store_attr(VALUE listener, const char * attr_type,
           const char * at, size_t length, 
           int line)
{
  VALUE val = ENCODED_STR_NEW(at, length);
  rb_funcall(listener, rb_intern(attr_type), 2, val, INT2FIX(line));
}

static void 
store_pystring_content(VALUE listener, 
          int start_col, 
          const char *at, size_t length, 
          int current_line)
{
  VALUE re2;
  VALUE unescape_escaped_quotes;
  VALUE con = ENCODED_STR_NEW(at, length);

  unindent(con, start_col);

  re2 = rb_reg_regcomp(rb_str_new2("\r\\Z"));
  unescape_escaped_quotes = rb_reg_regcomp(rb_str_new2("\\\\\"\\\\\"\\\\\""));
  rb_funcall(con, rb_intern("sub!"), 2, re2, rb_str_new2(""));
  rb_funcall(con, rb_intern("gsub!"), 2, unescape_escaped_quotes, rb_str_new2("\"\"\""));
  rb_funcall(listener, rb_intern("py_string"), 2, con, INT2FIX(current_line));
}

static void 
raise_lexer_error(const char * at, int line)
{ 
  rb_raise(rb_eGherkinLexingError, "Lexing error on line %d: '%s'. See http://wiki.github.com/aslakhellesoy/gherkin/lexingerror for more information.", line, at);
}

static void lexer_init(lexer_state *lexer) {
  lexer->content_start = 0;
  lexer->content_end = 0;
  lexer->content_len = 0;
  lexer->mark = 0;
  lexer->keyword_start = 0;
  lexer->keyword_end = 0;
  lexer->next_keyword_start = 0;
  lexer->line_number = 1;
  lexer->last_newline = 0;
  lexer->final_newline = 0;
  lexer->start_col = 0;
}

static VALUE CLexer_alloc(VALUE klass)
{
  VALUE obj;
  lexer_state *lxr = ALLOC(lexer_state);
  lexer_init(lxr);

  obj = Data_Wrap_Struct(klass, NULL, -1, lxr);

  return obj;
}

static VALUE CLexer_init(VALUE self, VALUE listener)
{
  lexer_state *lxr; 
  rb_iv_set(self, "@listener", listener);
  
  lxr = NULL;
  DATA_GET(self, lexer_state, lxr);
  lexer_init(lxr);
  
  return self;
}

static VALUE CLexer_scan(VALUE self, VALUE input)
{
  VALUE input_copy;
  char *data;
  size_t len;
  VALUE listener = rb_iv_get(self, "@listener");

  lexer_state *lexer;
  lexer = NULL;
  DATA_GET(self, lexer_state, lexer);

  input_copy = rb_str_dup(input);

  rb_str_append(input_copy, rb_str_new2("\n%_FEATURE_END_%"));
  data = RSTRING_PTR(input_copy);
  len = RSTRING_LEN(input_copy);
  
  if (len == 0) { 
    rb_raise(rb_eGherkinLexingError, "No content to lex.");
  } else {

    const char *p, *pe, *eof;
    int cs = 0;
    
    VALUE current_row = Qnil;

    p = data;
    pe = data + len;
    eof = pe;
    
    assert(*pe == '\0' && "pointer does not end on NULL");
    
    
#line 1025 "ext/gherkin_lexer_ar/gherkin_lexer_ar.c"
	{
	cs = lexer_start;
	}

#line 410 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
    
#line 1032 "ext/gherkin_lexer_ar/gherkin_lexer_ar.c"
	{
	int _klen;
	unsigned int _trans;
	const char *_acts;
	unsigned int _nacts;
	const char *_keys;

	if ( p == pe )
		goto _test_eof;
	if ( cs == 0 )
		goto _out;
_resume:
	_keys = _lexer_trans_keys + _lexer_key_offsets[cs];
	_trans = _lexer_index_offsets[cs];

	_klen = _lexer_single_lengths[cs];
	if ( _klen > 0 ) {
		const char *_lower = _keys;
		const char *_mid;
		const char *_upper = _keys + _klen - 1;
		while (1) {
			if ( _upper < _lower )
				break;

			_mid = _lower + ((_upper-_lower) >> 1);
			if ( (*p) < *_mid )
				_upper = _mid - 1;
			else if ( (*p) > *_mid )
				_lower = _mid + 1;
			else {
				_trans += (_mid - _keys);
				goto _match;
			}
		}
		_keys += _klen;
		_trans += _klen;
	}

	_klen = _lexer_range_lengths[cs];
	if ( _klen > 0 ) {
		const char *_lower = _keys;
		const char *_mid;
		const char *_upper = _keys + (_klen<<1) - 2;
		while (1) {
			if ( _upper < _lower )
				break;

			_mid = _lower + (((_upper-_lower) >> 1) & ~1);
			if ( (*p) < _mid[0] )
				_upper = _mid - 2;
			else if ( (*p) > _mid[1] )
				_lower = _mid + 2;
			else {
				_trans += ((_mid - _keys)>>1);
				goto _match;
			}
		}
		_trans += _klen;
	}

_match:
	cs = _lexer_trans_targs[_trans];

	if ( _lexer_trans_actions[_trans] == 0 )
		goto _again;

	_acts = _lexer_actions + _lexer_trans_actions[_trans];
	_nacts = (unsigned int) *_acts++;
	while ( _nacts-- > 0 )
	{
		switch ( *_acts++ )
		{
	case 0:
#line 81 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
		MARK(content_start, p);
    lexer->current_line = lexer->line_number;
    lexer->start_col = lexer->content_start - lexer->last_newline - (lexer->keyword_end - lexer->keyword_start) + 2;
  }
	break;
	case 1:
#line 87 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    MARK(content_start, p);
  }
	break;
	case 2:
#line 91 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    lexer->current_line = lexer->line_number;
    lexer->start_col = p - data - lexer->last_newline;
  }
	break;
	case 3:
#line 96 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    int len = LEN(content_start, PTR_TO(final_newline));

    if (len < 0) len = 0;

    store_pystring_content(listener, lexer->start_col, PTR_TO(content_start), len, lexer->current_line);
  }
	break;
	case 4:
#line 104 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    STORE_KW_END_CON(feature);
  }
	break;
	case 5:
#line 108 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    STORE_KW_END_CON(background);
  }
	break;
	case 6:
#line 112 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    STORE_KW_END_CON(scenario);
  }
	break;
	case 7:
#line 116 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    STORE_KW_END_CON(scenario_outline);
  }
	break;
	case 8:
#line 120 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    STORE_KW_END_CON(examples);
  }
	break;
	case 9:
#line 124 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    store_kw_con(listener, "step",
      PTR_TO(keyword_start), LEN(keyword_start, PTR_TO(keyword_end)),
      PTR_TO(content_start), LEN(content_start, p), 
      lexer->current_line);
  }
	break;
	case 10:
#line 131 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    STORE_ATTR(comment);
    lexer->mark = 0;
  }
	break;
	case 11:
#line 136 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    STORE_ATTR(tag);
    lexer->mark = 0;
  }
	break;
	case 12:
#line 141 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    lexer->line_number += 1;
    MARK(final_newline, p);
  }
	break;
	case 13:
#line 146 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    MARK(last_newline, p + 1);
  }
	break;
	case 14:
#line 150 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    if (lexer->mark == 0) {
      MARK(mark, p);
    }
  }
	break;
	case 15:
#line 156 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    MARK(keyword_end, p);
    MARK(keyword_start, PTR_TO(mark));
    MARK(content_start, p + 1);
    lexer->mark = 0;
  }
	break;
	case 16:
#line 163 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    MARK(content_end, p);
  }
	break;
	case 17:
#line 167 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    p = p - 1;
    lexer->current_line = lexer->line_number;
    current_row = rb_ary_new();
  }
	break;
	case 18:
#line 173 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
		MARK(content_start, p);
  }
	break;
	case 19:
#line 177 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    VALUE re_pipe, re_newline, re_backslash;
    VALUE con = ENCODED_STR_NEW(PTR_TO(content_start), LEN(content_start, p));
    rb_funcall(con, rb_intern("strip!"), 0);
    re_pipe      = rb_reg_regcomp(rb_str_new2("\\\\\\|"));
    re_newline   = rb_reg_regcomp(rb_str_new2("\\\\n"));
    re_backslash = rb_reg_regcomp(rb_str_new2("\\\\\\\\"));
    rb_funcall(con, rb_intern("gsub!"), 2, re_pipe,      rb_str_new2("|"));
    rb_funcall(con, rb_intern("gsub!"), 2, re_newline,   rb_str_new2("\n"));
    rb_funcall(con, rb_intern("gsub!"), 2, re_backslash, rb_str_new2("\\"));

    rb_ary_push(current_row, con);
  }
	break;
	case 20:
#line 191 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    rb_funcall(listener, rb_intern("row"), 2, current_row, INT2FIX(lexer->current_line));
  }
	break;
	case 21:
#line 195 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    int line;
    if (cs < lexer_first_final) {
      size_t count = 0;
      VALUE newstr_val;
      char *newstr;
      int newstr_count = 0;        
      size_t len;
      const char *buff;
      if (lexer->last_newline != 0) {
        len = LEN(last_newline, eof);
        buff = PTR_TO(last_newline);
      } else {
        len = strlen(data);
        buff = data;
      }

      // Allocate as a ruby string so that it gets cleaned up by GC
      newstr_val = rb_str_new(buff, len);
      newstr = RSTRING_PTR(newstr_val);


      for (count = 0; count < len; count++) {
        if(buff[count] == 10) {
          newstr[newstr_count] = '\0'; // terminate new string at first newline found
          break;
        } else {
          if (buff[count] == '%') {
            newstr[newstr_count++] = buff[count];
            newstr[newstr_count] = buff[count];
          } else {
            newstr[newstr_count] = buff[count];
          }
        }
        newstr_count++;
      }

      line = lexer->line_number;
      lexer_init(lexer); // Re-initialize so we can scan again with the same lexer
      raise_lexer_error(newstr, line);
    } else {
      rb_funcall(listener, rb_intern("eof"), 0);
    }
  }
	break;
#line 1308 "ext/gherkin_lexer_ar/gherkin_lexer_ar.c"
		}
	}

_again:
	if ( cs == 0 )
		goto _out;
	if ( ++p != pe )
		goto _resume;
	_test_eof: {}
	if ( p == eof )
	{
	const char *__acts = _lexer_actions + _lexer_eof_actions[cs];
	unsigned int __nacts = (unsigned int) *__acts++;
	while ( __nacts-- > 0 ) {
		switch ( *__acts++ ) {
	case 21:
#line 195 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"
	{
    int line;
    if (cs < lexer_first_final) {
      size_t count = 0;
      VALUE newstr_val;
      char *newstr;
      int newstr_count = 0;        
      size_t len;
      const char *buff;
      if (lexer->last_newline != 0) {
        len = LEN(last_newline, eof);
        buff = PTR_TO(last_newline);
      } else {
        len = strlen(data);
        buff = data;
      }

      // Allocate as a ruby string so that it gets cleaned up by GC
      newstr_val = rb_str_new(buff, len);
      newstr = RSTRING_PTR(newstr_val);


      for (count = 0; count < len; count++) {
        if(buff[count] == 10) {
          newstr[newstr_count] = '\0'; // terminate new string at first newline found
          break;
        } else {
          if (buff[count] == '%') {
            newstr[newstr_count++] = buff[count];
            newstr[newstr_count] = buff[count];
          } else {
            newstr[newstr_count] = buff[count];
          }
        }
        newstr_count++;
      }

      line = lexer->line_number;
      lexer_init(lexer); // Re-initialize so we can scan again with the same lexer
      raise_lexer_error(newstr, line);
    } else {
      rb_funcall(listener, rb_intern("eof"), 0);
    }
  }
	break;
#line 1371 "ext/gherkin_lexer_ar/gherkin_lexer_ar.c"
		}
	}
	}

	_out: {}
	}

#line 411 "/home/ben/oib/gherkin/tasks/../ragel/i18n/ar.c.rl"

    assert(p <= pe && "data overflow after parsing execute");
    assert(lexer->content_start <= len && "content starts after data end");
    assert(lexer->mark < len && "mark is after data end");
    
    // Reset lexer by re-initializing the whole thing
    lexer_init(lexer);

    if (cs == lexer_error) {
      rb_raise(rb_eGherkinLexingError, "Invalid format, lexing fails.");
    } else {
      return Qtrue;
    }
  }
}

void Init_gherkin_lexer_ar()
{
  mGherkin = rb_define_module("Gherkin");
  mGherkinLexer = rb_define_module_under(mGherkin, "Lexer");
  rb_eGherkinLexingError = rb_const_get(mGherkinLexer, rb_intern("LexingError"));

  mCLexer = rb_define_module_under(mGherkin, "CLexer");
  cI18nLexer = rb_define_class_under(mCLexer, "Ar", rb_cObject);
  rb_define_alloc_func(cI18nLexer, CLexer_alloc);
  rb_define_method(cI18nLexer, "initialize", CLexer_init, 1);
  rb_define_method(cI18nLexer, "scan", CLexer_scan, 1);
}