Initial commit, running Sonic the Hedgehog demo in dlores mode
authorNick Downing <nick@ndcode.org>
Mon, 1 Aug 2022 12:01:08 +0000 (22:01 +1000)
committerNick Downing <nick@ndcode.org>
Mon, 1 Aug 2022 12:01:08 +0000 (22:01 +1000)
27 files changed:
.gitignore [new file with mode: 0644]
.gitmodules [new file with mode: 0644]
Makefile [new file with mode: 0644]
a2_hex2bin.py [new file with mode: 0755]
asxv5pxx [new submodule]
bootable.dsk [new file with mode: 0644]
dlores_viewer.asm [new file with mode: 0644]
dos33fsprogs [new submodule]
gr_to_ihx.py [new file with mode: 0755]
orig/199-1995393_sonic-running-png-sonic-running-3228446822 [new file with mode: 0644]
orig/808720_minerplaysbadly_archived-post-sonic-running-animation-march-2018-869792543 [new file with mode: 0644]
orig/db9lc5d-19469231-d721-4b63-84ca-f69afea91da6-62855643 [new file with mode: 0644]
orig/running_sonic_animation_by_vgafanatic-d7463qw-752803574 [new file with mode: 0644]
orig/sonic-running-gif-1-1044514248 [new file with mode: 0644]
orig/sonic-running-gif-18-1125167373 [new file with mode: 0644]
orig/sonic_running_by_dj_xiii-damx9xv-1354001961 [new file with mode: 0644]
sonic_running_6_colours.xcf [new file with mode: 0644]
sonic_running_6_colours_apple.xcf [new file with mode: 0644]
sonic_running_6_colours_apple_80x48.xcf [new file with mode: 0644]
sonic_running_6_colours_apple_80x48_indexed.gif [new file with mode: 0644]
sonic_running_6_colours_apple_80x48_indexed.xcf [new file with mode: 0644]
test/bas_to_tok.py [new file with mode: 0755]
test/gr_to_data.py [new file with mode: 0755]
test/sonic_gr.bas [new file with mode: 0644]
test/sonic_gr.png [new file with mode: 0644]
test/sonic_gr.sh [new file with mode: 0755]
test/tok_to_bin.py [new file with mode: 0755]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..9f20333
--- /dev/null
@@ -0,0 +1,12 @@
+*.a2bin
+*.bin
+*.hlr
+*.ihx
+*.lst
+*.map
+*.rel
+*.rst
+*.tok
+/sonic_frame*.gif
+/test.dsk
+/test/sonic_gr1.bas
diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..cba6afc
--- /dev/null
@@ -0,0 +1,6 @@
+[submodule "dos33fsprogs"]
+       path = dos33fsprogs
+       url = https://github.com/nickd4/dos33fsprogs.git
+[submodule "asxv5pxx"]
+       path = asxv5pxx
+       url = https://github.com/nickd4/asxv5pxx.git
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..5fa9027
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,86 @@
+DOS33=dos33fsprogs/utils/dos33fs-utils/dos33
+
+AS6500=asxv5pxx/asxmak/linux/exe/as6500
+ASLINK=asxv5pxx/asxmak/linux/exe/aslink
+
+# need to install intelhex package in Python first:
+#   pip3 install --user intelhex
+HEXMERGE=hexmerge.py
+
+LOAD_ADDR=0x800
+DATA_ADDR=0x880
+
+.PHONY: all
+all: \
+asxv5pxx \
+dos33fsprogs \
+test.dsk
+
+.PHONY: asxv5pxx
+asxv5pxx:
+       ${MAKE} ${MAKEFLAGS} -C asxv5pxx/asxmak/linux/build as6500 aslink
+
+.PHONY: dos33fsprogs
+dos33fsprogs:
+       ${MAKE} ${MAKEFLAGS} -C dos33fsprogs/utils/dos33fs-utils dos33 mkdos33fs
+
+test.dsk: bootable.dsk sonic.a2bin
+       cp bootable.dsk $@
+       ${DOS33} $@ SAVE B sonic.a2bin SONIC
+
+sonic.a2bin: sonic.ihx
+       ./a2_hex2bin.py $< $@ 
+
+sonic.ihx: \
+dlores_viewer.ihx \
+sonic_frames.ihx
+       ${HEXMERGE} -o $@ $^
+
+dlores_viewer.ihx: dlores_viewer.rel
+       ${ASLINK} -n -m -u -il -b zpage=0 -b text=${LOAD_ADDR} $@ $^
+
+dlores_viewer.rel: dlores_viewer.asm
+       ${AS6500} -l -o $<
+
+sonic_frames.ihx: \
+sonic_frame0.gif \
+sonic_frame1.gif \
+sonic_frame2.gif \
+sonic_frame3.gif \
+sonic_frame4.gif \
+sonic_frame5.gif
+       ./gr_to_ihx.py ${DATA_ADDR} "$^" $@
+
+sonic_frame0.gif: sonic_running_6_colours_apple_80x48_indexed.gif
+       convert "$^[0]" $@
+
+sonic_frame1.gif: sonic_running_6_colours_apple_80x48_indexed.gif
+       convert "$^[1]" $@
+
+sonic_frame2.gif: sonic_running_6_colours_apple_80x48_indexed.gif
+       convert "$^[2]" $@
+
+sonic_frame3.gif: sonic_running_6_colours_apple_80x48_indexed.gif
+       convert "$^[3]" $@
+
+sonic_frame4.gif: sonic_running_6_colours_apple_80x48_indexed.gif
+       convert "$^[4]" $@
+
+sonic_frame5.gif: sonic_running_6_colours_apple_80x48_indexed.gif
+       convert "$^[5]" $@
+
+.PHONY: clean
+clean:
+       ${MAKE} ${MAKEFLAGS} -C asxv5pxx/asxmak/linux/build clean
+       # avoid git complaining of changes in subrepo:
+       touch asxv5pxx/asxmak/linux/exe/_exe
+       ${MAKE} ${MAKEFLAGS} -C dos33fsprogs/utils/dos33fs-utils clean
+       rm -f \
+*.a2bin \
+*.hlr \
+*.ihx \
+*.lst \
+*.map \
+*.rel \
+*.rst \
+test.dsk
diff --git a/a2_hex2bin.py b/a2_hex2bin.py
new file mode 100755 (executable)
index 0000000..84800ad
--- /dev/null
@@ -0,0 +1,28 @@
+#!/usr/bin/env python3
+
+import sys
+from intelhex import IntelHex
+
+EXIT_SUCCESS = 0
+EXIT_FAILURE = 1
+
+if len(sys.argv) < 3:
+  print(f'usage: {sys.argv[0]:s} in.ihx out.a2bin')
+  sys.exit(EXIT_FAILURE)
+in_ihx = sys.argv[1]
+out_a2bin = sys.argv[2]
+
+intelhex = IntelHex(in_ihx)
+segments = [j for i in intelhex.segments() for j in i]
+for i in range(0, len(segments), 2):
+  print(f'[{segments[i]:04x}, {segments[i + 1]:04x})')
+
+load_addr = segments[0] #intelhex.minaddr()
+load_size = segments[-1] - load_addr #intelhex.maxaddr() + 1 - load_addr
+
+intelhex.padding = 0
+bin = list(intelhex.tobinstr(load_addr, load_addr + load_size - 1))
+
+hdr = [load_addr & 0xff, load_addr >> 8, load_size & 0xff, load_size >> 8]
+with open(out_a2bin, 'wb') as fout:
+  fout.write(bytes(hdr + bin))
diff --git a/asxv5pxx b/asxv5pxx
new file mode 160000 (submodule)
index 0000000..cd97f12
--- /dev/null
+++ b/asxv5pxx
@@ -0,0 +1 @@
+Subproject commit cd97f12f9ffb90aa6c6711f875f5203efa79a4e4
diff --git a/bootable.dsk b/bootable.dsk
new file mode 100644 (file)
index 0000000..03bd956
Binary files /dev/null and b/bootable.dsk differ
diff --git a/dlores_viewer.asm b/dlores_viewer.asm
new file mode 100644 (file)
index 0000000..eb57e47
--- /dev/null
@@ -0,0 +1,120 @@
+; read
+HW_KBD = 0xc000
+
+; write
+HW_CLR80COL = 0xc000
+HW_SET80COL = 0xc001
+HW_CLR80VID = 0xc00c
+HW_SET80VID = 0xc00d
+HW_KBDSTRB = 0xc010
+
+; read/write
+HW_CLRTEXT = 0xc050
+HW_SETTEXT = 0xc051
+HW_CLRMIXED = 0xc052
+HW_SETMIXED = 0xc053
+HW_PAGE1 = 0xc054
+HW_PAGE2 = 0xc055
+HW_CLRHIRES = 0xc056
+HW_SETHIRES = 0xc057
+HW_SETDHIRES = 0xc05e
+HW_SETIOUDIS = 0xc07e
+HW_CLRIOUDIS = 0xc07f
+
+TEXT_ADDR = 0x400
+TEXT_SIZE = 0x400
+DATA_ADDR = 0x880
+DATA_FRAMES = 6
+
+       .area   zpage
+       .setdp
+
+       .ds     0x80
+src:   .ds     2
+dest:  .ds     2
+
+       .area   text
+
+       sta     HW_CLR80COL
+       sta     HW_SET80VID
+       sta     HW_CLRIOUDIS
+
+       sta     HW_CLRTEXT
+       sta     HW_CLRMIXED
+       sta     HW_PAGE1
+       sta     HW_CLRHIRES
+       sta     HW_SETDHIRES
+
+       sta     HW_SET80COL ; use HW_PAGE1/HW_PAGE2 for bank switching
+
+       lda     #<DATA_ADDR
+       sta     src
+reset: ; enter here to reset to the first frame of animation
+       lda     #>DATA_ADDR
+       sta     src + 1
+
+loop:  ; enter here with src pointing to current frame of animation
+       lda     #<TEXT_ADDR
+       sta     dest
+       lda     #>TEXT_ADDR
+       sta     dest + 1
+
+       ; copy one screen (there are 8 lines in 1/3 screen)
+       ldx     #8
+copy:
+
+       ; copy 3 lines 8 lines apart to page 1, stop at screen hole
+       sta     HW_PAGE1
+       ldy     #119
+copy0: lda     [src],y
+       sta     [dest],y
+       dey
+       bpl     copy0
+
+       ; src += 0x80
+       lda     src
+       eor     #0x80
+       sta     src
+       bmi     0$
+       inc     src + 1
+0$:
+
+       ; copy 3 lines 8 lines apart to page 2, stop at screen hole
+       sta     HW_PAGE2
+       ldy     #119
+copy1: lda     [src],y
+       sta     [dest],y
+       dey
+       bpl     copy1
+
+       ; src += 0x80
+       lda     src
+       eor     #0x80
+       sta     src
+       bmi     0$
+       inc     src + 1
+0$:
+
+       ; dest += 0x80
+       lda     dest
+       eor     #0x80
+       sta     dest
+       bmi     1$
+       inc     dest + 1
+1$:
+
+       dex
+       bne     copy
+
+       ; delay (assumes x == 0)
+       ldy     #0x30
+2$:    dex
+       bne     2$
+       dey
+       bne     2$
+
+       ; wrap
+       lda     src + 1
+       cmp     #>(DATA_ADDR + DATA_FRAMES * TEXT_SIZE)
+       bcc     loop
+       bcs     reset
diff --git a/dos33fsprogs b/dos33fsprogs
new file mode 160000 (submodule)
index 0000000..ea5e0e9
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit ea5e0e975817069ee881f9b75bf14b1dcbb98d47
diff --git a/gr_to_ihx.py b/gr_to_ihx.py
new file mode 100755 (executable)
index 0000000..4bdba3c
--- /dev/null
@@ -0,0 +1,54 @@
+#!/usr/bin/env python3
+
+import io
+import numpy
+import sys
+import PIL.Image
+from intelhex import IntelHex
+
+EXIT_SUCCESS = 0
+EXIT_FAILURE = 1
+
+if len(sys.argv) < 4:
+  print(f'usage: {sys.argv[0]:s} load_addr "in.png ..." out.ihx')
+  sys.exit(EXIT_FAILURE)
+load_addr = int(sys.argv[1], 0)
+in_pngs = sys.argv[2].split()
+out_ihx = sys.argv[3]
+
+image_in = []
+for in_png in in_pngs:
+  image_in_pil = PIL.Image.open(in_png)
+  assert image_in_pil.mode == 'P'
+  image_in.append(
+    numpy.frombuffer(
+      image_in_pil.tobytes(),
+      dtype = numpy.uint8
+    ).reshape((image_in_pil.size[1], image_in_pil.size[0]))
+  )
+image_in = numpy.stack(image_in, 0)
+
+ts, ys, xs = image_in.shape
+assert ys == 48
+assert xs == 80
+
+# deal with transparency
+transparent_color = image_in[0, 0, 0] # temporary
+image_in[image_in == transparent_color] = 0
+
+# rotate colours in aux memory (required by the hardware)
+image_in[:, :, 0::2] = \
+  (image_in[:, :, 0::2] >> 1) | ((image_in[:, :, 0::2] << 3) & 8)
+
+image_out = numpy.zeros((ts, 8, 2, 0x80), numpy.uint8)
+shifts = [0, 4]
+planes = [1, 0]
+for i in range(ys):
+  for j in range(2):
+    image_out[:, (i >> 1) & 7, j, (i >> 4) * 40:((i >> 4) + 1) * 40] |= \
+      image_in[:, i, planes[j]::2] << shifts[i & 1]
+image_out = image_out.reshape((ts * 0x800,))
+
+intelhex = IntelHex()
+intelhex.frombytes(bytes(image_out), load_addr)
+intelhex.write_hex_file(out_ihx)
diff --git a/orig/199-1995393_sonic-running-png-sonic-running-3228446822 b/orig/199-1995393_sonic-running-png-sonic-running-3228446822
new file mode 100644 (file)
index 0000000..228a1d8
Binary files /dev/null and b/orig/199-1995393_sonic-running-png-sonic-running-3228446822 differ
diff --git a/orig/808720_minerplaysbadly_archived-post-sonic-running-animation-march-2018-869792543 b/orig/808720_minerplaysbadly_archived-post-sonic-running-animation-march-2018-869792543
new file mode 100644 (file)
index 0000000..f852d65
Binary files /dev/null and b/orig/808720_minerplaysbadly_archived-post-sonic-running-animation-march-2018-869792543 differ
diff --git a/orig/db9lc5d-19469231-d721-4b63-84ca-f69afea91da6-62855643 b/orig/db9lc5d-19469231-d721-4b63-84ca-f69afea91da6-62855643
new file mode 100644 (file)
index 0000000..052a535
Binary files /dev/null and b/orig/db9lc5d-19469231-d721-4b63-84ca-f69afea91da6-62855643 differ
diff --git a/orig/running_sonic_animation_by_vgafanatic-d7463qw-752803574 b/orig/running_sonic_animation_by_vgafanatic-d7463qw-752803574
new file mode 100644 (file)
index 0000000..f76599e
Binary files /dev/null and b/orig/running_sonic_animation_by_vgafanatic-d7463qw-752803574 differ
diff --git a/orig/sonic-running-gif-1-1044514248 b/orig/sonic-running-gif-1-1044514248
new file mode 100644 (file)
index 0000000..5ba3b39
Binary files /dev/null and b/orig/sonic-running-gif-1-1044514248 differ
diff --git a/orig/sonic-running-gif-18-1125167373 b/orig/sonic-running-gif-18-1125167373
new file mode 100644 (file)
index 0000000..b35ce81
Binary files /dev/null and b/orig/sonic-running-gif-18-1125167373 differ
diff --git a/orig/sonic_running_by_dj_xiii-damx9xv-1354001961 b/orig/sonic_running_by_dj_xiii-damx9xv-1354001961
new file mode 100644 (file)
index 0000000..df91d47
Binary files /dev/null and b/orig/sonic_running_by_dj_xiii-damx9xv-1354001961 differ
diff --git a/sonic_running_6_colours.xcf b/sonic_running_6_colours.xcf
new file mode 100644 (file)
index 0000000..e700900
Binary files /dev/null and b/sonic_running_6_colours.xcf differ
diff --git a/sonic_running_6_colours_apple.xcf b/sonic_running_6_colours_apple.xcf
new file mode 100644 (file)
index 0000000..3bd8e97
Binary files /dev/null and b/sonic_running_6_colours_apple.xcf differ
diff --git a/sonic_running_6_colours_apple_80x48.xcf b/sonic_running_6_colours_apple_80x48.xcf
new file mode 100644 (file)
index 0000000..7c62510
Binary files /dev/null and b/sonic_running_6_colours_apple_80x48.xcf differ
diff --git a/sonic_running_6_colours_apple_80x48_indexed.gif b/sonic_running_6_colours_apple_80x48_indexed.gif
new file mode 100644 (file)
index 0000000..0800110
Binary files /dev/null and b/sonic_running_6_colours_apple_80x48_indexed.gif differ
diff --git a/sonic_running_6_colours_apple_80x48_indexed.xcf b/sonic_running_6_colours_apple_80x48_indexed.xcf
new file mode 100644 (file)
index 0000000..9f711cc
Binary files /dev/null and b/sonic_running_6_colours_apple_80x48_indexed.xcf differ
diff --git a/test/bas_to_tok.py b/test/bas_to_tok.py
new file mode 100755 (executable)
index 0000000..d224a2c
--- /dev/null
@@ -0,0 +1,2213 @@
+#!/usr/bin/env python3
+
+# Copyright (C) 2019 Nick Downing <nick@ndcode.org>
+# SPDX-License-Identifier: GPL-2.0-with-bison-exception
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; version 2.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 51
+# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+# As a special exception, you may create a larger work that contains part or
+# all of the pilex lexical scanner skeleton and distribute that work under
+# terms of your choice, so long as that work isn't itself a lexical scanner
+# generator using the skeleton or a modified version thereof as a lexical
+# scanner skeleton. Alternatively, if you modify or redistribute the lexical
+# scanner skeleton itself, you may (at your option) remove this special
+# exception, which will cause the skeleton and the resulting pilex output
+# files to be licensed under the GNU General Public License without this
+# special exception.
+
+import bisect
+import sys
+
+YY_TRAILING_MASK = 0x2000
+YY_TRAILING_HEAD_MASK = 0x4000
+
+# this can be redefined in SECTION1
+def YY_AT_BOL():
+  return yy_buffer_stack[-1].at_bol
+
+def yy_set_bol(at_bol):
+  yy_buffer_stack[-1].at_bol = at_bol
+
+def YY_USER_ACTION():
+  pass
+
+def YY_RULE_START():
+  # note that this should also be done after yyless() and REJECT(),
+  # and state should be saved in case they result in a null string,
+  # however, it doesn't seem to be in flex, maintain compatibility:
+  if len(yytext):
+    yy_set_bol(yytext[-1] == '\n')
+  YY_USER_ACTION()
+
+# GENERATE SECTION1 BEGIN
+# GENERATE END
+
+# GENERATE STARTCONDDECL BEGIN
+INITIAL = 0
+DATA = 1
+DATA_TEXT = 2
+REM_TEXT = 3
+STR_LITERAL = 4
+# GENERATE END
+
+class YYReject(Exception):
+  pass
+
+class YYContinue(Exception):
+  pass
+
+class YYTerminate(Exception):
+  pass
+
+# each input file is represented as a linked list in which the
+# head is a YYBufferState and the following items (if any) are
+# YYBufferBlock -- the YYBufferList parent class is defined so
+# that we can guarantee the "previous" item to any particular
+# YYBufferBlock is at least a YYBufferList and hence deletion
+# (or other operation that needs the "previous" item) is easy
+class YYBufferList:
+  def __init__(self, next = None):
+    self.next = next
+
+class YYBufferBlock(YYBufferList):
+  def __init__(self, next = None, pos = 0, text = ''):
+    YYBufferList.__init__(self, next)
+    self.pos = pos
+    self.text = text
+
+class YYBufferState(YYBufferList):
+  def __init__(self, next = None, file_in = None, at_bol = True):
+    YYBufferList.__init__(self, next)
+    self.file_in = file_in
+    self.at_bol = at_bol
+
+yyin = sys.stdin
+yyout = sys.stdout
+yy_buffer_stack = [YYBufferState()]
+
+yystart = INITIAL
+yystart_stack = []
+
+yytext = ''
+yytext_len = 0
+
+yylineno = 0
+
+yy_state_buf = []
+
+YY_NULL = 0
+
+def REJECT():
+  # can't have already committed (can't call unput then REJECT)
+  assert yytext_len == len(yytext) # cannot have already committed
+  raise YYReject()
+
+def yyterminate():
+  raise YYTerminate()
+
+def yyless(i):
+  global yytext, yytext_len
+  # can't have already committed (can't call unput then yyless)
+  assert yytext_len == len(yytext)
+  assert yytext_len >= i
+  yytext = yytext[:i]
+  yytext_len = i
+
+def yycommit():
+  # now user code cannot call REJECT() / yyless() anymore,
+  # thus we know the match was of length yytext_len and we
+  # can skip that many chars, popping buffer stack for real
+  # we leave yytext == 0 afterwards, so double commit is OK
+  # (double commit occurs if user calls the unput function)
+  global yytext_len
+  #print('commit', yytext_len)
+  while yytext_len:
+    block = yy_buffer_stack[-1].next
+    while block is None or block.pos >= len(block.text):
+      if block is None:
+        yy_buffer_stack.pop()
+        block = yy_buffer_stack[-1].next
+        yyin = yy_buffer_stack[-1].file_in
+      else:
+        block = block.next
+        yy_buffer_stack[-1].next = block
+    i = min(yytext_len, len(block.text) - block.pos)
+    block.pos += i
+    yytext_len -= i
+
+def unput(text):
+  yycommit() # user cannot call REJECT() / yyless() anymore
+  yy_buffer_stack[-1].next = YYBufferBlock(yy_buffer_stack[-1].next, 0, text)
+
+def ECHO():
+  yyout.write(yytext)
+
+def BEGIN(start):
+  global yystart
+  yystart = start
+
+def YY_START():
+  return yystart
+
+def yy_push_state(start):
+  global yystart
+  yystart_stack.append(yystart)
+  yystart = start
+
+def yy_pop_state():
+  global yystart
+  yystart = yystart_stack.pop()
+
+# GENERATE SECTION2 BEGIN
+YY_END_OF_BUFFER = 116
+yy_acclist = [
+  16500,   116, 16499,   115, 16384,     0, 16385,     1, 16433,    49,
+  16460,    76, 16458,    74, 16459,    75, 16461,    77, 16467,    83,
+  16466,    82, 16465,    81, 16499,   115, 16499,   115, 16499,   115,
+  16499,   115, 16499,   115, 16499,   115, 16499,   115, 16499,   115,
+  16499,   115, 16499,   115, 16499,   115, 16499,   115, 16499,   115,
+  16499,   115, 16499,   115, 16499,   115, 16499,   115, 16499,   115,
+  16499,   115, 16499,   115, 16462,    78, 16499,   115, 16499,   115,
+  16499,   115, 16499,   115, 16499,   115, 16499,   115, 16499,   115,
+  16499,   115, 16499,   115, 16499,   115, 16499,   115, 16499,   115,
+  16499,   115, 16499,   115, 16499,   115, 16499,   115, 16499,   115,
+  16499,   115, 16499,   115, 16499,   115, 16494,   110, 16493,   109,
+  16384,     0, 16385,     1, 16499,   115, 16493,   109, 16499,   115,
+  16493,   109, 16495,   111, 16493,   109, 16499,   115, 16496,   112,
+  16499,   115, 16498,   114, 16497,   113, 16455,    71, 16452,    68,
+  16394,    10, 16431,    47, 16438,    54, 16464,    80, 16451,    67,
+  16455,    71, 16438,    54, 16470,    86, 16463,    79, 16488,   104,
+  16483,    99, 16480,    96, 16442,    58, 16391,     7, 16392,     8,
+  16386,     2, 16479,    95, 16387,     3, 16472,    88, 16448,    64,
+  16403,    19, 16397,    13, 16469,    85, 16485,   101, 16428,    44,
+  16478,    94, 16449,    65, 16456,    72, 16474,    90, 16419,    35,
+  16475,    91, 16396,    12, 16436,    52, 16477,    93, 16430,    46,
+  16468,    84, 16481,    97, 16476,    92, 16482,    98, 16471,    87,
+  16487,   103, 16403,    19, 16456,    72, 16398,    14, 16489,   105,
+  16445,    61, 16389,     5, 16406,    22, 16429,    45, 16402,    18,
+  16400,    16, 16409,    25, 16408,    24, 16446,    62, 16440,    56,
+  16492,   108, 16388,     4, 16484,   100, 16399,    15, 16443,    59,
+  16393,     9, 16410,    26, 16441,    57, 16453,    69, 16457,    73,
+  16437,    53, 16486,   102, 16450,    66, 16395,    11, 16454,    70,
+  16401,    17, 16420,    36, 16439,    55, 16447,    63, 16417,    33,
+  16434,    50, 16405,    21, 16390,     6, 16490,   106, 16423,    39,
+  16444,    60, 16473,    89, 16426,    42, 16413,    29, 16407,    23,
+  16418,    34, 16421,    37, 16422,    38, 16415,    31, 16425,    41,
+  16424,    40, 16435,    51, 16491,   107, 16411,    27, 16412,    28,
+  16427,    43, 16404,    20, 16416,    32, 16414,    30, 16432,    48
+]
+yy_accept = [
+      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      0,     0,     2,     4,     6,     8,    10,    12,    14,    16,
+     18,    20,    22,    24,    26,    28,    30,    32,    34,    36,
+     38,    40,    42,    44,    46,    48,    50,    52,    54,    56,
+     58,    60,    62,    64,    66,    68,    70,    72,    74,    76,
+     78,    80,    82,    84,    86,    88,    90,    92,    94,    96,
+     98,   100,   102,   104,   106,   108,   110,   112,   114,   116,
+    118,   120,   122,   124,   126,   128,   130,   132,   134,   136,
+    136,   136,   136,   136,   136,   138,   138,   138,   138,   138,
+    138,   138,   138,   138,   138,   138,   138,   138,   138,   138,
+    138,   138,   138,   138,   140,   140,   140,   140,   140,   140,
+    142,   142,   142,   142,   142,   142,   142,   142,   142,   142,
+    142,   144,   144,   144,   144,   144,   144,   144,   144,   144,
+    144,   144,   144,   144,   144,   144,   146,   148,   148,   148,
+    148,   148,   148,   148,   148,   148,   148,   148,   148,   148,
+    148,   148,   148,   148,   148,   148,   148,   148,   148,   148,
+    148,   148,   148,   148,   148,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   152,   152,   152,   152,   152,   152,   152,   152,   152,
+    152,   152,   152,   152,   152,   152,   152,   152,   152,   152,
+    152,   152,   152,   152,   152,   152,   152,   152,   152,   152,
+    152,   152,   152,   152,   152,   152,   152,   152,   152,   152,
+    152,   152,   154,   154,   154,   154,   154,   154,   154,   154,
+    154,   154,   154,   154,   154,   154,   154,   154,   154,   154,
+    154,   154,   154,   154,   154,   154,   154,   154,   154,   154,
+    154,   154,   154,   154,   154,   154,   154,   154,   154,   154,
+    156,   156,   158,   158,   160,   160,   162,   162,   162,   162,
+    162,   162,   162,   162,   162,   162,   164,   164,   164,   164,
+    166,   168,   168,   170,   170,   170,   170,   172,   172,   174,
+    174,   174,   174,   176,   176,   178,   178,   180,   180,   180,
+    180,   180,   180,   180,   182,   182,   182,   182,   182,   182,
+    182,   182,   182,   182,   182,   182,   184,   184,   186,   186,
+    186,   186,   188,   190,   190,   190,   190,   190,   192,   192,
+    192,   192,   192,   194,   194,   194,   194,   196,   196,   196,
+    196,   198,   198,   198,   198,   198,   198,   198,   200,   202,
+    202,   204,   204,   204,   204,   204,   206,   206,   206,   206,
+    206,   206,   208,   208,   208,   208,   210,   210,   210,   210,
+    210,   210,   210,   212,   212,   212,   212,   214,   214,   214,
+    214,   214,   216,   216,   216,   216,   216,   216,   216,   218,
+    218,   218,   218,   218,   218,   218,   218,   220,   220,   222,
+    222,   222,   222,   222,   222,   222,   222,   222,   222,   222,
+    222,   222,   222,   222,   222,   222,   222,   222,   222,   222,
+    222,   222,   222,   222,   222,   222,   222,   222,   222,   222,
+    222,   222,   222,   222,   222,   222,   222,   222,   222,   222,
+    224,   224,   224,   224,   224,   224,   224,   224,   224,   224,
+    224,   224,   224,   224,   224,   224,   224,   224,   224,   224,
+    224,   224,   224,   224,   224,   224,   224,   226,   226,   226,
+    226,   226,   226,   226,   226,   226,   226,   226,   226,   226,
+    226,   226,   226,   226,   226,   226,   226,   226,   226,   226,
+    226,   226,   226,   226,   226,   226,   226,   226,   226,   226,
+    226,   226,   226,   226,   226,   226,   226,   226,   226,   226,
+    226,   226,   226,   226,   226,   226,   226,   226,   226,   226,
+    226,   226,   226,   226,   226,   226,   228,   228,   230,   230,
+    230,   230,   230,   230,   232,   232,   234,   234,   236,   236,
+    236,   236,   236,   236,   238,   238,   238,   238,   240,   240,
+    240,   240,   242,   242,   244,   244,   244,   244,   246,   246,
+    246,   246,   246,   246,   246,   246,   248,   248,   250,   250,
+    250,   250,   252,   252,   254,   254,   254,   254,   254,   254,
+    254,   254,   256,   256,   258,   258,   260,   260,   260,   260,
+    262,   262,   262,   262,   262,   262,   262,   262,   262,   262,
+    262,   264,   264,   266,   266,   266,   266,   266,   266,   266,
+    266,   268,   268,   268,   268,   270,   270,   272,   272,   272,
+    274,   274,   276,   276,   278,   278,   280,   280,   280,   280,
+    282,   282,   284,   284,   286,   286,   286,   286,   286,   286,
+    286,   286,   286,   286,   286,   286,   286,   286,   286,   286,
+    286,   286,   286,   286,   286,   286,   286,   286,   286,   286,
+    286,   286,   286,   286,   286,   286,   286,   286,   286,   286,
+    286,   286,   286,   286,   286,   286,   286,   286,   286,   286,
+    286,   286,   286,   286,   286,   286,   286,   286,   286,   286,
+    286,   286,   286,   286,   286,   286,   286,   286,   286,   286,
+    286,   286,   286,   286,   286,   286,   286,   286,   286,   286,
+    286,   286,   286,   286,   286,   286,   286,   286,   286,   286,
+    288,   288,   288,   288,   290,   290,   292,   292,   292,   292,
+    292,   292,   294,   294,   296,   296,   296,   296,   298,   298,
+    298,   298,   298,   298,   298,   298,   300,   300,   302,   302,
+    302,   302,   302,   302,   302,   302,   302,   302,   302,   302,
+    302,   302,   304,   304,   304,   304,   304,   304,   306,   306,
+    308,   308,   310,   310,   310,   310,   310,   310,   310,   310,
+    310,   310,   310,   310,   310,   310,   310,   310,   310,   310,
+    310,   310,   310,   310,   310,   310,   310,   310,   310,   310,
+    310,   310,   310,   310,   310,   310,   310,   310,   310,   310,
+    310,   310,   310,   310,   310,   310,   312,   312,   312,   312,
+    314,   314,   314,   314,   316,   316,   318,   318,   318,   318,
+    320,   320,   320,   320,   322,   322,   324,   324,   326,   326,
+    328,   328,   330,   330,   332,   332,   332,   332,   332,   332,
+    332,   332,   332,   332,   332,   332,   332,   332,   332,   332,
+    332,   332,   332,   332,   332,   334,   334,   336,   336,   338,
+    338,   340,   340,   340,   340,   340
+]
+yy_base = [
+      0,  4902,  4814,  4557,  4557,  4300,  4300,  4043,  4043,  3786,
+   3786,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      0,     0,     0,  3529,  3190,  3415,  2933,  2594,  2476,  2251,
+   3423,  1994,  1658,  3417,   939,  1887,   598,   341,  2846,  1570,
+    855,  1547,  1487,     0,  3425,  2823,  3447,  2819,  2477,  1571,
+   1897,  2502,  1915,  1585,  2821,   234,  1883,   225,   257,  2845,
+   1562,   232,  1546,  1484,     0,     0,     0,     0,     0,     0,
+      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+   3529,  1561,  1483,  1468,  1456,     0,  3190,  1430,  1374,  1345,
+    826,  3415,  1275,  2487,  1211,  1545,     0,  2933,  1481,  1193,
+      0,  2594,  1544,     0,  1370,  1344,  2476,  1269,  2484,     0,
+      0,  2251,  1192,  2501,  1209,  1584,  1204,  1425,  1542,  3423,
+      0,  2508,     0,  1994,   823,  1555,   254,     0,  1658,  1480,
+   3417,  2483,   828,     0,   939,  1342,     0,  1887,  1423,  1339,
+   1185,   231,  1909,     0,   598,  2829,  1167,  1479,  1263,  1454,
+      0,   341,  1169,  2851,  1452,  1394,  1450,  2480,  1368,  1911,
+   2846,  2494,  1166,  1306,     0,  1541,  1570,  1366,   855,  1393,
+   1583,  1539,  1547,  1582,  1487,  1364,  3425,  1556,  1473,  1457,
+   1455,  2823,  1391,  1363,  1304,   239,  3447,  1262,  1586,   866,
+   1536,  2819,  1465,   860,  2477,  1535,  1369,  1279,  1571,  1188,
+   2481,  1897,  1184,  2493,  1203,  1581,  1202,  1390,  1534,  2502,
+   1892,  1915,   229,  1553,   228,  1585,  1478,  2821,  1899,   236,
+    234,  1303,  1883,  1395,  1301,  1183,   226,  1884,   225,  2820,
+    857,  1463,  1261,  1453,   257,   849,  2509,  1451,  1389,  1449,
+   2479,  1367,  1910,  2845,  1895,  1165,  1300,  1533,  1562,  1365,
+    232,  1392,  1576,  1532,  1546,  1573,  1484,  1362,  1561,     0,
+   1483,     0,  1468,     0,  1456,     0,  1430,  1388,  1374,  1164,
+   1345,  1531,   826,  1182,  1260,     0,  1275,  1530,  2487,     0,
+      0,  1211,     0,  1545,  1196,  1481,     0,  1193,     0,  1544,
+   1552,  1370,     0,  1344,     0,  1269,     0,  2484,   853,  1181,
+   1192,  1387,  2501,   846,  1209,  1299,  1584,  1448,  1204,  1298,
+   1425,  1180,  1542,   845,  2508,     0,   839,     0,  1297,   823,
+   1259,     0,     0,  1555,  1258,   254,  1477,     0,  1296,  1480,
+    893,  2483,     0,  1257,   828,  1201,  1361,  1342,  1360,  1423,
+      0,  1339,   842,  1185,  1255,   231,  1295,     0,     0,  1909,
+      0,  1446,  2829,  1476,  1527,     0,  1901,   838,  1167,   841,
+   1479,     0,  1263,   830,  1454,     0,  1169,  1294,  2851,  1385,
+   1445,  1452,     0,  1394,  1179,  1450,     0,  2480,   250,  1293,
+   1368,     0,  1911,   852,  2496,   858,  2494,   240,     0,  1166,
+   1253,  1306,  1444,  1541,  1466,  1366,     0,  1393,     0,  1583,
+   1442,  1539,   829,  1582,  1250,  1364,  1526,  1556,  1473,  1457,
+   1455,  1391,  1380,  1363,   833,  1304,  1525,   239,  1178,  1187,
+   1262,  1529,  1586,   866,  1536,   301,  1465,   860,  1535,  1550,
+   1369,  1279,  1188,  2481,   837,   834,  1184,  1384,  2493,   270,
+   1203,  1292,  1581,  1447,  1202,  1278,  1390,  1177,  1534,   264,
+   1892,   836,  1291,   229,  1216,  1553,  1176,   228,  1462,  1289,
+   1478,   832,  1899,  1175,   236,  1200,  1359,  1303,  1358,  1395,
+   1301,   252,  1183,  1174,   226,  1277,  1884,  1440,  2820,  1461,
+   1524,  1890,   831,   857,   263,  1463,  1261,   249,  1453,   849,
+   1276,  2509,  1383,  1439,  1451,  1389,  1173,  1449,  2479,   241,
+   1288,  1367,  1910,   835,  2491,   566,  1895,   238,  1165,   904,
+   1300,  1443,  1533,  1464,  1365,  1392,  1576,  1441,  1532,   259,
+   1573,   902,  1362,  1521,  1388,     0,  1164,     0,  1531,  1357,
+   1182,  1356,  1260,     0,  1530,     0,  1196,     0,  1552,   255,
+    853,   268,  1181,     0,  1387,  1172,   846,     0,  1299,  1199,
+   1448,     0,  1298,     0,  1180,  1215,   845,     0,   839,  1214,
+   1297,  1355,  1259,   844,  1258,     0,  1477,     0,  1296,  1198,
+    893,     0,  1257,     0,  1201,  1518,  1361,  1510,  1360,  1354,
+    842,     0,  1255,     0,  1295,     0,  1446,  1213,  1476,     0,
+   1527,  1378,  1901,  1171,  1197,   838,  1353,   841,  1212,   830,
+      0,  1294,     0,  1385,  1287,  1445,   237,  1179,  1507,   250,
+      0,  1293,  1475,   852,     0,  2496,     0,  1286,   858,     0,
+    240,     0,  1253,     0,  1444,     0,  1466,  1285,  1442,     0,
+    829,     0,  1250,     0,  1526,   840,  1380,   833,  1525,  1290,
+   1178,  1352,  1187,  1529,   301,  1550,   251,   837,   253,   834,
+   1384,  1170,   270,  1292,  1195,  1447,  1278,  1177,   901,   264,
+    836,   868,  1291,  1351,  1216,   308,  1176,  1462,  1289,  1191,
+    832,  1175,  1200,  1505,  1359,  1504,  1358,  1284,   252,  1174,
+   1277,  1440,   867,  1461,  1524,  1377,  1890,   851,  1190,   831,
+   1350,   263,  1186,   249,  1276,  1383,  1283,  1439,   235,  1173,
+   1489,   241,  1288,  1472,   835,  2491,  1274,   566,   238,   904,
+   1443,  1464,  1273,  1441,   259,   902,  1521,   294,  1357,     0,
+   1356,   827,   255,     0,   268,     0,  1172,  1349,  1199,   824,
+   1215,     0,  1214,     0,  1355,  1549,   844,     0,  1198,   230,
+   1518,  1375,  1510,  1460,  1354,     0,  1213,     0,  1378,  1373,
+   1171,  1348,  1197,  1282,  1353,  1436,  1212,   843,  1287,   825,
+    237,     0,  1507,  1470,  1475,   260,  1286,     0,  1285,     0,
+    840,     0,  1290,  1352,   247,   251,   253,  1170,  1347,  1195,
+    233,   901,   868,  1351,  1548,   308,  1191,   227,  1505,  1372,
+   1504,  1458,  1284,   867,  1377,  1371,   851,  1346,  1190,  1272,
+   1350,  1426,  1186,   307,  1283,   244,   235,  1489,  1459,  1472,
+    243,  1274,  1273,   294,   827,     0,  1349,   246,   824,     0,
+   1549,  1281,   230,     0,  1375,     0,  1460,  1280,  1373,     0,
+   1348,  1271,  1282,     0,  1436,     0,   843,     0,   825,     0,
+   1470,     0,   260,     0,   247,  1347,   242,   233,  1548,  1270,
+    227,  1372,  1458,  1194,  1371,  1346,  1189,  1272,  1426,   307,
+    244,  1459,   243,   246,     0,  1281,     0,  1280,     0,  1271,
+      0,   242,  1270,  1194,  1189
+]
+yy_def = [
+      0,     0,     1,     0,     3,     0,     5,     0,     7,     0,
+      9,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      0,     0,     0,     0,     0,    33,     0,     0,    27,     0,
+     23,     0,     0,    30,     0,    29,     0,     0,    24,    32,
+    132,    32,    32,     0,    23,    24,    25,    26,    27,    28,
+     29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+     39,    40,    41,    42,     0,     0,     0,     0,     0,     0,
+      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     23,    39,    42,    32,    32,     0,    24,    32,    32,    32,
+     34,    25,    32,   113,    32,    41,     0,    26,    42,    32,
+      0,    27,    41,     0,    88,    89,    28,    92,   113,     0,
+      0,    29,    32,    26,    94,    32,    94,    87,    41,    30,
+      0,    28,     0,    31,    34,    39,    34,     0,    32,    42,
+     33,    26,    34,     0,    34,    89,     0,    35,    87,    89,
+    112,    34,   113,     0,    36,    24,    32,    42,    92,    84,
+      0,    37,    32,   113,    84,    87,    84,   113,    88,    28,
+     38,    26,    32,    89,     0,    41,    39,    88,    40,    87,
+     32,    41,    41,    32,    42,    88,    44,    81,    82,    83,
+     84,    45,    87,    88,    89,    90,    46,    92,    93,    94,
+     41,    47,    98,    99,    48,    41,   104,   105,    49,   107,
+    108,    50,   112,   113,    94,    32,    94,    87,    41,    51,
+    121,    52,   124,    39,   126,    53,    42,    54,   131,   132,
+     55,    89,    56,   138,    89,   112,   141,   142,    57,   145,
+    146,   147,    92,   149,    58,   152,   113,   154,    87,   156,
+    157,   158,    28,    59,   161,   162,    89,    41,    60,   167,
+     61,   169,    32,    41,    62,    32,    63,    88,    81,     0,
+     82,     0,    83,     0,    84,     0,    87,    87,    88,    32,
+     89,    41,    90,   112,    92,     0,    92,    41,    93,     0,
+      0,    94,     0,    95,    32,    98,     0,    99,     0,   102,
+     39,   104,     0,   105,     0,   107,     0,   108,    32,   112,
+    112,    87,   113,    32,   114,    89,   115,    84,   116,    89,
+    117,   112,   118,    32,   121,     0,   298,     0,    89,   124,
+     92,     0,     0,   125,    92,   126,    42,     0,    89,   129,
+    269,   131,     0,    92,   132,    94,    88,   135,    88,   138,
+      0,   139,    32,   140,    92,   141,    89,     0,     0,   142,
+      0,    84,   145,    42,    41,     0,   113,   298,   146,    32,
+    147,     0,   148,    32,   149,     0,   152,    89,   153,    87,
+     84,   154,     0,   155,   112,   156,     0,   157,    32,    89,
+    158,     0,   159,    99,   113,   269,   161,   378,     0,   162,
+     92,   163,    84,   165,    83,   167,     0,   169,     0,   170,
+     84,   171,   313,   173,    92,   175,    41,   177,   178,   179,
+    180,   182,   267,   183,   269,   184,    41,   185,   112,   274,
+    187,   277,   188,   189,   190,   284,   192,   193,   195,    39,
+    196,   197,   199,   200,   298,   299,   202,    87,   203,   303,
+    204,    89,   205,   307,   206,   309,   207,   112,   208,   313,
+    210,   298,    89,   212,    92,   213,   324,   214,   326,    89,
+    216,   330,   218,   333,   219,    94,    88,   221,    88,   223,
+    224,   342,   225,   344,   226,   346,   227,    84,   229,   353,
+     41,   356,   298,   230,   359,   231,   232,   363,   233,   235,
+    367,   236,    87,    84,   237,   238,   112,   239,   240,   378,
+     89,   241,   242,   383,   384,   385,   244,   387,   245,   390,
+    246,   392,   247,    83,   249,   251,   252,   400,   253,   402,
+    255,   404,   257,    41,   267,     0,   269,     0,   271,    88,
+    273,    88,   274,     0,   277,     0,   284,     0,   290,   359,
+    298,   313,   299,     0,   301,   112,   303,     0,   305,    94,
+    307,     0,   309,     0,   311,    92,   313,     0,   316,    92,
+    318,    88,   320,   269,   324,     0,   326,     0,   328,    94,
+    330,     0,   333,     0,   335,    41,   336,    41,   338,    88,
+    342,     0,   344,     0,   346,     0,   351,    92,   353,     0,
+    354,    87,   356,   112,    94,   357,    88,   359,    92,   363,
+      0,   367,     0,   369,    89,   370,   378,   374,    41,   378,
+      0,   379,    42,   383,     0,   384,     0,    89,   385,     0,
+    387,     0,   390,     0,   392,     0,   394,    89,   400,     0,
+    402,     0,   404,     0,   406,   284,   412,   414,   416,   529,
+    418,    88,   419,   421,   425,   429,   539,   434,   541,   435,
+    437,   112,   439,   441,    94,   443,   445,   447,   555,   449,
+    451,   559,   452,    88,   454,   563,   456,   458,   459,    94,
+    461,   463,   465,    41,   466,    41,   468,   579,   471,   473,
+    475,   477,   587,   479,   480,    87,   481,   112,    94,   482,
+     88,   484,    92,   487,   490,   492,    89,   493,   606,   496,
+     41,   499,   500,    42,   503,   504,   617,   505,   507,   509,
+    511,   513,   627,   517,   519,   521,   523,   635,   529,     0,
+    531,   363,   539,     0,   541,     0,   545,    88,   549,    32,
+    555,     0,   559,     0,   561,    39,   563,     0,   569,   729,
+    575,    87,   577,    83,   579,     0,   587,     0,   591,    87,
+    593,    88,   594,    89,   596,    84,   598,   269,   604,   363,
+    606,     0,   608,    42,   612,   363,   617,     0,   627,     0,
+    635,     0,   639,   641,   721,   646,   648,   651,    88,   654,
+    729,   658,   661,   663,    39,   665,   669,   739,   673,   741,
+    675,    83,   677,   682,   685,   749,   687,    88,   688,   753,
+    690,   755,   692,   757,   696,   759,   698,   700,   763,   703,
+    765,   706,   712,   717,   721,     0,   727,   363,   729,     0,
+    735,    89,   739,     0,   741,     0,   743,    89,   749,     0,
+    751,    89,   753,     0,   755,     0,   757,     0,   759,     0,
+    763,     0,   765,     0,   774,   778,   817,   780,   784,   821,
+    787,   789,   791,   827,   795,   797,   831,   799,   801,   803,
+    805,   808,   810,   817,     0,   821,     0,   827,     0,   831,
+      0,   846,   849,   853,   856
+]
+yy_nxt = [
+     11,     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,     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,     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,   228,   474,   850,
+    457,   453,   822,   345,   250,   847,   220,   806,   464,   760,
+    708,   417,   620,   701,   871,   862,   860,   761,   863,   844,
+    621,   693,   609,   775,   678,   776,   325,   722,   823,   234,
+    610,   714,   842,   458,   229,   691,   659,   251,   230,   454,
+    724,   475,   652,   231,   232,   459,   346,   864,   252,   133,
+    233,   347,   221,   133,   348,   418,   253,   419,   465,   326,
+    466,   843,   235,   127,   236,   327,   813,   723,   237,   238,
+    239,   328,   133,   644,   725,   692,   133,   240,   241,   859,
+    785,   242,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   151,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   152,   150,   153,   150,
+    150,   150,   154,   155,   156,   150,   150,   150,   150,   150,
+    150,   157,   158,   150,   150,   159,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+    150,   150,   150,   150,   150,   150,   150,   150,   707,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    144,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   145,   143,   143,
+    143,   146,   143,   143,   143,   143,   147,   148,   143,   143,
+    143,   143,   143,   149,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
+    143,   143,   143,   143,   143,   319,   818,   838,   272,   814,
+    334,   630,   599,   689,   670,   637,   649,   704,   660,   647,
+    595,   558,   770,   597,   580,   836,   736,   556,   546,   837,
+    737,   489,   819,   796,   613,   540,   839,   168,   815,   483,
+    618,   600,   427,   320,   619,   631,   547,   127,   423,   793,
+    782,   321,   273,   127,   274,   133,   133,   322,   133,   275,
+    335,   557,   336,   598,   127,   127,   690,   581,   127,   127,
+    169,   661,   648,   596,   559,   570,   127,   771,   484,   571,
+    797,   170,   614,   781,   715,   490,   709,   133,   541,   171,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   134,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   135,   133,   133,
+    133,   136,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+    133,   133,   133,   133,   133,   133,   526,   508,   389,   358,
+    527,   366,   777,   750,   726,   699,   679,   671,   666,   657,
+    640,   607,   554,   542,   530,   472,   436,   343,   802,   642,
+    432,   874,   798,   786,   300,   287,   873,   779,   536,   752,
+    738,   728,   672,   574,   444,   440,   308,   127,   359,   127,
+    127,   304,   127,   281,   756,   746,   732,   730,   664,   778,
+    751,   727,   700,   509,   390,   367,   658,   641,   608,   555,
+    543,   531,   473,   437,   344,   127,   127,   799,   787,   127,
+    803,   301,   780,   288,   753,   739,   729,   673,   575,   445,
+    441,   309,   632,   537,   127,   622,   305,   582,   282,   572,
+    564,   562,   532,   486,   420,   362,   757,   747,   733,   731,
+    665,   295,   872,   869,   857,   812,   811,   276,   694,   680,
+    656,   431,   867,   865,   832,   804,   792,   768,   766,   758,
+    702,   668,   772,   662,   653,   611,   601,   584,   568,   560,
+    552,   548,   510,   470,   633,   467,   415,   623,   391,   583,
+    870,   573,   565,   563,   533,   487,   421,   363,   127,   868,
+    866,   833,   805,   296,   769,   767,   759,   703,   669,   277,
+    663,   654,   612,   602,   585,   569,   561,   553,   549,   511,
+    471,   341,   468,   416,   337,   392,   293,   270,   855,   845,
+    830,   816,   800,   783,   773,   754,   744,   734,   720,   718,
+    676,   674,   578,   576,   522,   413,   405,   514,   395,   501,
+    380,   430,   291,   854,   851,   828,   268,   824,   342,   794,
+    748,   338,   636,   294,   271,   695,   650,   603,   127,   544,
+    524,   495,   446,   411,   515,   397,   373,   469,   856,   846,
+    831,   817,   801,   784,   774,   755,   745,   735,   721,   719,
+    677,   675,   579,   577,   523,   414,   406,   127,   396,   829,
+    381,   825,   292,   795,   749,   339,   269,   310,   858,   696,
+    651,   604,   266,   545,   525,   496,   447,   412,   834,   398,
+    374,   697,   681,   713,   628,   710,   624,   605,   586,   655,
+    550,   497,   375,   494,   371,   488,   364,   410,   264,   409,
+    852,   861,   826,   683,   667,   485,   711,   426,   626,   340,
+    262,   311,   840,   127,   809,   408,   267,   764,   588,   566,
+    460,   360,   329,   285,   835,   260,   256,   698,   682,   174,
+    629,   807,   625,   606,   587,   853,   551,   827,   376,   127,
+    372,   712,   365,   627,   265,   263,   790,   788,   841,   762,
+    810,   127,   742,   765,   589,   567,   461,   361,   330,   286,
+    740,   261,   257,   716,   808,   175,   684,   638,   634,   590,
+    127,   643,   534,   528,   518,   512,   448,   428,   424,   791,
+    789,   401,   763,   393,   312,   743,   289,   283,   254,   172,
+    848,   820,   645,   741,   538,   455,   717,   323,   407,   685,
+    639,   635,   591,   258,   248,   535,   529,   519,   513,   449,
+    429,   425,   166,   198,   402,   520,   394,   313,   516,   290,
+    284,   255,   173,   442,   403,   399,   306,   215,   422, 65535,
+    127, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535,   849,   821,   646, 65535,   539,   456, 65535,   324, 65535,
+    199, 65535, 65535,   127,   259,   249,   521, 65535, 65535,   517,
+    200, 65535, 65535,   167,   443,   404,   400,   307,   216,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    128,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   129,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
+    127,   127,   127,   127,   127,   222,   476, 65535, 65535,   137,
+  65535, 65535,   686, 65535,   450, 65535, 65535,   506, 65535,   201,
+  65535,   462, 65535,   592, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535,   349,   502,   382,   350, 65535, 65535,   211, 65535, 65535,
+  65535,   223,   224, 65535,   110,   138,   139,   477,   110,   225,
+    110,   507,   226,   140,   202,   227,   141,   110,   203,   142,
+    204,   110,   451,   205,   687,   688,   206,   207,   452,   503,
+    383,   208,   351,    96,   212,   593,   594,   463,   213,   504,
+    384,    96,   505,   385,   214,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   123,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   124,   122,   122,   122,   125,   122,   122,
+    122,   122,   122,   126,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122,   122,   122,   122,   122,   122,   122,   122,   122,   122,
+    122, 65535,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   111,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   112,   110,
+    110,   110,   113,   110,   114,   110,   110,   115,   110,   110,
+    116,   117,   110,   110,   110,   118,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   110,   110,
+    110,   110,   110,   110,   110,   110,   110,   110,   106,   194,
+  65535,   498,   377,   433, 65535,   331,   297, 65535, 65535,   278,
+  65535, 65535, 65535,   705, 65535,   438,   386, 65535,   615, 65535,
+  65535, 65535, 65535,   302,   209, 65535, 65535, 65535, 65535, 65535,
+    314,   491, 65535,   315, 65535,   107,   499,   378,   500,   379,
+  65535, 65535,   100,   195,   100,   108,   196,   279,   109,   197,
+    387,    96,    96,   280,   434,   435,    96,   298,   299,    96,
+    332,   333,   388,   706,   492,   439,   616,   100,   617,    96,
+    210, 65535,    96,   303, 65535, 65535, 65535,   100,   316,    96,
+    100,   493,   317, 65535,   318,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   101,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    102,   100,   103,   104,   100,   100,   105,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   100,   100,   100,   100,   100,   100,   100,   100,   100,
+    100,   191,   478,   217, 65535,   181, 65535, 65535, 65535, 65535,
+  65535,   352, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535,   243,   160, 65535,
+  65535, 65535, 65535,   368, 65535,   479, 65535,   480,   182, 65535,
+    218, 65535, 65535, 65535,   353,   183,   354,   192, 65535,   184,
+    219,    85,   185,   481,   482,    85,   355,   193,    85, 65535,
+    244,   161,   356,   357,   245,   162,   369,   246,   163, 65535,
+  65535, 65535,    85, 65535, 65535,   164, 65535,   247,   165, 65535,
+  65535, 65535, 65535,   370,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    97,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    98,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    99,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+  65535,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    86,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    87,    85,    85,    85,    85,
+     85,    85,    88,    85,    85,    85,    89,    85,    85,    90,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+     85,    85,    85,    85,    85,    85,    85,    91, 65535,   130,
+  65535, 65535, 65535, 65535, 65535,   119, 65535,   176, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,   186,
+     92, 65535, 65535, 65535,    93, 65535,   131,    79,    94,    79,
+  65535,   177, 65535,   120,    79,    79,   132,    95, 65535, 65535,
+  65535,   121, 65535,   178, 65535, 65535,    79,    79,   179,   180,
+  65535, 65535,   187, 65535, 65535, 65535,   188, 65535, 65535, 65535,
+    189, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,   190,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    80,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    81,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    82,    79,    79,
+     79,    79,    83,    84,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
+     79,    79,    79,    79,    79,    79, 65535,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    77,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     78,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76,    76,    76,    76,    76,    76,    76,    76,
+     76,    76,    76, 65535,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    75,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+     74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+  65535,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     71,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    72,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    73,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+     70,    70,    70,    70,    70,    70,    70, 65535,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    65,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    66,
+     64,    67,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    68,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    69,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+     64,    64,    64,    64, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,    44,
+  65535,    45,    46,    47,    48,    49,    50,    51, 65535, 65535,
+     52,    53,    54,    55,    56, 65535,    57,    58,    59,    60,
+     61,    62,    63,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    13,    12,    14,    12,    12,    12,
+     15,    12,    12,    12,    16,    17,    12,    18,    12,    19,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    20,    21,    22,    12,    12,    23,    12,    24,
+     25,    26,    27,    28,    29,    30,    12,    12,    31,    32,
+     33,    34,    35,    12,    36,    37,    38,    39,    40,    41,
+     42,    12,    12,    12,    12,    12,    43,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+     12,    12,    12,    12,    12,    12,    12,    12,    12
+]
+yy_chk = [
+      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,     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,
+      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,    57,   226,   787,
+    214,   212,   739,   141,    61,   780,    55,   698,   219,   606,
+    507,   185,   387,   499,   846,   810,   805,   606,   817,   774,
+    387,   487,   378,   646,   471,   648,   126,   539,   739,    58,
+    378,   519,   765,   214,    57,   484,   449,    61,    57,   212,
+    541,   226,   439,    57,    57,   214,   141,   817,    61,   141,
+     57,   141,    55,   141,   141,   185,    61,   185,   219,   126,
+    219,   765,    58,   378,    58,   126,   717,   539,    58,    58,
+     58,   126,   126,   425,   541,   484,   126,    58,    58,   803,
+    665,    58,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
+     37,    37,    37,    37,    37,    37,    37,    37,   505,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+     36,    36,    36,    36,    36,   124,   729,   759,    90,   721,
+    132,   402,   363,   482,   461,   414,   435,   503,   451,   434,
+    357,   316,   635,   359,   342,   757,   563,   313,   303,   757,
+    563,   235,   729,   687,   383,   298,   759,    40,   721,   230,
+    385,   363,   193,   124,   385,   402,   303,   729,   189,   682,
+    661,   124,    90,   363,    90,   124,   132,   124,    90,    90,
+    132,   313,   132,   359,   359,   342,   482,   342,   313,   303,
+     40,   451,   434,   357,   316,   330,   298,   635,   230,   330,
+    687,    40,   383,   658,   521,   235,   509,    40,   298,    40,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
+     34,    34,    34,    34,    34,    34,   269,   245,   162,   146,
+    269,   152,   651,   593,   545,   496,   473,   463,   456,   447,
+    418,   374,   311,   299,   273,   225,   202,   140,   692,   419,
+    199,   856,   688,   669,   112,    99,   853,   654,   284,   594,
+    569,   549,   465,   335,   206,   204,   116,   269,   146,   162,
+    146,   114,   152,    94,   598,   587,   559,   555,   454,   651,
+    593,   545,   496,   245,   162,   152,   447,   418,   374,   311,
+    299,   273,   225,   202,   140,   112,    99,   688,   669,   284,
+    692,   112,   654,    99,   594,   569,   549,   465,   335,   206,
+    204,   116,   404,   284,    94,   390,   114,   344,    94,   333,
+    324,   320,   274,   232,   187,   148,   598,   587,   559,   555,
+    454,   107,   849,   831,   799,   712,   706,    92,   490,   475,
+    445,   197,   827,   821,   753,   696,   677,   627,   617,   604,
+    500,   459,   639,   452,   441,   379,   367,   346,   328,   318,
+    309,   305,   246,   224,   404,   221,   184,   390,   163,   344,
+    831,   333,   324,   320,   274,   232,   187,   148,    92,   827,
+    821,   753,   696,   107,   627,   617,   604,   500,   459,    92,
+    452,   441,   379,   367,   346,   328,   318,   309,   305,   246,
+    224,   139,   221,   184,   135,   163,   105,    89,   797,   778,
+    751,   727,   690,   663,   641,   596,   579,   561,   531,   529,
+    468,   466,   338,   336,   257,   183,   175,   249,   167,   241,
+    158,   196,   104,   795,   789,   749,    88,   741,   139,   685,
+    591,   135,   412,   105,    89,   492,   437,   369,    89,   301,
+    267,   238,   207,   182,   251,   169,   155,   223,   797,   778,
+    751,   727,   690,   663,   641,   596,   579,   561,   531,   529,
+    468,   466,   338,   336,   257,   183,   175,    88,   167,   749,
+    158,   741,   104,   685,   591,   138,    88,   117,   801,   492,
+    437,   369,    87,   301,   267,   238,   207,   182,   755,   169,
+    155,   493,   477,   517,   400,   511,   392,   370,   351,   443,
+    307,   239,   156,   237,   154,   233,   149,   180,    84,   179,
+    791,   808,   743,   479,   458,   231,   513,   192,   394,   138,
+     83,   117,   763,    87,   703,   178,    87,   612,   353,   326,
+    216,   147,   129,    98,   755,    82,    63,   493,   477,    42,
+    400,   700,   392,   370,   351,   791,   307,   743,   156,    84,
+    154,   513,   149,   394,    84,    83,   675,   673,   763,   608,
+    703,    83,   577,   612,   353,   326,   216,   147,   129,    98,
+    575,    82,    63,   523,   700,    42,   480,   416,   406,   354,
+     42,   421,   277,   271,   253,   247,   208,   195,   190,   675,
+    673,   171,   608,   165,   118,   577,   102,    95,    62,    41,
+    784,   735,   429,   575,   290,   213,   523,   125,   177,   480,
+    416,   406,   354,    81,    60,   277,   271,   253,   247,   208,
+    195,   190,    39,    49,   171,   255,   165,   118,   252,   102,
+     95,    62,    41,   205,   173,   170,   115,    53,   188, 65535,
+     41, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535,   784,   735,   429, 65535,   290,   213, 65535,   125, 65535,
+     49, 65535, 65535,    39,    81,    60,   255, 65535, 65535,   252,
+     49, 65535, 65535,    39,   205,   173,   170,   115,    53,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
+     32,    32,    32,    32,    32,    56,   227, 65535, 65535,    35,
+  65535, 65535,   481, 65535,   210, 65535, 65535,   244, 65535,    50,
+  65535,   218, 65535,   356, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535,   142,   242,   159,   142, 65535, 65535,    52, 65535, 65535,
+  65535,    56,    56, 65535,    35,    35,    35,   227,    35,    56,
+     35,   244,    56,    35,    50,    56,    35,    35,    50,    35,
+     50,    35,   210,    50,   481,   481,    50,    50,   210,   242,
+    159,    50,   142,   356,    52,   356,   356,   218,    52,   242,
+    159,   142,   242,   159,    52,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+     31, 65535,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+     29,    29,    29,    29,    29,    29,    29,    29,    28,    48,
+  65535,   240,   157,   200, 65535,   131,   108, 65535, 65535,    93,
+  65535, 65535, 65535,   504, 65535,   203,   161, 65535,   384, 65535,
+  65535, 65535, 65535,   113,    51, 65535, 65535, 65535, 65535, 65535,
+    121,   236, 65535,   121, 65535,    28,   240,   157,   240,   157,
+  65535, 65535,    28,    48,    28,    28,    48,    93,    28,    48,
+    161,   131,   157,    93,   200,   200,   108,   108,   108,    93,
+    131,   131,   161,   504,   236,   203,   384,   121,   384,   113,
+     51, 65535,   161,   113, 65535, 65535, 65535,   121,   121,   113,
+    121,   236,   121, 65535,   121,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+     27,    47,   229,    54, 65535,    45, 65535, 65535, 65535, 65535,
+  65535,   145, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535,    59,    38, 65535,
+  65535, 65535, 65535,   153, 65535,   229, 65535,   229,    45, 65535,
+     54, 65535, 65535, 65535,   145,    45,   145,    47, 65535,    45,
+     54,   145,    45,   229,   229,   145,   145,    47,   145, 65535,
+     59,    38,   145,   145,    59,    38,   153,    59,    38, 65535,
+  65535, 65535,    38, 65535, 65535,    38, 65535,    59,    38, 65535,
+  65535, 65535, 65535,   153,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+     26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+  65535,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
+     24,    24,    24,    24,    24,    24,    24,    25, 65535,    33,
+  65535, 65535, 65535, 65535, 65535,    30, 65535,    44, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,    46,
+     25, 65535, 65535, 65535,    25, 65535,    33,    33,    25,    30,
+  65535,    44, 65535,    30,    25,    33,    33,    25, 65535, 65535,
+  65535,    30, 65535,    44, 65535, 65535,    30,    30,    44,    44,
+  65535, 65535,    46, 65535, 65535, 65535,    46, 65535, 65535, 65535,
+     46, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,    46,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+     23,    23,    23,    23,    23,    23, 65535,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9,     9,     9,     9,     9,     9,     9,     9,
+      9,     9,     9, 65535,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
+  65535,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
+      5,     5,     5,     5,     5,     5,     5, 65535,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+      3,     3,     3,     3, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
+  65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,     2,
+  65535,     2,     2,     2,     2,     2,     2,     2, 65535, 65535,
+      2,     2,     2,     2,     2, 65535,     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,     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,     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
+]
+def yy_action0():
+  raise YYContinue()
+def yy_action1():
+  ECHO()
+  yy_push_state(STR_LITERAL)
+  raise YYContinue()
+def yy_action2():
+  yyout.write('\x80')
+  raise YYContinue()
+def yy_action3():
+  yyout.write('\x81')
+  raise YYContinue()
+def yy_action4():
+  yyout.write('\x82')
+  raise YYContinue()
+def yy_action5():
+  yyout.write('\x83')
+  BEGIN(DATA)
+  raise YYContinue()
+def yy_action6():
+  yyout.write('\x84')
+  raise YYContinue()
+def yy_action7():
+  yyout.write('\x85')
+  raise YYContinue()
+def yy_action8():
+  yyout.write('\x86')
+  raise YYContinue()
+def yy_action9():
+  yyout.write('\x87')
+  raise YYContinue()
+def yy_action10():
+  yyout.write('\x88')
+  raise YYContinue()
+def yy_action11():
+  yyout.write('\x89')
+  raise YYContinue()
+def yy_action12():
+  yyout.write('\x8a')
+  raise YYContinue()
+def yy_action13():
+  yyout.write('\x8b')
+  raise YYContinue()
+def yy_action14():
+  yyout.write('\x8c')
+  raise YYContinue()
+def yy_action15():
+  yyout.write('\x8d')
+  raise YYContinue()
+def yy_action16():
+  yyout.write('\x8e')
+  raise YYContinue()
+def yy_action17():
+  yyout.write('\x8f')
+  raise YYContinue()
+def yy_action18():
+  yyout.write('\x90')
+  raise YYContinue()
+def yy_action19():
+  yyout.write('\x91')
+  raise YYContinue()
+def yy_action20():
+  yyout.write('\x92')
+  raise YYContinue()
+def yy_action21():
+  yyout.write('\x93')
+  raise YYContinue()
+def yy_action22():
+  yyout.write('\x94')
+  raise YYContinue()
+def yy_action23():
+  yyout.write('\x95')
+  raise YYContinue()
+def yy_action24():
+  yyout.write('\x96')
+  raise YYContinue()
+def yy_action25():
+  yyout.write('\x97')
+  raise YYContinue()
+def yy_action26():
+  yyout.write('\x98')
+  raise YYContinue()
+def yy_action27():
+  yyout.write('\x99')
+  raise YYContinue()
+def yy_action28():
+  yyout.write('\x9a')
+  raise YYContinue()
+def yy_action29():
+  yyout.write('\x9b')
+  raise YYContinue()
+def yy_action30():
+  yyout.write('\x9c')
+  raise YYContinue()
+def yy_action31():
+  yyout.write('\x9d')
+  raise YYContinue()
+def yy_action32():
+  yyout.write('\x9e')
+  raise YYContinue()
+def yy_action33():
+  yyout.write('\x9f')
+  raise YYContinue()
+def yy_action34():
+  yyout.write('\xa0')
+  raise YYContinue()
+def yy_action35():
+  yyout.write('\xa1')
+  raise YYContinue()
+def yy_action36():
+  yyout.write('\xa2')
+  raise YYContinue()
+def yy_action37():
+  yyout.write('\xa3')
+  raise YYContinue()
+def yy_action38():
+  yyout.write('\xa4')
+  raise YYContinue()
+def yy_action39():
+  yyout.write('\xa5')
+  raise YYContinue()
+def yy_action40():
+  yyout.write('\xa6')
+  raise YYContinue()
+def yy_action41():
+  yyout.write('\xa7')
+  raise YYContinue()
+def yy_action42():
+  yyout.write('\xa8')
+  raise YYContinue()
+def yy_action43():
+  yyout.write('\xa9')
+  raise YYContinue()
+def yy_action44():
+  yyout.write('\xaa')
+  raise YYContinue()
+def yy_action45():
+  yyout.write('\xab')
+  raise YYContinue()
+def yy_action46():
+  yyout.write('\xac')
+  raise YYContinue()
+def yy_action47():
+  yyout.write('\xad')
+  raise YYContinue()
+def yy_action48():
+  yyout.write('\xae')
+  raise YYContinue()
+def yy_action49():
+  yyout.write('\xaf')
+  raise YYContinue()
+def yy_action50():
+  yyout.write('\xb0')
+  raise YYContinue()
+def yy_action51():
+  yyout.write('\xb1')
+  raise YYContinue()
+def yy_action52():
+  yyout.write('\xb2')
+  BEGIN(REM_TEXT)
+  raise YYContinue()
+def yy_action53():
+  yyout.write('\xb3')
+  raise YYContinue()
+def yy_action54():
+  yyout.write('\xb4')
+  raise YYContinue()
+def yy_action55():
+  yyout.write('\xb5')
+  raise YYContinue()
+def yy_action56():
+  yyout.write('\xb6')
+  raise YYContinue()
+def yy_action57():
+  yyout.write('\xb7')
+  raise YYContinue()
+def yy_action58():
+  yyout.write('\xb8')
+  raise YYContinue()
+def yy_action59():
+  yyout.write('\xb9')
+  raise YYContinue()
+def yy_action60():
+  yyout.write('\xba')
+  raise YYContinue()
+def yy_action61():
+  yyout.write('\xbb')
+  raise YYContinue()
+def yy_action62():
+  yyout.write('\xbc')
+  raise YYContinue()
+def yy_action63():
+  yyout.write('\xbd')
+  raise YYContinue()
+def yy_action64():
+  yyout.write('\xbe')
+  raise YYContinue()
+def yy_action65():
+  yyout.write('\xbf')
+  raise YYContinue()
+def yy_action66():
+  yyout.write('\xc0')
+  raise YYContinue()
+def yy_action67():
+  yyout.write('\xc1')
+  raise YYContinue()
+def yy_action68():
+  yyout.write('\xc2')
+  raise YYContinue()
+def yy_action69():
+  yyout.write('\xc3')
+  raise YYContinue()
+def yy_action70():
+  yyout.write('\xc4')
+  raise YYContinue()
+def yy_action71():
+  yyout.write('\xc5')
+  raise YYContinue()
+def yy_action72():
+  yyout.write('\xc6')
+  raise YYContinue()
+def yy_action73():
+  yyout.write('\xc7')
+  raise YYContinue()
+def yy_action74():
+  yyout.write('\xc8')
+  raise YYContinue()
+def yy_action75():
+  yyout.write('\xc9')
+  raise YYContinue()
+def yy_action76():
+  yyout.write('\xca')
+  raise YYContinue()
+def yy_action77():
+  yyout.write('\xcb')
+  raise YYContinue()
+def yy_action78():
+  yyout.write('\xcc')
+  raise YYContinue()
+def yy_action79():
+  yyout.write('\xcd')
+  raise YYContinue()
+def yy_action80():
+  yyout.write('\xce')
+  raise YYContinue()
+def yy_action81():
+  yyout.write('\xcf')
+  raise YYContinue()
+def yy_action82():
+  yyout.write('\xd0')
+  raise YYContinue()
+def yy_action83():
+  yyout.write('\xd1')
+  raise YYContinue()
+def yy_action84():
+  yyout.write('\xd2')
+  raise YYContinue()
+def yy_action85():
+  yyout.write('\xd3')
+  raise YYContinue()
+def yy_action86():
+  yyout.write('\xd4')
+  raise YYContinue()
+def yy_action87():
+  yyout.write('\xd5')
+  raise YYContinue()
+def yy_action88():
+  yyout.write('\xd6')
+  raise YYContinue()
+def yy_action89():
+  yyout.write('\xd7')
+  raise YYContinue()
+def yy_action90():
+  yyout.write('\xd8')
+  raise YYContinue()
+def yy_action91():
+  yyout.write('\xd9')
+  raise YYContinue()
+def yy_action92():
+  yyout.write('\xda')
+  raise YYContinue()
+def yy_action93():
+  yyout.write('\xdb')
+  raise YYContinue()
+def yy_action94():
+  yyout.write('\xdc')
+  raise YYContinue()
+def yy_action95():
+  yyout.write('\xdd')
+  raise YYContinue()
+def yy_action96():
+  yyout.write('\xde')
+  raise YYContinue()
+def yy_action97():
+  yyout.write('\xdf')
+  raise YYContinue()
+def yy_action98():
+  yyout.write('\xe0')
+  raise YYContinue()
+def yy_action99():
+  yyout.write('\xe1')
+  raise YYContinue()
+def yy_action100():
+  yyout.write('\xe2')
+  raise YYContinue()
+def yy_action101():
+  yyout.write('\xe3')
+  raise YYContinue()
+def yy_action102():
+  yyout.write('\xe4')
+  raise YYContinue()
+def yy_action103():
+  yyout.write('\xe5')
+  raise YYContinue()
+def yy_action104():
+  yyout.write('\xe6')
+  raise YYContinue()
+def yy_action105():
+  yyout.write('\xe7')
+  raise YYContinue()
+def yy_action106():
+  yyout.write('\xe8')
+  raise YYContinue()
+def yy_action107():
+  yyout.write('\xe9')
+  raise YYContinue()
+def yy_action108():
+  yyout.write('\xea')
+  raise YYContinue()
+def yy_action109():
+  ECHO()
+  BEGIN(INITIAL)
+  raise YYContinue()
+def yy_action110():
+  ECHO()
+  BEGIN(DATA_TEXT)
+  raise YYContinue()
+def yy_action111():
+  ECHO()
+  BEGIN(DATA)
+  raise YYContinue()
+def yy_action112():
+  ECHO()
+  BEGIN(INITIAL)
+  raise YYContinue()
+def yy_action113():
+  ECHO()
+  yy_pop_state()
+  raise YYContinue()
+def yy_action114():
+  ECHO()
+  yy_pop_state()
+  BEGIN(INITIAL)
+  raise YYContinue()
+def yy_action115():
+  ECHO()
+  raise YYContinue()
+yy_actions = [
+  yy_action0,
+  yy_action1,
+  yy_action2,
+  yy_action3,
+  yy_action4,
+  yy_action5,
+  yy_action6,
+  yy_action7,
+  yy_action8,
+  yy_action9,
+  yy_action10,
+  yy_action11,
+  yy_action12,
+  yy_action13,
+  yy_action14,
+  yy_action15,
+  yy_action16,
+  yy_action17,
+  yy_action18,
+  yy_action19,
+  yy_action20,
+  yy_action21,
+  yy_action22,
+  yy_action23,
+  yy_action24,
+  yy_action25,
+  yy_action26,
+  yy_action27,
+  yy_action28,
+  yy_action29,
+  yy_action30,
+  yy_action31,
+  yy_action32,
+  yy_action33,
+  yy_action34,
+  yy_action35,
+  yy_action36,
+  yy_action37,
+  yy_action38,
+  yy_action39,
+  yy_action40,
+  yy_action41,
+  yy_action42,
+  yy_action43,
+  yy_action44,
+  yy_action45,
+  yy_action46,
+  yy_action47,
+  yy_action48,
+  yy_action49,
+  yy_action50,
+  yy_action51,
+  yy_action52,
+  yy_action53,
+  yy_action54,
+  yy_action55,
+  yy_action56,
+  yy_action57,
+  yy_action58,
+  yy_action59,
+  yy_action60,
+  yy_action61,
+  yy_action62,
+  yy_action63,
+  yy_action64,
+  yy_action65,
+  yy_action66,
+  yy_action67,
+  yy_action68,
+  yy_action69,
+  yy_action70,
+  yy_action71,
+  yy_action72,
+  yy_action73,
+  yy_action74,
+  yy_action75,
+  yy_action76,
+  yy_action77,
+  yy_action78,
+  yy_action79,
+  yy_action80,
+  yy_action81,
+  yy_action82,
+  yy_action83,
+  yy_action84,
+  yy_action85,
+  yy_action86,
+  yy_action87,
+  yy_action88,
+  yy_action89,
+  yy_action90,
+  yy_action91,
+  yy_action92,
+  yy_action93,
+  yy_action94,
+  yy_action95,
+  yy_action96,
+  yy_action97,
+  yy_action98,
+  yy_action99,
+  yy_action100,
+  yy_action101,
+  yy_action102,
+  yy_action103,
+  yy_action104,
+  yy_action105,
+  yy_action106,
+  yy_action107,
+  yy_action108,
+  yy_action109,
+  yy_action110,
+  yy_action111,
+  yy_action112,
+  yy_action113,
+  yy_action114,
+  yy_action115
+]
+def yy_eof_action0():
+  yyterminate()
+  return 0
+yy_eof_actions = [
+  yy_eof_action0,
+  yy_eof_action0,
+  yy_eof_action0,
+  yy_eof_action0,
+  yy_eof_action0
+]
+# GENERATE END
+
+def yylex():
+  global yyin, yytext, yytext_len, yylineno
+
+  # GENERATE SECTION2INITIAL BEGIN
+  # GENERATE END
+
+  # user may modify yyin, but only while outside yylex()
+  yy_buffer_stack[-1].file_in = yyin
+
+  # start:
+  while True:
+    # this will collect the remainder of each block as the block is
+    # exhausted, any partial block will be added after DFA is stuck
+    match = ''
+
+    # this is used to keep track of newlines, firstly during the scan
+    # and secondly when user calls REJECT() or yyless(), basically we
+    # will count newlines added/removed when it is extended/truncated
+    yytext = ''
+
+    # as we progress through the text and exhaust each input file
+    # on the buffer stack, we will "virtually" pop the stack by
+    # decrementing buffer_ptr, but actually leave the stack alone
+    # since it will be popped for real after executing the action
+    buffer_ptr = len(yy_buffer_stack) - 1
+
+    # block variable keeps track of where we are in current file's
+    # linked list, if None it means we have run out of blocks from
+    # the current file and in that case we have to append another
+    # block -- we maintain the invariant block == block_prev.next
+    # so we can append the block by pointing block_prev.next at it
+    block_prev = yy_buffer_stack[buffer_ptr]
+    block = block_prev.next
+    if block is not None:
+      block_pos = block.pos
+
+    # yy_current_state variable keeps track of where we are in the
+    # DFA, and yy_state_buf keeps track of the historical values of
+    # yy_current_state before each character -- when DFA is stuck
+    # we will look backwards in yy_state_buf for an accepting state
+    yy_current_state = yystart * 2 + 1 + YY_AT_BOL()
+    del yy_state_buf[:]
+
+    # yy_match:
+    #print('yy_match')
+    while True:
+      # try to get a character
+      while block is None or block_pos >= len(block.text):
+        if block is None:
+          # out of blocks, read and append one from current file
+          file_in = yy_buffer_stack[buffer_ptr].file_in
+          text = '' if file_in is None else file_in.readline()
+          if len(text):
+            block = YYBufferBlock(None, 0, text)
+            block_pos = 0
+            block_prev.next = block
+          else:
+            # EOF for current file
+
+            # mark file as being exhausted, so we do not re-attempt read
+            yy_buffer_stack[buffer_ptr].file_in = None
+
+            # "virtually" pop the buffer stack, maintaining invariant
+            buffer_ptr -= 1
+            if buffer_ptr < 0:
+              # EOF and no more input stacked (should call yywrap here?)
+              if len(yy_state_buf):
+                # had some characters already, so go and process them first
+                break # goto yy_find_action
+              # EOF on attempt to get first character, means we are done
+              try:
+                token = yy_eof_actions[yystart]()
+                yyin = yy_buffer_stack[-1].file_in = yyin # user may modify
+                return token
+              except YYTerminate:
+                yyin = yy_buffer_stack[-1].file_in = yyin # user may modify
+                return 0
+            block_prev = yy_buffer_stack[buffer_ptr]
+            block = block_prev.next
+            if block is not None:
+              block_pos = block.pos
+        else:
+          # out of data for current block
+
+          # take most recent data from block for yytext
+          # at this point len(yy_state_buf) == number of chars scanned
+          i = len(yy_state_buf) - len(match)
+          if i:
+            match += block.text[block_pos - i:block_pos]
+          assert len(match) == len(yy_state_buf)
+
+          # advance past exhausted block, maintaining invariant
+          block_prev = block
+          block = block_prev.next
+          if block is not None:
+            block_pos = block.pos
+      else:
+        # character available
+        yy_state_buf.append(yy_current_state)
+        yy_c = ord(block.text[block_pos])
+        block_pos += 1
+        #print('yy_c', yy_c)
+        while yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state:
+          yy_current_state = yy_def[yy_current_state];
+        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+        if yy_base[yy_current_state] != 0:
+          continue # goto yy_match
+
+      # we get here when either there is EOF and had some characters, or
+      # we had a character which makes DFA stuck -- do best action we can
+      break # goto yy_find_action
+
+    # yy_find_action:
+    # we seem to detect the jam one character earlier than flex does (when
+    # we've processed the last character of the maximal length string rather
+    # than when we try to process another character after that), and hence
+    # we do not need to back up one character here, unlike flex's algorithm
+    yy_state_ptr = len(yy_state_buf)
+    yy_lp = yy_accept[yy_current_state]
+
+    # take most recent data from block for yytext
+    # at this point yy_state_ptr == number of chars scanned
+    i = yy_state_ptr - len(match)
+    if i:
+      match += block.text[block_pos - i:block_pos]
+    assert len(match) == yy_state_ptr
+
+    # the following variables are used to handle trailing context
+    # suppose there is a rule like: foo/bar
+    # then state after 3 characters will be given YY_TRAILING_MASK
+    # and state after 6 characters will be given YY_TRAILING_HEAD_MASK
+    # so we look backwards for the YY_TRAILING_MASK, and when we find
+    # it, store the state after 6 characters into yy_full_XXX, then we
+    # keep looking for YY_TRAILING_HEAD_MASK, and when we find it, we
+    # execute the action -- and if it rejects then restart the search,
+    # but from the 6 characters point (yy_full_XXX) not 3 characters
+    yy_looking_for_trail_begin = 0
+    yy_full_state_ptr = None
+    yy_full_lp = None
+
+    # find_rule:
+    # we branch to this label when backing up (i.e. reject)
+    while True:
+      #print('find_rule')
+      while True: # until we find what rule matched
+        if yy_lp < yy_accept[yy_current_state + 1]:
+          yy_act = yy_acclist[yy_lp]
+          if (yy_act & YY_TRAILING_HEAD_MASK) or yy_looking_for_trail_begin:
+            if yy_act == yy_looking_for_trail_begin:
+              yy_looking_for_trail_begin = 0
+              yy_act &= ~YY_TRAILING_HEAD_MASK
+              break
+          elif yy_act & YY_TRAILING_MASK:
+            yy_looking_for_trail_begin = (
+              (yy_act & ~YY_TRAILING_MASK) | YY_TRAILING_HEAD_MASK
+            )
+            yy_full_state_ptr = yy_state_ptr
+            yy_full_lp = yy_lp
+          else:
+            yy_full_state_ptr = yy_state_ptr
+            yy_full_lp = yy_lp
+            break
+          yy_lp += 1
+        else:
+          # if the following assertion fails there is a hole in state machine,
+          # this is not supposed to happen due to the automatic catch-all rule
+          yy_state_ptr -= 1
+          assert yy_state_ptr >= 0
+          yy_current_state = yy_state_buf[yy_state_ptr]
+          yy_lp = yy_accept[yy_current_state]
+  
+      # at this point yy_state_ptr == number of chars needed
+      # truncate or extend yytext from match, counting added/removed newlines
+      if len(yytext) < yy_state_ptr:
+        i = match.find('\n', len(yytext), yy_state_ptr)
+        while i >= 0:
+          yylineno += 1
+          i = match.find('\n', i + 1, yy_state_ptr)
+      else:
+        i = yytext.find('\n', yy_state_ptr)
+        while i >= 0:
+          yylineno -= 1
+          i = yytext.find('\n', i + 1)
+      yytext = match[:yy_state_ptr]
+  
+      try:
+        yytext_len = len(yytext) # this is used by yycommit()
+        token = yy_actions[yy_act]()
+        yycommit() # user cannot call REJECT() / yyless() anymore
+        yyin = yy_buffer_stack[-1].file_in = yyin # user may modify
+        return token
+      except YYReject:
+        yy_state_ptr = yy_full_state_ptr
+        yy_current_state = yy_state_buf[yy_state_ptr]
+        yy_lp = yy_full_lp + 1
+        # goto find_rule
+      except YYContinue:
+        yycommit() # user cannot call REJECT() / yyless() anymore
+        break # goto start
+      except YYTerminate:
+        yycommit() # user cannot call REJECT() / yyless() anymore
+        yyin = yy_buffer_stack[-1].file_in = yyin # user may modify
+        return 0
+      # goto find_rule
+    # goto start
+
+# GENERATE SECTION3 BEGIN
+if __name__ == '__main__':
+  while yylex():
+    pass
+# GENERATE END
diff --git a/test/gr_to_data.py b/test/gr_to_data.py
new file mode 100755 (executable)
index 0000000..b50d61b
--- /dev/null
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+
+import numpy
+import sys
+import PIL.Image
+
+EXIT_SUCCESS = 0
+EXIT_FAILURE = 1
+
+if len(sys.argv) < 2:
+  print(f'usage: {sys.argv[0]:s} in.png')
+  sys.exit(EXIT_FAILURE)
+in_png = sys.argv[1]
+
+image_in_pil = PIL.Image.open(in_png)
+assert image_in_pil.mode == 'P'
+image_in = numpy.frombuffer(
+  image_in_pil.tobytes(),
+  dtype = numpy.uint8
+).reshape((image_in_pil.size[1], image_in_pil.size[0]))
+
+ys, xs = image_in.shape
+for i in range(ys):
+  print(
+    '{0:d} DATA {1:s}'.format(
+      i * 10 + 1000,
+      ','.join([str(i) for i in image_in[i, :]])
+    )
+  )
diff --git a/test/sonic_gr.bas b/test/sonic_gr.bas
new file mode 100644 (file)
index 0000000..9e0cb84
--- /dev/null
@@ -0,0 +1,59 @@
+10 GR:I=PEEK(-16302)
+20 FOR I=0 TO 47
+30 FOR J=0 TO 39
+40 READ K
+50 COLOR=K
+60 PLOT J,I
+70 NEXT J
+80 NEXT I
+90 GET I$
+100 TEXT
+110 END
+1020 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
+1030 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,7,7,2,2,2,2,2,7,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
+1040 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,7,2,2,2,2,2,2,2,2,2,2,7,15,15,15,15,15,15,15,15,15,15,15,15,15
+1050 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,7,2,2,2,2,2,2,2,2,2,2,2,2,2,15,15,15,15,15,15,15,15,15,15,15,15
+1060 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,7,2,3,2,2,2,2,2,2,2,2,2,2,7,7,15,15,15,15,15,15,15,15,15,15
+1070 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,7,2,2,2,7,15,15,15,15,15
+1080 DATA 15,15,15,15,15,15,15,15,15,15,15,15,7,2,2,2,2,2,2,2,2,2,2,2,2,2,7,2,2,2,2,2,2,2,15,15,15,15,15,15
+1090 DATA 15,15,15,15,15,15,15,15,15,15,15,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,7,2,2,2,2,2,15,15,15,15,15,15,15
+1100 DATA 15,15,15,15,15,15,15,15,15,15,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,2,2,2,2,15,15,15,15,15,15,15,15
+1110 DATA 15,15,15,15,15,15,15,15,15,7,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,15,15,15,15,15,15,15,15
+1120 DATA 15,15,15,15,15,15,15,15,15,7,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,3,2,2,7,15,15,15,15,15,15,15
+1130 DATA 15,15,15,15,15,15,15,15,7,7,2,2,2,7,2,2,2,2,2,2,2,2,2,2,2,2,2,7,2,2,3,2,2,15,15,15,15,15,15,15
+1140 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,7,2,2,2,2,2,2,2,2,2,2,15,15,15,2,2,2,7,15,15,15,15,15,15,15
+1150 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,7,7,2,2,2,2,2,2,2,2,2,7,15,15,15,7,2,2,15,15,15,15,15,15,15,15
+1160 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,10,7,2,2,2,2,2,2,2,2,2,2,7,15,15,15,15,2,2,15,15,15,15,15,15,15,15
+1170 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,3,2,2,2,2,2,2,2,2,2,2,2,2,15,15,15,11,2,7,15,15,15,15,15,15,15,15
+1180 DATA 15,15,15,15,15,15,15,15,15,15,15,15,7,2,2,2,2,2,2,2,2,2,2,2,2,7,15,15,15,10,7,10,15,15,15,15,15,15,15,15
+1190 DATA 15,15,15,15,15,15,15,15,15,15,15,15,7,7,2,2,2,2,2,2,2,2,2,2,2,9,8,13,14,9,13,15,15,15,15,15,15,15,15,15
+1200 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11,15,15,2,0,2,2,0,2,0,9,9,9,8,9,9,10,15,15,15,15,15,15,15,15
+1210 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,13,8,9,9,9,1,0,0,9,9,13,15,15,15,15,15,15,15,15,15,15
+1220 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,13,9,9,5,5,2,2,9,9,10,15,15,15,15,15,15,15,15,15,15,15
+1230 DATA 15,15,15,15,15,15,15,15,15,15,15,10,15,15,15,15,10,10,15,15,15,7,5,2,2,1,8,9,15,15,15,15,15,15,15,15,15,15,15,15
+1240 DATA 15,15,15,15,15,15,15,15,15,15,11,9,11,11,9,15,5,5,5,10,5,5,2,2,2,5,9,9,10,15,15,15,15,15,15,15,15,15,15,15
+1250 DATA 15,15,15,15,15,15,15,10,1,9,9,11,9,11,11,9,1,9,1,9,0,0,2,2,2,8,9,15,15,15,15,15,15,15,15,15,15,15,15,15
+1260 DATA 15,15,15,15,15,15,15,9,9,11,15,15,11,9,1,9,9,9,9,1,5,1,2,0,5,5,10,15,15,15,15,15,15,15,15,15,15,15,15,15
+1270 DATA 15,15,15,15,15,11,9,1,11,15,15,11,9,9,1,9,9,1,9,9,9,1,3,1,1,0,7,7,15,15,15,15,15,15,15,15,15,15,15,15
+1280 DATA 15,15,15,15,10,9,1,9,13,10,11,9,1,9,9,11,9,9,9,1,9,9,9,1,9,1,1,2,7,10,15,15,15,15,15,15,15,15,15,15
+1290 DATA 15,15,15,15,5,9,1,9,11,9,9,1,9,11,10,5,11,10,1,1,3,1,9,9,1,9,1,1,1,1,9,10,15,15,15,15,15,15,15,15
+1300 DATA 15,15,15,11,9,1,9,15,9,1,9,1,9,10,10,5,7,2,2,2,5,10,9,1,9,9,9,1,1,1,9,1,9,11,15,15,15,15,15,15
+1310 DATA 15,15,15,10,9,9,9,9,9,9,9,10,10,15,5,2,2,2,7,15,15,15,9,9,1,9,9,9,9,1,9,1,9,9,11,15,15,15,15,15
+1320 DATA 15,15,15,11,5,11,1,9,9,1,9,9,15,15,7,2,0,15,15,15,15,15,15,15,13,1,9,9,1,9,9,9,1,9,9,11,15,15,15,15
+1330 DATA 15,15,10,11,9,9,9,8,9,9,1,15,10,7,5,7,5,15,15,15,15,15,15,15,9,9,1,9,9,9,9,9,9,1,9,11,15,15,15,15
+1340 DATA 15,15,15,11,9,11,9,9,8,9,5,10,10,10,5,5,15,15,15,15,15,15,15,15,15,15,9,9,1,9,9,9,1,9,9,9,15,15,15,15
+1350 DATA 15,15,15,10,11,9,9,9,8,15,15,15,10,11,10,10,15,15,15,15,15,15,15,15,15,10,11,9,9,9,9,9,1,9,1,11,15,15,15,15
+1360 DATA 15,15,15,9,11,9,11,8,9,9,15,10,10,5,10,15,15,15,15,15,15,15,15,15,15,11,15,15,15,9,9,9,9,9,9,9,11,10,15,15
+1370 DATA 15,15,15,15,9,11,9,9,9,9,11,9,11,5,15,15,15,15,15,15,15,15,15,15,15,15,10,15,11,9,9,9,1,9,1,9,11,15,15,15
+1380 DATA 15,15,15,15,11,9,11,9,9,9,1,9,5,5,11,10,15,15,15,15,15,15,15,15,15,15,10,11,15,9,1,9,9,9,9,9,9,10,15,15
+1390 DATA 15,15,15,15,15,11,9,9,9,9,1,9,1,9,5,10,15,15,15,15,15,15,15,15,15,15,10,15,9,9,9,9,1,9,1,9,11,10,15,15
+1400 DATA 15,15,15,15,15,11,9,11,1,9,9,9,9,1,9,5,11,15,15,15,15,15,15,15,15,10,9,15,15,1,9,9,9,9,1,9,5,11,15,15
+1410 DATA 15,15,15,15,15,11,9,9,9,1,9,9,9,9,1,9,10,15,15,15,15,15,15,15,5,11,15,10,9,9,9,9,9,9,1,9,5,15,15,15
+1420 DATA 15,15,15,15,15,15,15,11,1,9,9,9,1,9,9,9,1,9,5,15,15,10,5,11,15,15,15,11,9,9,9,9,1,9,9,5,11,15,15,15
+1430 DATA 15,15,15,15,15,15,15,9,9,1,9,9,9,1,9,9,9,1,9,5,10,15,15,15,15,10,9,1,9,9,9,9,9,1,9,5,15,15,15,15
+1440 DATA 15,15,15,15,15,15,15,15,15,9,9,1,9,9,9,1,9,9,1,9,11,10,10,9,5,1,9,9,9,9,9,1,9,1,5,15,15,15,15,15
+1450 DATA 15,15,15,15,15,15,15,15,11,15,9,9,1,9,9,9,9,9,9,9,9,9,1,9,9,9,9,9,9,9,9,9,9,5,15,15,15,15,15,15
+1460 DATA 15,15,15,15,15,15,15,15,15,15,15,15,13,9,11,9,1,9,9,9,9,9,9,9,9,9,9,9,9,1,9,9,11,15,15,15,15,15,15,15
+1470 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,11,15,9,9,9,9,9,9,1,9,1,9,1,9,1,9,9,11,15,15,15,15,15,15,15,15,15
+1480 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11,9,9,9,9,9,9,9,15,9,15,10,15,15,15,15,15,15,15,15,15
+1490 DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
diff --git a/test/sonic_gr.png b/test/sonic_gr.png
new file mode 100644 (file)
index 0000000..d24018d
Binary files /dev/null and b/test/sonic_gr.png differ
diff --git a/test/sonic_gr.sh b/test/sonic_gr.sh
new file mode 100755 (executable)
index 0000000..fcbc0b2
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh
+sed -e 's/ //' <sonic_gr.bas >sonic_gr1.bas
+./bas_to_tok.py <sonic_gr1.bas >sonic_gr1.tok
+./tok_to_bin.py <sonic_gr1.tok >sonic_gr1.bin
+../dos33fsprogs/utils/dos33fs-utils/dos33 ~/src/linapple-pie/chris.dsk SAVE A sonic_gr1.bin SONIC\ GR
diff --git a/test/tok_to_bin.py b/test/tok_to_bin.py
new file mode 100755 (executable)
index 0000000..1e7033c
--- /dev/null
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+bin = []
+def byte(value):
+  bin.append(value & 0xff)
+def word(value):
+  bin.extend([value & 0xff, (value >> 8) & 0xff])
+
+word(0)
+for line in sys.stdin:
+  line = [ord(i) for i in line]
+  assert line.pop() == 0xa
+
+  i = 0
+  line_number = 0
+  while i < len(line) and line[i] >= 0x30 and line[i] < 0x3a:
+    line_number = line_number * 10 + (line[i] & 0xf)
+    i += 1
+  line = line[i:]
+
+  word(len(bin) + 4 + len(line) + 0x800)
+  word(line_number)
+  bin.extend(line)
+  byte(0)
+bin[0] = len(bin) & 0xff
+bin[1] = (len(bin) >> 8) & 0xff
+word(0)
+assert os.write(sys.stdout.fileno(), bytes(bin)) == len(bin)