]> granicus.if.org Git - yasm/commitdiff
Add support for single-level GAS .rept directive. Nested .rept's are not
authorPeter Johnson <peter@tortall.net>
Wed, 2 Nov 2005 08:24:19 +0000 (08:24 -0000)
committerPeter Johnson <peter@tortall.net>
Wed, 2 Nov 2005 08:24:19 +0000 (08:24 -0000)
allowed at the moment.  The implementation works mostly like a preproc; it
copies source lines and replays them to the lexer.  A new .line directive
was added to fix up line numbers for errors and warnings.

* gas-parser.h (yasm_parser_gas): Add rept structure storage.
(gas_rept): New data structure for .rept state.
(gas_rept_line): Data structure to store source lines within .rept block.

* gas-parser.c: Initialize rept to NULL and check for unclosed rept.

* gas-bison.y: Add support for .line, .rept, and .endr directives.  The
DIR_REPT handler just creates the rept structure, and the DIR_ENDR handler
just errors (.endr without .rept).  All the real work is done in the lexer.

* gas-token.re (rept_input): Replays captured .rept block source lines back
to fill().
(fill): Call rept_input() instead of yasm_preproc_input() if expanding a
rept block.
(gas_parser_lex): Capture source lines and store into rept data structures.

Also added a whole bunch of testcases.

svn path=/trunk/yasm/; revision=1306

26 files changed:
modules/parsers/gas/gas-bison.y
modules/parsers/gas/gas-parser.c
modules/parsers/gas/gas-parser.h
modules/parsers/gas/gas-token.re
modules/parsers/gas/tests/Makefile.inc
modules/parsers/gas/tests/bin/Makefile.inc [new file with mode: 0644]
modules/parsers/gas/tests/bin/gas_bin_test.sh [new file with mode: 0755]
modules/parsers/gas/tests/bin/rept-err.asm [new file with mode: 0644]
modules/parsers/gas/tests/bin/rept-err.errwarn [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptempty.asm [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptempty.errwarn [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptempty.hex [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptlong.asm [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptlong.errwarn [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptlong.hex [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptnested-err.asm [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptnested-err.errwarn [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptsimple.asm [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptsimple.errwarn [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptsimple.hex [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptwarn.asm [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptwarn.errwarn [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptwarn.hex [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptzero.asm [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptzero.errwarn [new file with mode: 0644]
modules/parsers/gas/tests/bin/reptzero.hex [new file with mode: 0644]

index 1b073ec6e8398697e7d8878ca94ee7a95547e33f..81cec4ee9882246e42ae3e592e341d3ea626b320 100644 (file)
@@ -106,8 +106,8 @@ static void gas_parser_directive
 %token LINE
 %token DIR_2BYTE DIR_4BYTE DIR_ALIGN DIR_ASCII DIR_ASCIZ DIR_BALIGN
 %token DIR_BSS DIR_BYTE DIR_COMM DIR_DATA DIR_DOUBLE DIR_ENDR DIR_EXTERN
-%token DIR_EQU DIR_FILE DIR_FLOAT DIR_GLOBAL DIR_IDENT DIR_INT DIR_LOC
-%token DIR_LCOMM DIR_OCTA DIR_ORG DIR_P2ALIGN DIR_REPT DIR_SECTION
+%token DIR_EQU DIR_FILE DIR_FLOAT DIR_GLOBAL DIR_IDENT DIR_INT DIR_LINE
+%token DIR_LOC DIR_LCOMM DIR_OCTA DIR_ORG DIR_P2ALIGN DIR_REPT DIR_SECTION
 %token DIR_SHORT DIR_SIZE DIR_SKIP DIR_SLEB128 DIR_STRING DIR_TEXT
 %token DIR_TFLOAT DIR_TYPE DIR_QUAD DIR_ULEB128 DIR_VALUE DIR_WEAK DIR_WORD
 %token DIR_ZERO
@@ -169,6 +169,44 @@ lineexp: instr
        $$ = $3;
        define_label(parser_gas, $1, 0);
     }
+    /* Line directive */
+    | DIR_LINE INTNUM {
+       $$ = (yasm_bytecode *)NULL;
+       if (yasm_intnum_sign($2) < 0)
+           yasm__error(cur_line, N_("line number is negative"));
+       else
+           yasm_linemap_set(parser_gas->linemap, NULL,
+                            yasm_intnum_get_uint($2), 1);
+    }
+    /* Macro directives */
+    | DIR_REPT expr {
+       yasm_intnum *intn = yasm_expr_get_intnum(&$2, NULL);
+
+       $$ = (yasm_bytecode *)NULL;
+       if (!intn) {
+           yasm__error(cur_line, N_("rept expression not absolute"));
+       } else if (yasm_intnum_sign(intn) < 0) {
+           yasm__error(cur_line, N_("rept expression is negative"));
+       } else {
+           gas_rept *rept = yasm_xmalloc(sizeof(gas_rept));
+           STAILQ_INIT(&rept->lines);
+           rept->startline = cur_line;
+           rept->numrept = yasm_intnum_get_uint(intn);
+           rept->numdone = 0;
+           rept->line = NULL;
+           rept->linepos = 0;
+           rept->ended = 0;
+           rept->oldbuf = NULL;
+           rept->oldbuflen = 0;
+           rept->oldbufpos = 0;
+           parser_gas->rept = rept;
+       }
+    }
+    | DIR_ENDR {
+       $$ = (yasm_bytecode *)NULL;
+       /* Shouldn't ever get here unless we didn't get a DIR_REPT first */
+       yasm__error(cur_line, N_("endr without matching rept"));
+    }
     /* Alignment directives */
     | DIR_ALIGN dirvals2 {
        /* FIXME: Whether this is power-of-two or not depends on arch and
index 8b98fa93b2657113209fc9d35ac0a76dd448edf3..9df1cecd522ef93493a1f980eb4c4f1042882efb 100644 (file)
@@ -79,11 +79,18 @@ gas_parser_do_parse(yasm_object *object, yasm_preproc *pp, yasm_arch *a,
 
     parser_gas.code_section = !strcmp(yasm_section_get_name(def_sect), ".text");
 
+    parser_gas.rept = NULL;
+
     /* yacc debugging, needs YYDEBUG set in bison.y.in to work */
     parser_gas.debug = 1;
 
     gas_parser_parse(&parser_gas);
 
+    /* Check for ending inside a rept */
+    if (parser_gas.rept)
+       yasm__error(parser_gas.rept->startline,
+                   N_("rept without matching endr"));
+
     gas_parser_cleanup(&parser_gas);
 
     /* Free locallabel base if necessary */
index acdbe3ef96ba0aa181bd198b89add6b2600c7b6f..d17ee34aa2a35d7db34245aac87f95bf2df49afc 100644 (file)
@@ -40,6 +40,26 @@ typedef struct Scanner {
 
 #define MAX_SAVED_LINE_LEN  80
 
+typedef struct gas_rept_line {
+    STAILQ_ENTRY(gas_rept_line) link;
+    YYCTYPE *data;             /* line characters */
+    size_t len;                        /* length of data */
+} gas_rept_line;
+
+typedef struct gas_rept {
+    STAILQ_HEAD(reptlinelist, gas_rept_line) lines;    /* repeated lines */
+    unsigned long startline;   /* line number of rept directive */
+    unsigned long numrept;     /* number of repititions to generate */
+    unsigned long numdone;     /* number of repititions executed so far */
+    /*@null@*/ gas_rept_line *line;    /* next line to repeat */
+    size_t linepos;            /* position to start pulling chars from line */
+    int ended;                 /* seen endr directive yet? */
+
+    char *oldbuf;              /* saved previous fill buffer */
+    size_t oldbuflen;          /* previous fill buffer length */
+    size_t oldbufpos;          /* position in previous fill buffer */
+} gas_rept;
+
 typedef struct yasm_parser_gas {
     FILE *in;
     int debug;
@@ -72,6 +92,8 @@ typedef struct yasm_parser_gas {
     } state;
 
     int code_section;
+
+    /*@null@*/ gas_rept *rept;
 } yasm_parser_gas;
 
 /* shorter access names to commonly used parser_gas fields */
index 98db9472ec78b2f54752e85caf8d8d7f96ddffca..e284232f34379478f7c07ce3573bac929d12a102 100644 (file)
@@ -54,6 +54,80 @@ RCSID("$Id$");
 
 #define TOKLEN         (size_t)(cursor-s->tok)
 
+static size_t
+rept_input(yasm_parser_gas *parser_gas, /*@out@*/ char *buf, size_t max_size)
+{
+    gas_rept *rept = parser_gas->rept;
+    size_t numleft = max_size;
+    char *bufp = buf;
+
+    /* If numrept is 0, copy out just the line end characters */
+    if (rept->numrept == 0) {
+       /* Skip first line, which contains .line */
+       rept->line = STAILQ_NEXT(rept->line, link);
+       if (!rept->line) {
+           rept->numrept = 1;
+           rept->numdone = 1;
+       }
+       while (rept->numrept == 0 && numleft > 0) {
+           *bufp++ = rept->line->data[rept->line->len-1];
+           rept->line = STAILQ_NEXT(rept->line, link);
+           if (!rept->line) {
+               rept->numrept = 1;
+               rept->numdone = 1;
+           }
+       }
+    }
+
+    /* Copy out the previous fill buffer until we're *really* done */
+    if (rept->numdone == rept->numrept) {
+       size_t numcopy = rept->oldbuflen - rept->oldbufpos;
+       if (numcopy > numleft)
+           numcopy = numleft;
+       memcpy(bufp, &rept->oldbuf[rept->oldbufpos], numcopy);
+       numleft -= numcopy;
+       bufp += numcopy;
+       rept->oldbufpos += numcopy;
+
+       if (rept->oldbufpos == rept->oldbuflen) {
+           /* Delete lines, then delete rept and clear rept state */
+           gas_rept_line *cur, *next;
+           cur = STAILQ_FIRST(&rept->lines);
+           while (cur) {
+               next = STAILQ_NEXT(cur, link);
+               yasm_xfree(cur->data);
+               yasm_xfree(cur);
+               cur = next;
+           }
+           yasm_xfree(rept->oldbuf);
+           yasm_xfree(rept);
+           parser_gas->rept = NULL;
+       }
+    }
+
+    while (numleft > 0 && rept->numdone < rept->numrept) {
+       /* Copy from line data to buf */
+       size_t numcopy = rept->line->len - rept->linepos;
+       if (numcopy > numleft)
+           numcopy = numleft;
+       memcpy(bufp, &rept->line->data[rept->linepos], numcopy);
+       numleft -= numcopy;
+       bufp += numcopy;
+       rept->linepos += numcopy;
+
+       /* Update locations if needed */
+       if (rept->linepos == rept->line->len) {
+           rept->line = STAILQ_NEXT(rept->line, link);
+           rept->linepos = 0;
+       }
+       if (rept->line == NULL) {
+           rept->numdone++;
+           rept->line = STAILQ_FIRST(&rept->lines);
+       }
+    }
+
+    return (max_size-numleft);
+}
 
 static YYCTYPE *
 fill(yasm_parser_gas *parser_gas, YYCTYPE *cursor)
@@ -85,7 +159,10 @@ fill(yasm_parser_gas *parser_gas, YYCTYPE *cursor)
                yasm_xfree(s->bot);
            s->bot = buf;
        }
-       if((cnt = yasm_preproc_input(parser_gas->preproc, s->lim,
+       if (parser_gas->rept && parser_gas->rept->ended) {
+           /* Pull from rept lines instead of preproc */
+           cnt = rept_input(parser_gas, s->lim, BSIZE);
+       } else if((cnt = yasm_preproc_input(parser_gas->preproc, s->lim,
                                     BSIZE)) == 0) {
            s->eof = &s->lim[cnt]; *s->eof++ = '\n';
        }
@@ -168,15 +245,22 @@ strbuf_append(size_t count, YYCTYPE *cursor, Scanner *s, unsigned long line,
 int
 gas_parser_lex(YYSTYPE *lvalp, yasm_parser_gas *parser_gas)
 {
+    /*@null@*/ gas_rept *rept = parser_gas->rept;
     Scanner *s = &parser_gas->s;
     YYCTYPE *cursor = s->cur;
     size_t count;
     YYCTYPE savech;
+    int linestart;
+    gas_rept_line *new_line;
 
     /* Catch EOF */
     if (s->eof && cursor == s->eof)
        return 0;
 
+    /* Handle rept */
+    if (rept && !rept->ended)
+       goto rept_directive;
+
     /* Jump to proper "exclusive" states */
     switch (parser_gas->state) {
        case SECTION_DIRECTIVE:
@@ -276,6 +360,7 @@ scan:
        '.ident'        { RETURN(DIR_IDENT); }
        '.int'          { RETURN(DIR_INT); }
        '.lcomm'        { RETURN(DIR_LCOMM); }
+       '.line'         { RETURN(DIR_LINE); }
        '.loc'          { RETURN(DIR_LOC); }
        '.long'         { RETURN(DIR_INT); }
        '.octa'         { RETURN(DIR_OCTA); }
@@ -504,4 +589,104 @@ stringconst_scan:
            goto stringconst_scan;
        }
     */
+
+rept_directive:
+    strbuf = yasm_xmalloc(STRBUF_ALLOC_SIZE);
+    strbuf_size = STRBUF_ALLOC_SIZE;
+    count = 0;
+    linestart = 1;
+
+
+rept_scan:
+    SCANINIT();
+
+    /*!re2c
+       [\n;]   {
+           /* Line ending, save in lines */
+           new_line = yasm_xmalloc(sizeof(gas_rept_line));
+           if (cursor == s->eof) {
+               yasm_xfree(strbuf);
+               return 0;
+           }
+           strbuf_append(count++, cursor, s, cur_line, s->tok[0]);
+           new_line->data = strbuf;
+           new_line->len = count;
+           STAILQ_INSERT_TAIL(&rept->lines, new_line, link);
+           /* Allocate new strbuf */
+           strbuf = yasm_xmalloc(STRBUF_ALLOC_SIZE);
+           strbuf_size = STRBUF_ALLOC_SIZE;
+           count = 0;
+           /* Mark start of line */
+           linestart = 1;
+           goto rept_scan;
+       }
+       '.rept' {
+           int i;
+           if (linestart) {
+               /* We don't support nested right now, error */
+               yasm__error(cur_line, N_("nested rept not supported"));
+           }
+           for (i=0; i<6; i++)
+               strbuf_append(count++, cursor, s, cur_line, s->tok[i]);
+           goto rept_scan;
+       }
+       '.endr' {
+           if (linestart) {
+               /* We're done, kick off the main lexer */
+               rept->line = STAILQ_FIRST(&rept->lines);
+               if (!rept->line) {
+                   /* Didn't get any intervening data?  Empty repeat, so
+                    * don't even bother.
+                    */
+                   yasm_xfree(strbuf);
+                   yasm_xfree(rept);
+                   parser_gas->rept = NULL;
+               } else {
+                   rept->ended = 1;
+
+                   /* Add .line as first line to get line numbers correct */
+                   new_line = yasm_xmalloc(sizeof(gas_rept_line));
+                   new_line->data = yasm_xmalloc(40);
+                   sprintf(new_line->data, ".line %lu;", rept->startline+1);
+                   new_line->len = strlen(new_line->data);
+                   STAILQ_INSERT_HEAD(&rept->lines, new_line, link);
+
+                   /* Save previous fill buffer */
+                   rept->oldbuf = parser_gas->s.bot;
+                   rept->oldbuflen = s->lim - s->bot;
+                   rept->oldbufpos = cursor - s->bot;
+
+                   /* Reset fill */
+                   s->bot = NULL;
+                   s->tok = NULL;
+                   s->ptr = NULL;
+                   s->cur = NULL;
+                   s->pos = NULL;
+                   s->lim = NULL;
+                   s->top = NULL;
+                   s->eof = NULL;
+                   cursor = NULL;
+                   YYFILL(1);
+               }
+
+               goto scan;
+           } else {
+               int i;
+               for (i=0; i<6; i++)
+                   strbuf_append(count++, cursor, s, cur_line, s->tok[i]);
+               goto rept_scan;
+           }
+       }
+
+       any     {
+           if (cursor == s->eof) {
+               yasm_xfree(strbuf);
+               return 0;
+           }
+           strbuf_append(count++, cursor, s, cur_line, s->tok[0]);
+           linestart = 0;
+           goto rept_scan;
+       }
+    */
+
 }
index 484d60eb18a3afcefa69b575a062ff7718f7b880..7134b34a5cd0f414bac67836356c61c58657efdd 100644 (file)
@@ -33,3 +33,5 @@ EXTRA_DIST += modules/parsers/gas/tests/varinsn.asm
 EXTRA_DIST += modules/parsers/gas/tests/varinsn.errwarn
 EXTRA_DIST += modules/parsers/gas/tests/varinsn.hex
 
+EXTRA_DIST += modules/parsers/gas/tests/bin/Makefile.inc
+include modules/parsers/gas/tests/bin/Makefile.inc
diff --git a/modules/parsers/gas/tests/bin/Makefile.inc b/modules/parsers/gas/tests/bin/Makefile.inc
new file mode 100644 (file)
index 0000000..7acd93f
--- /dev/null
@@ -0,0 +1,25 @@
+# $Id$
+
+TESTS += modules/parsers/gas/tests/bin/gas_bin_test.sh
+
+EXTRA_DIST += modules/parsers/gas/tests/bin/gas_bin_test.sh
+EXTRA_DIST += modules/parsers/gas/tests/bin/rept-err.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/rept-err.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptempty.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptempty.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptempty.hex
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptlong.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptlong.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptlong.hex
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptnested-err.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptnested-err.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptsimple.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptsimple.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptsimple.hex
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptwarn.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptwarn.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptwarn.hex
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptzero.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptzero.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptzero.hex
+
diff --git a/modules/parsers/gas/tests/bin/gas_bin_test.sh b/modules/parsers/gas/tests/bin/gas_bin_test.sh
new file mode 100755 (executable)
index 0000000..f0c83e9
--- /dev/null
@@ -0,0 +1,4 @@
+#! /bin/sh
+# $Id$
+${srcdir}/out_test.sh gas_bin_test modules/parsers/gas/tests/bin "gas-compat parser bin output" "-f bin -p gas" ""
+exit $?
diff --git a/modules/parsers/gas/tests/bin/rept-err.asm b/modules/parsers/gas/tests/bin/rept-err.asm
new file mode 100644 (file)
index 0000000..143e904
--- /dev/null
@@ -0,0 +1,2 @@
+.rept 6
+.byte 0
diff --git a/modules/parsers/gas/tests/bin/rept-err.errwarn b/modules/parsers/gas/tests/bin/rept-err.errwarn
new file mode 100644 (file)
index 0000000..050398c
--- /dev/null
@@ -0,0 +1 @@
+-:1: rept without matching endr
diff --git a/modules/parsers/gas/tests/bin/reptempty.asm b/modules/parsers/gas/tests/bin/reptempty.asm
new file mode 100644 (file)
index 0000000..4560083
--- /dev/null
@@ -0,0 +1,4 @@
+.byte 1
+.rept 2
+.endr
+.byte 2
diff --git a/modules/parsers/gas/tests/bin/reptempty.errwarn b/modules/parsers/gas/tests/bin/reptempty.errwarn
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/modules/parsers/gas/tests/bin/reptempty.hex b/modules/parsers/gas/tests/bin/reptempty.hex
new file mode 100644 (file)
index 0000000..2633481
--- /dev/null
@@ -0,0 +1,2 @@
+01 
+02 
diff --git a/modules/parsers/gas/tests/bin/reptlong.asm b/modules/parsers/gas/tests/bin/reptlong.asm
new file mode 100644 (file)
index 0000000..cc5e992
--- /dev/null
@@ -0,0 +1,156 @@
+.byte 1
+.rept 5
+.byte 0
+.endr
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+.byte 2
diff --git a/modules/parsers/gas/tests/bin/reptlong.errwarn b/modules/parsers/gas/tests/bin/reptlong.errwarn
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/modules/parsers/gas/tests/bin/reptlong.hex b/modules/parsers/gas/tests/bin/reptlong.hex
new file mode 100644 (file)
index 0000000..627e3d2
--- /dev/null
@@ -0,0 +1,7 @@
+01 
+00 
+00 
+00 
+00 
+00 
+02 
diff --git a/modules/parsers/gas/tests/bin/reptnested-err.asm b/modules/parsers/gas/tests/bin/reptnested-err.asm
new file mode 100644 (file)
index 0000000..bb85988
--- /dev/null
@@ -0,0 +1,7 @@
+.rept 6
+.byte 1
+.rept 2
+.byte 2
+.endr
+.byte 3
+.endr
diff --git a/modules/parsers/gas/tests/bin/reptnested-err.errwarn b/modules/parsers/gas/tests/bin/reptnested-err.errwarn
new file mode 100644 (file)
index 0000000..016b13e
--- /dev/null
@@ -0,0 +1,7 @@
+-:2: nested rept not supported
+-:3: rept without matching endr
+-:4: nested rept not supported
+-:4: nested rept not supported
+-:4: nested rept not supported
+-:4: nested rept not supported
+-:4: nested rept not supported
diff --git a/modules/parsers/gas/tests/bin/reptsimple.asm b/modules/parsers/gas/tests/bin/reptsimple.asm
new file mode 100644 (file)
index 0000000..cb7045a
--- /dev/null
@@ -0,0 +1,5 @@
+.byte 1
+.rept 5
+.byte 0
+.endr
+.byte 2
diff --git a/modules/parsers/gas/tests/bin/reptsimple.errwarn b/modules/parsers/gas/tests/bin/reptsimple.errwarn
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/modules/parsers/gas/tests/bin/reptsimple.hex b/modules/parsers/gas/tests/bin/reptsimple.hex
new file mode 100644 (file)
index 0000000..627e3d2
--- /dev/null
@@ -0,0 +1,7 @@
+01 
+00 
+00 
+00 
+00 
+00 
+02 
diff --git a/modules/parsers/gas/tests/bin/reptwarn.asm b/modules/parsers/gas/tests/bin/reptwarn.asm
new file mode 100644 (file)
index 0000000..826bd81
--- /dev/null
@@ -0,0 +1,10 @@
+.byte 1000
+.rept 3
+.byte 1000
+
+
+.byte 1000
+.endr
+
+.byte 1000
+.byte 1000
diff --git a/modules/parsers/gas/tests/bin/reptwarn.errwarn b/modules/parsers/gas/tests/bin/reptwarn.errwarn
new file mode 100644 (file)
index 0000000..bd1611d
--- /dev/null
@@ -0,0 +1,9 @@
+-:1: warning: value does not fit in 8 bit field
+-:3: warning: value does not fit in 8 bit field
+-:6: warning: value does not fit in 8 bit field
+-:3: warning: value does not fit in 8 bit field
+-:6: warning: value does not fit in 8 bit field
+-:3: warning: value does not fit in 8 bit field
+-:6: warning: value does not fit in 8 bit field
+-:9: warning: value does not fit in 8 bit field
+-:10: warning: value does not fit in 8 bit field
diff --git a/modules/parsers/gas/tests/bin/reptwarn.hex b/modules/parsers/gas/tests/bin/reptwarn.hex
new file mode 100644 (file)
index 0000000..91ee381
--- /dev/null
@@ -0,0 +1,9 @@
+e8 
+e8 
+e8 
+e8 
+e8 
+e8 
+e8 
+e8 
+e8 
diff --git a/modules/parsers/gas/tests/bin/reptzero.asm b/modules/parsers/gas/tests/bin/reptzero.asm
new file mode 100644 (file)
index 0000000..02749d2
--- /dev/null
@@ -0,0 +1,6 @@
+.byte 1
+.rept 0
+.byte 2
+.byte 3
+.endr
+.byte 4
diff --git a/modules/parsers/gas/tests/bin/reptzero.errwarn b/modules/parsers/gas/tests/bin/reptzero.errwarn
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/modules/parsers/gas/tests/bin/reptzero.hex b/modules/parsers/gas/tests/bin/reptzero.hex
new file mode 100644 (file)
index 0000000..5b7f2e8
--- /dev/null
@@ -0,0 +1,2 @@
+01 
+04