diff --git a/rewrite-docker/src/main/antlr/DockerLexer.g4 b/rewrite-docker/src/main/antlr/DockerLexer.g4 index df845b0572..79bdbf183d 100644 --- a/rewrite-docker/src/main/antlr/DockerLexer.g4 +++ b/rewrite-docker/src/main/antlr/DockerLexer.g4 @@ -17,6 +17,31 @@ import java.util.Queue;} private boolean atLineStart = true; // Track if we're after HEALTHCHECK to recognize CMD/NONE as keywords private boolean afterHealthcheck = false; + // Track if we're in the flag section of a COPY or ADD, where --from carries an image reference + private boolean copyAddFlags = false; + + // Every flag that is scoped to one logical line is cleared here, so that a mode of its own does + // not have to remember which of them the newline it matches instead of NEWLINE should reset + private void resetLine() { + atLineStart = true; + afterHealthcheck = false; + copyAddFlags = false; + } + + // Whether what follows the '--' that both flag rules begin with is the '--from=' of a COPY or ADD + private boolean atFromFlag() { + if (!copyAddFlags) { + return false; + } + String fromFlag = "from="; + for (int i = 0; i < fromFlag.length(); i++) { + int c = _input.LA(i + 1); + if (c == -1 || Character.toLowerCase(c) != fromFlag.charAt(i)) { + return false; + } + } + return true; + } } options { @@ -42,8 +67,8 @@ NONE : 'NONE' { if (!afterHealthcheck) setType(UNQUOTED_TEXT); atLin LABEL : 'LABEL' { if (!atLineStart) setType(UNQUOTED_TEXT); atLineStart = false; }; EXPOSE : 'EXPOSE' { if (!atLineStart) setType(UNQUOTED_TEXT); atLineStart = false; }; ENV : 'ENV' { if (!atLineStart) setType(UNQUOTED_TEXT); atLineStart = false; }; -ADD : 'ADD' { if (!atLineStart) setType(UNQUOTED_TEXT); atLineStart = false; }; -COPY : 'COPY' { if (!atLineStart) setType(UNQUOTED_TEXT); atLineStart = false; }; +ADD : 'ADD' { if (!atLineStart) setType(UNQUOTED_TEXT); else copyAddFlags = true; atLineStart = false; }; +COPY : 'COPY' { if (!atLineStart) setType(UNQUOTED_TEXT); else copyAddFlags = true; atLineStart = false; }; ENTRYPOINT : 'ENTRYPOINT' { if (!atLineStart) setType(UNQUOTED_TEXT); atLineStart = false; }; VOLUME : 'VOLUME' { if (!atLineStart) setType(UNQUOTED_TEXT); atLineStart = false; }; USER : 'USER' { if (!atLineStart) setType(UNQUOTED_TEXT); else pushMode(USER_SPEC); atLineStart = false; }; @@ -86,9 +111,16 @@ EQUALS : '=' { if (!afterHealthcheck) atLineStart = false; }; // Captures the entire flag as a single token, stopping at whitespace // This avoids the greedy flagValue+ parsing issue while keeping shell commands working // Flag values can contain quoted strings (which may include spaces) -FLAG : FLAG_TOKEN { if (!afterHealthcheck) atLineStart = false; }; +// The predicate excludes this rule where FROM_FLAG applies. Lexing is maximal munch, so without it +// this longer token would always win and the image reference of a --from would stay unsplit. It sits +// after the '--' because a predicate reachable without consuming anything stops the lexer caching the +// start state of the mode that holds it, which costs every token in that mode a closure computation. +FLAG : '--' {!atFromFlag()}? FLAG_BODY { if (!afterHealthcheck) atLineStart = false; }; -fragment FLAG_TOKEN : '--' [a-z] [a-z0-9_-]* ('=' FLAG_VALUE_PART+)?; +// The --from of a COPY or ADD names an image, so its value is lexed as an image reference +FROM_FLAG : '--' {atFromFlag()}? 'from=' { atLineStart = false; } -> pushMode(FLAG_IMAGE_REF); + +fragment FLAG_BODY : [a-z] [a-z0-9_-]* ('=' FLAG_VALUE_PART+)?; fragment FLAG_VALUE_PART : '"' ( '\\' ~[\r\n] | ~["\\\r\n] )* '"' // Double-quoted string (with escapes) | '\'' ~['\r\n]* '\'' // Single-quoted string (literal) @@ -164,7 +196,7 @@ UNQUOTED_TEXT | '<' ~[< \t\r\n\\"'$[\]=] ( UNQUOTED_CHAR | ESCAPED_CHAR )* // Single < followed by non-< | '<' // Just a < by itself | ESCAPED_CHAR ( UNQUOTED_CHAR | ESCAPED_CHAR )* // Start with escaped char (e.g., \; in find -exec) - ) { if (!afterHealthcheck) atLineStart = false; } + ) { if (!afterHealthcheck) atLineStart = false; copyAddFlags = false; } ; // Whitespace - HIDDEN in main mode @@ -173,7 +205,7 @@ WS : WS_CHAR+ -> channel(HIDDEN); fragment WS_CHAR : [ \t]; // Newlines - HIDDEN in main mode, reset state for next line -NEWLINE : NEWLINE_CHAR+ { atLineStart = true; afterHealthcheck = false; } -> channel(HIDDEN); +NEWLINE : NEWLINE_CHAR+ { resetLine(); } -> channel(HIDDEN); fragment NEWLINE_CHAR : [\r\n]; @@ -188,7 +220,7 @@ mode IMAGE_REF; IR_WS : WS_CHAR+ -> type(WS), channel(HIDDEN); IR_LINE_CONTINUATION : LINE_CONT -> type(LINE_CONTINUATION), channel(HIDDEN); IR_COMMENT : '#' ~[\r\n]* -> type(COMMENT), channel(HIDDEN); -IR_NEWLINE : NEWLINE_CHAR+ { atLineStart = true; afterHealthcheck = false; } -> type(NEWLINE), channel(HIDDEN), popMode; +IR_NEWLINE : NEWLINE_CHAR+ { resetLine(); } -> type(NEWLINE), channel(HIDDEN), popMode; COLON : ':'; AT : '@'; @@ -196,7 +228,7 @@ AT : '@'; // AS ends the reference; the stage name that follows it is ordinary text AS : 'AS' -> popMode; -IR_FLAG : FLAG_TOKEN -> type(FLAG); +IR_FLAG : '--' FLAG_BODY -> type(FLAG); IR_DOUBLE_QUOTED_STRING : DQ_STRING -> type(DOUBLE_QUOTED_STRING); IR_SINGLE_QUOTED_STRING : SQ_STRING -> type(SINGLE_QUOTED_STRING); IR_ENV_VAR : VAR_REF -> type(ENV_VAR); @@ -205,11 +237,40 @@ IR_DOLLAR : '$' -> type(DOLLAR); // Text of one part of the reference. A colon that a '/' follows belongs to a registry port rather // than to a tag ('host:5000/img:tag'), so it stays inside the token. -IR_UNQUOTED_TEXT : ( IR_TEXT_CHAR | ESCAPED_CHAR | IR_PORT_COLON )+ -> type(UNQUOTED_TEXT); +IR_UNQUOTED_TEXT : IR_TEXT -> type(UNQUOTED_TEXT); +// Shared with FLAG_IMAGE_REF, which reads the same reference. ESCAPE_SEQUENCE rather than +// ESCAPED_CHAR because it stops before a newline, which lexing longest-match-first would otherwise +// take into the token and so hide the line continuation that ends the reference. +fragment IR_TEXT : ( IR_TEXT_CHAR | ESCAPE_SEQUENCE | IR_PORT_COLON )+; fragment IR_TEXT_CHAR : ~[:@ \t\r\n\\"'$]; fragment IR_PORT_COLON : ':' ( IR_TEXT_CHAR | ':' )* '/'; +// ---------------------------------------------------------------------------------------------- +// FLAG_IMAGE_REF mode - the image reference carried by the --from flag of a COPY or ADD +// As IMAGE_REF, except that the reference ends at the whitespace before the paths that follow it +// rather than at the end of the line, and AS is not a keyword because no stage alias can appear here. +// ---------------------------------------------------------------------------------------------- +mode FLAG_IMAGE_REF; + +// The end of the reference is a token of its own rather than hidden whitespace: popping a mode does +// not bound a parser rule, so without a token to name the `imageName` of `COPY --from=build --link .` +// would carry on into the flag that follows it. +FLAG_END : ( WS_CHAR+ | LINE_CONT ) -> popMode; + +FIR_NEWLINE : NEWLINE_CHAR+ { resetLine(); } -> type(NEWLINE), channel(HIDDEN), popMode; + +FIR_COLON : ':' -> type(COLON); +FIR_AT : '@' -> type(AT); + +FIR_DOUBLE_QUOTED_STRING : DQ_STRING -> type(DOUBLE_QUOTED_STRING); +FIR_SINGLE_QUOTED_STRING : SQ_STRING -> type(SINGLE_QUOTED_STRING); +FIR_ENV_VAR : VAR_REF -> type(ENV_VAR); +FIR_SPECIAL_VAR : SPECIAL_VAR_REF -> type(SPECIAL_VAR); +FIR_DOLLAR : '$' -> type(DOLLAR); + +FIR_UNQUOTED_TEXT : IR_TEXT -> type(UNQUOTED_TEXT); + // ---------------------------------------------------------------------------------------------- // USER_SPEC mode - the user:group of a USER instruction // Entered from the USER keyword and left at the end of the line. As IMAGE_REF, minus the '@' and the @@ -221,7 +282,7 @@ mode USER_SPEC; US_WS : WS_CHAR+ -> type(WS), channel(HIDDEN); US_LINE_CONTINUATION : LINE_CONT -> type(LINE_CONTINUATION), channel(HIDDEN); US_COMMENT : '#' ~[\r\n]* -> type(COMMENT), channel(HIDDEN); -US_NEWLINE : NEWLINE_CHAR+ { atLineStart = true; afterHealthcheck = false; } -> type(NEWLINE), channel(HIDDEN), popMode; +US_NEWLINE : NEWLINE_CHAR+ { resetLine(); } -> type(NEWLINE), channel(HIDDEN), popMode; US_COLON : ':' -> type(COLON); diff --git a/rewrite-docker/src/main/antlr/DockerParser.g4 b/rewrite-docker/src/main/antlr/DockerParser.g4 index 4335eb77dd..07ac29ad6f 100644 --- a/rewrite-docker/src/main/antlr/DockerParser.g4 +++ b/rewrite-docker/src/main/antlr/DockerParser.g4 @@ -149,7 +149,7 @@ maintainerInstruction // Common elements flags - : flag+ + : ( flag | fromFlag )+ ; // Flag token captures entire flag: --name or --name=value @@ -158,6 +158,13 @@ flag : FLAG ; +// The --from of a COPY or ADD holds the same name:tag@digest reference a FROM does, split by the +// same rule. FLAG_END is the whitespace that ends the reference, without which this rule would +// carry on into the flags and paths that follow it. +fromFlag + : FROM_FLAG imageReference? FLAG_END? + ; + execForm : jsonArray ; diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/DockerParserVisitor.java b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/DockerParserVisitor.java index ac304e1054..64725070eb 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/DockerParserVisitor.java +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/DockerParserVisitor.java @@ -133,24 +133,35 @@ public Docker visitFromInstruction(DockerParser.FromInstructionContext ctx) { List flags = ctx.flags() != null ? convertFlags(ctx.flags()) : null; - DockerParser.ImageReferenceContext reference = ctx.imageReference(); - TerminalNode colon = reference.COLON(); - TerminalNode at = reference.AT(); - Docker.Argument imageName = separatedPart(reference.imageName(), colon != null ? colon : at); + Docker.@Nullable Argument[] reference = imageReferenceParts(ctx.imageReference()); + + Docker.From.As as = ctx.AS() != null ? visitFromAs(ctx) : null; + + return new Docker.From(randomId(), prefix, Markers.EMPTY, fromKeyword, flags, reference[0], reference[1], reference[2], as); + } + + /// The `{imageName, tag, digest}` a reference splits into, or an empty name where the reference is + /// absent, as it is in the `--from=` of a `COPY` that names nothing. Shared by `FROM` and by the + /// `--from` of a `COPY`/`ADD`, which the grammar splits by the same `imageReference` rule. + private Docker.@Nullable Argument[] imageReferenceParts(DockerParser.@Nullable ImageReferenceContext ctx) { + if (ctx == null) { + return new Docker.@Nullable Argument[]{ + new Docker.Argument(randomId(), Space.EMPTY, Markers.EMPTY, emptyList()), null, null}; + } + TerminalNode colon = ctx.COLON(); + TerminalNode at = ctx.AT(); + Docker.Argument imageName = separatedPart(ctx.imageName(), colon != null ? colon : at); Docker.Argument tag = null; if (colon != null) { skip(colon.getSymbol()); - tag = separatedPart(reference.tag(), at); + tag = separatedPart(ctx.tag(), at); } Docker.Argument digest = null; if (at != null) { skip(at.getSymbol()); - digest = separatedPart(reference.digest(), null); + digest = separatedPart(ctx.digest(), null); } - - Docker.From.As as = ctx.AS() != null ? visitFromAs(ctx) : null; - - return new Docker.From(randomId(), prefix, Markers.EMPTY, fromKeyword, flags, imageName, tag, digest, as); + return new Docker.@Nullable Argument[]{imageName, tag, digest}; } private Docker.From.As visitFromAs(DockerParser.FromInstructionContext ctx) { @@ -934,12 +945,31 @@ private Docker.CommandForm visitCommandFormForEntrypoint(DockerParser.Entrypoint private List convertFlags(DockerParser.FlagsContext ctx) { List flags = new ArrayList<>(); - for (DockerParser.FlagContext flagCtx : ctx.flag()) { - flags.add(parseFlag(flagCtx.FLAG().getSymbol())); + for (ParseTree child : ctx.children) { + if (child instanceof DockerParser.FlagContext) { + flags.add(parseFlag(((DockerParser.FlagContext) child).FLAG().getSymbol())); + } else if (child instanceof DockerParser.FromFlagContext) { + flags.add(parseFromFlag((DockerParser.FromFlagContext) child)); + } } return flags; } + /// The `--from` of a `COPY` or `ADD`, whose value the `FLAG_IMAGE_REF` lexer mode splits by the + /// same rule that splits the reference of a `FROM`. A flag holds one value, so the parts are + /// flattened back into it with their separators, the form [ImageReferences] reads them from. + private Docker.Flag parseFromFlag(DockerParser.FromFlagContext ctx) { + Token token = ctx.FROM_FLAG().getSymbol(); + Space flagPrefix = prefix(token); + String tokenText = token.getText(); + skip(token); + + String flagName = tokenText.substring(2, tokenText.indexOf('=')); + Docker.Argument value = new Docker.Argument(randomId(), Space.EMPTY, Markers.EMPTY, + ImageReferences.contents(imageReferenceParts(ctx.imageReference()))); + return new Docker.Flag(randomId(), flagPrefix, Markers.EMPTY, flagName, value); + } + /** * Parse a FLAG token into a Flag AST node. * FLAG token format: --name or --name=value diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/ImageReferences.java b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/ImageReferences.java index c55d2db91b..1c7e61d341 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/ImageReferences.java +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/ImageReferences.java @@ -26,11 +26,14 @@ import static org.openrewrite.Tree.randomId; /** - * Splits an image reference (the {@code name:tag@digest} form) into its component - * {@link Docker.Argument}s. Used where the reference reaches the trait layer as text rather than as - * a parse tree: the value of the {@code --from} flag of {@code COPY}/{@code ADD}, which the lexer - * keeps as one token, and a reference handed in by a recipe. A {@code FROM} instruction is split by - * the grammar instead, in the {@code IMAGE_REF} lexer mode. + * Translates between the two forms an image reference takes: the {@code {imageName, tag, digest}} + * parts a caller works in, and the flat contents of one {@link Docker.Argument}, where the {@code :} + * and {@code @} separating those parts are contents of their own. + *

+ * That is the form the {@code IMAGE_REF} and {@code FLAG_IMAGE_REF} lexer modes leave a parsed + * reference in, so a reference a recipe supplies as text is modelled here the same way a parsed one + * is, and reading the parts back needs no knowledge of which colon separates a tag: a colon inside a + * quoted name, a variable reference or a registry port is never a content of its own. */ public final class ImageReferences { @@ -38,112 +41,110 @@ private ImageReferences() { } /** - * Splits an image reference a recipe supplied as text, such as {@code "nginx:1.25"}, into - * {@code {imageName, tag, digest}}. The parts are unquoted literals, so that a colon in the - * text separates the tag rather than being kept as part of a quoted name. + * Splits a reference a recipe supplied as text, such as {@code "nginx:1.25"}, into + * {@code {imageName, tag, digest}}. */ public static Docker.@Nullable Argument[] split(String reference, Space prefix) { - return split(ArgumentContents.of(reference, null), prefix); + return split(contents(reference), prefix); } /** - * Splits image reference contents into {@code {imageName, tag, digest}}, with {@code tag} and - * {@code digest} null when absent. A single quoted string is kept intact as the image name. + * Groups contents into {@code {imageName, tag, digest}}, with {@code tag} and {@code digest} + * null where the reference does not carry them, and empty where it ends in a dangling separator. */ public static Docker.@Nullable Argument[] split(List contents, Space prefix) { - if (contents.size() == 1 && contents.get(0) instanceof Docker.Literal && ((Docker.Literal) contents.get(0)).isQuoted()) { - Docker.Argument imageName = new Docker.Argument(randomId(), prefix, Markers.EMPTY, contents); - return new Docker.@Nullable Argument[]{imageName, null, null}; - } - - List imageNameContents = new ArrayList<>(); - List tagContents = new ArrayList<>(); - List digestContents = new ArrayList<>(); - - boolean foundColon = false; - boolean foundAt = false; + List imageName = new ArrayList<>(); + List tag = null; + List digest = null; + List part = imageName; for (Docker.ArgumentContent content : contents) { - if (content instanceof Docker.Literal && !((Docker.Literal) content).isQuoted()) { - String text = ((Docker.Literal) content).getText(); - - int atIndex = text.indexOf('@'); - int colonIndex = tagColonIndex(text); - - if (atIndex >= 0 && !foundAt) { - foundAt = true; - String beforeAt = text.substring(0, atIndex); - String digestPart = text.substring(atIndex + 1); - - int colonInBeforeAt = tagColonIndex(beforeAt); - if (colonInBeforeAt >= 0 && !foundColon) { - foundColon = true; - String imagePart = beforeAt.substring(0, colonInBeforeAt); - String tagPart = beforeAt.substring(colonInBeforeAt + 1); - - if (!imagePart.isEmpty()) { - imageNameContents.add(new Docker.Literal(randomId(), Space.EMPTY, Markers.EMPTY, imagePart, null)); - } - if (!tagPart.isEmpty()) { - tagContents.add(new Docker.Literal(randomId(), Space.EMPTY, Markers.EMPTY, tagPart, null)); - } - } else { - if (!beforeAt.isEmpty()) { - if (foundColon) { - tagContents.add(new Docker.Literal(randomId(), Space.EMPTY, Markers.EMPTY, beforeAt, null)); - } else { - imageNameContents.add(new Docker.Literal(randomId(), Space.EMPTY, Markers.EMPTY, beforeAt, null)); - } - } - } - if (!digestPart.isEmpty()) { - digestContents.add(new Docker.Literal(randomId(), Space.EMPTY, Markers.EMPTY, digestPart, null)); - } - } else if (colonIndex >= 0 && !foundColon && !foundAt) { - foundColon = true; - String imagePart = text.substring(0, colonIndex); - String tagPart = text.substring(colonIndex + 1); - - if (!imagePart.isEmpty()) { - imageNameContents.add(new Docker.Literal(randomId(), Space.EMPTY, Markers.EMPTY, imagePart, null)); - } - if (!tagPart.isEmpty()) { - tagContents.add(new Docker.Literal(randomId(), Space.EMPTY, Markers.EMPTY, tagPart, null)); - } - } else { - if (foundAt) { - digestContents.add(content); - } else if (foundColon) { - tagContents.add(content); - } else { - imageNameContents.add(content); - } - } + if (digest == null && isSeparator(content, '@')) { + part = digest = new ArrayList<>(); + } else if (tag == null && digest == null && isSeparator(content, ':')) { + part = tag = new ArrayList<>(); } else { - if (foundAt) { - digestContents.add(content); - } else if (foundColon) { - tagContents.add(content); - } else { - imageNameContents.add(content); - } + part.add(content); } } - Docker.Argument imageName = new Docker.Argument(randomId(), prefix, Markers.EMPTY, imageNameContents); - Docker.Argument tag = tagContents.isEmpty() ? null : - new Docker.Argument(randomId(), Space.EMPTY, Markers.EMPTY, tagContents); - Docker.Argument digest = digestContents.isEmpty() ? null : - new Docker.Argument(randomId(), Space.EMPTY, Markers.EMPTY, digestContents); + return new Docker.@Nullable Argument[]{ + new Docker.Argument(randomId(), prefix, Markers.EMPTY, imageName), + tag == null ? null : new Docker.Argument(randomId(), Space.EMPTY, Markers.EMPTY, tag), + digest == null ? null : new Docker.Argument(randomId(), Space.EMPTY, Markers.EMPTY, digest)}; + } - return new Docker.@Nullable Argument[]{imageName, tag, digest}; + /** + * The contents of a reference given as text. Environment variable references are split out + * first, so a colon inside {@code ${VAR:-default}} separates nothing. + */ + public static List contents(String reference) { + List contents = new ArrayList<>(); + boolean tagged = false; + boolean digested = false; + + for (Docker.ArgumentContent content : ArgumentContents.of(reference, null)) { + if (!(content instanceof Docker.Literal)) { + contents.add(content); + continue; + } + String text = ((Docker.Literal) content).getText(); + int separator; + while (!digested && (separator = separatorIndex(text, tagged)) >= 0) { + addText(contents, text.substring(0, separator)); + digested = text.charAt(separator) == '@'; + tagged = true; + contents.add(separator(text.charAt(separator))); + text = text.substring(separator + 1); + } + addText(contents, text); + } + return contents; } /** - * The index of the colon that separates the tag, or {@code -1} when there is none. A colon - * before the last {@code /} is a registry port rather than a tag separator. + * The contents of a reference held as its parts, the inverse of {@link #split(List, Space)}. */ - private static int tagColonIndex(String text) { - return text.indexOf(':', text.lastIndexOf('/') + 1); + public static List contents(Docker.@Nullable Argument[] parts) { + List contents = new ArrayList<>(parts[0].getContents()); + if (parts[1] != null) { + contents.add(separator(':')); + contents.addAll(parts[1].getContents()); + } + if (parts[2] != null) { + contents.add(separator('@')); + contents.addAll(parts[2].getContents()); + } + return contents; + } + + /// The index of the first separator still to come, or `-1` when the text holds none. A colon + /// before the last `/` is a registry port rather than a tag separator, and one after the tag + /// belongs to the tag. + private static int separatorIndex(String text, boolean tagged) { + int at = text.indexOf('@'); + if (tagged) { + return at; + } + int colon = text.indexOf(':', text.lastIndexOf('/') + 1); + if (at >= 0 && colon >= 0) { + return Math.min(at, colon); + } + return at >= 0 ? at : colon; + } + + private static Docker.Literal separator(char separator) { + return new Docker.Literal(randomId(), Space.EMPTY, Markers.EMPTY, String.valueOf(separator), null); + } + + private static boolean isSeparator(Docker.ArgumentContent content, char separator) { + return content instanceof Docker.Literal && !((Docker.Literal) content).isQuoted() && + String.valueOf(separator).equals(((Docker.Literal) content).getText()); + } + + private static void addText(List contents, String text) { + if (!text.isEmpty()) { + contents.add(new Docker.Literal(randomId(), Space.EMPTY, Markers.EMPTY, text, null)); + } } } diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerLexer.interp b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerLexer.interp index 9a41da8cce..3715d45bee 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerLexer.interp +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerLexer.interp @@ -28,6 +28,7 @@ null ',' '=' null +null '--' null null @@ -40,13 +41,14 @@ null null null null -'@' +null 'AS' null null null null null +null '\n' token symbolic names: @@ -79,6 +81,7 @@ RBRACKET COMMA EQUALS FLAG +FROM_FLAG DASH_DASH DOUBLE_QUOTED_STRING SINGLE_QUOTED_STRING @@ -93,6 +96,7 @@ NEWLINE COLON AT AS +FLAG_END HP_LINE_CONTINUATION HP_WS HP_COMMENT @@ -130,7 +134,8 @@ RBRACKET COMMA EQUALS FLAG -FLAG_TOKEN +FROM_FLAG +FLAG_BODY FLAG_VALUE_PART DASH_DASH UNQUOTED_CHAR @@ -169,8 +174,19 @@ IR_ENV_VAR IR_SPECIAL_VAR IR_DOLLAR IR_UNQUOTED_TEXT +IR_TEXT IR_TEXT_CHAR IR_PORT_COLON +FLAG_END +FIR_NEWLINE +FIR_COLON +FIR_AT +FIR_DOUBLE_QUOTED_STRING +FIR_SINGLE_QUOTED_STRING +FIR_ENV_VAR +FIR_SPECIAL_VAR +FIR_DOLLAR +FIR_UNQUOTED_TEXT US_WS US_LINE_CONTINUATION US_COMMENT @@ -200,9 +216,10 @@ HIDDEN mode names: DEFAULT_MODE IMAGE_REF +FLAG_IMAGE_REF USER_SPEC HEREDOC_PREAMBLE HEREDOC atn: -[4, 0, 48, 929, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 1, 0, 1, 0, 5, 0, 190, 8, 0, 10, 0, 12, 0, 193, 9, 0, 1, 0, 4, 0, 196, 8, 0, 11, 0, 12, 0, 197, 1, 0, 5, 0, 201, 8, 0, 10, 0, 12, 0, 204, 9, 0, 1, 0, 1, 0, 5, 0, 208, 8, 0, 10, 0, 12, 0, 211, 9, 0, 1, 0, 5, 0, 214, 8, 0, 10, 0, 12, 0, 217, 9, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 5, 1, 224, 8, 1, 10, 1, 12, 1, 227, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 400, 8, 21, 1, 21, 1, 21, 5, 21, 404, 8, 21, 10, 21, 12, 21, 407, 9, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 5, 23, 419, 8, 23, 10, 23, 12, 23, 422, 9, 23, 1, 23, 3, 23, 425, 8, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 449, 8, 29, 10, 29, 12, 29, 452, 9, 29, 1, 29, 1, 29, 4, 29, 456, 8, 29, 11, 29, 12, 29, 457, 3, 29, 460, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 466, 8, 30, 10, 30, 12, 30, 469, 9, 30, 1, 30, 1, 30, 1, 30, 5, 30, 474, 8, 30, 10, 30, 12, 30, 477, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 483, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 503, 8, 35, 10, 35, 12, 35, 506, 9, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 517, 8, 37, 10, 37, 12, 37, 520, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 5, 38, 526, 8, 38, 10, 38, 12, 38, 529, 9, 38, 1, 38, 4, 38, 532, 8, 38, 11, 38, 12, 38, 533, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 548, 8, 42, 10, 42, 12, 42, 551, 9, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 558, 8, 42, 1, 42, 5, 42, 561, 8, 42, 10, 42, 12, 42, 564, 9, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 570, 8, 42, 10, 42, 12, 42, 573, 9, 42, 3, 42, 575, 8, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 5, 45, 590, 8, 45, 10, 45, 12, 45, 593, 9, 45, 1, 45, 5, 45, 596, 8, 45, 10, 45, 12, 45, 599, 9, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 3, 46, 606, 8, 46, 1, 47, 1, 47, 1, 47, 5, 47, 611, 8, 47, 10, 47, 12, 47, 614, 9, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 5, 49, 625, 8, 49, 10, 49, 12, 49, 628, 9, 49, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 634, 8, 49, 10, 49, 12, 49, 637, 9, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 644, 8, 49, 10, 49, 12, 49, 647, 9, 49, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 653, 8, 49, 10, 49, 12, 49, 656, 9, 49, 3, 49, 658, 8, 49, 1, 49, 1, 49, 1, 50, 4, 50, 663, 8, 50, 11, 50, 12, 50, 664, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 4, 52, 672, 8, 52, 11, 52, 12, 52, 673, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 4, 54, 683, 8, 54, 11, 54, 12, 54, 684, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 5, 56, 697, 8, 56, 10, 56, 12, 56, 700, 9, 56, 1, 56, 1, 56, 1, 56, 1, 57, 4, 57, 706, 8, 57, 11, 57, 12, 57, 707, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 4, 67, 752, 8, 67, 11, 67, 12, 67, 753, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 5, 69, 763, 8, 69, 10, 69, 12, 69, 766, 9, 69, 1, 69, 1, 69, 1, 70, 4, 70, 771, 8, 70, 11, 70, 12, 70, 772, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 5, 72, 785, 8, 72, 10, 72, 12, 72, 788, 9, 72, 1, 72, 1, 72, 1, 72, 1, 73, 4, 73, 794, 8, 73, 11, 73, 12, 73, 795, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 4, 80, 830, 8, 80, 11, 80, 12, 80, 831, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 4, 84, 848, 8, 84, 11, 84, 12, 84, 849, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 5, 85, 858, 8, 85, 10, 85, 12, 85, 861, 9, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 3, 86, 871, 8, 86, 1, 86, 5, 86, 874, 8, 86, 10, 86, 12, 86, 877, 9, 86, 1, 86, 3, 86, 880, 8, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 888, 8, 87, 1, 87, 1, 87, 5, 87, 892, 8, 87, 10, 87, 12, 87, 895, 9, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 4, 88, 902, 8, 88, 11, 88, 12, 88, 903, 1, 88, 1, 88, 1, 88, 5, 88, 909, 8, 88, 10, 88, 12, 88, 912, 9, 88, 1, 88, 3, 88, 915, 8, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 4, 90, 924, 8, 90, 11, 90, 12, 90, 925, 1, 90, 1, 90, 1, 859, 0, 91, 5, 1, 7, 2, 9, 3, 11, 4, 13, 5, 15, 6, 17, 7, 19, 8, 21, 9, 23, 10, 25, 11, 27, 12, 29, 13, 31, 14, 33, 15, 35, 16, 37, 17, 39, 18, 41, 19, 43, 20, 45, 21, 47, 22, 49, 23, 51, 0, 53, 24, 55, 25, 57, 26, 59, 27, 61, 28, 63, 0, 65, 0, 67, 29, 69, 0, 71, 0, 73, 30, 75, 0, 77, 31, 79, 0, 81, 0, 83, 0, 85, 0, 87, 32, 89, 0, 91, 33, 93, 0, 95, 34, 97, 0, 99, 35, 101, 36, 103, 37, 105, 38, 107, 0, 109, 39, 111, 0, 113, 0, 115, 0, 117, 0, 119, 0, 121, 40, 123, 41, 125, 42, 127, 0, 129, 0, 131, 0, 133, 0, 135, 0, 137, 0, 139, 0, 141, 0, 143, 0, 145, 0, 147, 0, 149, 0, 151, 0, 153, 0, 155, 0, 157, 0, 159, 0, 161, 0, 163, 0, 165, 0, 167, 0, 169, 43, 171, 0, 173, 44, 175, 45, 177, 46, 179, 0, 181, 0, 183, 48, 185, 47, 5, 0, 1, 2, 3, 4, 49, 3, 0, 65, 90, 95, 95, 97, 122, 2, 0, 10, 10, 13, 13, 2, 0, 70, 70, 102, 102, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 77, 77, 109, 109, 2, 0, 85, 85, 117, 117, 2, 0, 78, 78, 110, 110, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 69, 69, 101, 101, 2, 0, 76, 76, 108, 108, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 88, 88, 120, 120, 2, 0, 80, 80, 112, 112, 2, 0, 83, 83, 115, 115, 2, 0, 86, 86, 118, 118, 2, 0, 89, 89, 121, 121, 2, 0, 84, 84, 116, 116, 2, 0, 73, 73, 105, 105, 2, 0, 87, 87, 119, 119, 2, 0, 75, 75, 107, 107, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 2, 0, 92, 92, 96, 96, 2, 0, 9, 9, 32, 32, 2, 0, 65, 90, 97, 122, 5, 0, 45, 45, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 3, 0, 10, 10, 13, 13, 39, 39, 6, 0, 9, 10, 13, 13, 32, 32, 34, 34, 39, 39, 92, 92, 8, 0, 9, 10, 13, 13, 32, 32, 34, 34, 36, 36, 39, 39, 60, 61, 91, 93, 3, 0, 10, 10, 13, 13, 96, 96, 5, 0, 10, 10, 13, 13, 34, 34, 92, 92, 96, 96, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 125, 125, 5, 0, 33, 33, 35, 36, 42, 42, 48, 57, 63, 64, 1, 0, 40, 41, 4, 0, 9, 10, 13, 13, 32, 32, 96, 96, 9, 0, 9, 10, 13, 13, 32, 32, 34, 34, 36, 36, 39, 39, 45, 45, 60, 61, 91, 93, 9, 0, 9, 10, 13, 13, 32, 32, 34, 34, 36, 36, 39, 39, 58, 58, 64, 64, 92, 92, 8, 0, 9, 10, 13, 13, 32, 32, 34, 34, 36, 36, 39, 39, 58, 58, 92, 92, 3, 0, 9, 9, 12, 13, 32, 32, 6, 0, 9, 10, 13, 13, 32, 32, 60, 60, 92, 92, 96, 96, 4, 0, 9, 10, 13, 13, 32, 32, 60, 60, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 10, 10, 987, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 1, 113, 1, 0, 0, 0, 1, 115, 1, 0, 0, 0, 1, 117, 1, 0, 0, 0, 1, 119, 1, 0, 0, 0, 1, 121, 1, 0, 0, 0, 1, 123, 1, 0, 0, 0, 1, 125, 1, 0, 0, 0, 1, 127, 1, 0, 0, 0, 1, 129, 1, 0, 0, 0, 1, 131, 1, 0, 0, 0, 1, 133, 1, 0, 0, 0, 1, 135, 1, 0, 0, 0, 1, 137, 1, 0, 0, 0, 1, 139, 1, 0, 0, 0, 2, 145, 1, 0, 0, 0, 2, 147, 1, 0, 0, 0, 2, 149, 1, 0, 0, 0, 2, 151, 1, 0, 0, 0, 2, 153, 1, 0, 0, 0, 2, 155, 1, 0, 0, 0, 2, 157, 1, 0, 0, 0, 2, 159, 1, 0, 0, 0, 2, 161, 1, 0, 0, 0, 2, 163, 1, 0, 0, 0, 2, 165, 1, 0, 0, 0, 3, 169, 1, 0, 0, 0, 3, 171, 1, 0, 0, 0, 3, 173, 1, 0, 0, 0, 3, 175, 1, 0, 0, 0, 3, 177, 1, 0, 0, 0, 3, 179, 1, 0, 0, 0, 3, 181, 1, 0, 0, 0, 4, 183, 1, 0, 0, 0, 4, 185, 1, 0, 0, 0, 5, 187, 1, 0, 0, 0, 7, 221, 1, 0, 0, 0, 9, 230, 1, 0, 0, 0, 11, 237, 1, 0, 0, 0, 13, 243, 1, 0, 0, 0, 15, 249, 1, 0, 0, 0, 17, 256, 1, 0, 0, 0, 19, 264, 1, 0, 0, 0, 21, 273, 1, 0, 0, 0, 23, 279, 1, 0, 0, 0, 25, 285, 1, 0, 0, 0, 27, 292, 1, 0, 0, 0, 29, 305, 1, 0, 0, 0, 31, 314, 1, 0, 0, 0, 33, 321, 1, 0, 0, 0, 35, 331, 1, 0, 0, 0, 37, 337, 1, 0, 0, 0, 39, 347, 1, 0, 0, 0, 41, 360, 1, 0, 0, 0, 43, 374, 1, 0, 0, 0, 45, 382, 1, 0, 0, 0, 47, 395, 1, 0, 0, 0, 49, 412, 1, 0, 0, 0, 51, 416, 1, 0, 0, 0, 53, 428, 1, 0, 0, 0, 55, 431, 1, 0, 0, 0, 57, 434, 1, 0, 0, 0, 59, 437, 1, 0, 0, 0, 61, 440, 1, 0, 0, 0, 63, 443, 1, 0, 0, 0, 65, 482, 1, 0, 0, 0, 67, 484, 1, 0, 0, 0, 69, 489, 1, 0, 0, 0, 71, 491, 1, 0, 0, 0, 73, 494, 1, 0, 0, 0, 75, 497, 1, 0, 0, 0, 77, 509, 1, 0, 0, 0, 79, 512, 1, 0, 0, 0, 81, 523, 1, 0, 0, 0, 83, 535, 1, 0, 0, 0, 85, 538, 1, 0, 0, 0, 87, 540, 1, 0, 0, 0, 89, 574, 1, 0, 0, 0, 91, 576, 1, 0, 0, 0, 93, 579, 1, 0, 0, 0, 95, 582, 1, 0, 0, 0, 97, 605, 1, 0, 0, 0, 99, 607, 1, 0, 0, 0, 101, 618, 1, 0, 0, 0, 103, 657, 1, 0, 0, 0, 105, 662, 1, 0, 0, 0, 107, 668, 1, 0, 0, 0, 109, 671, 1, 0, 0, 0, 111, 679, 1, 0, 0, 0, 113, 682, 1, 0, 0, 0, 115, 689, 1, 0, 0, 0, 117, 694, 1, 0, 0, 0, 119, 705, 1, 0, 0, 0, 121, 715, 1, 0, 0, 0, 123, 717, 1, 0, 0, 0, 125, 719, 1, 0, 0, 0, 127, 724, 1, 0, 0, 0, 129, 728, 1, 0, 0, 0, 131, 732, 1, 0, 0, 0, 133, 736, 1, 0, 0, 0, 135, 740, 1, 0, 0, 0, 137, 744, 1, 0, 0, 0, 139, 751, 1, 0, 0, 0, 141, 757, 1, 0, 0, 0, 143, 759, 1, 0, 0, 0, 145, 770, 1, 0, 0, 0, 147, 777, 1, 0, 0, 0, 149, 782, 1, 0, 0, 0, 151, 793, 1, 0, 0, 0, 153, 803, 1, 0, 0, 0, 155, 807, 1, 0, 0, 0, 157, 811, 1, 0, 0, 0, 159, 815, 1, 0, 0, 0, 161, 819, 1, 0, 0, 0, 163, 823, 1, 0, 0, 0, 165, 829, 1, 0, 0, 0, 167, 835, 1, 0, 0, 0, 169, 837, 1, 0, 0, 0, 171, 841, 1, 0, 0, 0, 173, 847, 1, 0, 0, 0, 175, 853, 1, 0, 0, 0, 177, 870, 1, 0, 0, 0, 179, 883, 1, 0, 0, 0, 181, 914, 1, 0, 0, 0, 183, 918, 1, 0, 0, 0, 185, 923, 1, 0, 0, 0, 187, 191, 5, 35, 0, 0, 188, 190, 3, 107, 51, 0, 189, 188, 1, 0, 0, 0, 190, 193, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 195, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 194, 196, 7, 0, 0, 0, 195, 194, 1, 0, 0, 0, 196, 197, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 197, 198, 1, 0, 0, 0, 198, 202, 1, 0, 0, 0, 199, 201, 3, 107, 51, 0, 200, 199, 1, 0, 0, 0, 201, 204, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 205, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 205, 209, 5, 61, 0, 0, 206, 208, 3, 107, 51, 0, 207, 206, 1, 0, 0, 0, 208, 211, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 215, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 212, 214, 8, 1, 0, 0, 213, 212, 1, 0, 0, 0, 214, 217, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 218, 1, 0, 0, 0, 217, 215, 1, 0, 0, 0, 218, 219, 3, 111, 53, 0, 219, 220, 6, 0, 0, 0, 220, 6, 1, 0, 0, 0, 221, 225, 5, 35, 0, 0, 222, 224, 8, 1, 0, 0, 223, 222, 1, 0, 0, 0, 224, 227, 1, 0, 0, 0, 225, 223, 1, 0, 0, 0, 225, 226, 1, 0, 0, 0, 226, 228, 1, 0, 0, 0, 227, 225, 1, 0, 0, 0, 228, 229, 6, 1, 1, 0, 229, 8, 1, 0, 0, 0, 230, 231, 7, 2, 0, 0, 231, 232, 7, 3, 0, 0, 232, 233, 7, 4, 0, 0, 233, 234, 7, 5, 0, 0, 234, 235, 1, 0, 0, 0, 235, 236, 6, 2, 2, 0, 236, 10, 1, 0, 0, 0, 237, 238, 7, 3, 0, 0, 238, 239, 7, 6, 0, 0, 239, 240, 7, 7, 0, 0, 240, 241, 1, 0, 0, 0, 241, 242, 6, 3, 3, 0, 242, 12, 1, 0, 0, 0, 243, 244, 7, 8, 0, 0, 244, 245, 7, 5, 0, 0, 245, 246, 7, 9, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 6, 4, 4, 0, 248, 14, 1, 0, 0, 0, 249, 250, 7, 7, 0, 0, 250, 251, 7, 4, 0, 0, 251, 252, 7, 7, 0, 0, 252, 253, 7, 10, 0, 0, 253, 254, 1, 0, 0, 0, 254, 255, 6, 5, 5, 0, 255, 16, 1, 0, 0, 0, 256, 257, 7, 11, 0, 0, 257, 258, 7, 12, 0, 0, 258, 259, 7, 13, 0, 0, 259, 260, 7, 10, 0, 0, 260, 261, 7, 11, 0, 0, 261, 262, 1, 0, 0, 0, 262, 263, 6, 6, 6, 0, 263, 18, 1, 0, 0, 0, 264, 265, 7, 10, 0, 0, 265, 266, 7, 14, 0, 0, 266, 267, 7, 15, 0, 0, 267, 268, 7, 4, 0, 0, 268, 269, 7, 16, 0, 0, 269, 270, 7, 10, 0, 0, 270, 271, 1, 0, 0, 0, 271, 272, 6, 7, 7, 0, 272, 20, 1, 0, 0, 0, 273, 274, 7, 10, 0, 0, 274, 275, 7, 7, 0, 0, 275, 276, 7, 17, 0, 0, 276, 277, 1, 0, 0, 0, 277, 278, 6, 8, 8, 0, 278, 22, 1, 0, 0, 0, 279, 280, 7, 12, 0, 0, 280, 281, 7, 9, 0, 0, 281, 282, 7, 9, 0, 0, 282, 283, 1, 0, 0, 0, 283, 284, 6, 9, 9, 0, 284, 24, 1, 0, 0, 0, 285, 286, 7, 8, 0, 0, 286, 287, 7, 4, 0, 0, 287, 288, 7, 15, 0, 0, 288, 289, 7, 18, 0, 0, 289, 290, 1, 0, 0, 0, 290, 291, 6, 10, 10, 0, 291, 26, 1, 0, 0, 0, 292, 293, 7, 10, 0, 0, 293, 294, 7, 7, 0, 0, 294, 295, 7, 19, 0, 0, 295, 296, 7, 3, 0, 0, 296, 297, 7, 18, 0, 0, 297, 298, 7, 15, 0, 0, 298, 299, 7, 4, 0, 0, 299, 300, 7, 20, 0, 0, 300, 301, 7, 7, 0, 0, 301, 302, 7, 19, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 6, 11, 11, 0, 304, 28, 1, 0, 0, 0, 305, 306, 7, 17, 0, 0, 306, 307, 7, 4, 0, 0, 307, 308, 7, 11, 0, 0, 308, 309, 7, 6, 0, 0, 309, 310, 7, 5, 0, 0, 310, 311, 7, 10, 0, 0, 311, 312, 1, 0, 0, 0, 312, 313, 6, 12, 12, 0, 313, 30, 1, 0, 0, 0, 314, 315, 7, 6, 0, 0, 315, 316, 7, 16, 0, 0, 316, 317, 7, 10, 0, 0, 317, 318, 7, 3, 0, 0, 318, 319, 1, 0, 0, 0, 319, 320, 6, 13, 13, 0, 320, 32, 1, 0, 0, 0, 321, 322, 7, 21, 0, 0, 322, 323, 7, 4, 0, 0, 323, 324, 7, 3, 0, 0, 324, 325, 7, 22, 0, 0, 325, 326, 7, 9, 0, 0, 326, 327, 7, 20, 0, 0, 327, 328, 7, 3, 0, 0, 328, 329, 1, 0, 0, 0, 329, 330, 6, 14, 14, 0, 330, 34, 1, 0, 0, 0, 331, 332, 7, 12, 0, 0, 332, 333, 7, 3, 0, 0, 333, 334, 7, 23, 0, 0, 334, 335, 1, 0, 0, 0, 335, 336, 6, 15, 15, 0, 336, 36, 1, 0, 0, 0, 337, 338, 7, 4, 0, 0, 338, 339, 7, 7, 0, 0, 339, 340, 7, 13, 0, 0, 340, 341, 7, 6, 0, 0, 341, 342, 7, 20, 0, 0, 342, 343, 7, 11, 0, 0, 343, 344, 7, 9, 0, 0, 344, 345, 1, 0, 0, 0, 345, 346, 6, 16, 16, 0, 346, 38, 1, 0, 0, 0, 347, 348, 7, 16, 0, 0, 348, 349, 7, 19, 0, 0, 349, 350, 7, 4, 0, 0, 350, 351, 7, 15, 0, 0, 351, 352, 7, 16, 0, 0, 352, 353, 7, 20, 0, 0, 353, 354, 7, 23, 0, 0, 354, 355, 7, 7, 0, 0, 355, 356, 7, 12, 0, 0, 356, 357, 7, 11, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 6, 17, 17, 0, 359, 40, 1, 0, 0, 0, 360, 361, 7, 24, 0, 0, 361, 362, 7, 10, 0, 0, 362, 363, 7, 12, 0, 0, 363, 364, 7, 11, 0, 0, 364, 365, 7, 19, 0, 0, 365, 366, 7, 24, 0, 0, 366, 367, 7, 8, 0, 0, 367, 368, 7, 24, 0, 0, 368, 369, 7, 10, 0, 0, 369, 370, 7, 8, 0, 0, 370, 371, 7, 22, 0, 0, 371, 372, 1, 0, 0, 0, 372, 373, 6, 18, 18, 0, 373, 42, 1, 0, 0, 0, 374, 375, 7, 16, 0, 0, 375, 376, 7, 24, 0, 0, 376, 377, 7, 10, 0, 0, 377, 378, 7, 11, 0, 0, 378, 379, 7, 11, 0, 0, 379, 380, 1, 0, 0, 0, 380, 381, 6, 19, 19, 0, 381, 44, 1, 0, 0, 0, 382, 383, 7, 5, 0, 0, 383, 384, 7, 12, 0, 0, 384, 385, 7, 20, 0, 0, 385, 386, 7, 7, 0, 0, 386, 387, 7, 19, 0, 0, 387, 388, 7, 12, 0, 0, 388, 389, 7, 20, 0, 0, 389, 390, 7, 7, 0, 0, 390, 391, 7, 10, 0, 0, 391, 392, 7, 3, 0, 0, 392, 393, 1, 0, 0, 0, 393, 394, 6, 20, 20, 0, 394, 46, 1, 0, 0, 0, 395, 396, 5, 60, 0, 0, 396, 397, 5, 60, 0, 0, 397, 399, 1, 0, 0, 0, 398, 400, 5, 45, 0, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 405, 7, 0, 0, 0, 402, 404, 7, 25, 0, 0, 403, 402, 1, 0, 0, 0, 404, 407, 1, 0, 0, 0, 405, 403, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 408, 1, 0, 0, 0, 407, 405, 1, 0, 0, 0, 408, 409, 6, 21, 21, 0, 409, 410, 1, 0, 0, 0, 410, 411, 6, 21, 22, 0, 411, 48, 1, 0, 0, 0, 412, 413, 3, 51, 23, 0, 413, 414, 1, 0, 0, 0, 414, 415, 6, 22, 1, 0, 415, 50, 1, 0, 0, 0, 416, 420, 7, 26, 0, 0, 417, 419, 7, 27, 0, 0, 418, 417, 1, 0, 0, 0, 419, 422, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 424, 1, 0, 0, 0, 422, 420, 1, 0, 0, 0, 423, 425, 5, 13, 0, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 5, 10, 0, 0, 427, 52, 1, 0, 0, 0, 428, 429, 5, 91, 0, 0, 429, 430, 6, 24, 23, 0, 430, 54, 1, 0, 0, 0, 431, 432, 5, 93, 0, 0, 432, 433, 6, 25, 24, 0, 433, 56, 1, 0, 0, 0, 434, 435, 5, 44, 0, 0, 435, 436, 6, 26, 25, 0, 436, 58, 1, 0, 0, 0, 437, 438, 5, 61, 0, 0, 438, 439, 6, 27, 26, 0, 439, 60, 1, 0, 0, 0, 440, 441, 3, 63, 29, 0, 441, 442, 6, 28, 27, 0, 442, 62, 1, 0, 0, 0, 443, 444, 5, 45, 0, 0, 444, 445, 5, 45, 0, 0, 445, 446, 1, 0, 0, 0, 446, 450, 7, 28, 0, 0, 447, 449, 7, 29, 0, 0, 448, 447, 1, 0, 0, 0, 449, 452, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 459, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 453, 455, 5, 61, 0, 0, 454, 456, 3, 65, 30, 0, 455, 454, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 455, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 460, 1, 0, 0, 0, 459, 453, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 64, 1, 0, 0, 0, 461, 467, 5, 34, 0, 0, 462, 463, 5, 92, 0, 0, 463, 466, 8, 1, 0, 0, 464, 466, 8, 30, 0, 0, 465, 462, 1, 0, 0, 0, 465, 464, 1, 0, 0, 0, 466, 469, 1, 0, 0, 0, 467, 465, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 470, 1, 0, 0, 0, 469, 467, 1, 0, 0, 0, 470, 483, 5, 34, 0, 0, 471, 475, 5, 39, 0, 0, 472, 474, 8, 31, 0, 0, 473, 472, 1, 0, 0, 0, 474, 477, 1, 0, 0, 0, 475, 473, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 478, 1, 0, 0, 0, 477, 475, 1, 0, 0, 0, 478, 483, 5, 39, 0, 0, 479, 483, 8, 32, 0, 0, 480, 481, 5, 92, 0, 0, 481, 483, 8, 1, 0, 0, 482, 461, 1, 0, 0, 0, 482, 471, 1, 0, 0, 0, 482, 479, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 66, 1, 0, 0, 0, 484, 485, 5, 45, 0, 0, 485, 486, 5, 45, 0, 0, 486, 487, 1, 0, 0, 0, 487, 488, 6, 31, 28, 0, 488, 68, 1, 0, 0, 0, 489, 490, 8, 33, 0, 0, 490, 70, 1, 0, 0, 0, 491, 492, 5, 92, 0, 0, 492, 493, 9, 0, 0, 0, 493, 72, 1, 0, 0, 0, 494, 495, 3, 75, 35, 0, 495, 496, 6, 34, 29, 0, 496, 74, 1, 0, 0, 0, 497, 504, 5, 34, 0, 0, 498, 503, 3, 83, 39, 0, 499, 503, 3, 81, 38, 0, 500, 503, 7, 34, 0, 0, 501, 503, 8, 35, 0, 0, 502, 498, 1, 0, 0, 0, 502, 499, 1, 0, 0, 0, 502, 500, 1, 0, 0, 0, 502, 501, 1, 0, 0, 0, 503, 506, 1, 0, 0, 0, 504, 502, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 507, 1, 0, 0, 0, 506, 504, 1, 0, 0, 0, 507, 508, 5, 34, 0, 0, 508, 76, 1, 0, 0, 0, 509, 510, 3, 79, 37, 0, 510, 511, 6, 36, 30, 0, 511, 78, 1, 0, 0, 0, 512, 518, 5, 39, 0, 0, 513, 517, 3, 81, 38, 0, 514, 517, 7, 1, 0, 0, 515, 517, 8, 31, 0, 0, 516, 513, 1, 0, 0, 0, 516, 514, 1, 0, 0, 0, 516, 515, 1, 0, 0, 0, 517, 520, 1, 0, 0, 0, 518, 516, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 521, 1, 0, 0, 0, 520, 518, 1, 0, 0, 0, 521, 522, 5, 39, 0, 0, 522, 80, 1, 0, 0, 0, 523, 527, 7, 26, 0, 0, 524, 526, 7, 27, 0, 0, 525, 524, 1, 0, 0, 0, 526, 529, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 531, 1, 0, 0, 0, 529, 527, 1, 0, 0, 0, 530, 532, 7, 1, 0, 0, 531, 530, 1, 0, 0, 0, 532, 533, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 82, 1, 0, 0, 0, 535, 536, 5, 92, 0, 0, 536, 537, 8, 1, 0, 0, 537, 84, 1, 0, 0, 0, 538, 539, 7, 36, 0, 0, 539, 86, 1, 0, 0, 0, 540, 541, 3, 89, 42, 0, 541, 542, 6, 41, 31, 0, 542, 88, 1, 0, 0, 0, 543, 544, 5, 36, 0, 0, 544, 545, 5, 123, 0, 0, 545, 549, 7, 0, 0, 0, 546, 548, 7, 25, 0, 0, 547, 546, 1, 0, 0, 0, 548, 551, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 557, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 552, 553, 5, 58, 0, 0, 553, 558, 5, 45, 0, 0, 554, 555, 5, 58, 0, 0, 555, 558, 5, 43, 0, 0, 556, 558, 5, 58, 0, 0, 557, 552, 1, 0, 0, 0, 557, 554, 1, 0, 0, 0, 557, 556, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 562, 1, 0, 0, 0, 559, 561, 8, 37, 0, 0, 560, 559, 1, 0, 0, 0, 561, 564, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 565, 1, 0, 0, 0, 564, 562, 1, 0, 0, 0, 565, 575, 5, 125, 0, 0, 566, 567, 5, 36, 0, 0, 567, 571, 7, 0, 0, 0, 568, 570, 7, 25, 0, 0, 569, 568, 1, 0, 0, 0, 570, 573, 1, 0, 0, 0, 571, 569, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 575, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 574, 543, 1, 0, 0, 0, 574, 566, 1, 0, 0, 0, 575, 90, 1, 0, 0, 0, 576, 577, 3, 93, 44, 0, 577, 578, 6, 43, 32, 0, 578, 92, 1, 0, 0, 0, 579, 580, 5, 36, 0, 0, 580, 581, 7, 38, 0, 0, 581, 94, 1, 0, 0, 0, 582, 583, 5, 36, 0, 0, 583, 584, 5, 40, 0, 0, 584, 597, 1, 0, 0, 0, 585, 596, 3, 95, 45, 0, 586, 596, 8, 39, 0, 0, 587, 591, 5, 40, 0, 0, 588, 590, 3, 97, 46, 0, 589, 588, 1, 0, 0, 0, 590, 593, 1, 0, 0, 0, 591, 589, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 594, 1, 0, 0, 0, 593, 591, 1, 0, 0, 0, 594, 596, 5, 41, 0, 0, 595, 585, 1, 0, 0, 0, 595, 586, 1, 0, 0, 0, 595, 587, 1, 0, 0, 0, 596, 599, 1, 0, 0, 0, 597, 595, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 600, 1, 0, 0, 0, 599, 597, 1, 0, 0, 0, 600, 601, 5, 41, 0, 0, 601, 602, 6, 45, 33, 0, 602, 96, 1, 0, 0, 0, 603, 606, 3, 95, 45, 0, 604, 606, 8, 39, 0, 0, 605, 603, 1, 0, 0, 0, 605, 604, 1, 0, 0, 0, 606, 98, 1, 0, 0, 0, 607, 608, 5, 96, 0, 0, 608, 612, 8, 40, 0, 0, 609, 611, 8, 34, 0, 0, 610, 609, 1, 0, 0, 0, 611, 614, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 615, 1, 0, 0, 0, 614, 612, 1, 0, 0, 0, 615, 616, 5, 96, 0, 0, 616, 617, 6, 47, 34, 0, 617, 100, 1, 0, 0, 0, 618, 619, 5, 36, 0, 0, 619, 620, 6, 48, 35, 0, 620, 102, 1, 0, 0, 0, 621, 626, 8, 41, 0, 0, 622, 625, 3, 69, 32, 0, 623, 625, 3, 71, 33, 0, 624, 622, 1, 0, 0, 0, 624, 623, 1, 0, 0, 0, 625, 628, 1, 0, 0, 0, 626, 624, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 658, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 629, 630, 5, 45, 0, 0, 630, 635, 8, 41, 0, 0, 631, 634, 3, 69, 32, 0, 632, 634, 3, 71, 33, 0, 633, 631, 1, 0, 0, 0, 633, 632, 1, 0, 0, 0, 634, 637, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 658, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 638, 658, 5, 45, 0, 0, 639, 640, 5, 60, 0, 0, 640, 645, 8, 33, 0, 0, 641, 644, 3, 69, 32, 0, 642, 644, 3, 71, 33, 0, 643, 641, 1, 0, 0, 0, 643, 642, 1, 0, 0, 0, 644, 647, 1, 0, 0, 0, 645, 643, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 658, 1, 0, 0, 0, 647, 645, 1, 0, 0, 0, 648, 658, 5, 60, 0, 0, 649, 654, 3, 71, 33, 0, 650, 653, 3, 69, 32, 0, 651, 653, 3, 71, 33, 0, 652, 650, 1, 0, 0, 0, 652, 651, 1, 0, 0, 0, 653, 656, 1, 0, 0, 0, 654, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 658, 1, 0, 0, 0, 656, 654, 1, 0, 0, 0, 657, 621, 1, 0, 0, 0, 657, 629, 1, 0, 0, 0, 657, 638, 1, 0, 0, 0, 657, 639, 1, 0, 0, 0, 657, 648, 1, 0, 0, 0, 657, 649, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 659, 660, 6, 49, 36, 0, 660, 104, 1, 0, 0, 0, 661, 663, 3, 107, 51, 0, 662, 661, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 664, 665, 1, 0, 0, 0, 665, 666, 1, 0, 0, 0, 666, 667, 6, 50, 1, 0, 667, 106, 1, 0, 0, 0, 668, 669, 7, 27, 0, 0, 669, 108, 1, 0, 0, 0, 670, 672, 3, 111, 53, 0, 671, 670, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 671, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 676, 6, 52, 37, 0, 676, 677, 1, 0, 0, 0, 677, 678, 6, 52, 1, 0, 678, 110, 1, 0, 0, 0, 679, 680, 7, 1, 0, 0, 680, 112, 1, 0, 0, 0, 681, 683, 3, 107, 51, 0, 682, 681, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 682, 1, 0, 0, 0, 684, 685, 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 686, 687, 6, 54, 38, 0, 687, 688, 6, 54, 1, 0, 688, 114, 1, 0, 0, 0, 689, 690, 3, 51, 23, 0, 690, 691, 1, 0, 0, 0, 691, 692, 6, 55, 39, 0, 692, 693, 6, 55, 1, 0, 693, 116, 1, 0, 0, 0, 694, 698, 5, 35, 0, 0, 695, 697, 8, 1, 0, 0, 696, 695, 1, 0, 0, 0, 697, 700, 1, 0, 0, 0, 698, 696, 1, 0, 0, 0, 698, 699, 1, 0, 0, 0, 699, 701, 1, 0, 0, 0, 700, 698, 1, 0, 0, 0, 701, 702, 6, 56, 40, 0, 702, 703, 6, 56, 1, 0, 703, 118, 1, 0, 0, 0, 704, 706, 3, 111, 53, 0, 705, 704, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 709, 1, 0, 0, 0, 709, 710, 6, 57, 41, 0, 710, 711, 1, 0, 0, 0, 711, 712, 6, 57, 42, 0, 712, 713, 6, 57, 1, 0, 713, 714, 6, 57, 43, 0, 714, 120, 1, 0, 0, 0, 715, 716, 5, 58, 0, 0, 716, 122, 1, 0, 0, 0, 717, 718, 5, 64, 0, 0, 718, 124, 1, 0, 0, 0, 719, 720, 7, 12, 0, 0, 720, 721, 7, 16, 0, 0, 721, 722, 1, 0, 0, 0, 722, 723, 6, 60, 43, 0, 723, 126, 1, 0, 0, 0, 724, 725, 3, 63, 29, 0, 725, 726, 1, 0, 0, 0, 726, 727, 6, 61, 44, 0, 727, 128, 1, 0, 0, 0, 728, 729, 3, 75, 35, 0, 729, 730, 1, 0, 0, 0, 730, 731, 6, 62, 45, 0, 731, 130, 1, 0, 0, 0, 732, 733, 3, 79, 37, 0, 733, 734, 1, 0, 0, 0, 734, 735, 6, 63, 46, 0, 735, 132, 1, 0, 0, 0, 736, 737, 3, 89, 42, 0, 737, 738, 1, 0, 0, 0, 738, 739, 6, 64, 47, 0, 739, 134, 1, 0, 0, 0, 740, 741, 3, 93, 44, 0, 741, 742, 1, 0, 0, 0, 742, 743, 6, 65, 48, 0, 743, 136, 1, 0, 0, 0, 744, 745, 5, 36, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 6, 66, 49, 0, 747, 138, 1, 0, 0, 0, 748, 752, 3, 141, 68, 0, 749, 752, 3, 71, 33, 0, 750, 752, 3, 143, 69, 0, 751, 748, 1, 0, 0, 0, 751, 749, 1, 0, 0, 0, 751, 750, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 751, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 756, 6, 67, 50, 0, 756, 140, 1, 0, 0, 0, 757, 758, 8, 42, 0, 0, 758, 142, 1, 0, 0, 0, 759, 764, 5, 58, 0, 0, 760, 763, 3, 141, 68, 0, 761, 763, 5, 58, 0, 0, 762, 760, 1, 0, 0, 0, 762, 761, 1, 0, 0, 0, 763, 766, 1, 0, 0, 0, 764, 762, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 767, 1, 0, 0, 0, 766, 764, 1, 0, 0, 0, 767, 768, 5, 47, 0, 0, 768, 144, 1, 0, 0, 0, 769, 771, 3, 107, 51, 0, 770, 769, 1, 0, 0, 0, 771, 772, 1, 0, 0, 0, 772, 770, 1, 0, 0, 0, 772, 773, 1, 0, 0, 0, 773, 774, 1, 0, 0, 0, 774, 775, 6, 70, 38, 0, 775, 776, 6, 70, 1, 0, 776, 146, 1, 0, 0, 0, 777, 778, 3, 51, 23, 0, 778, 779, 1, 0, 0, 0, 779, 780, 6, 71, 39, 0, 780, 781, 6, 71, 1, 0, 781, 148, 1, 0, 0, 0, 782, 786, 5, 35, 0, 0, 783, 785, 8, 1, 0, 0, 784, 783, 1, 0, 0, 0, 785, 788, 1, 0, 0, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 789, 1, 0, 0, 0, 788, 786, 1, 0, 0, 0, 789, 790, 6, 72, 40, 0, 790, 791, 6, 72, 1, 0, 791, 150, 1, 0, 0, 0, 792, 794, 3, 111, 53, 0, 793, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 793, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 797, 1, 0, 0, 0, 797, 798, 6, 73, 51, 0, 798, 799, 1, 0, 0, 0, 799, 800, 6, 73, 42, 0, 800, 801, 6, 73, 1, 0, 801, 802, 6, 73, 43, 0, 802, 152, 1, 0, 0, 0, 803, 804, 5, 58, 0, 0, 804, 805, 1, 0, 0, 0, 805, 806, 6, 74, 52, 0, 806, 154, 1, 0, 0, 0, 807, 808, 3, 75, 35, 0, 808, 809, 1, 0, 0, 0, 809, 810, 6, 75, 45, 0, 810, 156, 1, 0, 0, 0, 811, 812, 3, 79, 37, 0, 812, 813, 1, 0, 0, 0, 813, 814, 6, 76, 46, 0, 814, 158, 1, 0, 0, 0, 815, 816, 3, 89, 42, 0, 816, 817, 1, 0, 0, 0, 817, 818, 6, 77, 47, 0, 818, 160, 1, 0, 0, 0, 819, 820, 3, 93, 44, 0, 820, 821, 1, 0, 0, 0, 821, 822, 6, 78, 48, 0, 822, 162, 1, 0, 0, 0, 823, 824, 5, 36, 0, 0, 824, 825, 1, 0, 0, 0, 825, 826, 6, 79, 49, 0, 826, 164, 1, 0, 0, 0, 827, 830, 3, 167, 81, 0, 828, 830, 3, 71, 33, 0, 829, 827, 1, 0, 0, 0, 829, 828, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 829, 1, 0, 0, 0, 831, 832, 1, 0, 0, 0, 832, 833, 1, 0, 0, 0, 833, 834, 6, 80, 50, 0, 834, 166, 1, 0, 0, 0, 835, 836, 8, 43, 0, 0, 836, 168, 1, 0, 0, 0, 837, 838, 3, 51, 23, 0, 838, 839, 1, 0, 0, 0, 839, 840, 6, 82, 1, 0, 840, 170, 1, 0, 0, 0, 841, 842, 5, 10, 0, 0, 842, 843, 1, 0, 0, 0, 843, 844, 6, 83, 42, 0, 844, 845, 6, 83, 53, 0, 845, 172, 1, 0, 0, 0, 846, 848, 7, 44, 0, 0, 847, 846, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 847, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 851, 1, 0, 0, 0, 851, 852, 6, 84, 1, 0, 852, 174, 1, 0, 0, 0, 853, 854, 5, 47, 0, 0, 854, 855, 5, 42, 0, 0, 855, 859, 1, 0, 0, 0, 856, 858, 9, 0, 0, 0, 857, 856, 1, 0, 0, 0, 858, 861, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 859, 857, 1, 0, 0, 0, 860, 862, 1, 0, 0, 0, 861, 859, 1, 0, 0, 0, 862, 863, 5, 42, 0, 0, 863, 864, 5, 47, 0, 0, 864, 865, 1, 0, 0, 0, 865, 866, 6, 85, 1, 0, 866, 176, 1, 0, 0, 0, 867, 868, 5, 47, 0, 0, 868, 871, 5, 47, 0, 0, 869, 871, 5, 35, 0, 0, 870, 867, 1, 0, 0, 0, 870, 869, 1, 0, 0, 0, 871, 875, 1, 0, 0, 0, 872, 874, 8, 1, 0, 0, 873, 872, 1, 0, 0, 0, 874, 877, 1, 0, 0, 0, 875, 873, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 879, 1, 0, 0, 0, 877, 875, 1, 0, 0, 0, 878, 880, 5, 13, 0, 0, 879, 878, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 881, 882, 6, 86, 1, 0, 882, 178, 1, 0, 0, 0, 883, 884, 5, 60, 0, 0, 884, 885, 5, 60, 0, 0, 885, 887, 1, 0, 0, 0, 886, 888, 5, 45, 0, 0, 887, 886, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 893, 7, 0, 0, 0, 890, 892, 7, 25, 0, 0, 891, 890, 1, 0, 0, 0, 892, 895, 1, 0, 0, 0, 893, 891, 1, 0, 0, 0, 893, 894, 1, 0, 0, 0, 894, 896, 1, 0, 0, 0, 895, 893, 1, 0, 0, 0, 896, 897, 6, 87, 54, 0, 897, 898, 1, 0, 0, 0, 898, 899, 6, 87, 55, 0, 899, 180, 1, 0, 0, 0, 900, 902, 8, 45, 0, 0, 901, 900, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 901, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 915, 1, 0, 0, 0, 905, 906, 5, 60, 0, 0, 906, 910, 8, 46, 0, 0, 907, 909, 8, 47, 0, 0, 908, 907, 1, 0, 0, 0, 909, 912, 1, 0, 0, 0, 910, 908, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 915, 1, 0, 0, 0, 912, 910, 1, 0, 0, 0, 913, 915, 5, 60, 0, 0, 914, 901, 1, 0, 0, 0, 914, 905, 1, 0, 0, 0, 914, 913, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 917, 6, 88, 50, 0, 917, 182, 1, 0, 0, 0, 918, 919, 5, 10, 0, 0, 919, 920, 1, 0, 0, 0, 920, 921, 6, 89, 42, 0, 921, 184, 1, 0, 0, 0, 922, 924, 8, 48, 0, 0, 923, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 923, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 928, 6, 90, 56, 0, 928, 186, 1, 0, 0, 0, 72, 0, 1, 2, 3, 4, 191, 197, 202, 209, 215, 225, 399, 405, 420, 424, 450, 457, 459, 465, 467, 475, 482, 502, 504, 516, 518, 527, 533, 549, 557, 562, 571, 574, 591, 595, 597, 605, 612, 624, 626, 633, 635, 643, 645, 652, 654, 657, 664, 673, 684, 698, 707, 751, 753, 762, 764, 772, 786, 795, 829, 831, 849, 859, 870, 875, 879, 887, 893, 903, 910, 914, 925, 57, 1, 0, 0, 0, 1, 0, 1, 2, 1, 1, 3, 2, 1, 4, 3, 1, 5, 4, 1, 6, 5, 1, 7, 6, 1, 8, 7, 1, 9, 8, 1, 10, 9, 1, 11, 10, 1, 12, 11, 1, 13, 12, 1, 14, 13, 1, 15, 14, 1, 16, 15, 1, 17, 16, 1, 18, 17, 1, 19, 18, 1, 20, 19, 1, 21, 20, 5, 3, 0, 1, 24, 21, 1, 25, 22, 1, 26, 23, 1, 27, 24, 1, 28, 25, 1, 31, 26, 1, 34, 27, 1, 36, 28, 1, 41, 29, 1, 43, 30, 1, 45, 31, 1, 47, 32, 1, 48, 33, 1, 49, 34, 1, 52, 35, 7, 38, 0, 7, 23, 0, 7, 2, 0, 1, 57, 36, 7, 39, 0, 4, 0, 0, 7, 28, 0, 7, 30, 0, 7, 31, 0, 7, 32, 0, 7, 33, 0, 7, 36, 0, 7, 37, 0, 1, 73, 37, 7, 40, 0, 2, 4, 0, 1, 87, 38, 7, 22, 0, 1, 90, 39] \ No newline at end of file +[4, 0, 50, 1027, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 1, 0, 1, 0, 5, 0, 215, 8, 0, 10, 0, 12, 0, 218, 9, 0, 1, 0, 4, 0, 221, 8, 0, 11, 0, 12, 0, 222, 1, 0, 5, 0, 226, 8, 0, 10, 0, 12, 0, 229, 9, 0, 1, 0, 1, 0, 5, 0, 233, 8, 0, 10, 0, 12, 0, 236, 9, 0, 1, 0, 5, 0, 239, 8, 0, 10, 0, 12, 0, 242, 9, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 5, 1, 249, 8, 1, 10, 1, 12, 1, 252, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 425, 8, 21, 1, 21, 1, 21, 5, 21, 429, 8, 21, 10, 21, 12, 21, 432, 9, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 5, 23, 444, 8, 23, 10, 23, 12, 23, 447, 9, 23, 1, 23, 3, 23, 450, 8, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 5, 30, 489, 8, 30, 10, 30, 12, 30, 492, 9, 30, 1, 30, 1, 30, 4, 30, 496, 8, 30, 11, 30, 12, 30, 497, 3, 30, 500, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 506, 8, 31, 10, 31, 12, 31, 509, 9, 31, 1, 31, 1, 31, 1, 31, 5, 31, 514, 8, 31, 10, 31, 12, 31, 517, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 523, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 543, 8, 36, 10, 36, 12, 36, 546, 9, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 557, 8, 38, 10, 38, 12, 38, 560, 9, 38, 1, 38, 1, 38, 1, 39, 1, 39, 5, 39, 566, 8, 39, 10, 39, 12, 39, 569, 9, 39, 1, 39, 4, 39, 572, 8, 39, 11, 39, 12, 39, 573, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 588, 8, 43, 10, 43, 12, 43, 591, 9, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 598, 8, 43, 1, 43, 5, 43, 601, 8, 43, 10, 43, 12, 43, 604, 9, 43, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 610, 8, 43, 10, 43, 12, 43, 613, 9, 43, 3, 43, 615, 8, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 5, 46, 630, 8, 46, 10, 46, 12, 46, 633, 9, 46, 1, 46, 5, 46, 636, 8, 46, 10, 46, 12, 46, 639, 9, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 646, 8, 47, 1, 48, 1, 48, 1, 48, 5, 48, 651, 8, 48, 10, 48, 12, 48, 654, 9, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 5, 50, 665, 8, 50, 10, 50, 12, 50, 668, 9, 50, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 674, 8, 50, 10, 50, 12, 50, 677, 9, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 684, 8, 50, 10, 50, 12, 50, 687, 9, 50, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 693, 8, 50, 10, 50, 12, 50, 696, 9, 50, 3, 50, 698, 8, 50, 1, 50, 1, 50, 1, 51, 4, 51, 703, 8, 51, 11, 51, 12, 51, 704, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 4, 53, 712, 8, 53, 11, 53, 12, 53, 713, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 4, 55, 723, 8, 55, 11, 55, 12, 55, 724, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 5, 57, 737, 8, 57, 10, 57, 12, 57, 740, 9, 57, 1, 57, 1, 57, 1, 57, 1, 58, 4, 58, 746, 8, 58, 11, 58, 12, 58, 747, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 4, 69, 799, 8, 69, 11, 69, 12, 69, 800, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 5, 71, 808, 8, 71, 10, 71, 12, 71, 811, 9, 71, 1, 71, 1, 71, 1, 72, 4, 72, 816, 8, 72, 11, 72, 12, 72, 817, 1, 72, 3, 72, 821, 8, 72, 1, 72, 1, 72, 1, 73, 4, 73, 826, 8, 73, 11, 73, 12, 73, 827, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 4, 82, 869, 8, 82, 11, 82, 12, 82, 870, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 5, 84, 883, 8, 84, 10, 84, 12, 84, 886, 9, 84, 1, 84, 1, 84, 1, 84, 1, 85, 4, 85, 892, 8, 85, 11, 85, 12, 85, 893, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 4, 92, 928, 8, 92, 11, 92, 12, 92, 929, 1, 92, 1, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 4, 96, 946, 8, 96, 11, 96, 12, 96, 947, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 5, 97, 956, 8, 97, 10, 97, 12, 97, 959, 9, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 3, 98, 969, 8, 98, 1, 98, 5, 98, 972, 8, 98, 10, 98, 12, 98, 975, 9, 98, 1, 98, 3, 98, 978, 8, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 3, 99, 986, 8, 99, 1, 99, 1, 99, 5, 99, 990, 8, 99, 10, 99, 12, 99, 993, 9, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 4, 100, 1000, 8, 100, 11, 100, 12, 100, 1001, 1, 100, 1, 100, 1, 100, 5, 100, 1007, 8, 100, 10, 100, 12, 100, 1010, 9, 100, 1, 100, 3, 100, 1013, 8, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 4, 102, 1022, 8, 102, 11, 102, 12, 102, 1023, 1, 102, 1, 102, 1, 957, 0, 103, 6, 1, 8, 2, 10, 3, 12, 4, 14, 5, 16, 6, 18, 7, 20, 8, 22, 9, 24, 10, 26, 11, 28, 12, 30, 13, 32, 14, 34, 15, 36, 16, 38, 17, 40, 18, 42, 19, 44, 20, 46, 21, 48, 22, 50, 23, 52, 0, 54, 24, 56, 25, 58, 26, 60, 27, 62, 28, 64, 29, 66, 0, 68, 0, 70, 30, 72, 0, 74, 0, 76, 31, 78, 0, 80, 32, 82, 0, 84, 0, 86, 0, 88, 0, 90, 33, 92, 0, 94, 34, 96, 0, 98, 35, 100, 0, 102, 36, 104, 37, 106, 38, 108, 39, 110, 0, 112, 40, 114, 0, 116, 0, 118, 0, 120, 0, 122, 0, 124, 41, 126, 42, 128, 43, 130, 0, 132, 0, 134, 0, 136, 0, 138, 0, 140, 0, 142, 0, 144, 0, 146, 0, 148, 0, 150, 44, 152, 0, 154, 0, 156, 0, 158, 0, 160, 0, 162, 0, 164, 0, 166, 0, 168, 0, 170, 0, 172, 0, 174, 0, 176, 0, 178, 0, 180, 0, 182, 0, 184, 0, 186, 0, 188, 0, 190, 0, 192, 0, 194, 45, 196, 0, 198, 46, 200, 47, 202, 48, 204, 0, 206, 0, 208, 50, 210, 49, 6, 0, 1, 2, 3, 4, 5, 49, 3, 0, 65, 90, 95, 95, 97, 122, 2, 0, 10, 10, 13, 13, 2, 0, 70, 70, 102, 102, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 77, 77, 109, 109, 2, 0, 85, 85, 117, 117, 2, 0, 78, 78, 110, 110, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 69, 69, 101, 101, 2, 0, 76, 76, 108, 108, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 88, 88, 120, 120, 2, 0, 80, 80, 112, 112, 2, 0, 83, 83, 115, 115, 2, 0, 86, 86, 118, 118, 2, 0, 89, 89, 121, 121, 2, 0, 84, 84, 116, 116, 2, 0, 73, 73, 105, 105, 2, 0, 87, 87, 119, 119, 2, 0, 75, 75, 107, 107, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 2, 0, 92, 92, 96, 96, 2, 0, 9, 9, 32, 32, 2, 0, 65, 90, 97, 122, 5, 0, 45, 45, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 3, 0, 10, 10, 13, 13, 39, 39, 6, 0, 9, 10, 13, 13, 32, 32, 34, 34, 39, 39, 92, 92, 8, 0, 9, 10, 13, 13, 32, 32, 34, 34, 36, 36, 39, 39, 60, 61, 91, 93, 3, 0, 10, 10, 13, 13, 96, 96, 5, 0, 10, 10, 13, 13, 34, 34, 92, 92, 96, 96, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 125, 125, 5, 0, 33, 33, 35, 36, 42, 42, 48, 57, 63, 64, 1, 0, 40, 41, 4, 0, 9, 10, 13, 13, 32, 32, 96, 96, 9, 0, 9, 10, 13, 13, 32, 32, 34, 34, 36, 36, 39, 39, 45, 45, 60, 61, 91, 93, 9, 0, 9, 10, 13, 13, 32, 32, 34, 34, 36, 36, 39, 39, 58, 58, 64, 64, 92, 92, 8, 0, 9, 10, 13, 13, 32, 32, 34, 34, 36, 36, 39, 39, 58, 58, 92, 92, 3, 0, 9, 9, 12, 13, 32, 32, 6, 0, 9, 10, 13, 13, 32, 32, 60, 60, 92, 92, 96, 96, 4, 0, 9, 10, 13, 13, 32, 32, 60, 60, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 10, 10, 1086, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 94, 1, 0, 0, 0, 0, 98, 1, 0, 0, 0, 0, 102, 1, 0, 0, 0, 0, 104, 1, 0, 0, 0, 0, 106, 1, 0, 0, 0, 0, 108, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 1, 116, 1, 0, 0, 0, 1, 118, 1, 0, 0, 0, 1, 120, 1, 0, 0, 0, 1, 122, 1, 0, 0, 0, 1, 124, 1, 0, 0, 0, 1, 126, 1, 0, 0, 0, 1, 128, 1, 0, 0, 0, 1, 130, 1, 0, 0, 0, 1, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 2, 156, 1, 0, 0, 0, 2, 158, 1, 0, 0, 0, 2, 160, 1, 0, 0, 0, 2, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 2, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 3, 170, 1, 0, 0, 0, 3, 172, 1, 0, 0, 0, 3, 174, 1, 0, 0, 0, 3, 176, 1, 0, 0, 0, 3, 178, 1, 0, 0, 0, 3, 180, 1, 0, 0, 0, 3, 182, 1, 0, 0, 0, 3, 184, 1, 0, 0, 0, 3, 186, 1, 0, 0, 0, 3, 188, 1, 0, 0, 0, 3, 190, 1, 0, 0, 0, 4, 194, 1, 0, 0, 0, 4, 196, 1, 0, 0, 0, 4, 198, 1, 0, 0, 0, 4, 200, 1, 0, 0, 0, 4, 202, 1, 0, 0, 0, 4, 204, 1, 0, 0, 0, 4, 206, 1, 0, 0, 0, 5, 208, 1, 0, 0, 0, 5, 210, 1, 0, 0, 0, 6, 212, 1, 0, 0, 0, 8, 246, 1, 0, 0, 0, 10, 255, 1, 0, 0, 0, 12, 262, 1, 0, 0, 0, 14, 268, 1, 0, 0, 0, 16, 274, 1, 0, 0, 0, 18, 281, 1, 0, 0, 0, 20, 289, 1, 0, 0, 0, 22, 298, 1, 0, 0, 0, 24, 304, 1, 0, 0, 0, 26, 310, 1, 0, 0, 0, 28, 317, 1, 0, 0, 0, 30, 330, 1, 0, 0, 0, 32, 339, 1, 0, 0, 0, 34, 346, 1, 0, 0, 0, 36, 356, 1, 0, 0, 0, 38, 362, 1, 0, 0, 0, 40, 372, 1, 0, 0, 0, 42, 385, 1, 0, 0, 0, 44, 399, 1, 0, 0, 0, 46, 407, 1, 0, 0, 0, 48, 420, 1, 0, 0, 0, 50, 437, 1, 0, 0, 0, 52, 441, 1, 0, 0, 0, 54, 453, 1, 0, 0, 0, 56, 456, 1, 0, 0, 0, 58, 459, 1, 0, 0, 0, 60, 462, 1, 0, 0, 0, 62, 465, 1, 0, 0, 0, 64, 472, 1, 0, 0, 0, 66, 486, 1, 0, 0, 0, 68, 522, 1, 0, 0, 0, 70, 524, 1, 0, 0, 0, 72, 529, 1, 0, 0, 0, 74, 531, 1, 0, 0, 0, 76, 534, 1, 0, 0, 0, 78, 537, 1, 0, 0, 0, 80, 549, 1, 0, 0, 0, 82, 552, 1, 0, 0, 0, 84, 563, 1, 0, 0, 0, 86, 575, 1, 0, 0, 0, 88, 578, 1, 0, 0, 0, 90, 580, 1, 0, 0, 0, 92, 614, 1, 0, 0, 0, 94, 616, 1, 0, 0, 0, 96, 619, 1, 0, 0, 0, 98, 622, 1, 0, 0, 0, 100, 645, 1, 0, 0, 0, 102, 647, 1, 0, 0, 0, 104, 658, 1, 0, 0, 0, 106, 697, 1, 0, 0, 0, 108, 702, 1, 0, 0, 0, 110, 708, 1, 0, 0, 0, 112, 711, 1, 0, 0, 0, 114, 719, 1, 0, 0, 0, 116, 722, 1, 0, 0, 0, 118, 729, 1, 0, 0, 0, 120, 734, 1, 0, 0, 0, 122, 745, 1, 0, 0, 0, 124, 755, 1, 0, 0, 0, 126, 757, 1, 0, 0, 0, 128, 759, 1, 0, 0, 0, 130, 764, 1, 0, 0, 0, 132, 771, 1, 0, 0, 0, 134, 775, 1, 0, 0, 0, 136, 779, 1, 0, 0, 0, 138, 783, 1, 0, 0, 0, 140, 787, 1, 0, 0, 0, 142, 791, 1, 0, 0, 0, 144, 798, 1, 0, 0, 0, 146, 802, 1, 0, 0, 0, 148, 804, 1, 0, 0, 0, 150, 820, 1, 0, 0, 0, 152, 825, 1, 0, 0, 0, 154, 835, 1, 0, 0, 0, 156, 839, 1, 0, 0, 0, 158, 843, 1, 0, 0, 0, 160, 847, 1, 0, 0, 0, 162, 851, 1, 0, 0, 0, 164, 855, 1, 0, 0, 0, 166, 859, 1, 0, 0, 0, 168, 863, 1, 0, 0, 0, 170, 868, 1, 0, 0, 0, 172, 875, 1, 0, 0, 0, 174, 880, 1, 0, 0, 0, 176, 891, 1, 0, 0, 0, 178, 901, 1, 0, 0, 0, 180, 905, 1, 0, 0, 0, 182, 909, 1, 0, 0, 0, 184, 913, 1, 0, 0, 0, 186, 917, 1, 0, 0, 0, 188, 921, 1, 0, 0, 0, 190, 927, 1, 0, 0, 0, 192, 933, 1, 0, 0, 0, 194, 935, 1, 0, 0, 0, 196, 939, 1, 0, 0, 0, 198, 945, 1, 0, 0, 0, 200, 951, 1, 0, 0, 0, 202, 968, 1, 0, 0, 0, 204, 981, 1, 0, 0, 0, 206, 1012, 1, 0, 0, 0, 208, 1016, 1, 0, 0, 0, 210, 1021, 1, 0, 0, 0, 212, 216, 5, 35, 0, 0, 213, 215, 3, 110, 52, 0, 214, 213, 1, 0, 0, 0, 215, 218, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 220, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 219, 221, 7, 0, 0, 0, 220, 219, 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 220, 1, 0, 0, 0, 222, 223, 1, 0, 0, 0, 223, 227, 1, 0, 0, 0, 224, 226, 3, 110, 52, 0, 225, 224, 1, 0, 0, 0, 226, 229, 1, 0, 0, 0, 227, 225, 1, 0, 0, 0, 227, 228, 1, 0, 0, 0, 228, 230, 1, 0, 0, 0, 229, 227, 1, 0, 0, 0, 230, 234, 5, 61, 0, 0, 231, 233, 3, 110, 52, 0, 232, 231, 1, 0, 0, 0, 233, 236, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 234, 235, 1, 0, 0, 0, 235, 240, 1, 0, 0, 0, 236, 234, 1, 0, 0, 0, 237, 239, 8, 1, 0, 0, 238, 237, 1, 0, 0, 0, 239, 242, 1, 0, 0, 0, 240, 238, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, 243, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 243, 244, 3, 114, 54, 0, 244, 245, 6, 0, 0, 0, 245, 7, 1, 0, 0, 0, 246, 250, 5, 35, 0, 0, 247, 249, 8, 1, 0, 0, 248, 247, 1, 0, 0, 0, 249, 252, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 253, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 253, 254, 6, 1, 1, 0, 254, 9, 1, 0, 0, 0, 255, 256, 7, 2, 0, 0, 256, 257, 7, 3, 0, 0, 257, 258, 7, 4, 0, 0, 258, 259, 7, 5, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 6, 2, 2, 0, 261, 11, 1, 0, 0, 0, 262, 263, 7, 3, 0, 0, 263, 264, 7, 6, 0, 0, 264, 265, 7, 7, 0, 0, 265, 266, 1, 0, 0, 0, 266, 267, 6, 3, 3, 0, 267, 13, 1, 0, 0, 0, 268, 269, 7, 8, 0, 0, 269, 270, 7, 5, 0, 0, 270, 271, 7, 9, 0, 0, 271, 272, 1, 0, 0, 0, 272, 273, 6, 4, 4, 0, 273, 15, 1, 0, 0, 0, 274, 275, 7, 7, 0, 0, 275, 276, 7, 4, 0, 0, 276, 277, 7, 7, 0, 0, 277, 278, 7, 10, 0, 0, 278, 279, 1, 0, 0, 0, 279, 280, 6, 5, 5, 0, 280, 17, 1, 0, 0, 0, 281, 282, 7, 11, 0, 0, 282, 283, 7, 12, 0, 0, 283, 284, 7, 13, 0, 0, 284, 285, 7, 10, 0, 0, 285, 286, 7, 11, 0, 0, 286, 287, 1, 0, 0, 0, 287, 288, 6, 6, 6, 0, 288, 19, 1, 0, 0, 0, 289, 290, 7, 10, 0, 0, 290, 291, 7, 14, 0, 0, 291, 292, 7, 15, 0, 0, 292, 293, 7, 4, 0, 0, 293, 294, 7, 16, 0, 0, 294, 295, 7, 10, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 6, 7, 7, 0, 297, 21, 1, 0, 0, 0, 298, 299, 7, 10, 0, 0, 299, 300, 7, 7, 0, 0, 300, 301, 7, 17, 0, 0, 301, 302, 1, 0, 0, 0, 302, 303, 6, 8, 8, 0, 303, 23, 1, 0, 0, 0, 304, 305, 7, 12, 0, 0, 305, 306, 7, 9, 0, 0, 306, 307, 7, 9, 0, 0, 307, 308, 1, 0, 0, 0, 308, 309, 6, 9, 9, 0, 309, 25, 1, 0, 0, 0, 310, 311, 7, 8, 0, 0, 311, 312, 7, 4, 0, 0, 312, 313, 7, 15, 0, 0, 313, 314, 7, 18, 0, 0, 314, 315, 1, 0, 0, 0, 315, 316, 6, 10, 10, 0, 316, 27, 1, 0, 0, 0, 317, 318, 7, 10, 0, 0, 318, 319, 7, 7, 0, 0, 319, 320, 7, 19, 0, 0, 320, 321, 7, 3, 0, 0, 321, 322, 7, 18, 0, 0, 322, 323, 7, 15, 0, 0, 323, 324, 7, 4, 0, 0, 324, 325, 7, 20, 0, 0, 325, 326, 7, 7, 0, 0, 326, 327, 7, 19, 0, 0, 327, 328, 1, 0, 0, 0, 328, 329, 6, 11, 11, 0, 329, 29, 1, 0, 0, 0, 330, 331, 7, 17, 0, 0, 331, 332, 7, 4, 0, 0, 332, 333, 7, 11, 0, 0, 333, 334, 7, 6, 0, 0, 334, 335, 7, 5, 0, 0, 335, 336, 7, 10, 0, 0, 336, 337, 1, 0, 0, 0, 337, 338, 6, 12, 12, 0, 338, 31, 1, 0, 0, 0, 339, 340, 7, 6, 0, 0, 340, 341, 7, 16, 0, 0, 341, 342, 7, 10, 0, 0, 342, 343, 7, 3, 0, 0, 343, 344, 1, 0, 0, 0, 344, 345, 6, 13, 13, 0, 345, 33, 1, 0, 0, 0, 346, 347, 7, 21, 0, 0, 347, 348, 7, 4, 0, 0, 348, 349, 7, 3, 0, 0, 349, 350, 7, 22, 0, 0, 350, 351, 7, 9, 0, 0, 351, 352, 7, 20, 0, 0, 352, 353, 7, 3, 0, 0, 353, 354, 1, 0, 0, 0, 354, 355, 6, 14, 14, 0, 355, 35, 1, 0, 0, 0, 356, 357, 7, 12, 0, 0, 357, 358, 7, 3, 0, 0, 358, 359, 7, 23, 0, 0, 359, 360, 1, 0, 0, 0, 360, 361, 6, 15, 15, 0, 361, 37, 1, 0, 0, 0, 362, 363, 7, 4, 0, 0, 363, 364, 7, 7, 0, 0, 364, 365, 7, 13, 0, 0, 365, 366, 7, 6, 0, 0, 366, 367, 7, 20, 0, 0, 367, 368, 7, 11, 0, 0, 368, 369, 7, 9, 0, 0, 369, 370, 1, 0, 0, 0, 370, 371, 6, 16, 16, 0, 371, 39, 1, 0, 0, 0, 372, 373, 7, 16, 0, 0, 373, 374, 7, 19, 0, 0, 374, 375, 7, 4, 0, 0, 375, 376, 7, 15, 0, 0, 376, 377, 7, 16, 0, 0, 377, 378, 7, 20, 0, 0, 378, 379, 7, 23, 0, 0, 379, 380, 7, 7, 0, 0, 380, 381, 7, 12, 0, 0, 381, 382, 7, 11, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 6, 17, 17, 0, 384, 41, 1, 0, 0, 0, 385, 386, 7, 24, 0, 0, 386, 387, 7, 10, 0, 0, 387, 388, 7, 12, 0, 0, 388, 389, 7, 11, 0, 0, 389, 390, 7, 19, 0, 0, 390, 391, 7, 24, 0, 0, 391, 392, 7, 8, 0, 0, 392, 393, 7, 24, 0, 0, 393, 394, 7, 10, 0, 0, 394, 395, 7, 8, 0, 0, 395, 396, 7, 22, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 6, 18, 18, 0, 398, 43, 1, 0, 0, 0, 399, 400, 7, 16, 0, 0, 400, 401, 7, 24, 0, 0, 401, 402, 7, 10, 0, 0, 402, 403, 7, 11, 0, 0, 403, 404, 7, 11, 0, 0, 404, 405, 1, 0, 0, 0, 405, 406, 6, 19, 19, 0, 406, 45, 1, 0, 0, 0, 407, 408, 7, 5, 0, 0, 408, 409, 7, 12, 0, 0, 409, 410, 7, 20, 0, 0, 410, 411, 7, 7, 0, 0, 411, 412, 7, 19, 0, 0, 412, 413, 7, 12, 0, 0, 413, 414, 7, 20, 0, 0, 414, 415, 7, 7, 0, 0, 415, 416, 7, 10, 0, 0, 416, 417, 7, 3, 0, 0, 417, 418, 1, 0, 0, 0, 418, 419, 6, 20, 20, 0, 419, 47, 1, 0, 0, 0, 420, 421, 5, 60, 0, 0, 421, 422, 5, 60, 0, 0, 422, 424, 1, 0, 0, 0, 423, 425, 5, 45, 0, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 430, 7, 0, 0, 0, 427, 429, 7, 25, 0, 0, 428, 427, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 428, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 433, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 433, 434, 6, 21, 21, 0, 434, 435, 1, 0, 0, 0, 435, 436, 6, 21, 22, 0, 436, 49, 1, 0, 0, 0, 437, 438, 3, 52, 23, 0, 438, 439, 1, 0, 0, 0, 439, 440, 6, 22, 1, 0, 440, 51, 1, 0, 0, 0, 441, 445, 7, 26, 0, 0, 442, 444, 7, 27, 0, 0, 443, 442, 1, 0, 0, 0, 444, 447, 1, 0, 0, 0, 445, 443, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 449, 1, 0, 0, 0, 447, 445, 1, 0, 0, 0, 448, 450, 5, 13, 0, 0, 449, 448, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 5, 10, 0, 0, 452, 53, 1, 0, 0, 0, 453, 454, 5, 91, 0, 0, 454, 455, 6, 24, 23, 0, 455, 55, 1, 0, 0, 0, 456, 457, 5, 93, 0, 0, 457, 458, 6, 25, 24, 0, 458, 57, 1, 0, 0, 0, 459, 460, 5, 44, 0, 0, 460, 461, 6, 26, 25, 0, 461, 59, 1, 0, 0, 0, 462, 463, 5, 61, 0, 0, 463, 464, 6, 27, 26, 0, 464, 61, 1, 0, 0, 0, 465, 466, 5, 45, 0, 0, 466, 467, 5, 45, 0, 0, 467, 468, 1, 0, 0, 0, 468, 469, 4, 28, 0, 0, 469, 470, 3, 66, 30, 0, 470, 471, 6, 28, 27, 0, 471, 63, 1, 0, 0, 0, 472, 473, 5, 45, 0, 0, 473, 474, 5, 45, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 4, 29, 1, 0, 476, 477, 7, 2, 0, 0, 477, 478, 7, 3, 0, 0, 478, 479, 7, 4, 0, 0, 479, 480, 7, 5, 0, 0, 480, 481, 5, 61, 0, 0, 481, 482, 1, 0, 0, 0, 482, 483, 6, 29, 28, 0, 483, 484, 1, 0, 0, 0, 484, 485, 6, 29, 29, 0, 485, 65, 1, 0, 0, 0, 486, 490, 7, 28, 0, 0, 487, 489, 7, 29, 0, 0, 488, 487, 1, 0, 0, 0, 489, 492, 1, 0, 0, 0, 490, 488, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 499, 1, 0, 0, 0, 492, 490, 1, 0, 0, 0, 493, 495, 5, 61, 0, 0, 494, 496, 3, 68, 31, 0, 495, 494, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 495, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 500, 1, 0, 0, 0, 499, 493, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 67, 1, 0, 0, 0, 501, 507, 5, 34, 0, 0, 502, 503, 5, 92, 0, 0, 503, 506, 8, 1, 0, 0, 504, 506, 8, 30, 0, 0, 505, 502, 1, 0, 0, 0, 505, 504, 1, 0, 0, 0, 506, 509, 1, 0, 0, 0, 507, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 510, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 510, 523, 5, 34, 0, 0, 511, 515, 5, 39, 0, 0, 512, 514, 8, 31, 0, 0, 513, 512, 1, 0, 0, 0, 514, 517, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 515, 516, 1, 0, 0, 0, 516, 518, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 518, 523, 5, 39, 0, 0, 519, 523, 8, 32, 0, 0, 520, 521, 5, 92, 0, 0, 521, 523, 8, 1, 0, 0, 522, 501, 1, 0, 0, 0, 522, 511, 1, 0, 0, 0, 522, 519, 1, 0, 0, 0, 522, 520, 1, 0, 0, 0, 523, 69, 1, 0, 0, 0, 524, 525, 5, 45, 0, 0, 525, 526, 5, 45, 0, 0, 526, 527, 1, 0, 0, 0, 527, 528, 6, 32, 30, 0, 528, 71, 1, 0, 0, 0, 529, 530, 8, 33, 0, 0, 530, 73, 1, 0, 0, 0, 531, 532, 5, 92, 0, 0, 532, 533, 9, 0, 0, 0, 533, 75, 1, 0, 0, 0, 534, 535, 3, 78, 36, 0, 535, 536, 6, 35, 31, 0, 536, 77, 1, 0, 0, 0, 537, 544, 5, 34, 0, 0, 538, 543, 3, 86, 40, 0, 539, 543, 3, 84, 39, 0, 540, 543, 7, 34, 0, 0, 541, 543, 8, 35, 0, 0, 542, 538, 1, 0, 0, 0, 542, 539, 1, 0, 0, 0, 542, 540, 1, 0, 0, 0, 542, 541, 1, 0, 0, 0, 543, 546, 1, 0, 0, 0, 544, 542, 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 547, 1, 0, 0, 0, 546, 544, 1, 0, 0, 0, 547, 548, 5, 34, 0, 0, 548, 79, 1, 0, 0, 0, 549, 550, 3, 82, 38, 0, 550, 551, 6, 37, 32, 0, 551, 81, 1, 0, 0, 0, 552, 558, 5, 39, 0, 0, 553, 557, 3, 84, 39, 0, 554, 557, 7, 1, 0, 0, 555, 557, 8, 31, 0, 0, 556, 553, 1, 0, 0, 0, 556, 554, 1, 0, 0, 0, 556, 555, 1, 0, 0, 0, 557, 560, 1, 0, 0, 0, 558, 556, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 561, 1, 0, 0, 0, 560, 558, 1, 0, 0, 0, 561, 562, 5, 39, 0, 0, 562, 83, 1, 0, 0, 0, 563, 567, 7, 26, 0, 0, 564, 566, 7, 27, 0, 0, 565, 564, 1, 0, 0, 0, 566, 569, 1, 0, 0, 0, 567, 565, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 571, 1, 0, 0, 0, 569, 567, 1, 0, 0, 0, 570, 572, 7, 1, 0, 0, 571, 570, 1, 0, 0, 0, 572, 573, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 85, 1, 0, 0, 0, 575, 576, 5, 92, 0, 0, 576, 577, 8, 1, 0, 0, 577, 87, 1, 0, 0, 0, 578, 579, 7, 36, 0, 0, 579, 89, 1, 0, 0, 0, 580, 581, 3, 92, 43, 0, 581, 582, 6, 42, 33, 0, 582, 91, 1, 0, 0, 0, 583, 584, 5, 36, 0, 0, 584, 585, 5, 123, 0, 0, 585, 589, 7, 0, 0, 0, 586, 588, 7, 25, 0, 0, 587, 586, 1, 0, 0, 0, 588, 591, 1, 0, 0, 0, 589, 587, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 597, 1, 0, 0, 0, 591, 589, 1, 0, 0, 0, 592, 593, 5, 58, 0, 0, 593, 598, 5, 45, 0, 0, 594, 595, 5, 58, 0, 0, 595, 598, 5, 43, 0, 0, 596, 598, 5, 58, 0, 0, 597, 592, 1, 0, 0, 0, 597, 594, 1, 0, 0, 0, 597, 596, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 602, 1, 0, 0, 0, 599, 601, 8, 37, 0, 0, 600, 599, 1, 0, 0, 0, 601, 604, 1, 0, 0, 0, 602, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 605, 1, 0, 0, 0, 604, 602, 1, 0, 0, 0, 605, 615, 5, 125, 0, 0, 606, 607, 5, 36, 0, 0, 607, 611, 7, 0, 0, 0, 608, 610, 7, 25, 0, 0, 609, 608, 1, 0, 0, 0, 610, 613, 1, 0, 0, 0, 611, 609, 1, 0, 0, 0, 611, 612, 1, 0, 0, 0, 612, 615, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 614, 583, 1, 0, 0, 0, 614, 606, 1, 0, 0, 0, 615, 93, 1, 0, 0, 0, 616, 617, 3, 96, 45, 0, 617, 618, 6, 44, 34, 0, 618, 95, 1, 0, 0, 0, 619, 620, 5, 36, 0, 0, 620, 621, 7, 38, 0, 0, 621, 97, 1, 0, 0, 0, 622, 623, 5, 36, 0, 0, 623, 624, 5, 40, 0, 0, 624, 637, 1, 0, 0, 0, 625, 636, 3, 98, 46, 0, 626, 636, 8, 39, 0, 0, 627, 631, 5, 40, 0, 0, 628, 630, 3, 100, 47, 0, 629, 628, 1, 0, 0, 0, 630, 633, 1, 0, 0, 0, 631, 629, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 634, 1, 0, 0, 0, 633, 631, 1, 0, 0, 0, 634, 636, 5, 41, 0, 0, 635, 625, 1, 0, 0, 0, 635, 626, 1, 0, 0, 0, 635, 627, 1, 0, 0, 0, 636, 639, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 640, 1, 0, 0, 0, 639, 637, 1, 0, 0, 0, 640, 641, 5, 41, 0, 0, 641, 642, 6, 46, 35, 0, 642, 99, 1, 0, 0, 0, 643, 646, 3, 98, 46, 0, 644, 646, 8, 39, 0, 0, 645, 643, 1, 0, 0, 0, 645, 644, 1, 0, 0, 0, 646, 101, 1, 0, 0, 0, 647, 648, 5, 96, 0, 0, 648, 652, 8, 40, 0, 0, 649, 651, 8, 34, 0, 0, 650, 649, 1, 0, 0, 0, 651, 654, 1, 0, 0, 0, 652, 650, 1, 0, 0, 0, 652, 653, 1, 0, 0, 0, 653, 655, 1, 0, 0, 0, 654, 652, 1, 0, 0, 0, 655, 656, 5, 96, 0, 0, 656, 657, 6, 48, 36, 0, 657, 103, 1, 0, 0, 0, 658, 659, 5, 36, 0, 0, 659, 660, 6, 49, 37, 0, 660, 105, 1, 0, 0, 0, 661, 666, 8, 41, 0, 0, 662, 665, 3, 72, 33, 0, 663, 665, 3, 74, 34, 0, 664, 662, 1, 0, 0, 0, 664, 663, 1, 0, 0, 0, 665, 668, 1, 0, 0, 0, 666, 664, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 698, 1, 0, 0, 0, 668, 666, 1, 0, 0, 0, 669, 670, 5, 45, 0, 0, 670, 675, 8, 41, 0, 0, 671, 674, 3, 72, 33, 0, 672, 674, 3, 74, 34, 0, 673, 671, 1, 0, 0, 0, 673, 672, 1, 0, 0, 0, 674, 677, 1, 0, 0, 0, 675, 673, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 698, 1, 0, 0, 0, 677, 675, 1, 0, 0, 0, 678, 698, 5, 45, 0, 0, 679, 680, 5, 60, 0, 0, 680, 685, 8, 33, 0, 0, 681, 684, 3, 72, 33, 0, 682, 684, 3, 74, 34, 0, 683, 681, 1, 0, 0, 0, 683, 682, 1, 0, 0, 0, 684, 687, 1, 0, 0, 0, 685, 683, 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 686, 698, 1, 0, 0, 0, 687, 685, 1, 0, 0, 0, 688, 698, 5, 60, 0, 0, 689, 694, 3, 74, 34, 0, 690, 693, 3, 72, 33, 0, 691, 693, 3, 74, 34, 0, 692, 690, 1, 0, 0, 0, 692, 691, 1, 0, 0, 0, 693, 696, 1, 0, 0, 0, 694, 692, 1, 0, 0, 0, 694, 695, 1, 0, 0, 0, 695, 698, 1, 0, 0, 0, 696, 694, 1, 0, 0, 0, 697, 661, 1, 0, 0, 0, 697, 669, 1, 0, 0, 0, 697, 678, 1, 0, 0, 0, 697, 679, 1, 0, 0, 0, 697, 688, 1, 0, 0, 0, 697, 689, 1, 0, 0, 0, 698, 699, 1, 0, 0, 0, 699, 700, 6, 50, 38, 0, 700, 107, 1, 0, 0, 0, 701, 703, 3, 110, 52, 0, 702, 701, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 702, 1, 0, 0, 0, 704, 705, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 707, 6, 51, 1, 0, 707, 109, 1, 0, 0, 0, 708, 709, 7, 27, 0, 0, 709, 111, 1, 0, 0, 0, 710, 712, 3, 114, 54, 0, 711, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 711, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 716, 6, 53, 39, 0, 716, 717, 1, 0, 0, 0, 717, 718, 6, 53, 1, 0, 718, 113, 1, 0, 0, 0, 719, 720, 7, 1, 0, 0, 720, 115, 1, 0, 0, 0, 721, 723, 3, 110, 52, 0, 722, 721, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 727, 6, 55, 40, 0, 727, 728, 6, 55, 1, 0, 728, 117, 1, 0, 0, 0, 729, 730, 3, 52, 23, 0, 730, 731, 1, 0, 0, 0, 731, 732, 6, 56, 41, 0, 732, 733, 6, 56, 1, 0, 733, 119, 1, 0, 0, 0, 734, 738, 5, 35, 0, 0, 735, 737, 8, 1, 0, 0, 736, 735, 1, 0, 0, 0, 737, 740, 1, 0, 0, 0, 738, 736, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 741, 1, 0, 0, 0, 740, 738, 1, 0, 0, 0, 741, 742, 6, 57, 42, 0, 742, 743, 6, 57, 1, 0, 743, 121, 1, 0, 0, 0, 744, 746, 3, 114, 54, 0, 745, 744, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 6, 58, 43, 0, 750, 751, 1, 0, 0, 0, 751, 752, 6, 58, 44, 0, 752, 753, 6, 58, 1, 0, 753, 754, 6, 58, 45, 0, 754, 123, 1, 0, 0, 0, 755, 756, 5, 58, 0, 0, 756, 125, 1, 0, 0, 0, 757, 758, 5, 64, 0, 0, 758, 127, 1, 0, 0, 0, 759, 760, 7, 12, 0, 0, 760, 761, 7, 16, 0, 0, 761, 762, 1, 0, 0, 0, 762, 763, 6, 61, 45, 0, 763, 129, 1, 0, 0, 0, 764, 765, 5, 45, 0, 0, 765, 766, 5, 45, 0, 0, 766, 767, 1, 0, 0, 0, 767, 768, 3, 66, 30, 0, 768, 769, 1, 0, 0, 0, 769, 770, 6, 62, 46, 0, 770, 131, 1, 0, 0, 0, 771, 772, 3, 78, 36, 0, 772, 773, 1, 0, 0, 0, 773, 774, 6, 63, 47, 0, 774, 133, 1, 0, 0, 0, 775, 776, 3, 82, 38, 0, 776, 777, 1, 0, 0, 0, 777, 778, 6, 64, 48, 0, 778, 135, 1, 0, 0, 0, 779, 780, 3, 92, 43, 0, 780, 781, 1, 0, 0, 0, 781, 782, 6, 65, 49, 0, 782, 137, 1, 0, 0, 0, 783, 784, 3, 96, 45, 0, 784, 785, 1, 0, 0, 0, 785, 786, 6, 66, 50, 0, 786, 139, 1, 0, 0, 0, 787, 788, 5, 36, 0, 0, 788, 789, 1, 0, 0, 0, 789, 790, 6, 67, 51, 0, 790, 141, 1, 0, 0, 0, 791, 792, 3, 144, 69, 0, 792, 793, 1, 0, 0, 0, 793, 794, 6, 68, 52, 0, 794, 143, 1, 0, 0, 0, 795, 799, 3, 146, 70, 0, 796, 799, 3, 86, 40, 0, 797, 799, 3, 148, 71, 0, 798, 795, 1, 0, 0, 0, 798, 796, 1, 0, 0, 0, 798, 797, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 798, 1, 0, 0, 0, 800, 801, 1, 0, 0, 0, 801, 145, 1, 0, 0, 0, 802, 803, 8, 42, 0, 0, 803, 147, 1, 0, 0, 0, 804, 809, 5, 58, 0, 0, 805, 808, 3, 146, 70, 0, 806, 808, 5, 58, 0, 0, 807, 805, 1, 0, 0, 0, 807, 806, 1, 0, 0, 0, 808, 811, 1, 0, 0, 0, 809, 807, 1, 0, 0, 0, 809, 810, 1, 0, 0, 0, 810, 812, 1, 0, 0, 0, 811, 809, 1, 0, 0, 0, 812, 813, 5, 47, 0, 0, 813, 149, 1, 0, 0, 0, 814, 816, 3, 110, 52, 0, 815, 814, 1, 0, 0, 0, 816, 817, 1, 0, 0, 0, 817, 815, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 821, 1, 0, 0, 0, 819, 821, 3, 52, 23, 0, 820, 815, 1, 0, 0, 0, 820, 819, 1, 0, 0, 0, 821, 822, 1, 0, 0, 0, 822, 823, 6, 72, 45, 0, 823, 151, 1, 0, 0, 0, 824, 826, 3, 114, 54, 0, 825, 824, 1, 0, 0, 0, 826, 827, 1, 0, 0, 0, 827, 825, 1, 0, 0, 0, 827, 828, 1, 0, 0, 0, 828, 829, 1, 0, 0, 0, 829, 830, 6, 73, 53, 0, 830, 831, 1, 0, 0, 0, 831, 832, 6, 73, 44, 0, 832, 833, 6, 73, 1, 0, 833, 834, 6, 73, 45, 0, 834, 153, 1, 0, 0, 0, 835, 836, 5, 58, 0, 0, 836, 837, 1, 0, 0, 0, 837, 838, 6, 74, 54, 0, 838, 155, 1, 0, 0, 0, 839, 840, 5, 64, 0, 0, 840, 841, 1, 0, 0, 0, 841, 842, 6, 75, 55, 0, 842, 157, 1, 0, 0, 0, 843, 844, 3, 78, 36, 0, 844, 845, 1, 0, 0, 0, 845, 846, 6, 76, 47, 0, 846, 159, 1, 0, 0, 0, 847, 848, 3, 82, 38, 0, 848, 849, 1, 0, 0, 0, 849, 850, 6, 77, 48, 0, 850, 161, 1, 0, 0, 0, 851, 852, 3, 92, 43, 0, 852, 853, 1, 0, 0, 0, 853, 854, 6, 78, 49, 0, 854, 163, 1, 0, 0, 0, 855, 856, 3, 96, 45, 0, 856, 857, 1, 0, 0, 0, 857, 858, 6, 79, 50, 0, 858, 165, 1, 0, 0, 0, 859, 860, 5, 36, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 6, 80, 51, 0, 862, 167, 1, 0, 0, 0, 863, 864, 3, 144, 69, 0, 864, 865, 1, 0, 0, 0, 865, 866, 6, 81, 52, 0, 866, 169, 1, 0, 0, 0, 867, 869, 3, 110, 52, 0, 868, 867, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 868, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 873, 6, 82, 40, 0, 873, 874, 6, 82, 1, 0, 874, 171, 1, 0, 0, 0, 875, 876, 3, 52, 23, 0, 876, 877, 1, 0, 0, 0, 877, 878, 6, 83, 41, 0, 878, 879, 6, 83, 1, 0, 879, 173, 1, 0, 0, 0, 880, 884, 5, 35, 0, 0, 881, 883, 8, 1, 0, 0, 882, 881, 1, 0, 0, 0, 883, 886, 1, 0, 0, 0, 884, 882, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 887, 1, 0, 0, 0, 886, 884, 1, 0, 0, 0, 887, 888, 6, 84, 42, 0, 888, 889, 6, 84, 1, 0, 889, 175, 1, 0, 0, 0, 890, 892, 3, 114, 54, 0, 891, 890, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 891, 1, 0, 0, 0, 893, 894, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 896, 6, 85, 56, 0, 896, 897, 1, 0, 0, 0, 897, 898, 6, 85, 44, 0, 898, 899, 6, 85, 1, 0, 899, 900, 6, 85, 45, 0, 900, 177, 1, 0, 0, 0, 901, 902, 5, 58, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 6, 86, 54, 0, 904, 179, 1, 0, 0, 0, 905, 906, 3, 78, 36, 0, 906, 907, 1, 0, 0, 0, 907, 908, 6, 87, 47, 0, 908, 181, 1, 0, 0, 0, 909, 910, 3, 82, 38, 0, 910, 911, 1, 0, 0, 0, 911, 912, 6, 88, 48, 0, 912, 183, 1, 0, 0, 0, 913, 914, 3, 92, 43, 0, 914, 915, 1, 0, 0, 0, 915, 916, 6, 89, 49, 0, 916, 185, 1, 0, 0, 0, 917, 918, 3, 96, 45, 0, 918, 919, 1, 0, 0, 0, 919, 920, 6, 90, 50, 0, 920, 187, 1, 0, 0, 0, 921, 922, 5, 36, 0, 0, 922, 923, 1, 0, 0, 0, 923, 924, 6, 91, 51, 0, 924, 189, 1, 0, 0, 0, 925, 928, 3, 192, 93, 0, 926, 928, 3, 74, 34, 0, 927, 925, 1, 0, 0, 0, 927, 926, 1, 0, 0, 0, 928, 929, 1, 0, 0, 0, 929, 927, 1, 0, 0, 0, 929, 930, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 932, 6, 92, 52, 0, 932, 191, 1, 0, 0, 0, 933, 934, 8, 43, 0, 0, 934, 193, 1, 0, 0, 0, 935, 936, 3, 52, 23, 0, 936, 937, 1, 0, 0, 0, 937, 938, 6, 94, 1, 0, 938, 195, 1, 0, 0, 0, 939, 940, 5, 10, 0, 0, 940, 941, 1, 0, 0, 0, 941, 942, 6, 95, 44, 0, 942, 943, 6, 95, 57, 0, 943, 197, 1, 0, 0, 0, 944, 946, 7, 44, 0, 0, 945, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 945, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 949, 1, 0, 0, 0, 949, 950, 6, 96, 1, 0, 950, 199, 1, 0, 0, 0, 951, 952, 5, 47, 0, 0, 952, 953, 5, 42, 0, 0, 953, 957, 1, 0, 0, 0, 954, 956, 9, 0, 0, 0, 955, 954, 1, 0, 0, 0, 956, 959, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 957, 955, 1, 0, 0, 0, 958, 960, 1, 0, 0, 0, 959, 957, 1, 0, 0, 0, 960, 961, 5, 42, 0, 0, 961, 962, 5, 47, 0, 0, 962, 963, 1, 0, 0, 0, 963, 964, 6, 97, 1, 0, 964, 201, 1, 0, 0, 0, 965, 966, 5, 47, 0, 0, 966, 969, 5, 47, 0, 0, 967, 969, 5, 35, 0, 0, 968, 965, 1, 0, 0, 0, 968, 967, 1, 0, 0, 0, 969, 973, 1, 0, 0, 0, 970, 972, 8, 1, 0, 0, 971, 970, 1, 0, 0, 0, 972, 975, 1, 0, 0, 0, 973, 971, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 977, 1, 0, 0, 0, 975, 973, 1, 0, 0, 0, 976, 978, 5, 13, 0, 0, 977, 976, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 980, 6, 98, 1, 0, 980, 203, 1, 0, 0, 0, 981, 982, 5, 60, 0, 0, 982, 983, 5, 60, 0, 0, 983, 985, 1, 0, 0, 0, 984, 986, 5, 45, 0, 0, 985, 984, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 991, 7, 0, 0, 0, 988, 990, 7, 25, 0, 0, 989, 988, 1, 0, 0, 0, 990, 993, 1, 0, 0, 0, 991, 989, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 994, 1, 0, 0, 0, 993, 991, 1, 0, 0, 0, 994, 995, 6, 99, 58, 0, 995, 996, 1, 0, 0, 0, 996, 997, 6, 99, 59, 0, 997, 205, 1, 0, 0, 0, 998, 1000, 8, 45, 0, 0, 999, 998, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 999, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1013, 1, 0, 0, 0, 1003, 1004, 5, 60, 0, 0, 1004, 1008, 8, 46, 0, 0, 1005, 1007, 8, 47, 0, 0, 1006, 1005, 1, 0, 0, 0, 1007, 1010, 1, 0, 0, 0, 1008, 1006, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 1013, 1, 0, 0, 0, 1010, 1008, 1, 0, 0, 0, 1011, 1013, 5, 60, 0, 0, 1012, 999, 1, 0, 0, 0, 1012, 1003, 1, 0, 0, 0, 1012, 1011, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1015, 6, 100, 52, 0, 1015, 207, 1, 0, 0, 0, 1016, 1017, 5, 10, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 6, 101, 44, 0, 1019, 209, 1, 0, 0, 0, 1020, 1022, 8, 48, 0, 0, 1021, 1020, 1, 0, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1021, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 6, 102, 60, 0, 1026, 211, 1, 0, 0, 0, 76, 0, 1, 2, 3, 4, 5, 216, 222, 227, 234, 240, 250, 424, 430, 445, 449, 490, 497, 499, 505, 507, 515, 522, 542, 544, 556, 558, 567, 573, 589, 597, 602, 611, 614, 631, 635, 637, 645, 652, 664, 666, 673, 675, 683, 685, 692, 694, 697, 704, 713, 724, 738, 747, 798, 800, 807, 809, 817, 820, 827, 870, 884, 893, 927, 929, 947, 957, 968, 973, 977, 985, 991, 1001, 1008, 1012, 1023, 61, 1, 0, 0, 0, 1, 0, 1, 2, 1, 1, 3, 2, 1, 4, 3, 1, 5, 4, 1, 6, 5, 1, 7, 6, 1, 8, 7, 1, 9, 8, 1, 10, 9, 1, 11, 10, 1, 12, 11, 1, 13, 12, 1, 14, 13, 1, 15, 14, 1, 16, 15, 1, 17, 16, 1, 18, 17, 1, 19, 18, 1, 20, 19, 1, 21, 20, 5, 4, 0, 1, 24, 21, 1, 25, 22, 1, 26, 23, 1, 27, 24, 1, 28, 25, 1, 29, 26, 5, 2, 0, 1, 32, 27, 1, 35, 28, 1, 37, 29, 1, 42, 30, 1, 44, 31, 1, 46, 32, 1, 48, 33, 1, 49, 34, 1, 50, 35, 1, 53, 36, 7, 39, 0, 7, 23, 0, 7, 2, 0, 1, 58, 37, 7, 40, 0, 4, 0, 0, 7, 28, 0, 7, 31, 0, 7, 32, 0, 7, 33, 0, 7, 34, 0, 7, 37, 0, 7, 38, 0, 1, 73, 38, 7, 41, 0, 7, 42, 0, 1, 85, 39, 2, 5, 0, 1, 99, 40, 7, 22, 0, 1, 102, 41] \ No newline at end of file diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerLexer.java b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerLexer.java index 2edbec1e0f..3a48944cba 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerLexer.java +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerLexer.java @@ -38,18 +38,20 @@ public class DockerLexer extends Lexer { EXPOSE=8, ENV=9, ADD=10, COPY=11, ENTRYPOINT=12, VOLUME=13, USER=14, WORKDIR=15, ARG=16, ONBUILD=17, STOPSIGNAL=18, HEALTHCHECK=19, SHELL=20, MAINTAINER=21, HEREDOC_START=22, LINE_CONTINUATION=23, LBRACKET=24, RBRACKET=25, COMMA=26, - EQUALS=27, FLAG=28, DASH_DASH=29, DOUBLE_QUOTED_STRING=30, SINGLE_QUOTED_STRING=31, - ENV_VAR=32, SPECIAL_VAR=33, COMMAND_SUBST=34, BACKTICK_SUBST=35, DOLLAR=36, - UNQUOTED_TEXT=37, WS=38, NEWLINE=39, COLON=40, AT=41, AS=42, HP_LINE_CONTINUATION=43, - HP_WS=44, HP_COMMENT=45, HP_LINE_COMMENT=46, HEREDOC_CONTENT=47, H_NEWLINE=48; + EQUALS=27, FLAG=28, FROM_FLAG=29, DASH_DASH=30, DOUBLE_QUOTED_STRING=31, + SINGLE_QUOTED_STRING=32, ENV_VAR=33, SPECIAL_VAR=34, COMMAND_SUBST=35, + BACKTICK_SUBST=36, DOLLAR=37, UNQUOTED_TEXT=38, WS=39, NEWLINE=40, COLON=41, + AT=42, AS=43, FLAG_END=44, HP_LINE_CONTINUATION=45, HP_WS=46, HP_COMMENT=47, + HP_LINE_COMMENT=48, HEREDOC_CONTENT=49, H_NEWLINE=50; public static final int - IMAGE_REF=1, USER_SPEC=2, HEREDOC_PREAMBLE=3, HEREDOC=4; + IMAGE_REF=1, FLAG_IMAGE_REF=2, USER_SPEC=3, HEREDOC_PREAMBLE=4, HEREDOC=5; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; public static String[] modeNames = { - "DEFAULT_MODE", "IMAGE_REF", "USER_SPEC", "HEREDOC_PREAMBLE", "HEREDOC" + "DEFAULT_MODE", "IMAGE_REF", "FLAG_IMAGE_REF", "USER_SPEC", "HEREDOC_PREAMBLE", + "HEREDOC" }; private static String[] makeRuleNames() { @@ -58,15 +60,18 @@ private static String[] makeRuleNames() { "EXPOSE", "ENV", "ADD", "COPY", "ENTRYPOINT", "VOLUME", "USER", "WORKDIR", "ARG", "ONBUILD", "STOPSIGNAL", "HEALTHCHECK", "SHELL", "MAINTAINER", "HEREDOC_START", "LINE_CONTINUATION", "LINE_CONT", "LBRACKET", "RBRACKET", - "COMMA", "EQUALS", "FLAG", "FLAG_TOKEN", "FLAG_VALUE_PART", "DASH_DASH", - "UNQUOTED_CHAR", "ESCAPED_CHAR", "DOUBLE_QUOTED_STRING", "DQ_STRING", - "SINGLE_QUOTED_STRING", "SQ_STRING", "INLINE_CONTINUATION", "ESCAPE_SEQUENCE", - "HEX_DIGIT", "ENV_VAR", "VAR_REF", "SPECIAL_VAR", "SPECIAL_VAR_REF", - "COMMAND_SUBST", "COMMAND_SUBST_INNER", "BACKTICK_SUBST", "DOLLAR", "UNQUOTED_TEXT", - "WS", "WS_CHAR", "NEWLINE", "NEWLINE_CHAR", "IR_WS", "IR_LINE_CONTINUATION", - "IR_COMMENT", "IR_NEWLINE", "COLON", "AT", "AS", "IR_FLAG", "IR_DOUBLE_QUOTED_STRING", - "IR_SINGLE_QUOTED_STRING", "IR_ENV_VAR", "IR_SPECIAL_VAR", "IR_DOLLAR", - "IR_UNQUOTED_TEXT", "IR_TEXT_CHAR", "IR_PORT_COLON", "US_WS", "US_LINE_CONTINUATION", + "COMMA", "EQUALS", "FLAG", "FROM_FLAG", "FLAG_BODY", "FLAG_VALUE_PART", + "DASH_DASH", "UNQUOTED_CHAR", "ESCAPED_CHAR", "DOUBLE_QUOTED_STRING", + "DQ_STRING", "SINGLE_QUOTED_STRING", "SQ_STRING", "INLINE_CONTINUATION", + "ESCAPE_SEQUENCE", "HEX_DIGIT", "ENV_VAR", "VAR_REF", "SPECIAL_VAR", + "SPECIAL_VAR_REF", "COMMAND_SUBST", "COMMAND_SUBST_INNER", "BACKTICK_SUBST", + "DOLLAR", "UNQUOTED_TEXT", "WS", "WS_CHAR", "NEWLINE", "NEWLINE_CHAR", + "IR_WS", "IR_LINE_CONTINUATION", "IR_COMMENT", "IR_NEWLINE", "COLON", + "AT", "AS", "IR_FLAG", "IR_DOUBLE_QUOTED_STRING", "IR_SINGLE_QUOTED_STRING", + "IR_ENV_VAR", "IR_SPECIAL_VAR", "IR_DOLLAR", "IR_UNQUOTED_TEXT", "IR_TEXT", + "IR_TEXT_CHAR", "IR_PORT_COLON", "FLAG_END", "FIR_NEWLINE", "FIR_COLON", + "FIR_AT", "FIR_DOUBLE_QUOTED_STRING", "FIR_SINGLE_QUOTED_STRING", "FIR_ENV_VAR", + "FIR_SPECIAL_VAR", "FIR_DOLLAR", "FIR_UNQUOTED_TEXT", "US_WS", "US_LINE_CONTINUATION", "US_COMMENT", "US_NEWLINE", "US_COLON", "US_DOUBLE_QUOTED_STRING", "US_SINGLE_QUOTED_STRING", "US_ENV_VAR", "US_SPECIAL_VAR", "US_DOLLAR", "US_UNQUOTED_TEXT", "US_TEXT_CHAR", "HP_LINE_CONTINUATION", "HP_NEWLINE", "HP_WS", "HP_COMMENT", "HP_LINE_COMMENT", @@ -80,9 +85,9 @@ private static String[] makeLiteralNames() { null, null, null, "'FROM'", "'RUN'", "'CMD'", "'NONE'", "'LABEL'", "'EXPOSE'", "'ENV'", "'ADD'", "'COPY'", "'ENTRYPOINT'", "'VOLUME'", "'USER'", "'WORKDIR'", "'ARG'", "'ONBUILD'", "'STOPSIGNAL'", "'HEALTHCHECK'", "'SHELL'", "'MAINTAINER'", - null, null, "'['", "']'", "','", "'='", null, "'--'", null, null, null, - null, null, null, null, null, null, null, null, "'@'", "'AS'", null, - null, null, null, null, "'\\n'" + null, null, "'['", "']'", "','", "'='", null, null, "'--'", null, null, + null, null, null, null, null, null, null, null, null, null, "'AS'", null, + null, null, null, null, null, "'\\n'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -92,9 +97,9 @@ private static String[] makeSymbolicNames() { "EXPOSE", "ENV", "ADD", "COPY", "ENTRYPOINT", "VOLUME", "USER", "WORKDIR", "ARG", "ONBUILD", "STOPSIGNAL", "HEALTHCHECK", "SHELL", "MAINTAINER", "HEREDOC_START", "LINE_CONTINUATION", "LBRACKET", "RBRACKET", "COMMA", - "EQUALS", "FLAG", "DASH_DASH", "DOUBLE_QUOTED_STRING", "SINGLE_QUOTED_STRING", + "EQUALS", "FLAG", "FROM_FLAG", "DASH_DASH", "DOUBLE_QUOTED_STRING", "SINGLE_QUOTED_STRING", "ENV_VAR", "SPECIAL_VAR", "COMMAND_SUBST", "BACKTICK_SUBST", "DOLLAR", - "UNQUOTED_TEXT", "WS", "NEWLINE", "COLON", "AT", "AS", "HP_LINE_CONTINUATION", + "UNQUOTED_TEXT", "WS", "NEWLINE", "COLON", "AT", "AS", "FLAG_END", "HP_LINE_CONTINUATION", "HP_WS", "HP_COMMENT", "HP_LINE_COMMENT", "HEREDOC_CONTENT", "H_NEWLINE" }; } @@ -140,6 +145,31 @@ public Vocabulary getVocabulary() { private boolean atLineStart = true; // Track if we're after HEALTHCHECK to recognize CMD/NONE as keywords private boolean afterHealthcheck = false; + // Track if we're in the flag section of a COPY or ADD, where --from carries an image reference + private boolean copyAddFlags = false; + + // Every flag that is scoped to one logical line is cleared here, so that a mode of its own does + // not have to remember which of them the newline it matches instead of NEWLINE should reset + private void resetLine() { + atLineStart = true; + afterHealthcheck = false; + copyAddFlags = false; + } + + // Whether what follows the '--' that both flag rules begin with is the '--from=' of a COPY or ADD + private boolean atFromFlag() { + if (!copyAddFlags) { + return false; + } + String fromFlag = "from="; + for (int i = 0; i < fromFlag.length(); i++) { + int c = _input.LA(i + 1); + if (c == -1 || Character.toLowerCase(c) != fromFlag.charAt(i)) { + return false; + } + } + return true; + } public DockerLexer(CharStream input) { @@ -246,46 +276,52 @@ public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { case 28: FLAG_action((RuleContext)_localctx, actionIndex); break; - case 31: + case 29: + FROM_FLAG_action((RuleContext)_localctx, actionIndex); + break; + case 32: DASH_DASH_action((RuleContext)_localctx, actionIndex); break; - case 34: + case 35: DOUBLE_QUOTED_STRING_action((RuleContext)_localctx, actionIndex); break; - case 36: + case 37: SINGLE_QUOTED_STRING_action((RuleContext)_localctx, actionIndex); break; - case 41: + case 42: ENV_VAR_action((RuleContext)_localctx, actionIndex); break; - case 43: + case 44: SPECIAL_VAR_action((RuleContext)_localctx, actionIndex); break; - case 45: + case 46: COMMAND_SUBST_action((RuleContext)_localctx, actionIndex); break; - case 47: + case 48: BACKTICK_SUBST_action((RuleContext)_localctx, actionIndex); break; - case 48: + case 49: DOLLAR_action((RuleContext)_localctx, actionIndex); break; - case 49: + case 50: UNQUOTED_TEXT_action((RuleContext)_localctx, actionIndex); break; - case 52: + case 53: NEWLINE_action((RuleContext)_localctx, actionIndex); break; - case 57: + case 58: IR_NEWLINE_action((RuleContext)_localctx, actionIndex); break; case 73: + FIR_NEWLINE_action((RuleContext)_localctx, actionIndex); + break; + case 85: US_NEWLINE_action((RuleContext)_localctx, actionIndex); break; - case 87: + case 99: HP_HEREDOC_START_action((RuleContext)_localctx, actionIndex); break; - case 90: + case 102: HEREDOC_CONTENT_action((RuleContext)_localctx, actionIndex); break; } @@ -349,14 +385,14 @@ private void ENV_action(RuleContext _localctx, int actionIndex) { private void ADD_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 8: - if (!atLineStart) setType(UNQUOTED_TEXT); atLineStart = false; + if (!atLineStart) setType(UNQUOTED_TEXT); else copyAddFlags = true; atLineStart = false; break; } } private void COPY_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 9: - if (!atLineStart) setType(UNQUOTED_TEXT); atLineStart = false; + if (!atLineStart) setType(UNQUOTED_TEXT); else copyAddFlags = true; atLineStart = false; break; } } @@ -480,93 +516,107 @@ private void FLAG_action(RuleContext _localctx, int actionIndex) { break; } } - private void DASH_DASH_action(RuleContext _localctx, int actionIndex) { + private void FROM_FLAG_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 26: + atLineStart = false; + break; + } + } + private void DASH_DASH_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 27: if (!afterHealthcheck) atLineStart = false; break; } } private void DOUBLE_QUOTED_STRING_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 27: + case 28: if (!afterHealthcheck) atLineStart = false; break; } } private void SINGLE_QUOTED_STRING_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 28: + case 29: if (!afterHealthcheck) atLineStart = false; break; } } private void ENV_VAR_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 29: + case 30: atLineStart = false; break; } } private void SPECIAL_VAR_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 30: + case 31: atLineStart = false; break; } } private void COMMAND_SUBST_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 31: + case 32: atLineStart = false; break; } } private void BACKTICK_SUBST_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 32: + case 33: atLineStart = false; break; } } private void DOLLAR_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 33: + case 34: atLineStart = false; break; } } private void UNQUOTED_TEXT_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 34: - if (!afterHealthcheck) atLineStart = false; + case 35: + if (!afterHealthcheck) atLineStart = false; copyAddFlags = false; break; } } private void NEWLINE_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 35: - atLineStart = true; afterHealthcheck = false; + case 36: + resetLine(); break; } } private void IR_NEWLINE_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 36: - atLineStart = true; afterHealthcheck = false; + case 37: + resetLine(); + break; + } + } + private void FIR_NEWLINE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 38: + resetLine(); break; } } private void US_NEWLINE_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 37: - atLineStart = true; afterHealthcheck = false; + case 39: + resetLine(); break; } } private void HP_HEREDOC_START_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 38: + case 40: // Extract and store the heredoc marker identifier in FIFO order String text = getText(); @@ -579,7 +629,7 @@ private void HP_HEREDOC_START_action(RuleContext _localctx, int actionIndex) { } private void HEREDOC_CONTENT_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 39: + case 41: if(!heredocIdentifiers.isEmpty() && getText().equals(heredocIdentifiers.peek())) { setType(UNQUOTED_TEXT); @@ -594,626 +644,710 @@ private void HEREDOC_CONTENT_action(RuleContext _localctx, int actionIndex) { break; } } + @Override + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 28: + return FLAG_sempred((RuleContext)_localctx, predIndex); + case 29: + return FROM_FLAG_sempred((RuleContext)_localctx, predIndex); + } + return true; + } + private boolean FLAG_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return !atFromFlag(); + } + return true; + } + private boolean FROM_FLAG_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 1: + return atFromFlag(); + } + return true; + } public static final String _serializedATN = - "\u0004\u00000\u03a1\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ - "\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+ - "\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+ - "\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+ - "\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+ - "\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+ - "\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+ - "\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+ - "\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+ - "\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+ - "\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+ - "\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+ - "!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+ - "&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+ - "+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+ - "0\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u0007"+ - "5\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007"+ - ":\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007"+ - "?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007"+ - "D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007"+ - "I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007"+ - "N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007"+ - "S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007"+ - "X\u0002Y\u0007Y\u0002Z\u0007Z\u0001\u0000\u0001\u0000\u0005\u0000\u00be"+ - "\b\u0000\n\u0000\f\u0000\u00c1\t\u0000\u0001\u0000\u0004\u0000\u00c4\b"+ - "\u0000\u000b\u0000\f\u0000\u00c5\u0001\u0000\u0005\u0000\u00c9\b\u0000"+ - "\n\u0000\f\u0000\u00cc\t\u0000\u0001\u0000\u0001\u0000\u0005\u0000\u00d0"+ - "\b\u0000\n\u0000\f\u0000\u00d3\t\u0000\u0001\u0000\u0005\u0000\u00d6\b"+ - "\u0000\n\u0000\f\u0000\u00d9\t\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+ - "\u0001\u0001\u0001\u0001\u0005\u0001\u00e0\b\u0001\n\u0001\f\u0001\u00e3"+ - "\t\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ - "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ + "\u0004\u00002\u0403\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ + "\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007"+ + "\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007"+ + "\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n"+ + "\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ + "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ + "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ + "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ + "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ + "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ + "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ + " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ + "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ + "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ + "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0002"+ + "4\u00074\u00025\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u0002"+ + "9\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002"+ + ">\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002"+ + "C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002"+ + "H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002"+ + "M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002"+ + "R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002"+ + "W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002"+ + "\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002"+ + "a\u0007a\u0002b\u0007b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002"+ + "f\u0007f\u0001\u0000\u0001\u0000\u0005\u0000\u00d7\b\u0000\n\u0000\f\u0000"+ + "\u00da\t\u0000\u0001\u0000\u0004\u0000\u00dd\b\u0000\u000b\u0000\f\u0000"+ + "\u00de\u0001\u0000\u0005\u0000\u00e2\b\u0000\n\u0000\f\u0000\u00e5\t\u0000"+ + "\u0001\u0000\u0001\u0000\u0005\u0000\u00e9\b\u0000\n\u0000\f\u0000\u00ec"+ + "\t\u0000\u0001\u0000\u0005\u0000\u00ef\b\u0000\n\u0000\f\u0000\u00f2\t"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0005"+ + "\u0001\u00f9\b\u0001\n\u0001\f\u0001\u00fc\t\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ + "\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f"+ + "\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001"+ "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001"+ "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0003\u0015\u0190\b\u0015\u0001"+ - "\u0015\u0001\u0015\u0005\u0015\u0194\b\u0015\n\u0015\f\u0015\u0197\t\u0015"+ - "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016"+ - "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0005\u0017\u01a3\b\u0017"+ - "\n\u0017\f\u0017\u01a6\t\u0017\u0001\u0017\u0003\u0017\u01a9\b\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001"+ - "\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001"+ - "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0005\u001d\u01c1\b\u001d\n"+ - "\u001d\f\u001d\u01c4\t\u001d\u0001\u001d\u0001\u001d\u0004\u001d\u01c8"+ - "\b\u001d\u000b\u001d\f\u001d\u01c9\u0003\u001d\u01cc\b\u001d\u0001\u001e"+ - "\u0001\u001e\u0001\u001e\u0001\u001e\u0005\u001e\u01d2\b\u001e\n\u001e"+ - "\f\u001e\u01d5\t\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0005\u001e"+ - "\u01da\b\u001e\n\u001e\f\u001e\u01dd\t\u001e\u0001\u001e\u0001\u001e\u0001"+ - "\u001e\u0001\u001e\u0003\u001e\u01e3\b\u001e\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001!\u0001!\u0001!\u0001"+ - "\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0005#\u01f7\b#"+ - "\n#\f#\u01fa\t#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001%\u0001%\u0001"+ - "%\u0001%\u0005%\u0205\b%\n%\f%\u0208\t%\u0001%\u0001%\u0001&\u0001&\u0005"+ - "&\u020e\b&\n&\f&\u0211\t&\u0001&\u0004&\u0214\b&\u000b&\f&\u0215\u0001"+ - "\'\u0001\'\u0001\'\u0001(\u0001(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001"+ - "*\u0001*\u0005*\u0224\b*\n*\f*\u0227\t*\u0001*\u0001*\u0001*\u0001*\u0001"+ - "*\u0003*\u022e\b*\u0001*\u0005*\u0231\b*\n*\f*\u0234\t*\u0001*\u0001*"+ - "\u0001*\u0001*\u0005*\u023a\b*\n*\f*\u023d\t*\u0003*\u023f\b*\u0001+\u0001"+ - "+\u0001+\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0005-\u024e\b-\n-\f-\u0251\t-\u0001-\u0005-\u0254\b-\n-\f-\u0257"+ - "\t-\u0001-\u0001-\u0001-\u0001.\u0001.\u0003.\u025e\b.\u0001/\u0001/\u0001"+ - "/\u0005/\u0263\b/\n/\f/\u0266\t/\u0001/\u0001/\u0001/\u00010\u00010\u0001"+ - "0\u00011\u00011\u00011\u00051\u0271\b1\n1\f1\u0274\t1\u00011\u00011\u0001"+ - "1\u00011\u00051\u027a\b1\n1\f1\u027d\t1\u00011\u00011\u00011\u00011\u0001"+ - "1\u00051\u0284\b1\n1\f1\u0287\t1\u00011\u00011\u00011\u00011\u00051\u028d"+ - "\b1\n1\f1\u0290\t1\u00031\u0292\b1\u00011\u00011\u00012\u00042\u0297\b"+ - "2\u000b2\f2\u0298\u00012\u00012\u00013\u00013\u00014\u00044\u02a0\b4\u000b"+ - "4\f4\u02a1\u00014\u00014\u00014\u00014\u00015\u00015\u00016\u00046\u02ab"+ - "\b6\u000b6\f6\u02ac\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u0001"+ - "7\u00018\u00018\u00058\u02b9\b8\n8\f8\u02bc\t8\u00018\u00018\u00018\u0001"+ - "9\u00049\u02c2\b9\u000b9\f9\u02c3\u00019\u00019\u00019\u00019\u00019\u0001"+ - "9\u0001:\u0001:\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ - "=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001"+ - "?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001"+ - "B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0004C\u02f0\bC\u000bC\fC"+ - "\u02f1\u0001C\u0001C\u0001D\u0001D\u0001E\u0001E\u0001E\u0005E\u02fb\b"+ - "E\nE\fE\u02fe\tE\u0001E\u0001E\u0001F\u0004F\u0303\bF\u000bF\fF\u0304"+ - "\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001"+ - "H\u0005H\u0311\bH\nH\fH\u0314\tH\u0001H\u0001H\u0001H\u0001I\u0004I\u031a"+ - "\bI\u000bI\fI\u031b\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001"+ - "J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001"+ - "L\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001O\u0001"+ - "O\u0001O\u0001O\u0001P\u0001P\u0004P\u033e\bP\u000bP\fP\u033f\u0001P\u0001"+ - "P\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001T\u0004T\u0350\bT\u000bT\fT\u0351\u0001T\u0001T\u0001U\u0001"+ - "U\u0001U\u0001U\u0005U\u035a\bU\nU\fU\u035d\tU\u0001U\u0001U\u0001U\u0001"+ - "U\u0001U\u0001V\u0001V\u0001V\u0003V\u0367\bV\u0001V\u0005V\u036a\bV\n"+ - "V\fV\u036d\tV\u0001V\u0003V\u0370\bV\u0001V\u0001V\u0001W\u0001W\u0001"+ - "W\u0001W\u0003W\u0378\bW\u0001W\u0001W\u0005W\u037c\bW\nW\fW\u037f\tW"+ - "\u0001W\u0001W\u0001W\u0001W\u0001X\u0004X\u0386\bX\u000bX\fX\u0387\u0001"+ - "X\u0001X\u0001X\u0005X\u038d\bX\nX\fX\u0390\tX\u0001X\u0003X\u0393\bX"+ - "\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0004Z\u039c\bZ\u000b"+ - "Z\fZ\u039d\u0001Z\u0001Z\u0001\u035b\u0000[\u0005\u0001\u0007\u0002\t"+ - "\u0003\u000b\u0004\r\u0005\u000f\u0006\u0011\u0007\u0013\b\u0015\t\u0017"+ - "\n\u0019\u000b\u001b\f\u001d\r\u001f\u000e!\u000f#\u0010%\u0011\'\u0012"+ - ")\u0013+\u0014-\u0015/\u00161\u00173\u00005\u00187\u00199\u001a;\u001b"+ - "=\u001c?\u0000A\u0000C\u001dE\u0000G\u0000I\u001eK\u0000M\u001fO\u0000"+ - "Q\u0000S\u0000U\u0000W Y\u0000[!]\u0000_\"a\u0000c#e$g%i&k\u0000m\'o\u0000"+ - "q\u0000s\u0000u\u0000w\u0000y({)}*\u007f\u0000\u0081\u0000\u0083\u0000"+ - "\u0085\u0000\u0087\u0000\u0089\u0000\u008b\u0000\u008d\u0000\u008f\u0000"+ - "\u0091\u0000\u0093\u0000\u0095\u0000\u0097\u0000\u0099\u0000\u009b\u0000"+ - "\u009d\u0000\u009f\u0000\u00a1\u0000\u00a3\u0000\u00a5\u0000\u00a7\u0000"+ - "\u00a9+\u00ab\u0000\u00ad,\u00af-\u00b1.\u00b3\u0000\u00b5\u0000\u00b7"+ - "0\u00b9/\u0005\u0000\u0001\u0002\u0003\u00041\u0003\u0000AZ__az\u0002"+ - "\u0000\n\n\r\r\u0002\u0000FFff\u0002\u0000RRrr\u0002\u0000OOoo\u0002\u0000"+ - "MMmm\u0002\u0000UUuu\u0002\u0000NNnn\u0002\u0000CCcc\u0002\u0000DDdd\u0002"+ - "\u0000EEee\u0002\u0000LLll\u0002\u0000AAaa\u0002\u0000BBbb\u0002\u0000"+ - "XXxx\u0002\u0000PPpp\u0002\u0000SSss\u0002\u0000VVvv\u0002\u0000YYyy\u0002"+ - "\u0000TTtt\u0002\u0000IIii\u0002\u0000WWww\u0002\u0000KKkk\u0002\u0000"+ - "GGgg\u0002\u0000HHhh\u0004\u000009AZ__az\u0002\u0000\\\\``\u0002\u0000"+ - "\t\t \u0002\u0000AZaz\u0005\u0000--09AZ__az\u0004\u0000\n\n\r\r\"\"\\"+ - "\\\u0003\u0000\n\n\r\r\'\'\u0006\u0000\t\n\r\r \"\"\'\'\\\\\b\u0000\t"+ - "\n\r\r \"\"$$\'\'<=[]\u0003\u0000\n\n\r\r``\u0005\u0000\n\n\r\r\"\"\\"+ - "\\``\u0003\u000009AFaf\u0001\u0000}}\u0005\u0000!!#$**09?@\u0001\u0000"+ - "()\u0004\u0000\t\n\r\r ``\t\u0000\t\n\r\r \"\"$$\'\'--<=[]\t\u0000\t"+ - "\n\r\r \"\"$$\'\'::@@\\\\\b\u0000\t\n\r\r \"\"$$\'\'::\\\\\u0003\u0000"+ - "\t\t\f\r \u0006\u0000\t\n\r\r <<\\\\``\u0004\u0000\t\n\r\r <<\u0003"+ - "\u0000\t\n\r\r \u0001\u0000\n\n\u03db\u0000\u0005\u0001\u0000\u0000\u0000"+ - "\u0000\u0007\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000"+ - "\u000b\u0001\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f"+ - "\u0001\u0000\u0000\u0000\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013"+ - "\u0001\u0000\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017"+ - "\u0001\u0000\u0000\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b"+ - "\u0001\u0000\u0000\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f"+ - "\u0001\u0000\u0000\u0000\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000"+ - "\u0000\u0000\u0000%\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000"+ - "\u0000\u0000)\u0001\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000\u0000"+ - "-\u0001\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000\u00001\u0001"+ - "\u0000\u0000\u0000\u00005\u0001\u0000\u0000\u0000\u00007\u0001\u0000\u0000"+ - "\u0000\u00009\u0001\u0000\u0000\u0000\u0000;\u0001\u0000\u0000\u0000\u0000"+ - "=\u0001\u0000\u0000\u0000\u0000C\u0001\u0000\u0000\u0000\u0000I\u0001"+ - "\u0000\u0000\u0000\u0000M\u0001\u0000\u0000\u0000\u0000W\u0001\u0000\u0000"+ - "\u0000\u0000[\u0001\u0000\u0000\u0000\u0000_\u0001\u0000\u0000\u0000\u0000"+ - "c\u0001\u0000\u0000\u0000\u0000e\u0001\u0000\u0000\u0000\u0000g\u0001"+ - "\u0000\u0000\u0000\u0000i\u0001\u0000\u0000\u0000\u0000m\u0001\u0000\u0000"+ - "\u0000\u0001q\u0001\u0000\u0000\u0000\u0001s\u0001\u0000\u0000\u0000\u0001"+ - "u\u0001\u0000\u0000\u0000\u0001w\u0001\u0000\u0000\u0000\u0001y\u0001"+ - "\u0000\u0000\u0000\u0001{\u0001\u0000\u0000\u0000\u0001}\u0001\u0000\u0000"+ - "\u0000\u0001\u007f\u0001\u0000\u0000\u0000\u0001\u0081\u0001\u0000\u0000"+ - "\u0000\u0001\u0083\u0001\u0000\u0000\u0000\u0001\u0085\u0001\u0000\u0000"+ - "\u0000\u0001\u0087\u0001\u0000\u0000\u0000\u0001\u0089\u0001\u0000\u0000"+ - "\u0000\u0001\u008b\u0001\u0000\u0000\u0000\u0002\u0091\u0001\u0000\u0000"+ - "\u0000\u0002\u0093\u0001\u0000\u0000\u0000\u0002\u0095\u0001\u0000\u0000"+ - "\u0000\u0002\u0097\u0001\u0000\u0000\u0000\u0002\u0099\u0001\u0000\u0000"+ - "\u0000\u0002\u009b\u0001\u0000\u0000\u0000\u0002\u009d\u0001\u0000\u0000"+ - "\u0000\u0002\u009f\u0001\u0000\u0000\u0000\u0002\u00a1\u0001\u0000\u0000"+ - "\u0000\u0002\u00a3\u0001\u0000\u0000\u0000\u0002\u00a5\u0001\u0000\u0000"+ - "\u0000\u0003\u00a9\u0001\u0000\u0000\u0000\u0003\u00ab\u0001\u0000\u0000"+ - "\u0000\u0003\u00ad\u0001\u0000\u0000\u0000\u0003\u00af\u0001\u0000\u0000"+ - "\u0000\u0003\u00b1\u0001\u0000\u0000\u0000\u0003\u00b3\u0001\u0000\u0000"+ - "\u0000\u0003\u00b5\u0001\u0000\u0000\u0000\u0004\u00b7\u0001\u0000\u0000"+ - "\u0000\u0004\u00b9\u0001\u0000\u0000\u0000\u0005\u00bb\u0001\u0000\u0000"+ - "\u0000\u0007\u00dd\u0001\u0000\u0000\u0000\t\u00e6\u0001\u0000\u0000\u0000"+ - "\u000b\u00ed\u0001\u0000\u0000\u0000\r\u00f3\u0001\u0000\u0000\u0000\u000f"+ - "\u00f9\u0001\u0000\u0000\u0000\u0011\u0100\u0001\u0000\u0000\u0000\u0013"+ - "\u0108\u0001\u0000\u0000\u0000\u0015\u0111\u0001\u0000\u0000\u0000\u0017"+ - "\u0117\u0001\u0000\u0000\u0000\u0019\u011d\u0001\u0000\u0000\u0000\u001b"+ - "\u0124\u0001\u0000\u0000\u0000\u001d\u0131\u0001\u0000\u0000\u0000\u001f"+ - "\u013a\u0001\u0000\u0000\u0000!\u0141\u0001\u0000\u0000\u0000#\u014b\u0001"+ - "\u0000\u0000\u0000%\u0151\u0001\u0000\u0000\u0000\'\u015b\u0001\u0000"+ - "\u0000\u0000)\u0168\u0001\u0000\u0000\u0000+\u0176\u0001\u0000\u0000\u0000"+ - "-\u017e\u0001\u0000\u0000\u0000/\u018b\u0001\u0000\u0000\u00001\u019c"+ - "\u0001\u0000\u0000\u00003\u01a0\u0001\u0000\u0000\u00005\u01ac\u0001\u0000"+ - "\u0000\u00007\u01af\u0001\u0000\u0000\u00009\u01b2\u0001\u0000\u0000\u0000"+ - ";\u01b5\u0001\u0000\u0000\u0000=\u01b8\u0001\u0000\u0000\u0000?\u01bb"+ - "\u0001\u0000\u0000\u0000A\u01e2\u0001\u0000\u0000\u0000C\u01e4\u0001\u0000"+ - "\u0000\u0000E\u01e9\u0001\u0000\u0000\u0000G\u01eb\u0001\u0000\u0000\u0000"+ - "I\u01ee\u0001\u0000\u0000\u0000K\u01f1\u0001\u0000\u0000\u0000M\u01fd"+ - "\u0001\u0000\u0000\u0000O\u0200\u0001\u0000\u0000\u0000Q\u020b\u0001\u0000"+ - "\u0000\u0000S\u0217\u0001\u0000\u0000\u0000U\u021a\u0001\u0000\u0000\u0000"+ - "W\u021c\u0001\u0000\u0000\u0000Y\u023e\u0001\u0000\u0000\u0000[\u0240"+ - "\u0001\u0000\u0000\u0000]\u0243\u0001\u0000\u0000\u0000_\u0246\u0001\u0000"+ - "\u0000\u0000a\u025d\u0001\u0000\u0000\u0000c\u025f\u0001\u0000\u0000\u0000"+ - "e\u026a\u0001\u0000\u0000\u0000g\u0291\u0001\u0000\u0000\u0000i\u0296"+ - "\u0001\u0000\u0000\u0000k\u029c\u0001\u0000\u0000\u0000m\u029f\u0001\u0000"+ - "\u0000\u0000o\u02a7\u0001\u0000\u0000\u0000q\u02aa\u0001\u0000\u0000\u0000"+ - "s\u02b1\u0001\u0000\u0000\u0000u\u02b6\u0001\u0000\u0000\u0000w\u02c1"+ - "\u0001\u0000\u0000\u0000y\u02cb\u0001\u0000\u0000\u0000{\u02cd\u0001\u0000"+ - "\u0000\u0000}\u02cf\u0001\u0000\u0000\u0000\u007f\u02d4\u0001\u0000\u0000"+ - "\u0000\u0081\u02d8\u0001\u0000\u0000\u0000\u0083\u02dc\u0001\u0000\u0000"+ - "\u0000\u0085\u02e0\u0001\u0000\u0000\u0000\u0087\u02e4\u0001\u0000\u0000"+ - "\u0000\u0089\u02e8\u0001\u0000\u0000\u0000\u008b\u02ef\u0001\u0000\u0000"+ - "\u0000\u008d\u02f5\u0001\u0000\u0000\u0000\u008f\u02f7\u0001\u0000\u0000"+ - "\u0000\u0091\u0302\u0001\u0000\u0000\u0000\u0093\u0309\u0001\u0000\u0000"+ - "\u0000\u0095\u030e\u0001\u0000\u0000\u0000\u0097\u0319\u0001\u0000\u0000"+ - "\u0000\u0099\u0323\u0001\u0000\u0000\u0000\u009b\u0327\u0001\u0000\u0000"+ - "\u0000\u009d\u032b\u0001\u0000\u0000\u0000\u009f\u032f\u0001\u0000\u0000"+ - "\u0000\u00a1\u0333\u0001\u0000\u0000\u0000\u00a3\u0337\u0001\u0000\u0000"+ - "\u0000\u00a5\u033d\u0001\u0000\u0000\u0000\u00a7\u0343\u0001\u0000\u0000"+ - "\u0000\u00a9\u0345\u0001\u0000\u0000\u0000\u00ab\u0349\u0001\u0000\u0000"+ - "\u0000\u00ad\u034f\u0001\u0000\u0000\u0000\u00af\u0355\u0001\u0000\u0000"+ - "\u0000\u00b1\u0366\u0001\u0000\u0000\u0000\u00b3\u0373\u0001\u0000\u0000"+ - "\u0000\u00b5\u0392\u0001\u0000\u0000\u0000\u00b7\u0396\u0001\u0000\u0000"+ - "\u0000\u00b9\u039b\u0001\u0000\u0000\u0000\u00bb\u00bf\u0005#\u0000\u0000"+ - "\u00bc\u00be\u0003k3\u0000\u00bd\u00bc\u0001\u0000\u0000\u0000\u00be\u00c1"+ - "\u0001\u0000\u0000\u0000\u00bf\u00bd\u0001\u0000\u0000\u0000\u00bf\u00c0"+ - "\u0001\u0000\u0000\u0000\u00c0\u00c3\u0001\u0000\u0000\u0000\u00c1\u00bf"+ - "\u0001\u0000\u0000\u0000\u00c2\u00c4\u0007\u0000\u0000\u0000\u00c3\u00c2"+ - "\u0001\u0000\u0000\u0000\u00c4\u00c5\u0001\u0000\u0000\u0000\u00c5\u00c3"+ - "\u0001\u0000\u0000\u0000\u00c5\u00c6\u0001\u0000\u0000\u0000\u00c6\u00ca"+ - "\u0001\u0000\u0000\u0000\u00c7\u00c9\u0003k3\u0000\u00c8\u00c7\u0001\u0000"+ - "\u0000\u0000\u00c9\u00cc\u0001\u0000\u0000\u0000\u00ca\u00c8\u0001\u0000"+ - "\u0000\u0000\u00ca\u00cb\u0001\u0000\u0000\u0000\u00cb\u00cd\u0001\u0000"+ - "\u0000\u0000\u00cc\u00ca\u0001\u0000\u0000\u0000\u00cd\u00d1\u0005=\u0000"+ - "\u0000\u00ce\u00d0\u0003k3\u0000\u00cf\u00ce\u0001\u0000\u0000\u0000\u00d0"+ - "\u00d3\u0001\u0000\u0000\u0000\u00d1\u00cf\u0001\u0000\u0000\u0000\u00d1"+ - "\u00d2\u0001\u0000\u0000\u0000\u00d2\u00d7\u0001\u0000\u0000\u0000\u00d3"+ - "\u00d1\u0001\u0000\u0000\u0000\u00d4\u00d6\b\u0001\u0000\u0000\u00d5\u00d4"+ - "\u0001\u0000\u0000\u0000\u00d6\u00d9\u0001\u0000\u0000\u0000\u00d7\u00d5"+ - "\u0001\u0000\u0000\u0000\u00d7\u00d8\u0001\u0000\u0000\u0000\u00d8\u00da"+ - "\u0001\u0000\u0000\u0000\u00d9\u00d7\u0001\u0000\u0000\u0000\u00da\u00db"+ - "\u0003o5\u0000\u00db\u00dc\u0006\u0000\u0000\u0000\u00dc\u0006\u0001\u0000"+ - "\u0000\u0000\u00dd\u00e1\u0005#\u0000\u0000\u00de\u00e0\b\u0001\u0000"+ - "\u0000\u00df\u00de\u0001\u0000\u0000\u0000\u00e0\u00e3\u0001\u0000\u0000"+ - "\u0000\u00e1\u00df\u0001\u0000\u0000\u0000\u00e1\u00e2\u0001\u0000\u0000"+ - "\u0000\u00e2\u00e4\u0001\u0000\u0000\u0000\u00e3\u00e1\u0001\u0000\u0000"+ - "\u0000\u00e4\u00e5\u0006\u0001\u0001\u0000\u00e5\b\u0001\u0000\u0000\u0000"+ - "\u00e6\u00e7\u0007\u0002\u0000\u0000\u00e7\u00e8\u0007\u0003\u0000\u0000"+ - "\u00e8\u00e9\u0007\u0004\u0000\u0000\u00e9\u00ea\u0007\u0005\u0000\u0000"+ - "\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb\u00ec\u0006\u0002\u0002\u0000"+ - "\u00ec\n\u0001\u0000\u0000\u0000\u00ed\u00ee\u0007\u0003\u0000\u0000\u00ee"+ - "\u00ef\u0007\u0006\u0000\u0000\u00ef\u00f0\u0007\u0007\u0000\u0000\u00f0"+ - "\u00f1\u0001\u0000\u0000\u0000\u00f1\u00f2\u0006\u0003\u0003\u0000\u00f2"+ - "\f\u0001\u0000\u0000\u0000\u00f3\u00f4\u0007\b\u0000\u0000\u00f4\u00f5"+ - "\u0007\u0005\u0000\u0000\u00f5\u00f6\u0007\t\u0000\u0000\u00f6\u00f7\u0001"+ - "\u0000\u0000\u0000\u00f7\u00f8\u0006\u0004\u0004\u0000\u00f8\u000e\u0001"+ - "\u0000\u0000\u0000\u00f9\u00fa\u0007\u0007\u0000\u0000\u00fa\u00fb\u0007"+ - "\u0004\u0000\u0000\u00fb\u00fc\u0007\u0007\u0000\u0000\u00fc\u00fd\u0007"+ - "\n\u0000\u0000\u00fd\u00fe\u0001\u0000\u0000\u0000\u00fe\u00ff\u0006\u0005"+ - "\u0005\u0000\u00ff\u0010\u0001\u0000\u0000\u0000\u0100\u0101\u0007\u000b"+ - "\u0000\u0000\u0101\u0102\u0007\f\u0000\u0000\u0102\u0103\u0007\r\u0000"+ - "\u0000\u0103\u0104\u0007\n\u0000\u0000\u0104\u0105\u0007\u000b\u0000\u0000"+ - "\u0105\u0106\u0001\u0000\u0000\u0000\u0106\u0107\u0006\u0006\u0006\u0000"+ - "\u0107\u0012\u0001\u0000\u0000\u0000\u0108\u0109\u0007\n\u0000\u0000\u0109"+ - "\u010a\u0007\u000e\u0000\u0000\u010a\u010b\u0007\u000f\u0000\u0000\u010b"+ - "\u010c\u0007\u0004\u0000\u0000\u010c\u010d\u0007\u0010\u0000\u0000\u010d"+ - "\u010e\u0007\n\u0000\u0000\u010e\u010f\u0001\u0000\u0000\u0000\u010f\u0110"+ - "\u0006\u0007\u0007\u0000\u0110\u0014\u0001\u0000\u0000\u0000\u0111\u0112"+ - "\u0007\n\u0000\u0000\u0112\u0113\u0007\u0007\u0000\u0000\u0113\u0114\u0007"+ - "\u0011\u0000\u0000\u0114\u0115\u0001\u0000\u0000\u0000\u0115\u0116\u0006"+ - "\b\b\u0000\u0116\u0016\u0001\u0000\u0000\u0000\u0117\u0118\u0007\f\u0000"+ - "\u0000\u0118\u0119\u0007\t\u0000\u0000\u0119\u011a\u0007\t\u0000\u0000"+ - "\u011a\u011b\u0001\u0000\u0000\u0000\u011b\u011c\u0006\t\t\u0000\u011c"+ - "\u0018\u0001\u0000\u0000\u0000\u011d\u011e\u0007\b\u0000\u0000\u011e\u011f"+ - "\u0007\u0004\u0000\u0000\u011f\u0120\u0007\u000f\u0000\u0000\u0120\u0121"+ - "\u0007\u0012\u0000\u0000\u0121\u0122\u0001\u0000\u0000\u0000\u0122\u0123"+ - "\u0006\n\n\u0000\u0123\u001a\u0001\u0000\u0000\u0000\u0124\u0125\u0007"+ - "\n\u0000\u0000\u0125\u0126\u0007\u0007\u0000\u0000\u0126\u0127\u0007\u0013"+ - "\u0000\u0000\u0127\u0128\u0007\u0003\u0000\u0000\u0128\u0129\u0007\u0012"+ - "\u0000\u0000\u0129\u012a\u0007\u000f\u0000\u0000\u012a\u012b\u0007\u0004"+ - "\u0000\u0000\u012b\u012c\u0007\u0014\u0000\u0000\u012c\u012d\u0007\u0007"+ - "\u0000\u0000\u012d\u012e\u0007\u0013\u0000\u0000\u012e\u012f\u0001\u0000"+ - "\u0000\u0000\u012f\u0130\u0006\u000b\u000b\u0000\u0130\u001c\u0001\u0000"+ - "\u0000\u0000\u0131\u0132\u0007\u0011\u0000\u0000\u0132\u0133\u0007\u0004"+ - "\u0000\u0000\u0133\u0134\u0007\u000b\u0000\u0000\u0134\u0135\u0007\u0006"+ - "\u0000\u0000\u0135\u0136\u0007\u0005\u0000\u0000\u0136\u0137\u0007\n\u0000"+ - "\u0000\u0137\u0138\u0001\u0000\u0000\u0000\u0138\u0139\u0006\f\f\u0000"+ - "\u0139\u001e\u0001\u0000\u0000\u0000\u013a\u013b\u0007\u0006\u0000\u0000"+ - "\u013b\u013c\u0007\u0010\u0000\u0000\u013c\u013d\u0007\n\u0000\u0000\u013d"+ - "\u013e\u0007\u0003\u0000\u0000\u013e\u013f\u0001\u0000\u0000\u0000\u013f"+ - "\u0140\u0006\r\r\u0000\u0140 \u0001\u0000\u0000\u0000\u0141\u0142\u0007"+ - "\u0015\u0000\u0000\u0142\u0143\u0007\u0004\u0000\u0000\u0143\u0144\u0007"+ - "\u0003\u0000\u0000\u0144\u0145\u0007\u0016\u0000\u0000\u0145\u0146\u0007"+ - "\t\u0000\u0000\u0146\u0147\u0007\u0014\u0000\u0000\u0147\u0148\u0007\u0003"+ - "\u0000\u0000\u0148\u0149\u0001\u0000\u0000\u0000\u0149\u014a\u0006\u000e"+ - "\u000e\u0000\u014a\"\u0001\u0000\u0000\u0000\u014b\u014c\u0007\f\u0000"+ - "\u0000\u014c\u014d\u0007\u0003\u0000\u0000\u014d\u014e\u0007\u0017\u0000"+ - "\u0000\u014e\u014f\u0001\u0000\u0000\u0000\u014f\u0150\u0006\u000f\u000f"+ - "\u0000\u0150$\u0001\u0000\u0000\u0000\u0151\u0152\u0007\u0004\u0000\u0000"+ - "\u0152\u0153\u0007\u0007\u0000\u0000\u0153\u0154\u0007\r\u0000\u0000\u0154"+ - "\u0155\u0007\u0006\u0000\u0000\u0155\u0156\u0007\u0014\u0000\u0000\u0156"+ - "\u0157\u0007\u000b\u0000\u0000\u0157\u0158\u0007\t\u0000\u0000\u0158\u0159"+ - "\u0001\u0000\u0000\u0000\u0159\u015a\u0006\u0010\u0010\u0000\u015a&\u0001"+ - "\u0000\u0000\u0000\u015b\u015c\u0007\u0010\u0000\u0000\u015c\u015d\u0007"+ - "\u0013\u0000\u0000\u015d\u015e\u0007\u0004\u0000\u0000\u015e\u015f\u0007"+ - "\u000f\u0000\u0000\u015f\u0160\u0007\u0010\u0000\u0000\u0160\u0161\u0007"+ - "\u0014\u0000\u0000\u0161\u0162\u0007\u0017\u0000\u0000\u0162\u0163\u0007"+ - "\u0007\u0000\u0000\u0163\u0164\u0007\f\u0000\u0000\u0164\u0165\u0007\u000b"+ - "\u0000\u0000\u0165\u0166\u0001\u0000\u0000\u0000\u0166\u0167\u0006\u0011"+ - "\u0011\u0000\u0167(\u0001\u0000\u0000\u0000\u0168\u0169\u0007\u0018\u0000"+ - "\u0000\u0169\u016a\u0007\n\u0000\u0000\u016a\u016b\u0007\f\u0000\u0000"+ - "\u016b\u016c\u0007\u000b\u0000\u0000\u016c\u016d\u0007\u0013\u0000\u0000"+ - "\u016d\u016e\u0007\u0018\u0000\u0000\u016e\u016f\u0007\b\u0000\u0000\u016f"+ - "\u0170\u0007\u0018\u0000\u0000\u0170\u0171\u0007\n\u0000\u0000\u0171\u0172"+ - "\u0007\b\u0000\u0000\u0172\u0173\u0007\u0016\u0000\u0000\u0173\u0174\u0001"+ - "\u0000\u0000\u0000\u0174\u0175\u0006\u0012\u0012\u0000\u0175*\u0001\u0000"+ - "\u0000\u0000\u0176\u0177\u0007\u0010\u0000\u0000\u0177\u0178\u0007\u0018"+ - "\u0000\u0000\u0178\u0179\u0007\n\u0000\u0000\u0179\u017a\u0007\u000b\u0000"+ - "\u0000\u017a\u017b\u0007\u000b\u0000\u0000\u017b\u017c\u0001\u0000\u0000"+ - "\u0000\u017c\u017d\u0006\u0013\u0013\u0000\u017d,\u0001\u0000\u0000\u0000"+ - "\u017e\u017f\u0007\u0005\u0000\u0000\u017f\u0180\u0007\f\u0000\u0000\u0180"+ - "\u0181\u0007\u0014\u0000\u0000\u0181\u0182\u0007\u0007\u0000\u0000\u0182"+ - "\u0183\u0007\u0013\u0000\u0000\u0183\u0184\u0007\f\u0000\u0000\u0184\u0185"+ - "\u0007\u0014\u0000\u0000\u0185\u0186\u0007\u0007\u0000\u0000\u0186\u0187"+ - "\u0007\n\u0000\u0000\u0187\u0188\u0007\u0003\u0000\u0000\u0188\u0189\u0001"+ - "\u0000\u0000\u0000\u0189\u018a\u0006\u0014\u0014\u0000\u018a.\u0001\u0000"+ - "\u0000\u0000\u018b\u018c\u0005<\u0000\u0000\u018c\u018d\u0005<\u0000\u0000"+ - "\u018d\u018f\u0001\u0000\u0000\u0000\u018e\u0190\u0005-\u0000\u0000\u018f"+ - "\u018e\u0001\u0000\u0000\u0000\u018f\u0190\u0001\u0000\u0000\u0000\u0190"+ - "\u0191\u0001\u0000\u0000\u0000\u0191\u0195\u0007\u0000\u0000\u0000\u0192"+ - "\u0194\u0007\u0019\u0000\u0000\u0193\u0192\u0001\u0000\u0000\u0000\u0194"+ - "\u0197\u0001\u0000\u0000\u0000\u0195\u0193\u0001\u0000\u0000\u0000\u0195"+ - "\u0196\u0001\u0000\u0000\u0000\u0196\u0198\u0001\u0000\u0000\u0000\u0197"+ - "\u0195\u0001\u0000\u0000\u0000\u0198\u0199\u0006\u0015\u0015\u0000\u0199"+ - "\u019a\u0001\u0000\u0000\u0000\u019a\u019b\u0006\u0015\u0016\u0000\u019b"+ - "0\u0001\u0000\u0000\u0000\u019c\u019d\u00033\u0017\u0000\u019d\u019e\u0001"+ - "\u0000\u0000\u0000\u019e\u019f\u0006\u0016\u0001\u0000\u019f2\u0001\u0000"+ - "\u0000\u0000\u01a0\u01a4\u0007\u001a\u0000\u0000\u01a1\u01a3\u0007\u001b"+ - "\u0000\u0000\u01a2\u01a1\u0001\u0000\u0000\u0000\u01a3\u01a6\u0001\u0000"+ - "\u0000\u0000\u01a4\u01a2\u0001\u0000\u0000\u0000\u01a4\u01a5\u0001\u0000"+ - "\u0000\u0000\u01a5\u01a8\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001\u0000"+ - "\u0000\u0000\u01a7\u01a9\u0005\r\u0000\u0000\u01a8\u01a7\u0001\u0000\u0000"+ - "\u0000\u01a8\u01a9\u0001\u0000\u0000\u0000\u01a9\u01aa\u0001\u0000\u0000"+ - "\u0000\u01aa\u01ab\u0005\n\u0000\u0000\u01ab4\u0001\u0000\u0000\u0000"+ - "\u01ac\u01ad\u0005[\u0000\u0000\u01ad\u01ae\u0006\u0018\u0017\u0000\u01ae"+ - "6\u0001\u0000\u0000\u0000\u01af\u01b0\u0005]\u0000\u0000\u01b0\u01b1\u0006"+ - "\u0019\u0018\u0000\u01b18\u0001\u0000\u0000\u0000\u01b2\u01b3\u0005,\u0000"+ - "\u0000\u01b3\u01b4\u0006\u001a\u0019\u0000\u01b4:\u0001\u0000\u0000\u0000"+ - "\u01b5\u01b6\u0005=\u0000\u0000\u01b6\u01b7\u0006\u001b\u001a\u0000\u01b7"+ - "<\u0001\u0000\u0000\u0000\u01b8\u01b9\u0003?\u001d\u0000\u01b9\u01ba\u0006"+ - "\u001c\u001b\u0000\u01ba>\u0001\u0000\u0000\u0000\u01bb\u01bc\u0005-\u0000"+ - "\u0000\u01bc\u01bd\u0005-\u0000\u0000\u01bd\u01be\u0001\u0000\u0000\u0000"+ - "\u01be\u01c2\u0007\u001c\u0000\u0000\u01bf\u01c1\u0007\u001d\u0000\u0000"+ - "\u01c0\u01bf\u0001\u0000\u0000\u0000\u01c1\u01c4\u0001\u0000\u0000\u0000"+ - "\u01c2\u01c0\u0001\u0000\u0000\u0000\u01c2\u01c3\u0001\u0000\u0000\u0000"+ - "\u01c3\u01cb\u0001\u0000\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000"+ - "\u01c5\u01c7\u0005=\u0000\u0000\u01c6\u01c8\u0003A\u001e\u0000\u01c7\u01c6"+ - "\u0001\u0000\u0000\u0000\u01c8\u01c9\u0001\u0000\u0000\u0000\u01c9\u01c7"+ - "\u0001\u0000\u0000\u0000\u01c9\u01ca\u0001\u0000\u0000\u0000\u01ca\u01cc"+ - "\u0001\u0000\u0000\u0000\u01cb\u01c5\u0001\u0000\u0000\u0000\u01cb\u01cc"+ - "\u0001\u0000\u0000\u0000\u01cc@\u0001\u0000\u0000\u0000\u01cd\u01d3\u0005"+ - "\"\u0000\u0000\u01ce\u01cf\u0005\\\u0000\u0000\u01cf\u01d2\b\u0001\u0000"+ - "\u0000\u01d0\u01d2\b\u001e\u0000\u0000\u01d1\u01ce\u0001\u0000\u0000\u0000"+ - "\u01d1\u01d0\u0001\u0000\u0000\u0000\u01d2\u01d5\u0001\u0000\u0000\u0000"+ - "\u01d3\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d4\u0001\u0000\u0000\u0000"+ - "\u01d4\u01d6\u0001\u0000\u0000\u0000\u01d5\u01d3\u0001\u0000\u0000\u0000"+ - "\u01d6\u01e3\u0005\"\u0000\u0000\u01d7\u01db\u0005\'\u0000\u0000\u01d8"+ - "\u01da\b\u001f\u0000\u0000\u01d9\u01d8\u0001\u0000\u0000\u0000\u01da\u01dd"+ - "\u0001\u0000\u0000\u0000\u01db\u01d9\u0001\u0000\u0000\u0000\u01db\u01dc"+ - "\u0001\u0000\u0000\u0000\u01dc\u01de\u0001\u0000\u0000\u0000\u01dd\u01db"+ - "\u0001\u0000\u0000\u0000\u01de\u01e3\u0005\'\u0000\u0000\u01df\u01e3\b"+ - " \u0000\u0000\u01e0\u01e1\u0005\\\u0000\u0000\u01e1\u01e3\b\u0001\u0000"+ - "\u0000\u01e2\u01cd\u0001\u0000\u0000\u0000\u01e2\u01d7\u0001\u0000\u0000"+ - "\u0000\u01e2\u01df\u0001\u0000\u0000\u0000\u01e2\u01e0\u0001\u0000\u0000"+ - "\u0000\u01e3B\u0001\u0000\u0000\u0000\u01e4\u01e5\u0005-\u0000\u0000\u01e5"+ - "\u01e6\u0005-\u0000\u0000\u01e6\u01e7\u0001\u0000\u0000\u0000\u01e7\u01e8"+ - "\u0006\u001f\u001c\u0000\u01e8D\u0001\u0000\u0000\u0000\u01e9\u01ea\b"+ - "!\u0000\u0000\u01eaF\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005\\\u0000"+ - "\u0000\u01ec\u01ed\t\u0000\u0000\u0000\u01edH\u0001\u0000\u0000\u0000"+ - "\u01ee\u01ef\u0003K#\u0000\u01ef\u01f0\u0006\"\u001d\u0000\u01f0J\u0001"+ - "\u0000\u0000\u0000\u01f1\u01f8\u0005\"\u0000\u0000\u01f2\u01f7\u0003S"+ - "\'\u0000\u01f3\u01f7\u0003Q&\u0000\u01f4\u01f7\u0007\"\u0000\u0000\u01f5"+ - "\u01f7\b#\u0000\u0000\u01f6\u01f2\u0001\u0000\u0000\u0000\u01f6\u01f3"+ - "\u0001\u0000\u0000\u0000\u01f6\u01f4\u0001\u0000\u0000\u0000\u01f6\u01f5"+ - "\u0001\u0000\u0000\u0000\u01f7\u01fa\u0001\u0000\u0000\u0000\u01f8\u01f6"+ - "\u0001\u0000\u0000\u0000\u01f8\u01f9\u0001\u0000\u0000\u0000\u01f9\u01fb"+ - "\u0001\u0000\u0000\u0000\u01fa\u01f8\u0001\u0000\u0000\u0000\u01fb\u01fc"+ - "\u0005\"\u0000\u0000\u01fcL\u0001\u0000\u0000\u0000\u01fd\u01fe\u0003"+ - "O%\u0000\u01fe\u01ff\u0006$\u001e\u0000\u01ffN\u0001\u0000\u0000\u0000"+ - "\u0200\u0206\u0005\'\u0000\u0000\u0201\u0205\u0003Q&\u0000\u0202\u0205"+ - "\u0007\u0001\u0000\u0000\u0203\u0205\b\u001f\u0000\u0000\u0204\u0201\u0001"+ - "\u0000\u0000\u0000\u0204\u0202\u0001\u0000\u0000\u0000\u0204\u0203\u0001"+ - "\u0000\u0000\u0000\u0205\u0208\u0001\u0000\u0000\u0000\u0206\u0204\u0001"+ - "\u0000\u0000\u0000\u0206\u0207\u0001\u0000\u0000\u0000\u0207\u0209\u0001"+ - "\u0000\u0000\u0000\u0208\u0206\u0001\u0000\u0000\u0000\u0209\u020a\u0005"+ - "\'\u0000\u0000\u020aP\u0001\u0000\u0000\u0000\u020b\u020f\u0007\u001a"+ - "\u0000\u0000\u020c\u020e\u0007\u001b\u0000\u0000\u020d\u020c\u0001\u0000"+ - "\u0000\u0000\u020e\u0211\u0001\u0000\u0000\u0000\u020f\u020d\u0001\u0000"+ - "\u0000\u0000\u020f\u0210\u0001\u0000\u0000\u0000\u0210\u0213\u0001\u0000"+ - "\u0000\u0000\u0211\u020f\u0001\u0000\u0000\u0000\u0212\u0214\u0007\u0001"+ - "\u0000\u0000\u0213\u0212\u0001\u0000\u0000\u0000\u0214\u0215\u0001\u0000"+ - "\u0000\u0000\u0215\u0213\u0001\u0000\u0000\u0000\u0215\u0216\u0001\u0000"+ - "\u0000\u0000\u0216R\u0001\u0000\u0000\u0000\u0217\u0218\u0005\\\u0000"+ - "\u0000\u0218\u0219\b\u0001\u0000\u0000\u0219T\u0001\u0000\u0000\u0000"+ - "\u021a\u021b\u0007$\u0000\u0000\u021bV\u0001\u0000\u0000\u0000\u021c\u021d"+ - "\u0003Y*\u0000\u021d\u021e\u0006)\u001f\u0000\u021eX\u0001\u0000\u0000"+ - "\u0000\u021f\u0220\u0005$\u0000\u0000\u0220\u0221\u0005{\u0000\u0000\u0221"+ - "\u0225\u0007\u0000\u0000\u0000\u0222\u0224\u0007\u0019\u0000\u0000\u0223"+ - "\u0222\u0001\u0000\u0000\u0000\u0224\u0227\u0001\u0000\u0000\u0000\u0225"+ - "\u0223\u0001\u0000\u0000\u0000\u0225\u0226\u0001\u0000\u0000\u0000\u0226"+ - "\u022d\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0228"+ - "\u0229\u0005:\u0000\u0000\u0229\u022e\u0005-\u0000\u0000\u022a\u022b\u0005"+ - ":\u0000\u0000\u022b\u022e\u0005+\u0000\u0000\u022c\u022e\u0005:\u0000"+ - "\u0000\u022d\u0228\u0001\u0000\u0000\u0000\u022d\u022a\u0001\u0000\u0000"+ - "\u0000\u022d\u022c\u0001\u0000\u0000\u0000\u022d\u022e\u0001\u0000\u0000"+ - "\u0000\u022e\u0232\u0001\u0000\u0000\u0000\u022f\u0231\b%\u0000\u0000"+ - "\u0230\u022f\u0001\u0000\u0000\u0000\u0231\u0234\u0001\u0000\u0000\u0000"+ - "\u0232\u0230\u0001\u0000\u0000\u0000\u0232\u0233\u0001\u0000\u0000\u0000"+ - "\u0233\u0235\u0001\u0000\u0000\u0000\u0234\u0232\u0001\u0000\u0000\u0000"+ - "\u0235\u023f\u0005}\u0000\u0000\u0236\u0237\u0005$\u0000\u0000\u0237\u023b"+ - "\u0007\u0000\u0000\u0000\u0238\u023a\u0007\u0019\u0000\u0000\u0239\u0238"+ - "\u0001\u0000\u0000\u0000\u023a\u023d\u0001\u0000\u0000\u0000\u023b\u0239"+ - "\u0001\u0000\u0000\u0000\u023b\u023c\u0001\u0000\u0000\u0000\u023c\u023f"+ - "\u0001\u0000\u0000\u0000\u023d\u023b\u0001\u0000\u0000\u0000\u023e\u021f"+ - "\u0001\u0000\u0000\u0000\u023e\u0236\u0001\u0000\u0000\u0000\u023fZ\u0001"+ - "\u0000\u0000\u0000\u0240\u0241\u0003],\u0000\u0241\u0242\u0006+ \u0000"+ - "\u0242\\\u0001\u0000\u0000\u0000\u0243\u0244\u0005$\u0000\u0000\u0244"+ - "\u0245\u0007&\u0000\u0000\u0245^\u0001\u0000\u0000\u0000\u0246\u0247\u0005"+ - "$\u0000\u0000\u0247\u0248\u0005(\u0000\u0000\u0248\u0255\u0001\u0000\u0000"+ - "\u0000\u0249\u0254\u0003_-\u0000\u024a\u0254\b\'\u0000\u0000\u024b\u024f"+ - "\u0005(\u0000\u0000\u024c\u024e\u0003a.\u0000\u024d\u024c\u0001\u0000"+ - "\u0000\u0000\u024e\u0251\u0001\u0000\u0000\u0000\u024f\u024d\u0001\u0000"+ - "\u0000\u0000\u024f\u0250\u0001\u0000\u0000\u0000\u0250\u0252\u0001\u0000"+ - "\u0000\u0000\u0251\u024f\u0001\u0000\u0000\u0000\u0252\u0254\u0005)\u0000"+ - "\u0000\u0253\u0249\u0001\u0000\u0000\u0000\u0253\u024a\u0001\u0000\u0000"+ - "\u0000\u0253\u024b\u0001\u0000\u0000\u0000\u0254\u0257\u0001\u0000\u0000"+ - "\u0000\u0255\u0253\u0001\u0000\u0000\u0000\u0255\u0256\u0001\u0000\u0000"+ - "\u0000\u0256\u0258\u0001\u0000\u0000\u0000\u0257\u0255\u0001\u0000\u0000"+ - "\u0000\u0258\u0259\u0005)\u0000\u0000\u0259\u025a\u0006-!\u0000\u025a"+ - "`\u0001\u0000\u0000\u0000\u025b\u025e\u0003_-\u0000\u025c\u025e\b\'\u0000"+ - "\u0000\u025d\u025b\u0001\u0000\u0000\u0000\u025d\u025c\u0001\u0000\u0000"+ - "\u0000\u025eb\u0001\u0000\u0000\u0000\u025f\u0260\u0005`\u0000\u0000\u0260"+ - "\u0264\b(\u0000\u0000\u0261\u0263\b\"\u0000\u0000\u0262\u0261\u0001\u0000"+ - "\u0000\u0000\u0263\u0266\u0001\u0000\u0000\u0000\u0264\u0262\u0001\u0000"+ - "\u0000\u0000\u0264\u0265\u0001\u0000\u0000\u0000\u0265\u0267\u0001\u0000"+ - "\u0000\u0000\u0266\u0264\u0001\u0000\u0000\u0000\u0267\u0268\u0005`\u0000"+ - "\u0000\u0268\u0269\u0006/\"\u0000\u0269d\u0001\u0000\u0000\u0000\u026a"+ - "\u026b\u0005$\u0000\u0000\u026b\u026c\u00060#\u0000\u026cf\u0001\u0000"+ - "\u0000\u0000\u026d\u0272\b)\u0000\u0000\u026e\u0271\u0003E \u0000\u026f"+ - "\u0271\u0003G!\u0000\u0270\u026e\u0001\u0000\u0000\u0000\u0270\u026f\u0001"+ - "\u0000\u0000\u0000\u0271\u0274\u0001\u0000\u0000\u0000\u0272\u0270\u0001"+ - "\u0000\u0000\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0292\u0001"+ - "\u0000\u0000\u0000\u0274\u0272\u0001\u0000\u0000\u0000\u0275\u0276\u0005"+ - "-\u0000\u0000\u0276\u027b\b)\u0000\u0000\u0277\u027a\u0003E \u0000\u0278"+ - "\u027a\u0003G!\u0000\u0279\u0277\u0001\u0000\u0000\u0000\u0279\u0278\u0001"+ - "\u0000\u0000\u0000\u027a\u027d\u0001\u0000\u0000\u0000\u027b\u0279\u0001"+ - "\u0000\u0000\u0000\u027b\u027c\u0001\u0000\u0000\u0000\u027c\u0292\u0001"+ - "\u0000\u0000\u0000\u027d\u027b\u0001\u0000\u0000\u0000\u027e\u0292\u0005"+ - "-\u0000\u0000\u027f\u0280\u0005<\u0000\u0000\u0280\u0285\b!\u0000\u0000"+ - "\u0281\u0284\u0003E \u0000\u0282\u0284\u0003G!\u0000\u0283\u0281\u0001"+ - "\u0000\u0000\u0000\u0283\u0282\u0001\u0000\u0000\u0000\u0284\u0287\u0001"+ - "\u0000\u0000\u0000\u0285\u0283\u0001\u0000\u0000\u0000\u0285\u0286\u0001"+ - "\u0000\u0000\u0000\u0286\u0292\u0001\u0000\u0000\u0000\u0287\u0285\u0001"+ - "\u0000\u0000\u0000\u0288\u0292\u0005<\u0000\u0000\u0289\u028e\u0003G!"+ - "\u0000\u028a\u028d\u0003E \u0000\u028b\u028d\u0003G!\u0000\u028c\u028a"+ - "\u0001\u0000\u0000\u0000\u028c\u028b\u0001\u0000\u0000\u0000\u028d\u0290"+ - "\u0001\u0000\u0000\u0000\u028e\u028c\u0001\u0000\u0000\u0000\u028e\u028f"+ - "\u0001\u0000\u0000\u0000\u028f\u0292\u0001\u0000\u0000\u0000\u0290\u028e"+ - "\u0001\u0000\u0000\u0000\u0291\u026d\u0001\u0000\u0000\u0000\u0291\u0275"+ - "\u0001\u0000\u0000\u0000\u0291\u027e\u0001\u0000\u0000\u0000\u0291\u027f"+ - "\u0001\u0000\u0000\u0000\u0291\u0288\u0001\u0000\u0000\u0000\u0291\u0289"+ - "\u0001\u0000\u0000\u0000\u0292\u0293\u0001\u0000\u0000\u0000\u0293\u0294"+ - "\u00061$\u0000\u0294h\u0001\u0000\u0000\u0000\u0295\u0297\u0003k3\u0000"+ - "\u0296\u0295\u0001\u0000\u0000\u0000\u0297\u0298\u0001\u0000\u0000\u0000"+ - "\u0298\u0296\u0001\u0000\u0000\u0000\u0298\u0299\u0001\u0000\u0000\u0000"+ - "\u0299\u029a\u0001\u0000\u0000\u0000\u029a\u029b\u00062\u0001\u0000\u029b"+ - "j\u0001\u0000\u0000\u0000\u029c\u029d\u0007\u001b\u0000\u0000\u029dl\u0001"+ - "\u0000\u0000\u0000\u029e\u02a0\u0003o5\u0000\u029f\u029e\u0001\u0000\u0000"+ - "\u0000\u02a0\u02a1\u0001\u0000\u0000\u0000\u02a1\u029f\u0001\u0000\u0000"+ - "\u0000\u02a1\u02a2\u0001\u0000\u0000\u0000\u02a2\u02a3\u0001\u0000\u0000"+ - "\u0000\u02a3\u02a4\u00064%\u0000\u02a4\u02a5\u0001\u0000\u0000\u0000\u02a5"+ - "\u02a6\u00064\u0001\u0000\u02a6n\u0001\u0000\u0000\u0000\u02a7\u02a8\u0007"+ - "\u0001\u0000\u0000\u02a8p\u0001\u0000\u0000\u0000\u02a9\u02ab\u0003k3"+ - "\u0000\u02aa\u02a9\u0001\u0000\u0000\u0000\u02ab\u02ac\u0001\u0000\u0000"+ - "\u0000\u02ac\u02aa\u0001\u0000\u0000\u0000\u02ac\u02ad\u0001\u0000\u0000"+ - "\u0000\u02ad\u02ae\u0001\u0000\u0000\u0000\u02ae\u02af\u00066&\u0000\u02af"+ - "\u02b0\u00066\u0001\u0000\u02b0r\u0001\u0000\u0000\u0000\u02b1\u02b2\u0003"+ - "3\u0017\u0000\u02b2\u02b3\u0001\u0000\u0000\u0000\u02b3\u02b4\u00067\'"+ - "\u0000\u02b4\u02b5\u00067\u0001\u0000\u02b5t\u0001\u0000\u0000\u0000\u02b6"+ - "\u02ba\u0005#\u0000\u0000\u02b7\u02b9\b\u0001\u0000\u0000\u02b8\u02b7"+ - "\u0001\u0000\u0000\u0000\u02b9\u02bc\u0001\u0000\u0000\u0000\u02ba\u02b8"+ - "\u0001\u0000\u0000\u0000\u02ba\u02bb\u0001\u0000\u0000\u0000\u02bb\u02bd"+ - "\u0001\u0000\u0000\u0000\u02bc\u02ba\u0001\u0000\u0000\u0000\u02bd\u02be"+ - "\u00068(\u0000\u02be\u02bf\u00068\u0001\u0000\u02bfv\u0001\u0000\u0000"+ - "\u0000\u02c0\u02c2\u0003o5\u0000\u02c1\u02c0\u0001\u0000\u0000\u0000\u02c2"+ - "\u02c3\u0001\u0000\u0000\u0000\u02c3\u02c1\u0001\u0000\u0000\u0000\u02c3"+ - "\u02c4\u0001\u0000\u0000\u0000\u02c4\u02c5\u0001\u0000\u0000\u0000\u02c5"+ - "\u02c6\u00069)\u0000\u02c6\u02c7\u0001\u0000\u0000\u0000\u02c7\u02c8\u0006"+ - "9*\u0000\u02c8\u02c9\u00069\u0001\u0000\u02c9\u02ca\u00069+\u0000\u02ca"+ - "x\u0001\u0000\u0000\u0000\u02cb\u02cc\u0005:\u0000\u0000\u02ccz\u0001"+ - "\u0000\u0000\u0000\u02cd\u02ce\u0005@\u0000\u0000\u02ce|\u0001\u0000\u0000"+ - "\u0000\u02cf\u02d0\u0007\f\u0000\u0000\u02d0\u02d1\u0007\u0010\u0000\u0000"+ - "\u02d1\u02d2\u0001\u0000\u0000\u0000\u02d2\u02d3\u0006<+\u0000\u02d3~"+ - "\u0001\u0000\u0000\u0000\u02d4\u02d5\u0003?\u001d\u0000\u02d5\u02d6\u0001"+ - "\u0000\u0000\u0000\u02d6\u02d7\u0006=,\u0000\u02d7\u0080\u0001\u0000\u0000"+ - "\u0000\u02d8\u02d9\u0003K#\u0000\u02d9\u02da\u0001\u0000\u0000\u0000\u02da"+ - "\u02db\u0006>-\u0000\u02db\u0082\u0001\u0000\u0000\u0000\u02dc\u02dd\u0003"+ - "O%\u0000\u02dd\u02de\u0001\u0000\u0000\u0000\u02de\u02df\u0006?.\u0000"+ - "\u02df\u0084\u0001\u0000\u0000\u0000\u02e0\u02e1\u0003Y*\u0000\u02e1\u02e2"+ - "\u0001\u0000\u0000\u0000\u02e2\u02e3\u0006@/\u0000\u02e3\u0086\u0001\u0000"+ - "\u0000\u0000\u02e4\u02e5\u0003],\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000"+ - "\u02e6\u02e7\u0006A0\u0000\u02e7\u0088\u0001\u0000\u0000\u0000\u02e8\u02e9"+ - "\u0005$\u0000\u0000\u02e9\u02ea\u0001\u0000\u0000\u0000\u02ea\u02eb\u0006"+ - "B1\u0000\u02eb\u008a\u0001\u0000\u0000\u0000\u02ec\u02f0\u0003\u008dD"+ - "\u0000\u02ed\u02f0\u0003G!\u0000\u02ee\u02f0\u0003\u008fE\u0000\u02ef"+ - "\u02ec\u0001\u0000\u0000\u0000\u02ef\u02ed\u0001\u0000\u0000\u0000\u02ef"+ - "\u02ee\u0001\u0000\u0000\u0000\u02f0\u02f1\u0001\u0000\u0000\u0000\u02f1"+ - "\u02ef\u0001\u0000\u0000\u0000\u02f1\u02f2\u0001\u0000\u0000\u0000\u02f2"+ - "\u02f3\u0001\u0000\u0000\u0000\u02f3\u02f4\u0006C2\u0000\u02f4\u008c\u0001"+ - "\u0000\u0000\u0000\u02f5\u02f6\b*\u0000\u0000\u02f6\u008e\u0001\u0000"+ - "\u0000\u0000\u02f7\u02fc\u0005:\u0000\u0000\u02f8\u02fb\u0003\u008dD\u0000"+ - "\u02f9\u02fb\u0005:\u0000\u0000\u02fa\u02f8\u0001\u0000\u0000\u0000\u02fa"+ - "\u02f9\u0001\u0000\u0000\u0000\u02fb\u02fe\u0001\u0000\u0000\u0000\u02fc"+ - "\u02fa\u0001\u0000\u0000\u0000\u02fc\u02fd\u0001\u0000\u0000\u0000\u02fd"+ - "\u02ff\u0001\u0000\u0000\u0000\u02fe\u02fc\u0001\u0000\u0000\u0000\u02ff"+ - "\u0300\u0005/\u0000\u0000\u0300\u0090\u0001\u0000\u0000\u0000\u0301\u0303"+ - "\u0003k3\u0000\u0302\u0301\u0001\u0000\u0000\u0000\u0303\u0304\u0001\u0000"+ - "\u0000\u0000\u0304\u0302\u0001\u0000\u0000\u0000\u0304\u0305\u0001\u0000"+ - "\u0000\u0000\u0305\u0306\u0001\u0000\u0000\u0000\u0306\u0307\u0006F&\u0000"+ - "\u0307\u0308\u0006F\u0001\u0000\u0308\u0092\u0001\u0000\u0000\u0000\u0309"+ - "\u030a\u00033\u0017\u0000\u030a\u030b\u0001\u0000\u0000\u0000\u030b\u030c"+ - "\u0006G\'\u0000\u030c\u030d\u0006G\u0001\u0000\u030d\u0094\u0001\u0000"+ - "\u0000\u0000\u030e\u0312\u0005#\u0000\u0000\u030f\u0311\b\u0001\u0000"+ - "\u0000\u0310\u030f\u0001\u0000\u0000\u0000\u0311\u0314\u0001\u0000\u0000"+ - "\u0000\u0312\u0310\u0001\u0000\u0000\u0000\u0312\u0313\u0001\u0000\u0000"+ - "\u0000\u0313\u0315\u0001\u0000\u0000\u0000\u0314\u0312\u0001\u0000\u0000"+ - "\u0000\u0315\u0316\u0006H(\u0000\u0316\u0317\u0006H\u0001\u0000\u0317"+ - "\u0096\u0001\u0000\u0000\u0000\u0318\u031a\u0003o5\u0000\u0319\u0318\u0001"+ - "\u0000\u0000\u0000\u031a\u031b\u0001\u0000\u0000\u0000\u031b\u0319\u0001"+ - "\u0000\u0000\u0000\u031b\u031c\u0001\u0000\u0000\u0000\u031c\u031d\u0001"+ - "\u0000\u0000\u0000\u031d\u031e\u0006I3\u0000\u031e\u031f\u0001\u0000\u0000"+ - "\u0000\u031f\u0320\u0006I*\u0000\u0320\u0321\u0006I\u0001\u0000\u0321"+ - "\u0322\u0006I+\u0000\u0322\u0098\u0001\u0000\u0000\u0000\u0323\u0324\u0005"+ - ":\u0000\u0000\u0324\u0325\u0001\u0000\u0000\u0000\u0325\u0326\u0006J4"+ - "\u0000\u0326\u009a\u0001\u0000\u0000\u0000\u0327\u0328\u0003K#\u0000\u0328"+ - "\u0329\u0001\u0000\u0000\u0000\u0329\u032a\u0006K-\u0000\u032a\u009c\u0001"+ - "\u0000\u0000\u0000\u032b\u032c\u0003O%\u0000\u032c\u032d\u0001\u0000\u0000"+ - "\u0000\u032d\u032e\u0006L.\u0000\u032e\u009e\u0001\u0000\u0000\u0000\u032f"+ - "\u0330\u0003Y*\u0000\u0330\u0331\u0001\u0000\u0000\u0000\u0331\u0332\u0006"+ - "M/\u0000\u0332\u00a0\u0001\u0000\u0000\u0000\u0333\u0334\u0003],\u0000"+ - "\u0334\u0335\u0001\u0000\u0000\u0000\u0335\u0336\u0006N0\u0000\u0336\u00a2"+ - "\u0001\u0000\u0000\u0000\u0337\u0338\u0005$\u0000\u0000\u0338\u0339\u0001"+ - "\u0000\u0000\u0000\u0339\u033a\u0006O1\u0000\u033a\u00a4\u0001\u0000\u0000"+ - "\u0000\u033b\u033e\u0003\u00a7Q\u0000\u033c\u033e\u0003G!\u0000\u033d"+ - "\u033b\u0001\u0000\u0000\u0000\u033d\u033c\u0001\u0000\u0000\u0000\u033e"+ - "\u033f\u0001\u0000\u0000\u0000\u033f\u033d\u0001\u0000\u0000\u0000\u033f"+ - "\u0340\u0001\u0000\u0000\u0000\u0340\u0341\u0001\u0000\u0000\u0000\u0341"+ - "\u0342\u0006P2\u0000\u0342\u00a6\u0001\u0000\u0000\u0000\u0343\u0344\b"+ - "+\u0000\u0000\u0344\u00a8\u0001\u0000\u0000\u0000\u0345\u0346\u00033\u0017"+ - "\u0000\u0346\u0347\u0001\u0000\u0000\u0000\u0347\u0348\u0006R\u0001\u0000"+ - "\u0348\u00aa\u0001\u0000\u0000\u0000\u0349\u034a\u0005\n\u0000\u0000\u034a"+ - "\u034b\u0001\u0000\u0000\u0000\u034b\u034c\u0006S*\u0000\u034c\u034d\u0006"+ - "S5\u0000\u034d\u00ac\u0001\u0000\u0000\u0000\u034e\u0350\u0007,\u0000"+ - "\u0000\u034f\u034e\u0001\u0000\u0000\u0000\u0350\u0351\u0001\u0000\u0000"+ - "\u0000\u0351\u034f\u0001\u0000\u0000\u0000\u0351\u0352\u0001\u0000\u0000"+ - "\u0000\u0352\u0353\u0001\u0000\u0000\u0000\u0353\u0354\u0006T\u0001\u0000"+ - "\u0354\u00ae\u0001\u0000\u0000\u0000\u0355\u0356\u0005/\u0000\u0000\u0356"+ - "\u0357\u0005*\u0000\u0000\u0357\u035b\u0001\u0000\u0000\u0000\u0358\u035a"+ - "\t\u0000\u0000\u0000\u0359\u0358\u0001\u0000\u0000\u0000\u035a\u035d\u0001"+ - "\u0000\u0000\u0000\u035b\u035c\u0001\u0000\u0000\u0000\u035b\u0359\u0001"+ - "\u0000\u0000\u0000\u035c\u035e\u0001\u0000\u0000\u0000\u035d\u035b\u0001"+ - "\u0000\u0000\u0000\u035e\u035f\u0005*\u0000\u0000\u035f\u0360\u0005/\u0000"+ - "\u0000\u0360\u0361\u0001\u0000\u0000\u0000\u0361\u0362\u0006U\u0001\u0000"+ - "\u0362\u00b0\u0001\u0000\u0000\u0000\u0363\u0364\u0005/\u0000\u0000\u0364"+ - "\u0367\u0005/\u0000\u0000\u0365\u0367\u0005#\u0000\u0000\u0366\u0363\u0001"+ - "\u0000\u0000\u0000\u0366\u0365\u0001\u0000\u0000\u0000\u0367\u036b\u0001"+ - "\u0000\u0000\u0000\u0368\u036a\b\u0001\u0000\u0000\u0369\u0368\u0001\u0000"+ - "\u0000\u0000\u036a\u036d\u0001\u0000\u0000\u0000\u036b\u0369\u0001\u0000"+ - "\u0000\u0000\u036b\u036c\u0001\u0000\u0000\u0000\u036c\u036f\u0001\u0000"+ - "\u0000\u0000\u036d\u036b\u0001\u0000\u0000\u0000\u036e\u0370\u0005\r\u0000"+ - "\u0000\u036f\u036e\u0001\u0000\u0000\u0000\u036f\u0370\u0001\u0000\u0000"+ - "\u0000\u0370\u0371\u0001\u0000\u0000\u0000\u0371\u0372\u0006V\u0001\u0000"+ - "\u0372\u00b2\u0001\u0000\u0000\u0000\u0373\u0374\u0005<\u0000\u0000\u0374"+ - "\u0375\u0005<\u0000\u0000\u0375\u0377\u0001\u0000\u0000\u0000\u0376\u0378"+ - "\u0005-\u0000\u0000\u0377\u0376\u0001\u0000\u0000\u0000\u0377\u0378\u0001"+ - "\u0000\u0000\u0000\u0378\u0379\u0001\u0000\u0000\u0000\u0379\u037d\u0007"+ - "\u0000\u0000\u0000\u037a\u037c\u0007\u0019\u0000\u0000\u037b\u037a\u0001"+ - "\u0000\u0000\u0000\u037c\u037f\u0001\u0000\u0000\u0000\u037d\u037b\u0001"+ - "\u0000\u0000\u0000\u037d\u037e\u0001\u0000\u0000\u0000\u037e\u0380\u0001"+ - "\u0000\u0000\u0000\u037f\u037d\u0001\u0000\u0000\u0000\u0380\u0381\u0006"+ - "W6\u0000\u0381\u0382\u0001\u0000\u0000\u0000\u0382\u0383\u0006W7\u0000"+ - "\u0383\u00b4\u0001\u0000\u0000\u0000\u0384\u0386\b-\u0000\u0000\u0385"+ - "\u0384\u0001\u0000\u0000\u0000\u0386\u0387\u0001\u0000\u0000\u0000\u0387"+ - "\u0385\u0001\u0000\u0000\u0000\u0387\u0388\u0001\u0000\u0000\u0000\u0388"+ - "\u0393\u0001\u0000\u0000\u0000\u0389\u038a\u0005<\u0000\u0000\u038a\u038e"+ - "\b.\u0000\u0000\u038b\u038d\b/\u0000\u0000\u038c\u038b\u0001\u0000\u0000"+ - "\u0000\u038d\u0390\u0001\u0000\u0000\u0000\u038e\u038c\u0001\u0000\u0000"+ - "\u0000\u038e\u038f\u0001\u0000\u0000\u0000\u038f\u0393\u0001\u0000\u0000"+ - "\u0000\u0390\u038e\u0001\u0000\u0000\u0000\u0391\u0393\u0005<\u0000\u0000"+ - "\u0392\u0385\u0001\u0000\u0000\u0000\u0392\u0389\u0001\u0000\u0000\u0000"+ - "\u0392\u0391\u0001\u0000\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000"+ - "\u0394\u0395\u0006X2\u0000\u0395\u00b6\u0001\u0000\u0000\u0000\u0396\u0397"+ - "\u0005\n\u0000\u0000\u0397\u0398\u0001\u0000\u0000\u0000\u0398\u0399\u0006"+ - "Y*\u0000\u0399\u00b8\u0001\u0000\u0000\u0000\u039a\u039c\b0\u0000\u0000"+ - "\u039b\u039a\u0001\u0000\u0000\u0000\u039c\u039d\u0001\u0000\u0000\u0000"+ - "\u039d\u039b\u0001\u0000\u0000\u0000\u039d\u039e\u0001\u0000\u0000\u0000"+ - "\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u03a0\u0006Z8\u0000\u03a0\u00ba"+ - "\u0001\u0000\u0000\u0000H\u0000\u0001\u0002\u0003\u0004\u00bf\u00c5\u00ca"+ - "\u00d1\u00d7\u00e1\u018f\u0195\u01a4\u01a8\u01c2\u01c9\u01cb\u01d1\u01d3"+ - "\u01db\u01e2\u01f6\u01f8\u0204\u0206\u020f\u0215\u0225\u022d\u0232\u023b"+ - "\u023e\u024f\u0253\u0255\u025d\u0264\u0270\u0272\u0279\u027b\u0283\u0285"+ - "\u028c\u028e\u0291\u0298\u02a1\u02ac\u02ba\u02c3\u02ef\u02f1\u02fa\u02fc"+ - "\u0304\u0312\u031b\u033d\u033f\u0351\u035b\u0366\u036b\u036f\u0377\u037d"+ - "\u0387\u038e\u0392\u039d9\u0001\u0000\u0000\u0000\u0001\u0000\u0001\u0002"+ - "\u0001\u0001\u0003\u0002\u0001\u0004\u0003\u0001\u0005\u0004\u0001\u0006"+ - "\u0005\u0001\u0007\u0006\u0001\b\u0007\u0001\t\b\u0001\n\t\u0001\u000b"+ - "\n\u0001\f\u000b\u0001\r\f\u0001\u000e\r\u0001\u000f\u000e\u0001\u0010"+ - "\u000f\u0001\u0011\u0010\u0001\u0012\u0011\u0001\u0013\u0012\u0001\u0014"+ - "\u0013\u0001\u0015\u0014\u0005\u0003\u0000\u0001\u0018\u0015\u0001\u0019"+ - "\u0016\u0001\u001a\u0017\u0001\u001b\u0018\u0001\u001c\u0019\u0001\u001f"+ - "\u001a\u0001\"\u001b\u0001$\u001c\u0001)\u001d\u0001+\u001e\u0001-\u001f"+ - "\u0001/ \u00010!\u00011\"\u00014#\u0007&\u0000\u0007\u0017\u0000\u0007"+ - "\u0002\u0000\u00019$\u0007\'\u0000\u0004\u0000\u0000\u0007\u001c\u0000"+ - "\u0007\u001e\u0000\u0007\u001f\u0000\u0007 \u0000\u0007!\u0000\u0007$"+ - "\u0000\u0007%\u0000\u0001I%\u0007(\u0000\u0002\u0004\u0000\u0001W&\u0007"+ - "\u0016\u0000\u0001Z\'"; + "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0001\u0015\u0003\u0015\u01a9\b\u0015\u0001\u0015\u0001\u0015\u0005"+ + "\u0015\u01ad\b\u0015\n\u0015\f\u0015\u01b0\t\u0015\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0017\u0001\u0017\u0005\u0017\u01bc\b\u0017\n\u0017\f\u0017\u01bf"+ + "\t\u0017\u0001\u0017\u0003\u0017\u01c2\b\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0005\u001e"+ + "\u01e9\b\u001e\n\u001e\f\u001e\u01ec\t\u001e\u0001\u001e\u0001\u001e\u0004"+ + "\u001e\u01f0\b\u001e\u000b\u001e\f\u001e\u01f1\u0003\u001e\u01f4\b\u001e"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0005\u001f\u01fa\b\u001f"+ + "\n\u001f\f\u001f\u01fd\t\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0005"+ + "\u001f\u0202\b\u001f\n\u001f\f\u001f\u0205\t\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0003\u001f\u020b\b\u001f\u0001 \u0001 \u0001"+ + " \u0001 \u0001 \u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001"+ + "#\u0001$\u0001$\u0001$\u0001$\u0001$\u0005$\u021f\b$\n$\f$\u0222\t$\u0001"+ + "$\u0001$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0005&\u022d"+ + "\b&\n&\f&\u0230\t&\u0001&\u0001&\u0001\'\u0001\'\u0005\'\u0236\b\'\n\'"+ + "\f\'\u0239\t\'\u0001\'\u0004\'\u023c\b\'\u000b\'\f\'\u023d\u0001(\u0001"+ + "(\u0001(\u0001)\u0001)\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001"+ + "+\u0005+\u024c\b+\n+\f+\u024f\t+\u0001+\u0001+\u0001+\u0001+\u0001+\u0003"+ + "+\u0256\b+\u0001+\u0005+\u0259\b+\n+\f+\u025c\t+\u0001+\u0001+\u0001+"+ + "\u0001+\u0005+\u0262\b+\n+\f+\u0265\t+\u0003+\u0267\b+\u0001,\u0001,\u0001"+ + ",\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0005.\u0276\b.\n.\f.\u0279\t.\u0001.\u0005.\u027c\b.\n.\f.\u027f\t"+ + ".\u0001.\u0001.\u0001.\u0001/\u0001/\u0003/\u0286\b/\u00010\u00010\u0001"+ + "0\u00050\u028b\b0\n0\f0\u028e\t0\u00010\u00010\u00010\u00011\u00011\u0001"+ + "1\u00012\u00012\u00012\u00052\u0299\b2\n2\f2\u029c\t2\u00012\u00012\u0001"+ + "2\u00012\u00052\u02a2\b2\n2\f2\u02a5\t2\u00012\u00012\u00012\u00012\u0001"+ + "2\u00052\u02ac\b2\n2\f2\u02af\t2\u00012\u00012\u00012\u00012\u00052\u02b5"+ + "\b2\n2\f2\u02b8\t2\u00032\u02ba\b2\u00012\u00012\u00013\u00043\u02bf\b"+ + "3\u000b3\f3\u02c0\u00013\u00013\u00014\u00014\u00015\u00045\u02c8\b5\u000b"+ + "5\f5\u02c9\u00015\u00015\u00015\u00015\u00016\u00016\u00017\u00047\u02d3"+ + "\b7\u000b7\f7\u02d4\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u0001"+ + "8\u00019\u00019\u00059\u02e1\b9\n9\f9\u02e4\t9\u00019\u00019\u00019\u0001"+ + ":\u0004:\u02ea\b:\u000b:\f:\u02eb\u0001:\u0001:\u0001:\u0001:\u0001:\u0001"+ + ":\u0001;\u0001;\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001"+ + "?\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001B\u0001"+ + "B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001"+ + "D\u0001E\u0001E\u0001E\u0004E\u031f\bE\u000bE\fE\u0320\u0001F\u0001F\u0001"+ + "G\u0001G\u0001G\u0005G\u0328\bG\nG\fG\u032b\tG\u0001G\u0001G\u0001H\u0004"+ + "H\u0330\bH\u000bH\fH\u0331\u0001H\u0003H\u0335\bH\u0001H\u0001H\u0001"+ + "I\u0004I\u033a\bI\u000bI\fI\u033b\u0001I\u0001I\u0001I\u0001I\u0001I\u0001"+ + "I\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001L\u0001"+ + "L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001"+ + "N\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001R\u0004R\u0365\bR\u000bR\fR\u0366\u0001R\u0001R\u0001"+ + "R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0005T\u0373\bT\nT"+ + "\fT\u0376\tT\u0001T\u0001T\u0001T\u0001U\u0004U\u037c\bU\u000bU\fU\u037d"+ + "\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001"+ + "V\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001"+ + "[\u0001\\\u0001\\\u0004\\\u03a0\b\\\u000b\\\f\\\u03a1\u0001\\\u0001\\"+ + "\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001"+ + "_\u0001_\u0001`\u0004`\u03b2\b`\u000b`\f`\u03b3\u0001`\u0001`\u0001a\u0001"+ + "a\u0001a\u0001a\u0005a\u03bc\ba\na\fa\u03bf\ta\u0001a\u0001a\u0001a\u0001"+ + "a\u0001a\u0001b\u0001b\u0001b\u0003b\u03c9\bb\u0001b\u0005b\u03cc\bb\n"+ + "b\fb\u03cf\tb\u0001b\u0003b\u03d2\bb\u0001b\u0001b\u0001c\u0001c\u0001"+ + "c\u0001c\u0003c\u03da\bc\u0001c\u0001c\u0005c\u03de\bc\nc\fc\u03e1\tc"+ + "\u0001c\u0001c\u0001c\u0001c\u0001d\u0004d\u03e8\bd\u000bd\fd\u03e9\u0001"+ + "d\u0001d\u0001d\u0005d\u03ef\bd\nd\fd\u03f2\td\u0001d\u0003d\u03f5\bd"+ + "\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001f\u0004f\u03fe\bf\u000b"+ + "f\ff\u03ff\u0001f\u0001f\u0001\u03bd\u0000g\u0006\u0001\b\u0002\n\u0003"+ + "\f\u0004\u000e\u0005\u0010\u0006\u0012\u0007\u0014\b\u0016\t\u0018\n\u001a"+ + "\u000b\u001c\f\u001e\r \u000e\"\u000f$\u0010&\u0011(\u0012*\u0013,\u0014"+ + ".\u00150\u00162\u00174\u00006\u00188\u0019:\u001a<\u001b>\u001c@\u001d"+ + "B\u0000D\u0000F\u001eH\u0000J\u0000L\u001fN\u0000P R\u0000T\u0000V\u0000"+ + "X\u0000Z!\\\u0000^\"`\u0000b#d\u0000f$h%j&l\'n\u0000p(r\u0000t\u0000v"+ + "\u0000x\u0000z\u0000|)~*\u0080+\u0082\u0000\u0084\u0000\u0086\u0000\u0088"+ + "\u0000\u008a\u0000\u008c\u0000\u008e\u0000\u0090\u0000\u0092\u0000\u0094"+ + "\u0000\u0096,\u0098\u0000\u009a\u0000\u009c\u0000\u009e\u0000\u00a0\u0000"+ + "\u00a2\u0000\u00a4\u0000\u00a6\u0000\u00a8\u0000\u00aa\u0000\u00ac\u0000"+ + "\u00ae\u0000\u00b0\u0000\u00b2\u0000\u00b4\u0000\u00b6\u0000\u00b8\u0000"+ + "\u00ba\u0000\u00bc\u0000\u00be\u0000\u00c0\u0000\u00c2-\u00c4\u0000\u00c6"+ + ".\u00c8/\u00ca0\u00cc\u0000\u00ce\u0000\u00d02\u00d21\u0006\u0000\u0001"+ + "\u0002\u0003\u0004\u00051\u0003\u0000AZ__az\u0002\u0000\n\n\r\r\u0002"+ + "\u0000FFff\u0002\u0000RRrr\u0002\u0000OOoo\u0002\u0000MMmm\u0002\u0000"+ + "UUuu\u0002\u0000NNnn\u0002\u0000CCcc\u0002\u0000DDdd\u0002\u0000EEee\u0002"+ + "\u0000LLll\u0002\u0000AAaa\u0002\u0000BBbb\u0002\u0000XXxx\u0002\u0000"+ + "PPpp\u0002\u0000SSss\u0002\u0000VVvv\u0002\u0000YYyy\u0002\u0000TTtt\u0002"+ + "\u0000IIii\u0002\u0000WWww\u0002\u0000KKkk\u0002\u0000GGgg\u0002\u0000"+ + "HHhh\u0004\u000009AZ__az\u0002\u0000\\\\``\u0002\u0000\t\t \u0002\u0000"+ + "AZaz\u0005\u0000--09AZ__az\u0004\u0000\n\n\r\r\"\"\\\\\u0003\u0000\n\n"+ + "\r\r\'\'\u0006\u0000\t\n\r\r \"\"\'\'\\\\\b\u0000\t\n\r\r \"\"$$\'\'"+ + "<=[]\u0003\u0000\n\n\r\r``\u0005\u0000\n\n\r\r\"\"\\\\``\u0003\u00000"+ + "9AFaf\u0001\u0000}}\u0005\u0000!!#$**09?@\u0001\u0000()\u0004\u0000\t"+ + "\n\r\r ``\t\u0000\t\n\r\r \"\"$$\'\'--<=[]\t\u0000\t\n\r\r \"\"$$\'"+ + "\'::@@\\\\\b\u0000\t\n\r\r \"\"$$\'\'::\\\\\u0003\u0000\t\t\f\r \u0006"+ + "\u0000\t\n\r\r <<\\\\``\u0004\u0000\t\n\r\r <<\u0003\u0000\t\n\r\r "+ + " \u0001\u0000\n\n\u043e\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001"+ + "\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000"+ + "\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000"+ + "\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000"+ + "\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000"+ + "\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000"+ + "\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000"+ + "\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000"+ + "\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*"+ + "\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000"+ + "\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000"+ + "\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:"+ + "\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000"+ + "\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000"+ + "\u0000L\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000Z"+ + "\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000b\u0001\u0000"+ + "\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000"+ + "\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000p"+ + "\u0001\u0000\u0000\u0000\u0001t\u0001\u0000\u0000\u0000\u0001v\u0001\u0000"+ + "\u0000\u0000\u0001x\u0001\u0000\u0000\u0000\u0001z\u0001\u0000\u0000\u0000"+ + "\u0001|\u0001\u0000\u0000\u0000\u0001~\u0001\u0000\u0000\u0000\u0001\u0080"+ + "\u0001\u0000\u0000\u0000\u0001\u0082\u0001\u0000\u0000\u0000\u0001\u0084"+ + "\u0001\u0000\u0000\u0000\u0001\u0086\u0001\u0000\u0000\u0000\u0001\u0088"+ + "\u0001\u0000\u0000\u0000\u0001\u008a\u0001\u0000\u0000\u0000\u0001\u008c"+ + "\u0001\u0000\u0000\u0000\u0001\u008e\u0001\u0000\u0000\u0000\u0002\u0096"+ + "\u0001\u0000\u0000\u0000\u0002\u0098\u0001\u0000\u0000\u0000\u0002\u009a"+ + "\u0001\u0000\u0000\u0000\u0002\u009c\u0001\u0000\u0000\u0000\u0002\u009e"+ + "\u0001\u0000\u0000\u0000\u0002\u00a0\u0001\u0000\u0000\u0000\u0002\u00a2"+ + "\u0001\u0000\u0000\u0000\u0002\u00a4\u0001\u0000\u0000\u0000\u0002\u00a6"+ + "\u0001\u0000\u0000\u0000\u0002\u00a8\u0001\u0000\u0000\u0000\u0003\u00aa"+ + "\u0001\u0000\u0000\u0000\u0003\u00ac\u0001\u0000\u0000\u0000\u0003\u00ae"+ + "\u0001\u0000\u0000\u0000\u0003\u00b0\u0001\u0000\u0000\u0000\u0003\u00b2"+ + "\u0001\u0000\u0000\u0000\u0003\u00b4\u0001\u0000\u0000\u0000\u0003\u00b6"+ + "\u0001\u0000\u0000\u0000\u0003\u00b8\u0001\u0000\u0000\u0000\u0003\u00ba"+ + "\u0001\u0000\u0000\u0000\u0003\u00bc\u0001\u0000\u0000\u0000\u0003\u00be"+ + "\u0001\u0000\u0000\u0000\u0004\u00c2\u0001\u0000\u0000\u0000\u0004\u00c4"+ + "\u0001\u0000\u0000\u0000\u0004\u00c6\u0001\u0000\u0000\u0000\u0004\u00c8"+ + "\u0001\u0000\u0000\u0000\u0004\u00ca\u0001\u0000\u0000\u0000\u0004\u00cc"+ + "\u0001\u0000\u0000\u0000\u0004\u00ce\u0001\u0000\u0000\u0000\u0005\u00d0"+ + "\u0001\u0000\u0000\u0000\u0005\u00d2\u0001\u0000\u0000\u0000\u0006\u00d4"+ + "\u0001\u0000\u0000\u0000\b\u00f6\u0001\u0000\u0000\u0000\n\u00ff\u0001"+ + "\u0000\u0000\u0000\f\u0106\u0001\u0000\u0000\u0000\u000e\u010c\u0001\u0000"+ + "\u0000\u0000\u0010\u0112\u0001\u0000\u0000\u0000\u0012\u0119\u0001\u0000"+ + "\u0000\u0000\u0014\u0121\u0001\u0000\u0000\u0000\u0016\u012a\u0001\u0000"+ + "\u0000\u0000\u0018\u0130\u0001\u0000\u0000\u0000\u001a\u0136\u0001\u0000"+ + "\u0000\u0000\u001c\u013d\u0001\u0000\u0000\u0000\u001e\u014a\u0001\u0000"+ + "\u0000\u0000 \u0153\u0001\u0000\u0000\u0000\"\u015a\u0001\u0000\u0000"+ + "\u0000$\u0164\u0001\u0000\u0000\u0000&\u016a\u0001\u0000\u0000\u0000("+ + "\u0174\u0001\u0000\u0000\u0000*\u0181\u0001\u0000\u0000\u0000,\u018f\u0001"+ + "\u0000\u0000\u0000.\u0197\u0001\u0000\u0000\u00000\u01a4\u0001\u0000\u0000"+ + "\u00002\u01b5\u0001\u0000\u0000\u00004\u01b9\u0001\u0000\u0000\u00006"+ + "\u01c5\u0001\u0000\u0000\u00008\u01c8\u0001\u0000\u0000\u0000:\u01cb\u0001"+ + "\u0000\u0000\u0000<\u01ce\u0001\u0000\u0000\u0000>\u01d1\u0001\u0000\u0000"+ + "\u0000@\u01d8\u0001\u0000\u0000\u0000B\u01e6\u0001\u0000\u0000\u0000D"+ + "\u020a\u0001\u0000\u0000\u0000F\u020c\u0001\u0000\u0000\u0000H\u0211\u0001"+ + "\u0000\u0000\u0000J\u0213\u0001\u0000\u0000\u0000L\u0216\u0001\u0000\u0000"+ + "\u0000N\u0219\u0001\u0000\u0000\u0000P\u0225\u0001\u0000\u0000\u0000R"+ + "\u0228\u0001\u0000\u0000\u0000T\u0233\u0001\u0000\u0000\u0000V\u023f\u0001"+ + "\u0000\u0000\u0000X\u0242\u0001\u0000\u0000\u0000Z\u0244\u0001\u0000\u0000"+ + "\u0000\\\u0266\u0001\u0000\u0000\u0000^\u0268\u0001\u0000\u0000\u0000"+ + "`\u026b\u0001\u0000\u0000\u0000b\u026e\u0001\u0000\u0000\u0000d\u0285"+ + "\u0001\u0000\u0000\u0000f\u0287\u0001\u0000\u0000\u0000h\u0292\u0001\u0000"+ + "\u0000\u0000j\u02b9\u0001\u0000\u0000\u0000l\u02be\u0001\u0000\u0000\u0000"+ + "n\u02c4\u0001\u0000\u0000\u0000p\u02c7\u0001\u0000\u0000\u0000r\u02cf"+ + "\u0001\u0000\u0000\u0000t\u02d2\u0001\u0000\u0000\u0000v\u02d9\u0001\u0000"+ + "\u0000\u0000x\u02de\u0001\u0000\u0000\u0000z\u02e9\u0001\u0000\u0000\u0000"+ + "|\u02f3\u0001\u0000\u0000\u0000~\u02f5\u0001\u0000\u0000\u0000\u0080\u02f7"+ + "\u0001\u0000\u0000\u0000\u0082\u02fc\u0001\u0000\u0000\u0000\u0084\u0303"+ + "\u0001\u0000\u0000\u0000\u0086\u0307\u0001\u0000\u0000\u0000\u0088\u030b"+ + "\u0001\u0000\u0000\u0000\u008a\u030f\u0001\u0000\u0000\u0000\u008c\u0313"+ + "\u0001\u0000\u0000\u0000\u008e\u0317\u0001\u0000\u0000\u0000\u0090\u031e"+ + "\u0001\u0000\u0000\u0000\u0092\u0322\u0001\u0000\u0000\u0000\u0094\u0324"+ + "\u0001\u0000\u0000\u0000\u0096\u0334\u0001\u0000\u0000\u0000\u0098\u0339"+ + "\u0001\u0000\u0000\u0000\u009a\u0343\u0001\u0000\u0000\u0000\u009c\u0347"+ + "\u0001\u0000\u0000\u0000\u009e\u034b\u0001\u0000\u0000\u0000\u00a0\u034f"+ + "\u0001\u0000\u0000\u0000\u00a2\u0353\u0001\u0000\u0000\u0000\u00a4\u0357"+ + "\u0001\u0000\u0000\u0000\u00a6\u035b\u0001\u0000\u0000\u0000\u00a8\u035f"+ + "\u0001\u0000\u0000\u0000\u00aa\u0364\u0001\u0000\u0000\u0000\u00ac\u036b"+ + "\u0001\u0000\u0000\u0000\u00ae\u0370\u0001\u0000\u0000\u0000\u00b0\u037b"+ + "\u0001\u0000\u0000\u0000\u00b2\u0385\u0001\u0000\u0000\u0000\u00b4\u0389"+ + "\u0001\u0000\u0000\u0000\u00b6\u038d\u0001\u0000\u0000\u0000\u00b8\u0391"+ + "\u0001\u0000\u0000\u0000\u00ba\u0395\u0001\u0000\u0000\u0000\u00bc\u0399"+ + "\u0001\u0000\u0000\u0000\u00be\u039f\u0001\u0000\u0000\u0000\u00c0\u03a5"+ + "\u0001\u0000\u0000\u0000\u00c2\u03a7\u0001\u0000\u0000\u0000\u00c4\u03ab"+ + "\u0001\u0000\u0000\u0000\u00c6\u03b1\u0001\u0000\u0000\u0000\u00c8\u03b7"+ + "\u0001\u0000\u0000\u0000\u00ca\u03c8\u0001\u0000\u0000\u0000\u00cc\u03d5"+ + "\u0001\u0000\u0000\u0000\u00ce\u03f4\u0001\u0000\u0000\u0000\u00d0\u03f8"+ + "\u0001\u0000\u0000\u0000\u00d2\u03fd\u0001\u0000\u0000\u0000\u00d4\u00d8"+ + "\u0005#\u0000\u0000\u00d5\u00d7\u0003n4\u0000\u00d6\u00d5\u0001\u0000"+ + "\u0000\u0000\u00d7\u00da\u0001\u0000\u0000\u0000\u00d8\u00d6\u0001\u0000"+ + "\u0000\u0000\u00d8\u00d9\u0001\u0000\u0000\u0000\u00d9\u00dc\u0001\u0000"+ + "\u0000\u0000\u00da\u00d8\u0001\u0000\u0000\u0000\u00db\u00dd\u0007\u0000"+ + "\u0000\u0000\u00dc\u00db\u0001\u0000\u0000\u0000\u00dd\u00de\u0001\u0000"+ + "\u0000\u0000\u00de\u00dc\u0001\u0000\u0000\u0000\u00de\u00df\u0001\u0000"+ + "\u0000\u0000\u00df\u00e3\u0001\u0000\u0000\u0000\u00e0\u00e2\u0003n4\u0000"+ + "\u00e1\u00e0\u0001\u0000\u0000\u0000\u00e2\u00e5\u0001\u0000\u0000\u0000"+ + "\u00e3\u00e1\u0001\u0000\u0000\u0000\u00e3\u00e4\u0001\u0000\u0000\u0000"+ + "\u00e4\u00e6\u0001\u0000\u0000\u0000\u00e5\u00e3\u0001\u0000\u0000\u0000"+ + "\u00e6\u00ea\u0005=\u0000\u0000\u00e7\u00e9\u0003n4\u0000\u00e8\u00e7"+ + "\u0001\u0000\u0000\u0000\u00e9\u00ec\u0001\u0000\u0000\u0000\u00ea\u00e8"+ + "\u0001\u0000\u0000\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb\u00f0"+ + "\u0001\u0000\u0000\u0000\u00ec\u00ea\u0001\u0000\u0000\u0000\u00ed\u00ef"+ + "\b\u0001\u0000\u0000\u00ee\u00ed\u0001\u0000\u0000\u0000\u00ef\u00f2\u0001"+ + "\u0000\u0000\u0000\u00f0\u00ee\u0001\u0000\u0000\u0000\u00f0\u00f1\u0001"+ + "\u0000\u0000\u0000\u00f1\u00f3\u0001\u0000\u0000\u0000\u00f2\u00f0\u0001"+ + "\u0000\u0000\u0000\u00f3\u00f4\u0003r6\u0000\u00f4\u00f5\u0006\u0000\u0000"+ + "\u0000\u00f5\u0007\u0001\u0000\u0000\u0000\u00f6\u00fa\u0005#\u0000\u0000"+ + "\u00f7\u00f9\b\u0001\u0000\u0000\u00f8\u00f7\u0001\u0000\u0000\u0000\u00f9"+ + "\u00fc\u0001\u0000\u0000\u0000\u00fa\u00f8\u0001\u0000\u0000\u0000\u00fa"+ + "\u00fb\u0001\u0000\u0000\u0000\u00fb\u00fd\u0001\u0000\u0000\u0000\u00fc"+ + "\u00fa\u0001\u0000\u0000\u0000\u00fd\u00fe\u0006\u0001\u0001\u0000\u00fe"+ + "\t\u0001\u0000\u0000\u0000\u00ff\u0100\u0007\u0002\u0000\u0000\u0100\u0101"+ + "\u0007\u0003\u0000\u0000\u0101\u0102\u0007\u0004\u0000\u0000\u0102\u0103"+ + "\u0007\u0005\u0000\u0000\u0103\u0104\u0001\u0000\u0000\u0000\u0104\u0105"+ + "\u0006\u0002\u0002\u0000\u0105\u000b\u0001\u0000\u0000\u0000\u0106\u0107"+ + "\u0007\u0003\u0000\u0000\u0107\u0108\u0007\u0006\u0000\u0000\u0108\u0109"+ + "\u0007\u0007\u0000\u0000\u0109\u010a\u0001\u0000\u0000\u0000\u010a\u010b"+ + "\u0006\u0003\u0003\u0000\u010b\r\u0001\u0000\u0000\u0000\u010c\u010d\u0007"+ + "\b\u0000\u0000\u010d\u010e\u0007\u0005\u0000\u0000\u010e\u010f\u0007\t"+ + "\u0000\u0000\u010f\u0110\u0001\u0000\u0000\u0000\u0110\u0111\u0006\u0004"+ + "\u0004\u0000\u0111\u000f\u0001\u0000\u0000\u0000\u0112\u0113\u0007\u0007"+ + "\u0000\u0000\u0113\u0114\u0007\u0004\u0000\u0000\u0114\u0115\u0007\u0007"+ + "\u0000\u0000\u0115\u0116\u0007\n\u0000\u0000\u0116\u0117\u0001\u0000\u0000"+ + "\u0000\u0117\u0118\u0006\u0005\u0005\u0000\u0118\u0011\u0001\u0000\u0000"+ + "\u0000\u0119\u011a\u0007\u000b\u0000\u0000\u011a\u011b\u0007\f\u0000\u0000"+ + "\u011b\u011c\u0007\r\u0000\u0000\u011c\u011d\u0007\n\u0000\u0000\u011d"+ + "\u011e\u0007\u000b\u0000\u0000\u011e\u011f\u0001\u0000\u0000\u0000\u011f"+ + "\u0120\u0006\u0006\u0006\u0000\u0120\u0013\u0001\u0000\u0000\u0000\u0121"+ + "\u0122\u0007\n\u0000\u0000\u0122\u0123\u0007\u000e\u0000\u0000\u0123\u0124"+ + "\u0007\u000f\u0000\u0000\u0124\u0125\u0007\u0004\u0000\u0000\u0125\u0126"+ + "\u0007\u0010\u0000\u0000\u0126\u0127\u0007\n\u0000\u0000\u0127\u0128\u0001"+ + "\u0000\u0000\u0000\u0128\u0129\u0006\u0007\u0007\u0000\u0129\u0015\u0001"+ + "\u0000\u0000\u0000\u012a\u012b\u0007\n\u0000\u0000\u012b\u012c\u0007\u0007"+ + "\u0000\u0000\u012c\u012d\u0007\u0011\u0000\u0000\u012d\u012e\u0001\u0000"+ + "\u0000\u0000\u012e\u012f\u0006\b\b\u0000\u012f\u0017\u0001\u0000\u0000"+ + "\u0000\u0130\u0131\u0007\f\u0000\u0000\u0131\u0132\u0007\t\u0000\u0000"+ + "\u0132\u0133\u0007\t\u0000\u0000\u0133\u0134\u0001\u0000\u0000\u0000\u0134"+ + "\u0135\u0006\t\t\u0000\u0135\u0019\u0001\u0000\u0000\u0000\u0136\u0137"+ + "\u0007\b\u0000\u0000\u0137\u0138\u0007\u0004\u0000\u0000\u0138\u0139\u0007"+ + "\u000f\u0000\u0000\u0139\u013a\u0007\u0012\u0000\u0000\u013a\u013b\u0001"+ + "\u0000\u0000\u0000\u013b\u013c\u0006\n\n\u0000\u013c\u001b\u0001\u0000"+ + "\u0000\u0000\u013d\u013e\u0007\n\u0000\u0000\u013e\u013f\u0007\u0007\u0000"+ + "\u0000\u013f\u0140\u0007\u0013\u0000\u0000\u0140\u0141\u0007\u0003\u0000"+ + "\u0000\u0141\u0142\u0007\u0012\u0000\u0000\u0142\u0143\u0007\u000f\u0000"+ + "\u0000\u0143\u0144\u0007\u0004\u0000\u0000\u0144\u0145\u0007\u0014\u0000"+ + "\u0000\u0145\u0146\u0007\u0007\u0000\u0000\u0146\u0147\u0007\u0013\u0000"+ + "\u0000\u0147\u0148\u0001\u0000\u0000\u0000\u0148\u0149\u0006\u000b\u000b"+ + "\u0000\u0149\u001d\u0001\u0000\u0000\u0000\u014a\u014b\u0007\u0011\u0000"+ + "\u0000\u014b\u014c\u0007\u0004\u0000\u0000\u014c\u014d\u0007\u000b\u0000"+ + "\u0000\u014d\u014e\u0007\u0006\u0000\u0000\u014e\u014f\u0007\u0005\u0000"+ + "\u0000\u014f\u0150\u0007\n\u0000\u0000\u0150\u0151\u0001\u0000\u0000\u0000"+ + "\u0151\u0152\u0006\f\f\u0000\u0152\u001f\u0001\u0000\u0000\u0000\u0153"+ + "\u0154\u0007\u0006\u0000\u0000\u0154\u0155\u0007\u0010\u0000\u0000\u0155"+ + "\u0156\u0007\n\u0000\u0000\u0156\u0157\u0007\u0003\u0000\u0000\u0157\u0158"+ + "\u0001\u0000\u0000\u0000\u0158\u0159\u0006\r\r\u0000\u0159!\u0001\u0000"+ + "\u0000\u0000\u015a\u015b\u0007\u0015\u0000\u0000\u015b\u015c\u0007\u0004"+ + "\u0000\u0000\u015c\u015d\u0007\u0003\u0000\u0000\u015d\u015e\u0007\u0016"+ + "\u0000\u0000\u015e\u015f\u0007\t\u0000\u0000\u015f\u0160\u0007\u0014\u0000"+ + "\u0000\u0160\u0161\u0007\u0003\u0000\u0000\u0161\u0162\u0001\u0000\u0000"+ + "\u0000\u0162\u0163\u0006\u000e\u000e\u0000\u0163#\u0001\u0000\u0000\u0000"+ + "\u0164\u0165\u0007\f\u0000\u0000\u0165\u0166\u0007\u0003\u0000\u0000\u0166"+ + "\u0167\u0007\u0017\u0000\u0000\u0167\u0168\u0001\u0000\u0000\u0000\u0168"+ + "\u0169\u0006\u000f\u000f\u0000\u0169%\u0001\u0000\u0000\u0000\u016a\u016b"+ + "\u0007\u0004\u0000\u0000\u016b\u016c\u0007\u0007\u0000\u0000\u016c\u016d"+ + "\u0007\r\u0000\u0000\u016d\u016e\u0007\u0006\u0000\u0000\u016e\u016f\u0007"+ + "\u0014\u0000\u0000\u016f\u0170\u0007\u000b\u0000\u0000\u0170\u0171\u0007"+ + "\t\u0000\u0000\u0171\u0172\u0001\u0000\u0000\u0000\u0172\u0173\u0006\u0010"+ + "\u0010\u0000\u0173\'\u0001\u0000\u0000\u0000\u0174\u0175\u0007\u0010\u0000"+ + "\u0000\u0175\u0176\u0007\u0013\u0000\u0000\u0176\u0177\u0007\u0004\u0000"+ + "\u0000\u0177\u0178\u0007\u000f\u0000\u0000\u0178\u0179\u0007\u0010\u0000"+ + "\u0000\u0179\u017a\u0007\u0014\u0000\u0000\u017a\u017b\u0007\u0017\u0000"+ + "\u0000\u017b\u017c\u0007\u0007\u0000\u0000\u017c\u017d\u0007\f\u0000\u0000"+ + "\u017d\u017e\u0007\u000b\u0000\u0000\u017e\u017f\u0001\u0000\u0000\u0000"+ + "\u017f\u0180\u0006\u0011\u0011\u0000\u0180)\u0001\u0000\u0000\u0000\u0181"+ + "\u0182\u0007\u0018\u0000\u0000\u0182\u0183\u0007\n\u0000\u0000\u0183\u0184"+ + "\u0007\f\u0000\u0000\u0184\u0185\u0007\u000b\u0000\u0000\u0185\u0186\u0007"+ + "\u0013\u0000\u0000\u0186\u0187\u0007\u0018\u0000\u0000\u0187\u0188\u0007"+ + "\b\u0000\u0000\u0188\u0189\u0007\u0018\u0000\u0000\u0189\u018a\u0007\n"+ + "\u0000\u0000\u018a\u018b\u0007\b\u0000\u0000\u018b\u018c\u0007\u0016\u0000"+ + "\u0000\u018c\u018d\u0001\u0000\u0000\u0000\u018d\u018e\u0006\u0012\u0012"+ + "\u0000\u018e+\u0001\u0000\u0000\u0000\u018f\u0190\u0007\u0010\u0000\u0000"+ + "\u0190\u0191\u0007\u0018\u0000\u0000\u0191\u0192\u0007\n\u0000\u0000\u0192"+ + "\u0193\u0007\u000b\u0000\u0000\u0193\u0194\u0007\u000b\u0000\u0000\u0194"+ + "\u0195\u0001\u0000\u0000\u0000\u0195\u0196\u0006\u0013\u0013\u0000\u0196"+ + "-\u0001\u0000\u0000\u0000\u0197\u0198\u0007\u0005\u0000\u0000\u0198\u0199"+ + "\u0007\f\u0000\u0000\u0199\u019a\u0007\u0014\u0000\u0000\u019a\u019b\u0007"+ + "\u0007\u0000\u0000\u019b\u019c\u0007\u0013\u0000\u0000\u019c\u019d\u0007"+ + "\f\u0000\u0000\u019d\u019e\u0007\u0014\u0000\u0000\u019e\u019f\u0007\u0007"+ + "\u0000\u0000\u019f\u01a0\u0007\n\u0000\u0000\u01a0\u01a1\u0007\u0003\u0000"+ + "\u0000\u01a1\u01a2\u0001\u0000\u0000\u0000\u01a2\u01a3\u0006\u0014\u0014"+ + "\u0000\u01a3/\u0001\u0000\u0000\u0000\u01a4\u01a5\u0005<\u0000\u0000\u01a5"+ + "\u01a6\u0005<\u0000\u0000\u01a6\u01a8\u0001\u0000\u0000\u0000\u01a7\u01a9"+ + "\u0005-\u0000\u0000\u01a8\u01a7\u0001\u0000\u0000\u0000\u01a8\u01a9\u0001"+ + "\u0000\u0000\u0000\u01a9\u01aa\u0001\u0000\u0000\u0000\u01aa\u01ae\u0007"+ + "\u0000\u0000\u0000\u01ab\u01ad\u0007\u0019\u0000\u0000\u01ac\u01ab\u0001"+ + "\u0000\u0000\u0000\u01ad\u01b0\u0001\u0000\u0000\u0000\u01ae\u01ac\u0001"+ + "\u0000\u0000\u0000\u01ae\u01af\u0001\u0000\u0000\u0000\u01af\u01b1\u0001"+ + "\u0000\u0000\u0000\u01b0\u01ae\u0001\u0000\u0000\u0000\u01b1\u01b2\u0006"+ + "\u0015\u0015\u0000\u01b2\u01b3\u0001\u0000\u0000\u0000\u01b3\u01b4\u0006"+ + "\u0015\u0016\u0000\u01b41\u0001\u0000\u0000\u0000\u01b5\u01b6\u00034\u0017"+ + "\u0000\u01b6\u01b7\u0001\u0000\u0000\u0000\u01b7\u01b8\u0006\u0016\u0001"+ + "\u0000\u01b83\u0001\u0000\u0000\u0000\u01b9\u01bd\u0007\u001a\u0000\u0000"+ + "\u01ba\u01bc\u0007\u001b\u0000\u0000\u01bb\u01ba\u0001\u0000\u0000\u0000"+ + "\u01bc\u01bf\u0001\u0000\u0000\u0000\u01bd\u01bb\u0001\u0000\u0000\u0000"+ + "\u01bd\u01be\u0001\u0000\u0000\u0000\u01be\u01c1\u0001\u0000\u0000\u0000"+ + "\u01bf\u01bd\u0001\u0000\u0000\u0000\u01c0\u01c2\u0005\r\u0000\u0000\u01c1"+ + "\u01c0\u0001\u0000\u0000\u0000\u01c1\u01c2\u0001\u0000\u0000\u0000\u01c2"+ + "\u01c3\u0001\u0000\u0000\u0000\u01c3\u01c4\u0005\n\u0000\u0000\u01c45"+ + "\u0001\u0000\u0000\u0000\u01c5\u01c6\u0005[\u0000\u0000\u01c6\u01c7\u0006"+ + "\u0018\u0017\u0000\u01c77\u0001\u0000\u0000\u0000\u01c8\u01c9\u0005]\u0000"+ + "\u0000\u01c9\u01ca\u0006\u0019\u0018\u0000\u01ca9\u0001\u0000\u0000\u0000"+ + "\u01cb\u01cc\u0005,\u0000\u0000\u01cc\u01cd\u0006\u001a\u0019\u0000\u01cd"+ + ";\u0001\u0000\u0000\u0000\u01ce\u01cf\u0005=\u0000\u0000\u01cf\u01d0\u0006"+ + "\u001b\u001a\u0000\u01d0=\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005-\u0000"+ + "\u0000\u01d2\u01d3\u0005-\u0000\u0000\u01d3\u01d4\u0001\u0000\u0000\u0000"+ + "\u01d4\u01d5\u0004\u001c\u0000\u0000\u01d5\u01d6\u0003B\u001e\u0000\u01d6"+ + "\u01d7\u0006\u001c\u001b\u0000\u01d7?\u0001\u0000\u0000\u0000\u01d8\u01d9"+ + "\u0005-\u0000\u0000\u01d9\u01da\u0005-\u0000\u0000\u01da\u01db\u0001\u0000"+ + "\u0000\u0000\u01db\u01dc\u0004\u001d\u0001\u0000\u01dc\u01dd\u0007\u0002"+ + "\u0000\u0000\u01dd\u01de\u0007\u0003\u0000\u0000\u01de\u01df\u0007\u0004"+ + "\u0000\u0000\u01df\u01e0\u0007\u0005\u0000\u0000\u01e0\u01e1\u0005=\u0000"+ + "\u0000\u01e1\u01e2\u0001\u0000\u0000\u0000\u01e2\u01e3\u0006\u001d\u001c"+ + "\u0000\u01e3\u01e4\u0001\u0000\u0000\u0000\u01e4\u01e5\u0006\u001d\u001d"+ + "\u0000\u01e5A\u0001\u0000\u0000\u0000\u01e6\u01ea\u0007\u001c\u0000\u0000"+ + "\u01e7\u01e9\u0007\u001d\u0000\u0000\u01e8\u01e7\u0001\u0000\u0000\u0000"+ + "\u01e9\u01ec\u0001\u0000\u0000\u0000\u01ea\u01e8\u0001\u0000\u0000\u0000"+ + "\u01ea\u01eb\u0001\u0000\u0000\u0000\u01eb\u01f3\u0001\u0000\u0000\u0000"+ + "\u01ec\u01ea\u0001\u0000\u0000\u0000\u01ed\u01ef\u0005=\u0000\u0000\u01ee"+ + "\u01f0\u0003D\u001f\u0000\u01ef\u01ee\u0001\u0000\u0000\u0000\u01f0\u01f1"+ + "\u0001\u0000\u0000\u0000\u01f1\u01ef\u0001\u0000\u0000\u0000\u01f1\u01f2"+ + "\u0001\u0000\u0000\u0000\u01f2\u01f4\u0001\u0000\u0000\u0000\u01f3\u01ed"+ + "\u0001\u0000\u0000\u0000\u01f3\u01f4\u0001\u0000\u0000\u0000\u01f4C\u0001"+ + "\u0000\u0000\u0000\u01f5\u01fb\u0005\"\u0000\u0000\u01f6\u01f7\u0005\\"+ + "\u0000\u0000\u01f7\u01fa\b\u0001\u0000\u0000\u01f8\u01fa\b\u001e\u0000"+ + "\u0000\u01f9\u01f6\u0001\u0000\u0000\u0000\u01f9\u01f8\u0001\u0000\u0000"+ + "\u0000\u01fa\u01fd\u0001\u0000\u0000\u0000\u01fb\u01f9\u0001\u0000\u0000"+ + "\u0000\u01fb\u01fc\u0001\u0000\u0000\u0000\u01fc\u01fe\u0001\u0000\u0000"+ + "\u0000\u01fd\u01fb\u0001\u0000\u0000\u0000\u01fe\u020b\u0005\"\u0000\u0000"+ + "\u01ff\u0203\u0005\'\u0000\u0000\u0200\u0202\b\u001f\u0000\u0000\u0201"+ + "\u0200\u0001\u0000\u0000\u0000\u0202\u0205\u0001\u0000\u0000\u0000\u0203"+ + "\u0201\u0001\u0000\u0000\u0000\u0203\u0204\u0001\u0000\u0000\u0000\u0204"+ + "\u0206\u0001\u0000\u0000\u0000\u0205\u0203\u0001\u0000\u0000\u0000\u0206"+ + "\u020b\u0005\'\u0000\u0000\u0207\u020b\b \u0000\u0000\u0208\u0209\u0005"+ + "\\\u0000\u0000\u0209\u020b\b\u0001\u0000\u0000\u020a\u01f5\u0001\u0000"+ + "\u0000\u0000\u020a\u01ff\u0001\u0000\u0000\u0000\u020a\u0207\u0001\u0000"+ + "\u0000\u0000\u020a\u0208\u0001\u0000\u0000\u0000\u020bE\u0001\u0000\u0000"+ + "\u0000\u020c\u020d\u0005-\u0000\u0000\u020d\u020e\u0005-\u0000\u0000\u020e"+ + "\u020f\u0001\u0000\u0000\u0000\u020f\u0210\u0006 \u001e\u0000\u0210G\u0001"+ + "\u0000\u0000\u0000\u0211\u0212\b!\u0000\u0000\u0212I\u0001\u0000\u0000"+ + "\u0000\u0213\u0214\u0005\\\u0000\u0000\u0214\u0215\t\u0000\u0000\u0000"+ + "\u0215K\u0001\u0000\u0000\u0000\u0216\u0217\u0003N$\u0000\u0217\u0218"+ + "\u0006#\u001f\u0000\u0218M\u0001\u0000\u0000\u0000\u0219\u0220\u0005\""+ + "\u0000\u0000\u021a\u021f\u0003V(\u0000\u021b\u021f\u0003T\'\u0000\u021c"+ + "\u021f\u0007\"\u0000\u0000\u021d\u021f\b#\u0000\u0000\u021e\u021a\u0001"+ + "\u0000\u0000\u0000\u021e\u021b\u0001\u0000\u0000\u0000\u021e\u021c\u0001"+ + "\u0000\u0000\u0000\u021e\u021d\u0001\u0000\u0000\u0000\u021f\u0222\u0001"+ + "\u0000\u0000\u0000\u0220\u021e\u0001\u0000\u0000\u0000\u0220\u0221\u0001"+ + "\u0000\u0000\u0000\u0221\u0223\u0001\u0000\u0000\u0000\u0222\u0220\u0001"+ + "\u0000\u0000\u0000\u0223\u0224\u0005\"\u0000\u0000\u0224O\u0001\u0000"+ + "\u0000\u0000\u0225\u0226\u0003R&\u0000\u0226\u0227\u0006% \u0000\u0227"+ + "Q\u0001\u0000\u0000\u0000\u0228\u022e\u0005\'\u0000\u0000\u0229\u022d"+ + "\u0003T\'\u0000\u022a\u022d\u0007\u0001\u0000\u0000\u022b\u022d\b\u001f"+ + "\u0000\u0000\u022c\u0229\u0001\u0000\u0000\u0000\u022c\u022a\u0001\u0000"+ + "\u0000\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d\u0230\u0001\u0000"+ + "\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e\u022f\u0001\u0000"+ + "\u0000\u0000\u022f\u0231\u0001\u0000\u0000\u0000\u0230\u022e\u0001\u0000"+ + "\u0000\u0000\u0231\u0232\u0005\'\u0000\u0000\u0232S\u0001\u0000\u0000"+ + "\u0000\u0233\u0237\u0007\u001a\u0000\u0000\u0234\u0236\u0007\u001b\u0000"+ + "\u0000\u0235\u0234\u0001\u0000\u0000\u0000\u0236\u0239\u0001\u0000\u0000"+ + "\u0000\u0237\u0235\u0001\u0000\u0000\u0000\u0237\u0238\u0001\u0000\u0000"+ + "\u0000\u0238\u023b\u0001\u0000\u0000\u0000\u0239\u0237\u0001\u0000\u0000"+ + "\u0000\u023a\u023c\u0007\u0001\u0000\u0000\u023b\u023a\u0001\u0000\u0000"+ + "\u0000\u023c\u023d\u0001\u0000\u0000\u0000\u023d\u023b\u0001\u0000\u0000"+ + "\u0000\u023d\u023e\u0001\u0000\u0000\u0000\u023eU\u0001\u0000\u0000\u0000"+ + "\u023f\u0240\u0005\\\u0000\u0000\u0240\u0241\b\u0001\u0000\u0000\u0241"+ + "W\u0001\u0000\u0000\u0000\u0242\u0243\u0007$\u0000\u0000\u0243Y\u0001"+ + "\u0000\u0000\u0000\u0244\u0245\u0003\\+\u0000\u0245\u0246\u0006*!\u0000"+ + "\u0246[\u0001\u0000\u0000\u0000\u0247\u0248\u0005$\u0000\u0000\u0248\u0249"+ + "\u0005{\u0000\u0000\u0249\u024d\u0007\u0000\u0000\u0000\u024a\u024c\u0007"+ + "\u0019\u0000\u0000\u024b\u024a\u0001\u0000\u0000\u0000\u024c\u024f\u0001"+ + "\u0000\u0000\u0000\u024d\u024b\u0001\u0000\u0000\u0000\u024d\u024e\u0001"+ + "\u0000\u0000\u0000\u024e\u0255\u0001\u0000\u0000\u0000\u024f\u024d\u0001"+ + "\u0000\u0000\u0000\u0250\u0251\u0005:\u0000\u0000\u0251\u0256\u0005-\u0000"+ + "\u0000\u0252\u0253\u0005:\u0000\u0000\u0253\u0256\u0005+\u0000\u0000\u0254"+ + "\u0256\u0005:\u0000\u0000\u0255\u0250\u0001\u0000\u0000\u0000\u0255\u0252"+ + "\u0001\u0000\u0000\u0000\u0255\u0254\u0001\u0000\u0000\u0000\u0255\u0256"+ + "\u0001\u0000\u0000\u0000\u0256\u025a\u0001\u0000\u0000\u0000\u0257\u0259"+ + "\b%\u0000\u0000\u0258\u0257\u0001\u0000\u0000\u0000\u0259\u025c\u0001"+ + "\u0000\u0000\u0000\u025a\u0258\u0001\u0000\u0000\u0000\u025a\u025b\u0001"+ + "\u0000\u0000\u0000\u025b\u025d\u0001\u0000\u0000\u0000\u025c\u025a\u0001"+ + "\u0000\u0000\u0000\u025d\u0267\u0005}\u0000\u0000\u025e\u025f\u0005$\u0000"+ + "\u0000\u025f\u0263\u0007\u0000\u0000\u0000\u0260\u0262\u0007\u0019\u0000"+ + "\u0000\u0261\u0260\u0001\u0000\u0000\u0000\u0262\u0265\u0001\u0000\u0000"+ + "\u0000\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000"+ + "\u0000\u0264\u0267\u0001\u0000\u0000\u0000\u0265\u0263\u0001\u0000\u0000"+ + "\u0000\u0266\u0247\u0001\u0000\u0000\u0000\u0266\u025e\u0001\u0000\u0000"+ + "\u0000\u0267]\u0001\u0000\u0000\u0000\u0268\u0269\u0003`-\u0000\u0269"+ + "\u026a\u0006,\"\u0000\u026a_\u0001\u0000\u0000\u0000\u026b\u026c\u0005"+ + "$\u0000\u0000\u026c\u026d\u0007&\u0000\u0000\u026da\u0001\u0000\u0000"+ + "\u0000\u026e\u026f\u0005$\u0000\u0000\u026f\u0270\u0005(\u0000\u0000\u0270"+ + "\u027d\u0001\u0000\u0000\u0000\u0271\u027c\u0003b.\u0000\u0272\u027c\b"+ + "\'\u0000\u0000\u0273\u0277\u0005(\u0000\u0000\u0274\u0276\u0003d/\u0000"+ + "\u0275\u0274\u0001\u0000\u0000\u0000\u0276\u0279\u0001\u0000\u0000\u0000"+ + "\u0277\u0275\u0001\u0000\u0000\u0000\u0277\u0278\u0001\u0000\u0000\u0000"+ + "\u0278\u027a\u0001\u0000\u0000\u0000\u0279\u0277\u0001\u0000\u0000\u0000"+ + "\u027a\u027c\u0005)\u0000\u0000\u027b\u0271\u0001\u0000\u0000\u0000\u027b"+ + "\u0272\u0001\u0000\u0000\u0000\u027b\u0273\u0001\u0000\u0000\u0000\u027c"+ + "\u027f\u0001\u0000\u0000\u0000\u027d\u027b\u0001\u0000\u0000\u0000\u027d"+ + "\u027e\u0001\u0000\u0000\u0000\u027e\u0280\u0001\u0000\u0000\u0000\u027f"+ + "\u027d\u0001\u0000\u0000\u0000\u0280\u0281\u0005)\u0000\u0000\u0281\u0282"+ + "\u0006.#\u0000\u0282c\u0001\u0000\u0000\u0000\u0283\u0286\u0003b.\u0000"+ + "\u0284\u0286\b\'\u0000\u0000\u0285\u0283\u0001\u0000\u0000\u0000\u0285"+ + "\u0284\u0001\u0000\u0000\u0000\u0286e\u0001\u0000\u0000\u0000\u0287\u0288"+ + "\u0005`\u0000\u0000\u0288\u028c\b(\u0000\u0000\u0289\u028b\b\"\u0000\u0000"+ + "\u028a\u0289\u0001\u0000\u0000\u0000\u028b\u028e\u0001\u0000\u0000\u0000"+ + "\u028c\u028a\u0001\u0000\u0000\u0000\u028c\u028d\u0001\u0000\u0000\u0000"+ + "\u028d\u028f\u0001\u0000\u0000\u0000\u028e\u028c\u0001\u0000\u0000\u0000"+ + "\u028f\u0290\u0005`\u0000\u0000\u0290\u0291\u00060$\u0000\u0291g\u0001"+ + "\u0000\u0000\u0000\u0292\u0293\u0005$\u0000\u0000\u0293\u0294\u00061%"+ + "\u0000\u0294i\u0001\u0000\u0000\u0000\u0295\u029a\b)\u0000\u0000\u0296"+ + "\u0299\u0003H!\u0000\u0297\u0299\u0003J\"\u0000\u0298\u0296\u0001\u0000"+ + "\u0000\u0000\u0298\u0297\u0001\u0000\u0000\u0000\u0299\u029c\u0001\u0000"+ + "\u0000\u0000\u029a\u0298\u0001\u0000\u0000\u0000\u029a\u029b\u0001\u0000"+ + "\u0000\u0000\u029b\u02ba\u0001\u0000\u0000\u0000\u029c\u029a\u0001\u0000"+ + "\u0000\u0000\u029d\u029e\u0005-\u0000\u0000\u029e\u02a3\b)\u0000\u0000"+ + "\u029f\u02a2\u0003H!\u0000\u02a0\u02a2\u0003J\"\u0000\u02a1\u029f\u0001"+ + "\u0000\u0000\u0000\u02a1\u02a0\u0001\u0000\u0000\u0000\u02a2\u02a5\u0001"+ + "\u0000\u0000\u0000\u02a3\u02a1\u0001\u0000\u0000\u0000\u02a3\u02a4\u0001"+ + "\u0000\u0000\u0000\u02a4\u02ba\u0001\u0000\u0000\u0000\u02a5\u02a3\u0001"+ + "\u0000\u0000\u0000\u02a6\u02ba\u0005-\u0000\u0000\u02a7\u02a8\u0005<\u0000"+ + "\u0000\u02a8\u02ad\b!\u0000\u0000\u02a9\u02ac\u0003H!\u0000\u02aa\u02ac"+ + "\u0003J\"\u0000\u02ab\u02a9\u0001\u0000\u0000\u0000\u02ab\u02aa\u0001"+ + "\u0000\u0000\u0000\u02ac\u02af\u0001\u0000\u0000\u0000\u02ad\u02ab\u0001"+ + "\u0000\u0000\u0000\u02ad\u02ae\u0001\u0000\u0000\u0000\u02ae\u02ba\u0001"+ + "\u0000\u0000\u0000\u02af\u02ad\u0001\u0000\u0000\u0000\u02b0\u02ba\u0005"+ + "<\u0000\u0000\u02b1\u02b6\u0003J\"\u0000\u02b2\u02b5\u0003H!\u0000\u02b3"+ + "\u02b5\u0003J\"\u0000\u02b4\u02b2\u0001\u0000\u0000\u0000\u02b4\u02b3"+ + "\u0001\u0000\u0000\u0000\u02b5\u02b8\u0001\u0000\u0000\u0000\u02b6\u02b4"+ + "\u0001\u0000\u0000\u0000\u02b6\u02b7\u0001\u0000\u0000\u0000\u02b7\u02ba"+ + "\u0001\u0000\u0000\u0000\u02b8\u02b6\u0001\u0000\u0000\u0000\u02b9\u0295"+ + "\u0001\u0000\u0000\u0000\u02b9\u029d\u0001\u0000\u0000\u0000\u02b9\u02a6"+ + "\u0001\u0000\u0000\u0000\u02b9\u02a7\u0001\u0000\u0000\u0000\u02b9\u02b0"+ + "\u0001\u0000\u0000\u0000\u02b9\u02b1\u0001\u0000\u0000\u0000\u02ba\u02bb"+ + "\u0001\u0000\u0000\u0000\u02bb\u02bc\u00062&\u0000\u02bck\u0001\u0000"+ + "\u0000\u0000\u02bd\u02bf\u0003n4\u0000\u02be\u02bd\u0001\u0000\u0000\u0000"+ + "\u02bf\u02c0\u0001\u0000\u0000\u0000\u02c0\u02be\u0001\u0000\u0000\u0000"+ + "\u02c0\u02c1\u0001\u0000\u0000\u0000\u02c1\u02c2\u0001\u0000\u0000\u0000"+ + "\u02c2\u02c3\u00063\u0001\u0000\u02c3m\u0001\u0000\u0000\u0000\u02c4\u02c5"+ + "\u0007\u001b\u0000\u0000\u02c5o\u0001\u0000\u0000\u0000\u02c6\u02c8\u0003"+ + "r6\u0000\u02c7\u02c6\u0001\u0000\u0000\u0000\u02c8\u02c9\u0001\u0000\u0000"+ + "\u0000\u02c9\u02c7\u0001\u0000\u0000\u0000\u02c9\u02ca\u0001\u0000\u0000"+ + "\u0000\u02ca\u02cb\u0001\u0000\u0000\u0000\u02cb\u02cc\u00065\'\u0000"+ + "\u02cc\u02cd\u0001\u0000\u0000\u0000\u02cd\u02ce\u00065\u0001\u0000\u02ce"+ + "q\u0001\u0000\u0000\u0000\u02cf\u02d0\u0007\u0001\u0000\u0000\u02d0s\u0001"+ + "\u0000\u0000\u0000\u02d1\u02d3\u0003n4\u0000\u02d2\u02d1\u0001\u0000\u0000"+ + "\u0000\u02d3\u02d4\u0001\u0000\u0000\u0000\u02d4\u02d2\u0001\u0000\u0000"+ + "\u0000\u02d4\u02d5\u0001\u0000\u0000\u0000\u02d5\u02d6\u0001\u0000\u0000"+ + "\u0000\u02d6\u02d7\u00067(\u0000\u02d7\u02d8\u00067\u0001\u0000\u02d8"+ + "u\u0001\u0000\u0000\u0000\u02d9\u02da\u00034\u0017\u0000\u02da\u02db\u0001"+ + "\u0000\u0000\u0000\u02db\u02dc\u00068)\u0000\u02dc\u02dd\u00068\u0001"+ + "\u0000\u02ddw\u0001\u0000\u0000\u0000\u02de\u02e2\u0005#\u0000\u0000\u02df"+ + "\u02e1\b\u0001\u0000\u0000\u02e0\u02df\u0001\u0000\u0000\u0000\u02e1\u02e4"+ + "\u0001\u0000\u0000\u0000\u02e2\u02e0\u0001\u0000\u0000\u0000\u02e2\u02e3"+ + "\u0001\u0000\u0000\u0000\u02e3\u02e5\u0001\u0000\u0000\u0000\u02e4\u02e2"+ + "\u0001\u0000\u0000\u0000\u02e5\u02e6\u00069*\u0000\u02e6\u02e7\u00069"+ + "\u0001\u0000\u02e7y\u0001\u0000\u0000\u0000\u02e8\u02ea\u0003r6\u0000"+ + "\u02e9\u02e8\u0001\u0000\u0000\u0000\u02ea\u02eb\u0001\u0000\u0000\u0000"+ + "\u02eb\u02e9\u0001\u0000\u0000\u0000\u02eb\u02ec\u0001\u0000\u0000\u0000"+ + "\u02ec\u02ed\u0001\u0000\u0000\u0000\u02ed\u02ee\u0006:+\u0000\u02ee\u02ef"+ + "\u0001\u0000\u0000\u0000\u02ef\u02f0\u0006:,\u0000\u02f0\u02f1\u0006:"+ + "\u0001\u0000\u02f1\u02f2\u0006:-\u0000\u02f2{\u0001\u0000\u0000\u0000"+ + "\u02f3\u02f4\u0005:\u0000\u0000\u02f4}\u0001\u0000\u0000\u0000\u02f5\u02f6"+ + "\u0005@\u0000\u0000\u02f6\u007f\u0001\u0000\u0000\u0000\u02f7\u02f8\u0007"+ + "\f\u0000\u0000\u02f8\u02f9\u0007\u0010\u0000\u0000\u02f9\u02fa\u0001\u0000"+ + "\u0000\u0000\u02fa\u02fb\u0006=-\u0000\u02fb\u0081\u0001\u0000\u0000\u0000"+ + "\u02fc\u02fd\u0005-\u0000\u0000\u02fd\u02fe\u0005-\u0000\u0000\u02fe\u02ff"+ + "\u0001\u0000\u0000\u0000\u02ff\u0300\u0003B\u001e\u0000\u0300\u0301\u0001"+ + "\u0000\u0000\u0000\u0301\u0302\u0006>.\u0000\u0302\u0083\u0001\u0000\u0000"+ + "\u0000\u0303\u0304\u0003N$\u0000\u0304\u0305\u0001\u0000\u0000\u0000\u0305"+ + "\u0306\u0006?/\u0000\u0306\u0085\u0001\u0000\u0000\u0000\u0307\u0308\u0003"+ + "R&\u0000\u0308\u0309\u0001\u0000\u0000\u0000\u0309\u030a\u0006@0\u0000"+ + "\u030a\u0087\u0001\u0000\u0000\u0000\u030b\u030c\u0003\\+\u0000\u030c"+ + "\u030d\u0001\u0000\u0000\u0000\u030d\u030e\u0006A1\u0000\u030e\u0089\u0001"+ + "\u0000\u0000\u0000\u030f\u0310\u0003`-\u0000\u0310\u0311\u0001\u0000\u0000"+ + "\u0000\u0311\u0312\u0006B2\u0000\u0312\u008b\u0001\u0000\u0000\u0000\u0313"+ + "\u0314\u0005$\u0000\u0000\u0314\u0315\u0001\u0000\u0000\u0000\u0315\u0316"+ + "\u0006C3\u0000\u0316\u008d\u0001\u0000\u0000\u0000\u0317\u0318\u0003\u0090"+ + "E\u0000\u0318\u0319\u0001\u0000\u0000\u0000\u0319\u031a\u0006D4\u0000"+ + "\u031a\u008f\u0001\u0000\u0000\u0000\u031b\u031f\u0003\u0092F\u0000\u031c"+ + "\u031f\u0003V(\u0000\u031d\u031f\u0003\u0094G\u0000\u031e\u031b\u0001"+ + "\u0000\u0000\u0000\u031e\u031c\u0001\u0000\u0000\u0000\u031e\u031d\u0001"+ + "\u0000\u0000\u0000\u031f\u0320\u0001\u0000\u0000\u0000\u0320\u031e\u0001"+ + "\u0000\u0000\u0000\u0320\u0321\u0001\u0000\u0000\u0000\u0321\u0091\u0001"+ + "\u0000\u0000\u0000\u0322\u0323\b*\u0000\u0000\u0323\u0093\u0001\u0000"+ + "\u0000\u0000\u0324\u0329\u0005:\u0000\u0000\u0325\u0328\u0003\u0092F\u0000"+ + "\u0326\u0328\u0005:\u0000\u0000\u0327\u0325\u0001\u0000\u0000\u0000\u0327"+ + "\u0326\u0001\u0000\u0000\u0000\u0328\u032b\u0001\u0000\u0000\u0000\u0329"+ + "\u0327\u0001\u0000\u0000\u0000\u0329\u032a\u0001\u0000\u0000\u0000\u032a"+ + "\u032c\u0001\u0000\u0000\u0000\u032b\u0329\u0001\u0000\u0000\u0000\u032c"+ + "\u032d\u0005/\u0000\u0000\u032d\u0095\u0001\u0000\u0000\u0000\u032e\u0330"+ + "\u0003n4\u0000\u032f\u032e\u0001\u0000\u0000\u0000\u0330\u0331\u0001\u0000"+ + "\u0000\u0000\u0331\u032f\u0001\u0000\u0000\u0000\u0331\u0332\u0001\u0000"+ + "\u0000\u0000\u0332\u0335\u0001\u0000\u0000\u0000\u0333\u0335\u00034\u0017"+ + "\u0000\u0334\u032f\u0001\u0000\u0000\u0000\u0334\u0333\u0001\u0000\u0000"+ + "\u0000\u0335\u0336\u0001\u0000\u0000\u0000\u0336\u0337\u0006H-\u0000\u0337"+ + "\u0097\u0001\u0000\u0000\u0000\u0338\u033a\u0003r6\u0000\u0339\u0338\u0001"+ + "\u0000\u0000\u0000\u033a\u033b\u0001\u0000\u0000\u0000\u033b\u0339\u0001"+ + "\u0000\u0000\u0000\u033b\u033c\u0001\u0000\u0000\u0000\u033c\u033d\u0001"+ + "\u0000\u0000\u0000\u033d\u033e\u0006I5\u0000\u033e\u033f\u0001\u0000\u0000"+ + "\u0000\u033f\u0340\u0006I,\u0000\u0340\u0341\u0006I\u0001\u0000\u0341"+ + "\u0342\u0006I-\u0000\u0342\u0099\u0001\u0000\u0000\u0000\u0343\u0344\u0005"+ + ":\u0000\u0000\u0344\u0345\u0001\u0000\u0000\u0000\u0345\u0346\u0006J6"+ + "\u0000\u0346\u009b\u0001\u0000\u0000\u0000\u0347\u0348\u0005@\u0000\u0000"+ + "\u0348\u0349\u0001\u0000\u0000\u0000\u0349\u034a\u0006K7\u0000\u034a\u009d"+ + "\u0001\u0000\u0000\u0000\u034b\u034c\u0003N$\u0000\u034c\u034d\u0001\u0000"+ + "\u0000\u0000\u034d\u034e\u0006L/\u0000\u034e\u009f\u0001\u0000\u0000\u0000"+ + "\u034f\u0350\u0003R&\u0000\u0350\u0351\u0001\u0000\u0000\u0000\u0351\u0352"+ + "\u0006M0\u0000\u0352\u00a1\u0001\u0000\u0000\u0000\u0353\u0354\u0003\\"+ + "+\u0000\u0354\u0355\u0001\u0000\u0000\u0000\u0355\u0356\u0006N1\u0000"+ + "\u0356\u00a3\u0001\u0000\u0000\u0000\u0357\u0358\u0003`-\u0000\u0358\u0359"+ + "\u0001\u0000\u0000\u0000\u0359\u035a\u0006O2\u0000\u035a\u00a5\u0001\u0000"+ + "\u0000\u0000\u035b\u035c\u0005$\u0000\u0000\u035c\u035d\u0001\u0000\u0000"+ + "\u0000\u035d\u035e\u0006P3\u0000\u035e\u00a7\u0001\u0000\u0000\u0000\u035f"+ + "\u0360\u0003\u0090E\u0000\u0360\u0361\u0001\u0000\u0000\u0000\u0361\u0362"+ + "\u0006Q4\u0000\u0362\u00a9\u0001\u0000\u0000\u0000\u0363\u0365\u0003n"+ + "4\u0000\u0364\u0363\u0001\u0000\u0000\u0000\u0365\u0366\u0001\u0000\u0000"+ + "\u0000\u0366\u0364\u0001\u0000\u0000\u0000\u0366\u0367\u0001\u0000\u0000"+ + "\u0000\u0367\u0368\u0001\u0000\u0000\u0000\u0368\u0369\u0006R(\u0000\u0369"+ + "\u036a\u0006R\u0001\u0000\u036a\u00ab\u0001\u0000\u0000\u0000\u036b\u036c"+ + "\u00034\u0017\u0000\u036c\u036d\u0001\u0000\u0000\u0000\u036d\u036e\u0006"+ + "S)\u0000\u036e\u036f\u0006S\u0001\u0000\u036f\u00ad\u0001\u0000\u0000"+ + "\u0000\u0370\u0374\u0005#\u0000\u0000\u0371\u0373\b\u0001\u0000\u0000"+ + "\u0372\u0371\u0001\u0000\u0000\u0000\u0373\u0376\u0001\u0000\u0000\u0000"+ + "\u0374\u0372\u0001\u0000\u0000\u0000\u0374\u0375\u0001\u0000\u0000\u0000"+ + "\u0375\u0377\u0001\u0000\u0000\u0000\u0376\u0374\u0001\u0000\u0000\u0000"+ + "\u0377\u0378\u0006T*\u0000\u0378\u0379\u0006T\u0001\u0000\u0379\u00af"+ + "\u0001\u0000\u0000\u0000\u037a\u037c\u0003r6\u0000\u037b\u037a\u0001\u0000"+ + "\u0000\u0000\u037c\u037d\u0001\u0000\u0000\u0000\u037d\u037b\u0001\u0000"+ + "\u0000\u0000\u037d\u037e\u0001\u0000\u0000\u0000\u037e\u037f\u0001\u0000"+ + "\u0000\u0000\u037f\u0380\u0006U8\u0000\u0380\u0381\u0001\u0000\u0000\u0000"+ + "\u0381\u0382\u0006U,\u0000\u0382\u0383\u0006U\u0001\u0000\u0383\u0384"+ + "\u0006U-\u0000\u0384\u00b1\u0001\u0000\u0000\u0000\u0385\u0386\u0005:"+ + "\u0000\u0000\u0386\u0387\u0001\u0000\u0000\u0000\u0387\u0388\u0006V6\u0000"+ + "\u0388\u00b3\u0001\u0000\u0000\u0000\u0389\u038a\u0003N$\u0000\u038a\u038b"+ + "\u0001\u0000\u0000\u0000\u038b\u038c\u0006W/\u0000\u038c\u00b5\u0001\u0000"+ + "\u0000\u0000\u038d\u038e\u0003R&\u0000\u038e\u038f\u0001\u0000\u0000\u0000"+ + "\u038f\u0390\u0006X0\u0000\u0390\u00b7\u0001\u0000\u0000\u0000\u0391\u0392"+ + "\u0003\\+\u0000\u0392\u0393\u0001\u0000\u0000\u0000\u0393\u0394\u0006"+ + "Y1\u0000\u0394\u00b9\u0001\u0000\u0000\u0000\u0395\u0396\u0003`-\u0000"+ + "\u0396\u0397\u0001\u0000\u0000\u0000\u0397\u0398\u0006Z2\u0000\u0398\u00bb"+ + "\u0001\u0000\u0000\u0000\u0399\u039a\u0005$\u0000\u0000\u039a\u039b\u0001"+ + "\u0000\u0000\u0000\u039b\u039c\u0006[3\u0000\u039c\u00bd\u0001\u0000\u0000"+ + "\u0000\u039d\u03a0\u0003\u00c0]\u0000\u039e\u03a0\u0003J\"\u0000\u039f"+ + "\u039d\u0001\u0000\u0000\u0000\u039f\u039e\u0001\u0000\u0000\u0000\u03a0"+ + "\u03a1\u0001\u0000\u0000\u0000\u03a1\u039f\u0001\u0000\u0000\u0000\u03a1"+ + "\u03a2\u0001\u0000\u0000\u0000\u03a2\u03a3\u0001\u0000\u0000\u0000\u03a3"+ + "\u03a4\u0006\\4\u0000\u03a4\u00bf\u0001\u0000\u0000\u0000\u03a5\u03a6"+ + "\b+\u0000\u0000\u03a6\u00c1\u0001\u0000\u0000\u0000\u03a7\u03a8\u0003"+ + "4\u0017\u0000\u03a8\u03a9\u0001\u0000\u0000\u0000\u03a9\u03aa\u0006^\u0001"+ + "\u0000\u03aa\u00c3\u0001\u0000\u0000\u0000\u03ab\u03ac\u0005\n\u0000\u0000"+ + "\u03ac\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006_,\u0000\u03ae\u03af"+ + "\u0006_9\u0000\u03af\u00c5\u0001\u0000\u0000\u0000\u03b0\u03b2\u0007,"+ + "\u0000\u0000\u03b1\u03b0\u0001\u0000\u0000\u0000\u03b2\u03b3\u0001\u0000"+ + "\u0000\u0000\u03b3\u03b1\u0001\u0000\u0000\u0000\u03b3\u03b4\u0001\u0000"+ + "\u0000\u0000\u03b4\u03b5\u0001\u0000\u0000\u0000\u03b5\u03b6\u0006`\u0001"+ + "\u0000\u03b6\u00c7\u0001\u0000\u0000\u0000\u03b7\u03b8\u0005/\u0000\u0000"+ + "\u03b8\u03b9\u0005*\u0000\u0000\u03b9\u03bd\u0001\u0000\u0000\u0000\u03ba"+ + "\u03bc\t\u0000\u0000\u0000\u03bb\u03ba\u0001\u0000\u0000\u0000\u03bc\u03bf"+ + "\u0001\u0000\u0000\u0000\u03bd\u03be\u0001\u0000\u0000\u0000\u03bd\u03bb"+ + "\u0001\u0000\u0000\u0000\u03be\u03c0\u0001\u0000\u0000\u0000\u03bf\u03bd"+ + "\u0001\u0000\u0000\u0000\u03c0\u03c1\u0005*\u0000\u0000\u03c1\u03c2\u0005"+ + "/\u0000\u0000\u03c2\u03c3\u0001\u0000\u0000\u0000\u03c3\u03c4\u0006a\u0001"+ + "\u0000\u03c4\u00c9\u0001\u0000\u0000\u0000\u03c5\u03c6\u0005/\u0000\u0000"+ + "\u03c6\u03c9\u0005/\u0000\u0000\u03c7\u03c9\u0005#\u0000\u0000\u03c8\u03c5"+ + "\u0001\u0000\u0000\u0000\u03c8\u03c7\u0001\u0000\u0000\u0000\u03c9\u03cd"+ + "\u0001\u0000\u0000\u0000\u03ca\u03cc\b\u0001\u0000\u0000\u03cb\u03ca\u0001"+ + "\u0000\u0000\u0000\u03cc\u03cf\u0001\u0000\u0000\u0000\u03cd\u03cb\u0001"+ + "\u0000\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce\u03d1\u0001"+ + "\u0000\u0000\u0000\u03cf\u03cd\u0001\u0000\u0000\u0000\u03d0\u03d2\u0005"+ + "\r\u0000\u0000\u03d1\u03d0\u0001\u0000\u0000\u0000\u03d1\u03d2\u0001\u0000"+ + "\u0000\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3\u03d4\u0006b\u0001"+ + "\u0000\u03d4\u00cb\u0001\u0000\u0000\u0000\u03d5\u03d6\u0005<\u0000\u0000"+ + "\u03d6\u03d7\u0005<\u0000\u0000\u03d7\u03d9\u0001\u0000\u0000\u0000\u03d8"+ + "\u03da\u0005-\u0000\u0000\u03d9\u03d8\u0001\u0000\u0000\u0000\u03d9\u03da"+ + "\u0001\u0000\u0000\u0000\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u03df"+ + "\u0007\u0000\u0000\u0000\u03dc\u03de\u0007\u0019\u0000\u0000\u03dd\u03dc"+ + "\u0001\u0000\u0000\u0000\u03de\u03e1\u0001\u0000\u0000\u0000\u03df\u03dd"+ + "\u0001\u0000\u0000\u0000\u03df\u03e0\u0001\u0000\u0000\u0000\u03e0\u03e2"+ + "\u0001\u0000\u0000\u0000\u03e1\u03df\u0001\u0000\u0000\u0000\u03e2\u03e3"+ + "\u0006c:\u0000\u03e3\u03e4\u0001\u0000\u0000\u0000\u03e4\u03e5\u0006c"+ + ";\u0000\u03e5\u00cd\u0001\u0000\u0000\u0000\u03e6\u03e8\b-\u0000\u0000"+ + "\u03e7\u03e6\u0001\u0000\u0000\u0000\u03e8\u03e9\u0001\u0000\u0000\u0000"+ + "\u03e9\u03e7\u0001\u0000\u0000\u0000\u03e9\u03ea\u0001\u0000\u0000\u0000"+ + "\u03ea\u03f5\u0001\u0000\u0000\u0000\u03eb\u03ec\u0005<\u0000\u0000\u03ec"+ + "\u03f0\b.\u0000\u0000\u03ed\u03ef\b/\u0000\u0000\u03ee\u03ed\u0001\u0000"+ + "\u0000\u0000\u03ef\u03f2\u0001\u0000\u0000\u0000\u03f0\u03ee\u0001\u0000"+ + "\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000\u03f1\u03f5\u0001\u0000"+ + "\u0000\u0000\u03f2\u03f0\u0001\u0000\u0000\u0000\u03f3\u03f5\u0005<\u0000"+ + "\u0000\u03f4\u03e7\u0001\u0000\u0000\u0000\u03f4\u03eb\u0001\u0000\u0000"+ + "\u0000\u03f4\u03f3\u0001\u0000\u0000\u0000\u03f5\u03f6\u0001\u0000\u0000"+ + "\u0000\u03f6\u03f7\u0006d4\u0000\u03f7\u00cf\u0001\u0000\u0000\u0000\u03f8"+ + "\u03f9\u0005\n\u0000\u0000\u03f9\u03fa\u0001\u0000\u0000\u0000\u03fa\u03fb"+ + "\u0006e,\u0000\u03fb\u00d1\u0001\u0000\u0000\u0000\u03fc\u03fe\b0\u0000"+ + "\u0000\u03fd\u03fc\u0001\u0000\u0000\u0000\u03fe\u03ff\u0001\u0000\u0000"+ + "\u0000\u03ff\u03fd\u0001\u0000\u0000\u0000\u03ff\u0400\u0001\u0000\u0000"+ + "\u0000\u0400\u0401\u0001\u0000\u0000\u0000\u0401\u0402\u0006f<\u0000\u0402"+ + "\u00d3\u0001\u0000\u0000\u0000L\u0000\u0001\u0002\u0003\u0004\u0005\u00d8"+ + "\u00de\u00e3\u00ea\u00f0\u00fa\u01a8\u01ae\u01bd\u01c1\u01ea\u01f1\u01f3"+ + "\u01f9\u01fb\u0203\u020a\u021e\u0220\u022c\u022e\u0237\u023d\u024d\u0255"+ + "\u025a\u0263\u0266\u0277\u027b\u027d\u0285\u028c\u0298\u029a\u02a1\u02a3"+ + "\u02ab\u02ad\u02b4\u02b6\u02b9\u02c0\u02c9\u02d4\u02e2\u02eb\u031e\u0320"+ + "\u0327\u0329\u0331\u0334\u033b\u0366\u0374\u037d\u039f\u03a1\u03b3\u03bd"+ + "\u03c8\u03cd\u03d1\u03d9\u03df\u03e9\u03f0\u03f4\u03ff=\u0001\u0000\u0000"+ + "\u0000\u0001\u0000\u0001\u0002\u0001\u0001\u0003\u0002\u0001\u0004\u0003"+ + "\u0001\u0005\u0004\u0001\u0006\u0005\u0001\u0007\u0006\u0001\b\u0007\u0001"+ + "\t\b\u0001\n\t\u0001\u000b\n\u0001\f\u000b\u0001\r\f\u0001\u000e\r\u0001"+ + "\u000f\u000e\u0001\u0010\u000f\u0001\u0011\u0010\u0001\u0012\u0011\u0001"+ + "\u0013\u0012\u0001\u0014\u0013\u0001\u0015\u0014\u0005\u0004\u0000\u0001"+ + "\u0018\u0015\u0001\u0019\u0016\u0001\u001a\u0017\u0001\u001b\u0018\u0001"+ + "\u001c\u0019\u0001\u001d\u001a\u0005\u0002\u0000\u0001 \u001b\u0001#\u001c"+ + "\u0001%\u001d\u0001*\u001e\u0001,\u001f\u0001. \u00010!\u00011\"\u0001"+ + "2#\u00015$\u0007\'\u0000\u0007\u0017\u0000\u0007\u0002\u0000\u0001:%\u0007"+ + "(\u0000\u0004\u0000\u0000\u0007\u001c\u0000\u0007\u001f\u0000\u0007 \u0000"+ + "\u0007!\u0000\u0007\"\u0000\u0007%\u0000\u0007&\u0000\u0001I&\u0007)\u0000"+ + "\u0007*\u0000\u0001U\'\u0002\u0005\u0000\u0001c(\u0007\u0016\u0000\u0001"+ + "f)"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerLexer.tokens b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerLexer.tokens index 7e80664958..475a62a132 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerLexer.tokens +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerLexer.tokens @@ -26,26 +26,28 @@ RBRACKET=25 COMMA=26 EQUALS=27 FLAG=28 -DASH_DASH=29 -DOUBLE_QUOTED_STRING=30 -SINGLE_QUOTED_STRING=31 -ENV_VAR=32 -SPECIAL_VAR=33 -COMMAND_SUBST=34 -BACKTICK_SUBST=35 -DOLLAR=36 -UNQUOTED_TEXT=37 -WS=38 -NEWLINE=39 -COLON=40 -AT=41 -AS=42 -HP_LINE_CONTINUATION=43 -HP_WS=44 -HP_COMMENT=45 -HP_LINE_COMMENT=46 -HEREDOC_CONTENT=47 -H_NEWLINE=48 +FROM_FLAG=29 +DASH_DASH=30 +DOUBLE_QUOTED_STRING=31 +SINGLE_QUOTED_STRING=32 +ENV_VAR=33 +SPECIAL_VAR=34 +COMMAND_SUBST=35 +BACKTICK_SUBST=36 +DOLLAR=37 +UNQUOTED_TEXT=38 +WS=39 +NEWLINE=40 +COLON=41 +AT=42 +AS=43 +FLAG_END=44 +HP_LINE_CONTINUATION=45 +HP_WS=46 +HP_COMMENT=47 +HP_LINE_COMMENT=48 +HEREDOC_CONTENT=49 +H_NEWLINE=50 'FROM'=3 'RUN'=4 'CMD'=5 @@ -69,7 +71,6 @@ H_NEWLINE=48 ']'=25 ','=26 '='=27 -'--'=29 -'@'=41 -'AS'=42 -'\n'=48 +'--'=30 +'AS'=43 +'\n'=50 diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParser.interp b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParser.interp index 09da257267..09890eb3f4 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParser.interp +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParser.interp @@ -28,6 +28,7 @@ null ',' '=' null +null '--' null null @@ -40,13 +41,14 @@ null null null null -'@' +null 'AS' null null null null null +null '\n' token symbolic names: @@ -79,6 +81,7 @@ RBRACKET COMMA EQUALS FLAG +FROM_FLAG DASH_DASH DOUBLE_QUOTED_STRING SINGLE_QUOTED_STRING @@ -93,6 +96,7 @@ NEWLINE COLON AT AS +FLAG_END HP_LINE_CONTINUATION HP_WS HP_COMMENT @@ -129,6 +133,7 @@ shellInstruction maintainerInstruction flags flag +fromFlag execForm shellForm shellFormText @@ -171,4 +176,4 @@ textElement atn: -[4, 1, 48, 549, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 1, 0, 5, 0, 136, 8, 0, 10, 0, 12, 0, 139, 9, 0, 1, 0, 1, 0, 4, 0, 143, 8, 0, 11, 0, 12, 0, 144, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 5, 2, 152, 8, 2, 10, 2, 12, 2, 155, 9, 2, 1, 3, 1, 3, 5, 3, 159, 8, 3, 10, 3, 12, 3, 162, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 181, 8, 4, 1, 5, 1, 5, 3, 5, 185, 8, 5, 1, 6, 1, 6, 3, 6, 189, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 194, 8, 6, 1, 7, 1, 7, 3, 7, 198, 8, 7, 1, 7, 1, 7, 1, 7, 3, 7, 203, 8, 7, 1, 8, 1, 8, 1, 8, 3, 8, 208, 8, 8, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 3, 12, 221, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 226, 8, 12, 1, 13, 1, 13, 3, 13, 230, 8, 13, 1, 13, 1, 13, 1, 13, 3, 13, 235, 8, 13, 1, 14, 1, 14, 1, 14, 3, 14, 240, 8, 14, 1, 15, 1, 15, 1, 15, 4, 15, 245, 8, 15, 11, 15, 12, 15, 246, 3, 15, 249, 8, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 261, 8, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 273, 8, 21, 1, 21, 1, 21, 1, 21, 3, 21, 278, 8, 21, 3, 21, 280, 8, 21, 1, 22, 4, 22, 283, 8, 22, 11, 22, 12, 22, 284, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 4, 26, 296, 8, 26, 11, 26, 12, 26, 297, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 4, 30, 307, 8, 30, 11, 30, 12, 30, 308, 1, 31, 1, 31, 1, 31, 4, 31, 314, 8, 31, 11, 31, 12, 31, 315, 1, 32, 1, 32, 5, 32, 320, 8, 32, 10, 32, 12, 32, 323, 9, 32, 1, 32, 1, 32, 5, 32, 327, 8, 32, 10, 32, 12, 32, 330, 9, 32, 5, 32, 332, 8, 32, 10, 32, 12, 32, 335, 9, 32, 1, 33, 1, 33, 1, 33, 1, 34, 5, 34, 341, 8, 34, 10, 34, 12, 34, 344, 9, 34, 1, 35, 1, 35, 1, 36, 1, 36, 3, 36, 350, 8, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 5, 37, 357, 8, 37, 10, 37, 12, 37, 360, 9, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 3, 39, 367, 8, 39, 3, 39, 369, 8, 39, 1, 39, 1, 39, 3, 39, 373, 8, 39, 3, 39, 375, 8, 39, 1, 39, 1, 39, 3, 39, 379, 8, 39, 1, 39, 1, 39, 3, 39, 383, 8, 39, 3, 39, 385, 8, 39, 1, 39, 1, 39, 3, 39, 389, 8, 39, 3, 39, 391, 8, 39, 1, 40, 1, 40, 4, 40, 395, 8, 40, 11, 40, 12, 40, 396, 3, 40, 399, 8, 40, 1, 41, 1, 41, 1, 41, 4, 41, 404, 8, 41, 11, 41, 12, 41, 405, 3, 41, 408, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 4, 42, 414, 8, 42, 11, 42, 12, 42, 415, 3, 42, 418, 8, 42, 1, 43, 1, 43, 1, 44, 4, 44, 423, 8, 44, 11, 44, 12, 44, 424, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 434, 8, 45, 1, 46, 1, 46, 3, 46, 438, 8, 46, 1, 47, 4, 47, 441, 8, 47, 11, 47, 12, 47, 442, 1, 48, 1, 48, 1, 49, 4, 49, 448, 8, 49, 11, 49, 12, 49, 449, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 459, 8, 50, 1, 51, 1, 51, 1, 52, 1, 52, 4, 52, 465, 8, 52, 11, 52, 12, 52, 466, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 473, 8, 53, 10, 53, 12, 53, 476, 9, 53, 3, 53, 478, 8, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 3, 55, 485, 8, 55, 3, 55, 487, 8, 55, 1, 55, 1, 55, 3, 55, 491, 8, 55, 3, 55, 493, 8, 55, 1, 56, 1, 56, 4, 56, 497, 8, 56, 11, 56, 12, 56, 498, 3, 56, 501, 8, 56, 1, 57, 1, 57, 1, 57, 4, 57, 506, 8, 57, 11, 57, 12, 57, 507, 3, 57, 510, 8, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 4, 62, 522, 8, 62, 11, 62, 12, 62, 523, 1, 62, 1, 62, 3, 62, 528, 8, 62, 1, 63, 1, 63, 4, 63, 532, 8, 63, 11, 63, 12, 63, 533, 1, 63, 1, 63, 3, 63, 538, 8, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 3, 65, 545, 8, 65, 1, 66, 1, 66, 1, 66, 0, 0, 67, 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, 0, 5, 2, 0, 39, 39, 47, 47, 2, 0, 32, 35, 37, 37, 1, 0, 30, 31, 1, 0, 30, 37, 1, 0, 24, 37, 576, 0, 137, 1, 0, 0, 0, 2, 148, 1, 0, 0, 0, 4, 153, 1, 0, 0, 0, 6, 156, 1, 0, 0, 0, 8, 180, 1, 0, 0, 0, 10, 184, 1, 0, 0, 0, 12, 186, 1, 0, 0, 0, 14, 195, 1, 0, 0, 0, 16, 204, 1, 0, 0, 0, 18, 209, 1, 0, 0, 0, 20, 212, 1, 0, 0, 0, 22, 215, 1, 0, 0, 0, 24, 218, 1, 0, 0, 0, 26, 227, 1, 0, 0, 0, 28, 236, 1, 0, 0, 0, 30, 241, 1, 0, 0, 0, 32, 250, 1, 0, 0, 0, 34, 253, 1, 0, 0, 0, 36, 256, 1, 0, 0, 0, 38, 262, 1, 0, 0, 0, 40, 265, 1, 0, 0, 0, 42, 279, 1, 0, 0, 0, 44, 282, 1, 0, 0, 0, 46, 286, 1, 0, 0, 0, 48, 288, 1, 0, 0, 0, 50, 291, 1, 0, 0, 0, 52, 295, 1, 0, 0, 0, 54, 299, 1, 0, 0, 0, 56, 301, 1, 0, 0, 0, 58, 303, 1, 0, 0, 0, 60, 306, 1, 0, 0, 0, 62, 310, 1, 0, 0, 0, 64, 317, 1, 0, 0, 0, 66, 336, 1, 0, 0, 0, 68, 342, 1, 0, 0, 0, 70, 345, 1, 0, 0, 0, 72, 347, 1, 0, 0, 0, 74, 353, 1, 0, 0, 0, 76, 361, 1, 0, 0, 0, 78, 390, 1, 0, 0, 0, 80, 398, 1, 0, 0, 0, 82, 407, 1, 0, 0, 0, 84, 417, 1, 0, 0, 0, 86, 419, 1, 0, 0, 0, 88, 422, 1, 0, 0, 0, 90, 433, 1, 0, 0, 0, 92, 437, 1, 0, 0, 0, 94, 440, 1, 0, 0, 0, 96, 444, 1, 0, 0, 0, 98, 447, 1, 0, 0, 0, 100, 458, 1, 0, 0, 0, 102, 460, 1, 0, 0, 0, 104, 462, 1, 0, 0, 0, 106, 477, 1, 0, 0, 0, 108, 479, 1, 0, 0, 0, 110, 492, 1, 0, 0, 0, 112, 500, 1, 0, 0, 0, 114, 509, 1, 0, 0, 0, 116, 511, 1, 0, 0, 0, 118, 513, 1, 0, 0, 0, 120, 515, 1, 0, 0, 0, 122, 517, 1, 0, 0, 0, 124, 527, 1, 0, 0, 0, 126, 537, 1, 0, 0, 0, 128, 539, 1, 0, 0, 0, 130, 544, 1, 0, 0, 0, 132, 546, 1, 0, 0, 0, 134, 136, 3, 2, 1, 0, 135, 134, 1, 0, 0, 0, 136, 139, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 140, 1, 0, 0, 0, 139, 137, 1, 0, 0, 0, 140, 142, 3, 4, 2, 0, 141, 143, 3, 6, 3, 0, 142, 141, 1, 0, 0, 0, 143, 144, 1, 0, 0, 0, 144, 142, 1, 0, 0, 0, 144, 145, 1, 0, 0, 0, 145, 146, 1, 0, 0, 0, 146, 147, 5, 0, 0, 1, 147, 1, 1, 0, 0, 0, 148, 149, 5, 1, 0, 0, 149, 3, 1, 0, 0, 0, 150, 152, 3, 36, 18, 0, 151, 150, 1, 0, 0, 0, 152, 155, 1, 0, 0, 0, 153, 151, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 5, 1, 0, 0, 0, 155, 153, 1, 0, 0, 0, 156, 160, 3, 12, 6, 0, 157, 159, 3, 8, 4, 0, 158, 157, 1, 0, 0, 0, 159, 162, 1, 0, 0, 0, 160, 158, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, 7, 1, 0, 0, 0, 162, 160, 1, 0, 0, 0, 163, 181, 3, 14, 7, 0, 164, 181, 3, 16, 8, 0, 165, 181, 3, 18, 9, 0, 166, 181, 3, 20, 10, 0, 167, 181, 3, 22, 11, 0, 168, 181, 3, 24, 12, 0, 169, 181, 3, 26, 13, 0, 170, 181, 3, 28, 14, 0, 171, 181, 3, 30, 15, 0, 172, 181, 3, 32, 16, 0, 173, 181, 3, 34, 17, 0, 174, 181, 3, 36, 18, 0, 175, 181, 3, 38, 19, 0, 176, 181, 3, 40, 20, 0, 177, 181, 3, 42, 21, 0, 178, 181, 3, 48, 24, 0, 179, 181, 3, 50, 25, 0, 180, 163, 1, 0, 0, 0, 180, 164, 1, 0, 0, 0, 180, 165, 1, 0, 0, 0, 180, 166, 1, 0, 0, 0, 180, 167, 1, 0, 0, 0, 180, 168, 1, 0, 0, 0, 180, 169, 1, 0, 0, 0, 180, 170, 1, 0, 0, 0, 180, 171, 1, 0, 0, 0, 180, 172, 1, 0, 0, 0, 180, 173, 1, 0, 0, 0, 180, 174, 1, 0, 0, 0, 180, 175, 1, 0, 0, 0, 180, 176, 1, 0, 0, 0, 180, 177, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 179, 1, 0, 0, 0, 181, 9, 1, 0, 0, 0, 182, 185, 3, 12, 6, 0, 183, 185, 3, 8, 4, 0, 184, 182, 1, 0, 0, 0, 184, 183, 1, 0, 0, 0, 185, 11, 1, 0, 0, 0, 186, 188, 5, 3, 0, 0, 187, 189, 3, 52, 26, 0, 188, 187, 1, 0, 0, 0, 188, 189, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 193, 3, 78, 39, 0, 191, 192, 5, 42, 0, 0, 192, 194, 3, 86, 43, 0, 193, 191, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 13, 1, 0, 0, 0, 195, 197, 5, 4, 0, 0, 196, 198, 3, 52, 26, 0, 197, 196, 1, 0, 0, 0, 197, 198, 1, 0, 0, 0, 198, 202, 1, 0, 0, 0, 199, 203, 3, 56, 28, 0, 200, 203, 3, 58, 29, 0, 201, 203, 3, 62, 31, 0, 202, 199, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 202, 201, 1, 0, 0, 0, 203, 15, 1, 0, 0, 0, 204, 207, 5, 5, 0, 0, 205, 208, 3, 56, 28, 0, 206, 208, 3, 58, 29, 0, 207, 205, 1, 0, 0, 0, 207, 206, 1, 0, 0, 0, 208, 17, 1, 0, 0, 0, 209, 210, 5, 7, 0, 0, 210, 211, 3, 88, 44, 0, 211, 19, 1, 0, 0, 0, 212, 213, 5, 8, 0, 0, 213, 214, 3, 94, 47, 0, 214, 21, 1, 0, 0, 0, 215, 216, 5, 9, 0, 0, 216, 217, 3, 98, 49, 0, 217, 23, 1, 0, 0, 0, 218, 220, 5, 10, 0, 0, 219, 221, 3, 52, 26, 0, 220, 219, 1, 0, 0, 0, 220, 221, 1, 0, 0, 0, 221, 225, 1, 0, 0, 0, 222, 226, 3, 62, 31, 0, 223, 226, 3, 72, 36, 0, 224, 226, 3, 104, 52, 0, 225, 222, 1, 0, 0, 0, 225, 223, 1, 0, 0, 0, 225, 224, 1, 0, 0, 0, 226, 25, 1, 0, 0, 0, 227, 229, 5, 11, 0, 0, 228, 230, 3, 52, 26, 0, 229, 228, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 234, 1, 0, 0, 0, 231, 235, 3, 62, 31, 0, 232, 235, 3, 72, 36, 0, 233, 235, 3, 104, 52, 0, 234, 231, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 234, 233, 1, 0, 0, 0, 235, 27, 1, 0, 0, 0, 236, 239, 5, 12, 0, 0, 237, 240, 3, 56, 28, 0, 238, 240, 3, 58, 29, 0, 239, 237, 1, 0, 0, 0, 239, 238, 1, 0, 0, 0, 240, 29, 1, 0, 0, 0, 241, 248, 5, 13, 0, 0, 242, 249, 3, 72, 36, 0, 243, 245, 3, 106, 53, 0, 244, 243, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 244, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 249, 1, 0, 0, 0, 248, 242, 1, 0, 0, 0, 248, 244, 1, 0, 0, 0, 249, 31, 1, 0, 0, 0, 250, 251, 5, 14, 0, 0, 251, 252, 3, 110, 55, 0, 252, 33, 1, 0, 0, 0, 253, 254, 5, 15, 0, 0, 254, 255, 3, 108, 54, 0, 255, 35, 1, 0, 0, 0, 256, 257, 5, 16, 0, 0, 257, 260, 3, 116, 58, 0, 258, 259, 5, 27, 0, 0, 259, 261, 3, 118, 59, 0, 260, 258, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 37, 1, 0, 0, 0, 262, 263, 5, 17, 0, 0, 263, 264, 3, 10, 5, 0, 264, 39, 1, 0, 0, 0, 265, 266, 5, 18, 0, 0, 266, 267, 3, 120, 60, 0, 267, 41, 1, 0, 0, 0, 268, 269, 5, 19, 0, 0, 269, 280, 5, 6, 0, 0, 270, 272, 5, 19, 0, 0, 271, 273, 3, 44, 22, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 274, 1, 0, 0, 0, 274, 277, 5, 5, 0, 0, 275, 278, 3, 56, 28, 0, 276, 278, 3, 58, 29, 0, 277, 275, 1, 0, 0, 0, 277, 276, 1, 0, 0, 0, 278, 280, 1, 0, 0, 0, 279, 268, 1, 0, 0, 0, 279, 270, 1, 0, 0, 0, 280, 43, 1, 0, 0, 0, 281, 283, 3, 46, 23, 0, 282, 281, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 282, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 45, 1, 0, 0, 0, 286, 287, 5, 28, 0, 0, 287, 47, 1, 0, 0, 0, 288, 289, 5, 20, 0, 0, 289, 290, 3, 72, 36, 0, 290, 49, 1, 0, 0, 0, 291, 292, 5, 21, 0, 0, 292, 293, 3, 124, 62, 0, 293, 51, 1, 0, 0, 0, 294, 296, 3, 54, 27, 0, 295, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 53, 1, 0, 0, 0, 299, 300, 5, 28, 0, 0, 300, 55, 1, 0, 0, 0, 301, 302, 3, 72, 36, 0, 302, 57, 1, 0, 0, 0, 303, 304, 3, 60, 30, 0, 304, 59, 1, 0, 0, 0, 305, 307, 3, 132, 66, 0, 306, 305, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 61, 1, 0, 0, 0, 310, 311, 3, 64, 32, 0, 311, 313, 5, 39, 0, 0, 312, 314, 3, 66, 33, 0, 313, 312, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 63, 1, 0, 0, 0, 317, 321, 5, 22, 0, 0, 318, 320, 3, 132, 66, 0, 319, 318, 1, 0, 0, 0, 320, 323, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 333, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 324, 328, 5, 22, 0, 0, 325, 327, 3, 132, 66, 0, 326, 325, 1, 0, 0, 0, 327, 330, 1, 0, 0, 0, 328, 326, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 332, 1, 0, 0, 0, 330, 328, 1, 0, 0, 0, 331, 324, 1, 0, 0, 0, 332, 335, 1, 0, 0, 0, 333, 331, 1, 0, 0, 0, 333, 334, 1, 0, 0, 0, 334, 65, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 336, 337, 3, 68, 34, 0, 337, 338, 3, 70, 35, 0, 338, 67, 1, 0, 0, 0, 339, 341, 7, 0, 0, 0, 340, 339, 1, 0, 0, 0, 341, 344, 1, 0, 0, 0, 342, 340, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 69, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 345, 346, 5, 37, 0, 0, 346, 71, 1, 0, 0, 0, 347, 349, 5, 24, 0, 0, 348, 350, 3, 74, 37, 0, 349, 348, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 351, 352, 5, 25, 0, 0, 352, 73, 1, 0, 0, 0, 353, 358, 3, 76, 38, 0, 354, 355, 5, 26, 0, 0, 355, 357, 3, 76, 38, 0, 356, 354, 1, 0, 0, 0, 357, 360, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 75, 1, 0, 0, 0, 360, 358, 1, 0, 0, 0, 361, 362, 5, 30, 0, 0, 362, 77, 1, 0, 0, 0, 363, 368, 3, 80, 40, 0, 364, 366, 5, 40, 0, 0, 365, 367, 3, 82, 41, 0, 366, 365, 1, 0, 0, 0, 366, 367, 1, 0, 0, 0, 367, 369, 1, 0, 0, 0, 368, 364, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 374, 1, 0, 0, 0, 370, 372, 5, 41, 0, 0, 371, 373, 3, 84, 42, 0, 372, 371, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 375, 1, 0, 0, 0, 374, 370, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 391, 1, 0, 0, 0, 376, 378, 5, 40, 0, 0, 377, 379, 3, 82, 41, 0, 378, 377, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 384, 1, 0, 0, 0, 380, 382, 5, 41, 0, 0, 381, 383, 3, 84, 42, 0, 382, 381, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 385, 1, 0, 0, 0, 384, 380, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 391, 1, 0, 0, 0, 386, 388, 5, 41, 0, 0, 387, 389, 3, 84, 42, 0, 388, 387, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 391, 1, 0, 0, 0, 390, 363, 1, 0, 0, 0, 390, 376, 1, 0, 0, 0, 390, 386, 1, 0, 0, 0, 391, 79, 1, 0, 0, 0, 392, 399, 3, 122, 61, 0, 393, 395, 3, 132, 66, 0, 394, 393, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 399, 1, 0, 0, 0, 398, 392, 1, 0, 0, 0, 398, 394, 1, 0, 0, 0, 399, 81, 1, 0, 0, 0, 400, 408, 3, 122, 61, 0, 401, 404, 3, 132, 66, 0, 402, 404, 5, 40, 0, 0, 403, 401, 1, 0, 0, 0, 403, 402, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 403, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 408, 1, 0, 0, 0, 407, 400, 1, 0, 0, 0, 407, 403, 1, 0, 0, 0, 408, 83, 1, 0, 0, 0, 409, 418, 3, 122, 61, 0, 410, 414, 3, 132, 66, 0, 411, 414, 5, 40, 0, 0, 412, 414, 5, 41, 0, 0, 413, 410, 1, 0, 0, 0, 413, 411, 1, 0, 0, 0, 413, 412, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 418, 1, 0, 0, 0, 417, 409, 1, 0, 0, 0, 417, 413, 1, 0, 0, 0, 418, 85, 1, 0, 0, 0, 419, 420, 5, 37, 0, 0, 420, 87, 1, 0, 0, 0, 421, 423, 3, 90, 45, 0, 422, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 422, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 89, 1, 0, 0, 0, 426, 427, 3, 92, 46, 0, 427, 428, 5, 27, 0, 0, 428, 429, 3, 126, 63, 0, 429, 434, 1, 0, 0, 0, 430, 431, 3, 92, 46, 0, 431, 432, 3, 124, 62, 0, 432, 434, 1, 0, 0, 0, 433, 426, 1, 0, 0, 0, 433, 430, 1, 0, 0, 0, 434, 91, 1, 0, 0, 0, 435, 438, 3, 122, 61, 0, 436, 438, 5, 37, 0, 0, 437, 435, 1, 0, 0, 0, 437, 436, 1, 0, 0, 0, 438, 93, 1, 0, 0, 0, 439, 441, 3, 96, 48, 0, 440, 439, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 440, 1, 0, 0, 0, 442, 443, 1, 0, 0, 0, 443, 95, 1, 0, 0, 0, 444, 445, 7, 1, 0, 0, 445, 97, 1, 0, 0, 0, 446, 448, 3, 100, 50, 0, 447, 446, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 447, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 99, 1, 0, 0, 0, 451, 452, 3, 102, 51, 0, 452, 453, 5, 27, 0, 0, 453, 454, 3, 126, 63, 0, 454, 459, 1, 0, 0, 0, 455, 456, 3, 102, 51, 0, 456, 457, 3, 124, 62, 0, 457, 459, 1, 0, 0, 0, 458, 451, 1, 0, 0, 0, 458, 455, 1, 0, 0, 0, 459, 101, 1, 0, 0, 0, 460, 461, 5, 37, 0, 0, 461, 103, 1, 0, 0, 0, 462, 464, 3, 106, 53, 0, 463, 465, 3, 106, 53, 0, 464, 463, 1, 0, 0, 0, 465, 466, 1, 0, 0, 0, 466, 464, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 105, 1, 0, 0, 0, 468, 478, 3, 122, 61, 0, 469, 474, 3, 130, 65, 0, 470, 471, 4, 53, 0, 0, 471, 473, 3, 130, 65, 0, 472, 470, 1, 0, 0, 0, 473, 476, 1, 0, 0, 0, 474, 472, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 478, 1, 0, 0, 0, 476, 474, 1, 0, 0, 0, 477, 468, 1, 0, 0, 0, 477, 469, 1, 0, 0, 0, 478, 107, 1, 0, 0, 0, 479, 480, 3, 124, 62, 0, 480, 109, 1, 0, 0, 0, 481, 486, 3, 112, 56, 0, 482, 484, 5, 40, 0, 0, 483, 485, 3, 114, 57, 0, 484, 483, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 487, 1, 0, 0, 0, 486, 482, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 493, 1, 0, 0, 0, 488, 490, 5, 40, 0, 0, 489, 491, 3, 114, 57, 0, 490, 489, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 493, 1, 0, 0, 0, 492, 481, 1, 0, 0, 0, 492, 488, 1, 0, 0, 0, 493, 111, 1, 0, 0, 0, 494, 501, 3, 122, 61, 0, 495, 497, 3, 132, 66, 0, 496, 495, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 496, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 501, 1, 0, 0, 0, 500, 494, 1, 0, 0, 0, 500, 496, 1, 0, 0, 0, 501, 113, 1, 0, 0, 0, 502, 510, 3, 122, 61, 0, 503, 506, 3, 132, 66, 0, 504, 506, 5, 40, 0, 0, 505, 503, 1, 0, 0, 0, 505, 504, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 510, 1, 0, 0, 0, 509, 502, 1, 0, 0, 0, 509, 505, 1, 0, 0, 0, 510, 115, 1, 0, 0, 0, 511, 512, 5, 37, 0, 0, 512, 117, 1, 0, 0, 0, 513, 514, 3, 124, 62, 0, 514, 119, 1, 0, 0, 0, 515, 516, 5, 37, 0, 0, 516, 121, 1, 0, 0, 0, 517, 518, 7, 2, 0, 0, 518, 123, 1, 0, 0, 0, 519, 521, 3, 132, 66, 0, 520, 522, 3, 132, 66, 0, 521, 520, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 521, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 528, 1, 0, 0, 0, 525, 528, 3, 122, 61, 0, 526, 528, 3, 132, 66, 0, 527, 519, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 527, 526, 1, 0, 0, 0, 528, 125, 1, 0, 0, 0, 529, 531, 3, 128, 64, 0, 530, 532, 3, 128, 64, 0, 531, 530, 1, 0, 0, 0, 532, 533, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 538, 1, 0, 0, 0, 535, 538, 3, 122, 61, 0, 536, 538, 3, 128, 64, 0, 537, 529, 1, 0, 0, 0, 537, 535, 1, 0, 0, 0, 537, 536, 1, 0, 0, 0, 538, 127, 1, 0, 0, 0, 539, 540, 7, 3, 0, 0, 540, 129, 1, 0, 0, 0, 541, 545, 3, 128, 64, 0, 542, 545, 5, 27, 0, 0, 543, 545, 5, 26, 0, 0, 544, 541, 1, 0, 0, 0, 544, 542, 1, 0, 0, 0, 544, 543, 1, 0, 0, 0, 545, 131, 1, 0, 0, 0, 546, 547, 7, 4, 0, 0, 547, 133, 1, 0, 0, 0, 72, 137, 144, 153, 160, 180, 184, 188, 193, 197, 202, 207, 220, 225, 229, 234, 239, 246, 248, 260, 272, 277, 279, 284, 297, 308, 315, 321, 328, 333, 342, 349, 358, 366, 368, 372, 374, 378, 382, 384, 388, 390, 396, 398, 403, 405, 407, 413, 415, 417, 424, 433, 437, 442, 449, 458, 466, 474, 477, 484, 486, 490, 492, 498, 500, 505, 507, 509, 523, 527, 533, 537, 544] \ No newline at end of file +[4, 1, 50, 559, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 1, 0, 5, 0, 138, 8, 0, 10, 0, 12, 0, 141, 9, 0, 1, 0, 1, 0, 4, 0, 145, 8, 0, 11, 0, 12, 0, 146, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 5, 2, 154, 8, 2, 10, 2, 12, 2, 157, 9, 2, 1, 3, 1, 3, 5, 3, 161, 8, 3, 10, 3, 12, 3, 164, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 183, 8, 4, 1, 5, 1, 5, 3, 5, 187, 8, 5, 1, 6, 1, 6, 3, 6, 191, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 196, 8, 6, 1, 7, 1, 7, 3, 7, 200, 8, 7, 1, 7, 1, 7, 1, 7, 3, 7, 205, 8, 7, 1, 8, 1, 8, 1, 8, 3, 8, 210, 8, 8, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 3, 12, 223, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 228, 8, 12, 1, 13, 1, 13, 3, 13, 232, 8, 13, 1, 13, 1, 13, 1, 13, 3, 13, 237, 8, 13, 1, 14, 1, 14, 1, 14, 3, 14, 242, 8, 14, 1, 15, 1, 15, 1, 15, 4, 15, 247, 8, 15, 11, 15, 12, 15, 248, 3, 15, 251, 8, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 263, 8, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 275, 8, 21, 1, 21, 1, 21, 1, 21, 3, 21, 280, 8, 21, 3, 21, 282, 8, 21, 1, 22, 4, 22, 285, 8, 22, 11, 22, 12, 22, 286, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 4, 26, 299, 8, 26, 11, 26, 12, 26, 300, 1, 27, 1, 27, 1, 28, 1, 28, 3, 28, 307, 8, 28, 1, 28, 3, 28, 310, 8, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 4, 31, 317, 8, 31, 11, 31, 12, 31, 318, 1, 32, 1, 32, 1, 32, 4, 32, 324, 8, 32, 11, 32, 12, 32, 325, 1, 33, 1, 33, 5, 33, 330, 8, 33, 10, 33, 12, 33, 333, 9, 33, 1, 33, 1, 33, 5, 33, 337, 8, 33, 10, 33, 12, 33, 340, 9, 33, 5, 33, 342, 8, 33, 10, 33, 12, 33, 345, 9, 33, 1, 34, 1, 34, 1, 34, 1, 35, 5, 35, 351, 8, 35, 10, 35, 12, 35, 354, 9, 35, 1, 36, 1, 36, 1, 37, 1, 37, 3, 37, 360, 8, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 5, 38, 367, 8, 38, 10, 38, 12, 38, 370, 9, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 3, 40, 377, 8, 40, 3, 40, 379, 8, 40, 1, 40, 1, 40, 3, 40, 383, 8, 40, 3, 40, 385, 8, 40, 1, 40, 1, 40, 3, 40, 389, 8, 40, 1, 40, 1, 40, 3, 40, 393, 8, 40, 3, 40, 395, 8, 40, 1, 40, 1, 40, 3, 40, 399, 8, 40, 3, 40, 401, 8, 40, 1, 41, 1, 41, 4, 41, 405, 8, 41, 11, 41, 12, 41, 406, 3, 41, 409, 8, 41, 1, 42, 1, 42, 1, 42, 4, 42, 414, 8, 42, 11, 42, 12, 42, 415, 3, 42, 418, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 4, 43, 424, 8, 43, 11, 43, 12, 43, 425, 3, 43, 428, 8, 43, 1, 44, 1, 44, 1, 45, 4, 45, 433, 8, 45, 11, 45, 12, 45, 434, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 444, 8, 46, 1, 47, 1, 47, 3, 47, 448, 8, 47, 1, 48, 4, 48, 451, 8, 48, 11, 48, 12, 48, 452, 1, 49, 1, 49, 1, 50, 4, 50, 458, 8, 50, 11, 50, 12, 50, 459, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 469, 8, 51, 1, 52, 1, 52, 1, 53, 1, 53, 4, 53, 475, 8, 53, 11, 53, 12, 53, 476, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 483, 8, 54, 10, 54, 12, 54, 486, 9, 54, 3, 54, 488, 8, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 3, 56, 495, 8, 56, 3, 56, 497, 8, 56, 1, 56, 1, 56, 3, 56, 501, 8, 56, 3, 56, 503, 8, 56, 1, 57, 1, 57, 4, 57, 507, 8, 57, 11, 57, 12, 57, 508, 3, 57, 511, 8, 57, 1, 58, 1, 58, 1, 58, 4, 58, 516, 8, 58, 11, 58, 12, 58, 517, 3, 58, 520, 8, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 4, 63, 532, 8, 63, 11, 63, 12, 63, 533, 1, 63, 1, 63, 3, 63, 538, 8, 63, 1, 64, 1, 64, 4, 64, 542, 8, 64, 11, 64, 12, 64, 543, 1, 64, 1, 64, 3, 64, 548, 8, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 3, 66, 555, 8, 66, 1, 67, 1, 67, 1, 67, 0, 0, 68, 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, 0, 5, 2, 0, 40, 40, 49, 49, 2, 0, 33, 36, 38, 38, 1, 0, 31, 32, 1, 0, 31, 38, 2, 0, 24, 28, 30, 38, 588, 0, 139, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 4, 155, 1, 0, 0, 0, 6, 158, 1, 0, 0, 0, 8, 182, 1, 0, 0, 0, 10, 186, 1, 0, 0, 0, 12, 188, 1, 0, 0, 0, 14, 197, 1, 0, 0, 0, 16, 206, 1, 0, 0, 0, 18, 211, 1, 0, 0, 0, 20, 214, 1, 0, 0, 0, 22, 217, 1, 0, 0, 0, 24, 220, 1, 0, 0, 0, 26, 229, 1, 0, 0, 0, 28, 238, 1, 0, 0, 0, 30, 243, 1, 0, 0, 0, 32, 252, 1, 0, 0, 0, 34, 255, 1, 0, 0, 0, 36, 258, 1, 0, 0, 0, 38, 264, 1, 0, 0, 0, 40, 267, 1, 0, 0, 0, 42, 281, 1, 0, 0, 0, 44, 284, 1, 0, 0, 0, 46, 288, 1, 0, 0, 0, 48, 290, 1, 0, 0, 0, 50, 293, 1, 0, 0, 0, 52, 298, 1, 0, 0, 0, 54, 302, 1, 0, 0, 0, 56, 304, 1, 0, 0, 0, 58, 311, 1, 0, 0, 0, 60, 313, 1, 0, 0, 0, 62, 316, 1, 0, 0, 0, 64, 320, 1, 0, 0, 0, 66, 327, 1, 0, 0, 0, 68, 346, 1, 0, 0, 0, 70, 352, 1, 0, 0, 0, 72, 355, 1, 0, 0, 0, 74, 357, 1, 0, 0, 0, 76, 363, 1, 0, 0, 0, 78, 371, 1, 0, 0, 0, 80, 400, 1, 0, 0, 0, 82, 408, 1, 0, 0, 0, 84, 417, 1, 0, 0, 0, 86, 427, 1, 0, 0, 0, 88, 429, 1, 0, 0, 0, 90, 432, 1, 0, 0, 0, 92, 443, 1, 0, 0, 0, 94, 447, 1, 0, 0, 0, 96, 450, 1, 0, 0, 0, 98, 454, 1, 0, 0, 0, 100, 457, 1, 0, 0, 0, 102, 468, 1, 0, 0, 0, 104, 470, 1, 0, 0, 0, 106, 472, 1, 0, 0, 0, 108, 487, 1, 0, 0, 0, 110, 489, 1, 0, 0, 0, 112, 502, 1, 0, 0, 0, 114, 510, 1, 0, 0, 0, 116, 519, 1, 0, 0, 0, 118, 521, 1, 0, 0, 0, 120, 523, 1, 0, 0, 0, 122, 525, 1, 0, 0, 0, 124, 527, 1, 0, 0, 0, 126, 537, 1, 0, 0, 0, 128, 547, 1, 0, 0, 0, 130, 549, 1, 0, 0, 0, 132, 554, 1, 0, 0, 0, 134, 556, 1, 0, 0, 0, 136, 138, 3, 2, 1, 0, 137, 136, 1, 0, 0, 0, 138, 141, 1, 0, 0, 0, 139, 137, 1, 0, 0, 0, 139, 140, 1, 0, 0, 0, 140, 142, 1, 0, 0, 0, 141, 139, 1, 0, 0, 0, 142, 144, 3, 4, 2, 0, 143, 145, 3, 6, 3, 0, 144, 143, 1, 0, 0, 0, 145, 146, 1, 0, 0, 0, 146, 144, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, 147, 148, 1, 0, 0, 0, 148, 149, 5, 0, 0, 1, 149, 1, 1, 0, 0, 0, 150, 151, 5, 1, 0, 0, 151, 3, 1, 0, 0, 0, 152, 154, 3, 36, 18, 0, 153, 152, 1, 0, 0, 0, 154, 157, 1, 0, 0, 0, 155, 153, 1, 0, 0, 0, 155, 156, 1, 0, 0, 0, 156, 5, 1, 0, 0, 0, 157, 155, 1, 0, 0, 0, 158, 162, 3, 12, 6, 0, 159, 161, 3, 8, 4, 0, 160, 159, 1, 0, 0, 0, 161, 164, 1, 0, 0, 0, 162, 160, 1, 0, 0, 0, 162, 163, 1, 0, 0, 0, 163, 7, 1, 0, 0, 0, 164, 162, 1, 0, 0, 0, 165, 183, 3, 14, 7, 0, 166, 183, 3, 16, 8, 0, 167, 183, 3, 18, 9, 0, 168, 183, 3, 20, 10, 0, 169, 183, 3, 22, 11, 0, 170, 183, 3, 24, 12, 0, 171, 183, 3, 26, 13, 0, 172, 183, 3, 28, 14, 0, 173, 183, 3, 30, 15, 0, 174, 183, 3, 32, 16, 0, 175, 183, 3, 34, 17, 0, 176, 183, 3, 36, 18, 0, 177, 183, 3, 38, 19, 0, 178, 183, 3, 40, 20, 0, 179, 183, 3, 42, 21, 0, 180, 183, 3, 48, 24, 0, 181, 183, 3, 50, 25, 0, 182, 165, 1, 0, 0, 0, 182, 166, 1, 0, 0, 0, 182, 167, 1, 0, 0, 0, 182, 168, 1, 0, 0, 0, 182, 169, 1, 0, 0, 0, 182, 170, 1, 0, 0, 0, 182, 171, 1, 0, 0, 0, 182, 172, 1, 0, 0, 0, 182, 173, 1, 0, 0, 0, 182, 174, 1, 0, 0, 0, 182, 175, 1, 0, 0, 0, 182, 176, 1, 0, 0, 0, 182, 177, 1, 0, 0, 0, 182, 178, 1, 0, 0, 0, 182, 179, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 181, 1, 0, 0, 0, 183, 9, 1, 0, 0, 0, 184, 187, 3, 12, 6, 0, 185, 187, 3, 8, 4, 0, 186, 184, 1, 0, 0, 0, 186, 185, 1, 0, 0, 0, 187, 11, 1, 0, 0, 0, 188, 190, 5, 3, 0, 0, 189, 191, 3, 52, 26, 0, 190, 189, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 195, 3, 80, 40, 0, 193, 194, 5, 43, 0, 0, 194, 196, 3, 88, 44, 0, 195, 193, 1, 0, 0, 0, 195, 196, 1, 0, 0, 0, 196, 13, 1, 0, 0, 0, 197, 199, 5, 4, 0, 0, 198, 200, 3, 52, 26, 0, 199, 198, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 204, 1, 0, 0, 0, 201, 205, 3, 58, 29, 0, 202, 205, 3, 60, 30, 0, 203, 205, 3, 64, 32, 0, 204, 201, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 204, 203, 1, 0, 0, 0, 205, 15, 1, 0, 0, 0, 206, 209, 5, 5, 0, 0, 207, 210, 3, 58, 29, 0, 208, 210, 3, 60, 30, 0, 209, 207, 1, 0, 0, 0, 209, 208, 1, 0, 0, 0, 210, 17, 1, 0, 0, 0, 211, 212, 5, 7, 0, 0, 212, 213, 3, 90, 45, 0, 213, 19, 1, 0, 0, 0, 214, 215, 5, 8, 0, 0, 215, 216, 3, 96, 48, 0, 216, 21, 1, 0, 0, 0, 217, 218, 5, 9, 0, 0, 218, 219, 3, 100, 50, 0, 219, 23, 1, 0, 0, 0, 220, 222, 5, 10, 0, 0, 221, 223, 3, 52, 26, 0, 222, 221, 1, 0, 0, 0, 222, 223, 1, 0, 0, 0, 223, 227, 1, 0, 0, 0, 224, 228, 3, 64, 32, 0, 225, 228, 3, 74, 37, 0, 226, 228, 3, 106, 53, 0, 227, 224, 1, 0, 0, 0, 227, 225, 1, 0, 0, 0, 227, 226, 1, 0, 0, 0, 228, 25, 1, 0, 0, 0, 229, 231, 5, 11, 0, 0, 230, 232, 3, 52, 26, 0, 231, 230, 1, 0, 0, 0, 231, 232, 1, 0, 0, 0, 232, 236, 1, 0, 0, 0, 233, 237, 3, 64, 32, 0, 234, 237, 3, 74, 37, 0, 235, 237, 3, 106, 53, 0, 236, 233, 1, 0, 0, 0, 236, 234, 1, 0, 0, 0, 236, 235, 1, 0, 0, 0, 237, 27, 1, 0, 0, 0, 238, 241, 5, 12, 0, 0, 239, 242, 3, 58, 29, 0, 240, 242, 3, 60, 30, 0, 241, 239, 1, 0, 0, 0, 241, 240, 1, 0, 0, 0, 242, 29, 1, 0, 0, 0, 243, 250, 5, 13, 0, 0, 244, 251, 3, 74, 37, 0, 245, 247, 3, 108, 54, 0, 246, 245, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 251, 1, 0, 0, 0, 250, 244, 1, 0, 0, 0, 250, 246, 1, 0, 0, 0, 251, 31, 1, 0, 0, 0, 252, 253, 5, 14, 0, 0, 253, 254, 3, 112, 56, 0, 254, 33, 1, 0, 0, 0, 255, 256, 5, 15, 0, 0, 256, 257, 3, 110, 55, 0, 257, 35, 1, 0, 0, 0, 258, 259, 5, 16, 0, 0, 259, 262, 3, 118, 59, 0, 260, 261, 5, 27, 0, 0, 261, 263, 3, 120, 60, 0, 262, 260, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 37, 1, 0, 0, 0, 264, 265, 5, 17, 0, 0, 265, 266, 3, 10, 5, 0, 266, 39, 1, 0, 0, 0, 267, 268, 5, 18, 0, 0, 268, 269, 3, 122, 61, 0, 269, 41, 1, 0, 0, 0, 270, 271, 5, 19, 0, 0, 271, 282, 5, 6, 0, 0, 272, 274, 5, 19, 0, 0, 273, 275, 3, 44, 22, 0, 274, 273, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 279, 5, 5, 0, 0, 277, 280, 3, 58, 29, 0, 278, 280, 3, 60, 30, 0, 279, 277, 1, 0, 0, 0, 279, 278, 1, 0, 0, 0, 280, 282, 1, 0, 0, 0, 281, 270, 1, 0, 0, 0, 281, 272, 1, 0, 0, 0, 282, 43, 1, 0, 0, 0, 283, 285, 3, 46, 23, 0, 284, 283, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 45, 1, 0, 0, 0, 288, 289, 5, 28, 0, 0, 289, 47, 1, 0, 0, 0, 290, 291, 5, 20, 0, 0, 291, 292, 3, 74, 37, 0, 292, 49, 1, 0, 0, 0, 293, 294, 5, 21, 0, 0, 294, 295, 3, 126, 63, 0, 295, 51, 1, 0, 0, 0, 296, 299, 3, 54, 27, 0, 297, 299, 3, 56, 28, 0, 298, 296, 1, 0, 0, 0, 298, 297, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 53, 1, 0, 0, 0, 302, 303, 5, 28, 0, 0, 303, 55, 1, 0, 0, 0, 304, 306, 5, 29, 0, 0, 305, 307, 3, 80, 40, 0, 306, 305, 1, 0, 0, 0, 306, 307, 1, 0, 0, 0, 307, 309, 1, 0, 0, 0, 308, 310, 5, 44, 0, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 57, 1, 0, 0, 0, 311, 312, 3, 74, 37, 0, 312, 59, 1, 0, 0, 0, 313, 314, 3, 62, 31, 0, 314, 61, 1, 0, 0, 0, 315, 317, 3, 134, 67, 0, 316, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 316, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 63, 1, 0, 0, 0, 320, 321, 3, 66, 33, 0, 321, 323, 5, 40, 0, 0, 322, 324, 3, 68, 34, 0, 323, 322, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 325, 326, 1, 0, 0, 0, 326, 65, 1, 0, 0, 0, 327, 331, 5, 22, 0, 0, 328, 330, 3, 134, 67, 0, 329, 328, 1, 0, 0, 0, 330, 333, 1, 0, 0, 0, 331, 329, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 343, 1, 0, 0, 0, 333, 331, 1, 0, 0, 0, 334, 338, 5, 22, 0, 0, 335, 337, 3, 134, 67, 0, 336, 335, 1, 0, 0, 0, 337, 340, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 342, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 341, 334, 1, 0, 0, 0, 342, 345, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 67, 1, 0, 0, 0, 345, 343, 1, 0, 0, 0, 346, 347, 3, 70, 35, 0, 347, 348, 3, 72, 36, 0, 348, 69, 1, 0, 0, 0, 349, 351, 7, 0, 0, 0, 350, 349, 1, 0, 0, 0, 351, 354, 1, 0, 0, 0, 352, 350, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 71, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 355, 356, 5, 38, 0, 0, 356, 73, 1, 0, 0, 0, 357, 359, 5, 24, 0, 0, 358, 360, 3, 76, 38, 0, 359, 358, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 362, 5, 25, 0, 0, 362, 75, 1, 0, 0, 0, 363, 368, 3, 78, 39, 0, 364, 365, 5, 26, 0, 0, 365, 367, 3, 78, 39, 0, 366, 364, 1, 0, 0, 0, 367, 370, 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 77, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, 371, 372, 5, 31, 0, 0, 372, 79, 1, 0, 0, 0, 373, 378, 3, 82, 41, 0, 374, 376, 5, 41, 0, 0, 375, 377, 3, 84, 42, 0, 376, 375, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 379, 1, 0, 0, 0, 378, 374, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 384, 1, 0, 0, 0, 380, 382, 5, 42, 0, 0, 381, 383, 3, 86, 43, 0, 382, 381, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 385, 1, 0, 0, 0, 384, 380, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 401, 1, 0, 0, 0, 386, 388, 5, 41, 0, 0, 387, 389, 3, 84, 42, 0, 388, 387, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 394, 1, 0, 0, 0, 390, 392, 5, 42, 0, 0, 391, 393, 3, 86, 43, 0, 392, 391, 1, 0, 0, 0, 392, 393, 1, 0, 0, 0, 393, 395, 1, 0, 0, 0, 394, 390, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 401, 1, 0, 0, 0, 396, 398, 5, 42, 0, 0, 397, 399, 3, 86, 43, 0, 398, 397, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 401, 1, 0, 0, 0, 400, 373, 1, 0, 0, 0, 400, 386, 1, 0, 0, 0, 400, 396, 1, 0, 0, 0, 401, 81, 1, 0, 0, 0, 402, 409, 3, 124, 62, 0, 403, 405, 3, 134, 67, 0, 404, 403, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 404, 1, 0, 0, 0, 406, 407, 1, 0, 0, 0, 407, 409, 1, 0, 0, 0, 408, 402, 1, 0, 0, 0, 408, 404, 1, 0, 0, 0, 409, 83, 1, 0, 0, 0, 410, 418, 3, 124, 62, 0, 411, 414, 3, 134, 67, 0, 412, 414, 5, 41, 0, 0, 413, 411, 1, 0, 0, 0, 413, 412, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 418, 1, 0, 0, 0, 417, 410, 1, 0, 0, 0, 417, 413, 1, 0, 0, 0, 418, 85, 1, 0, 0, 0, 419, 428, 3, 124, 62, 0, 420, 424, 3, 134, 67, 0, 421, 424, 5, 41, 0, 0, 422, 424, 5, 42, 0, 0, 423, 420, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 423, 422, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 428, 1, 0, 0, 0, 427, 419, 1, 0, 0, 0, 427, 423, 1, 0, 0, 0, 428, 87, 1, 0, 0, 0, 429, 430, 5, 38, 0, 0, 430, 89, 1, 0, 0, 0, 431, 433, 3, 92, 46, 0, 432, 431, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 432, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 91, 1, 0, 0, 0, 436, 437, 3, 94, 47, 0, 437, 438, 5, 27, 0, 0, 438, 439, 3, 128, 64, 0, 439, 444, 1, 0, 0, 0, 440, 441, 3, 94, 47, 0, 441, 442, 3, 126, 63, 0, 442, 444, 1, 0, 0, 0, 443, 436, 1, 0, 0, 0, 443, 440, 1, 0, 0, 0, 444, 93, 1, 0, 0, 0, 445, 448, 3, 124, 62, 0, 446, 448, 5, 38, 0, 0, 447, 445, 1, 0, 0, 0, 447, 446, 1, 0, 0, 0, 448, 95, 1, 0, 0, 0, 449, 451, 3, 98, 49, 0, 450, 449, 1, 0, 0, 0, 451, 452, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 97, 1, 0, 0, 0, 454, 455, 7, 1, 0, 0, 455, 99, 1, 0, 0, 0, 456, 458, 3, 102, 51, 0, 457, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 457, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 101, 1, 0, 0, 0, 461, 462, 3, 104, 52, 0, 462, 463, 5, 27, 0, 0, 463, 464, 3, 128, 64, 0, 464, 469, 1, 0, 0, 0, 465, 466, 3, 104, 52, 0, 466, 467, 3, 126, 63, 0, 467, 469, 1, 0, 0, 0, 468, 461, 1, 0, 0, 0, 468, 465, 1, 0, 0, 0, 469, 103, 1, 0, 0, 0, 470, 471, 5, 38, 0, 0, 471, 105, 1, 0, 0, 0, 472, 474, 3, 108, 54, 0, 473, 475, 3, 108, 54, 0, 474, 473, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 474, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 107, 1, 0, 0, 0, 478, 488, 3, 124, 62, 0, 479, 484, 3, 132, 66, 0, 480, 481, 4, 54, 0, 0, 481, 483, 3, 132, 66, 0, 482, 480, 1, 0, 0, 0, 483, 486, 1, 0, 0, 0, 484, 482, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 488, 1, 0, 0, 0, 486, 484, 1, 0, 0, 0, 487, 478, 1, 0, 0, 0, 487, 479, 1, 0, 0, 0, 488, 109, 1, 0, 0, 0, 489, 490, 3, 126, 63, 0, 490, 111, 1, 0, 0, 0, 491, 496, 3, 114, 57, 0, 492, 494, 5, 41, 0, 0, 493, 495, 3, 116, 58, 0, 494, 493, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 497, 1, 0, 0, 0, 496, 492, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 503, 1, 0, 0, 0, 498, 500, 5, 41, 0, 0, 499, 501, 3, 116, 58, 0, 500, 499, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 503, 1, 0, 0, 0, 502, 491, 1, 0, 0, 0, 502, 498, 1, 0, 0, 0, 503, 113, 1, 0, 0, 0, 504, 511, 3, 124, 62, 0, 505, 507, 3, 134, 67, 0, 506, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 511, 1, 0, 0, 0, 510, 504, 1, 0, 0, 0, 510, 506, 1, 0, 0, 0, 511, 115, 1, 0, 0, 0, 512, 520, 3, 124, 62, 0, 513, 516, 3, 134, 67, 0, 514, 516, 5, 41, 0, 0, 515, 513, 1, 0, 0, 0, 515, 514, 1, 0, 0, 0, 516, 517, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 520, 1, 0, 0, 0, 519, 512, 1, 0, 0, 0, 519, 515, 1, 0, 0, 0, 520, 117, 1, 0, 0, 0, 521, 522, 5, 38, 0, 0, 522, 119, 1, 0, 0, 0, 523, 524, 3, 126, 63, 0, 524, 121, 1, 0, 0, 0, 525, 526, 5, 38, 0, 0, 526, 123, 1, 0, 0, 0, 527, 528, 7, 2, 0, 0, 528, 125, 1, 0, 0, 0, 529, 531, 3, 134, 67, 0, 530, 532, 3, 134, 67, 0, 531, 530, 1, 0, 0, 0, 532, 533, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 538, 1, 0, 0, 0, 535, 538, 3, 124, 62, 0, 536, 538, 3, 134, 67, 0, 537, 529, 1, 0, 0, 0, 537, 535, 1, 0, 0, 0, 537, 536, 1, 0, 0, 0, 538, 127, 1, 0, 0, 0, 539, 541, 3, 130, 65, 0, 540, 542, 3, 130, 65, 0, 541, 540, 1, 0, 0, 0, 542, 543, 1, 0, 0, 0, 543, 541, 1, 0, 0, 0, 543, 544, 1, 0, 0, 0, 544, 548, 1, 0, 0, 0, 545, 548, 3, 124, 62, 0, 546, 548, 3, 130, 65, 0, 547, 539, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 547, 546, 1, 0, 0, 0, 548, 129, 1, 0, 0, 0, 549, 550, 7, 3, 0, 0, 550, 131, 1, 0, 0, 0, 551, 555, 3, 130, 65, 0, 552, 555, 5, 27, 0, 0, 553, 555, 5, 26, 0, 0, 554, 551, 1, 0, 0, 0, 554, 552, 1, 0, 0, 0, 554, 553, 1, 0, 0, 0, 555, 133, 1, 0, 0, 0, 556, 557, 7, 4, 0, 0, 557, 135, 1, 0, 0, 0, 75, 139, 146, 155, 162, 182, 186, 190, 195, 199, 204, 209, 222, 227, 231, 236, 241, 248, 250, 262, 274, 279, 281, 286, 298, 300, 306, 309, 318, 325, 331, 338, 343, 352, 359, 368, 376, 378, 382, 384, 388, 392, 394, 398, 400, 406, 408, 413, 415, 417, 423, 425, 427, 434, 443, 447, 452, 459, 468, 476, 484, 487, 494, 496, 500, 502, 508, 510, 515, 517, 519, 533, 537, 543, 547, 554] \ No newline at end of file diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParser.java b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParser.java index 293ba487d3..e00fef8d04 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParser.java +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParser.java @@ -36,10 +36,11 @@ public class DockerParser extends Parser { EXPOSE=8, ENV=9, ADD=10, COPY=11, ENTRYPOINT=12, VOLUME=13, USER=14, WORKDIR=15, ARG=16, ONBUILD=17, STOPSIGNAL=18, HEALTHCHECK=19, SHELL=20, MAINTAINER=21, HEREDOC_START=22, LINE_CONTINUATION=23, LBRACKET=24, RBRACKET=25, COMMA=26, - EQUALS=27, FLAG=28, DASH_DASH=29, DOUBLE_QUOTED_STRING=30, SINGLE_QUOTED_STRING=31, - ENV_VAR=32, SPECIAL_VAR=33, COMMAND_SUBST=34, BACKTICK_SUBST=35, DOLLAR=36, - UNQUOTED_TEXT=37, WS=38, NEWLINE=39, COLON=40, AT=41, AS=42, HP_LINE_CONTINUATION=43, - HP_WS=44, HP_COMMENT=45, HP_LINE_COMMENT=46, HEREDOC_CONTENT=47, H_NEWLINE=48; + EQUALS=27, FLAG=28, FROM_FLAG=29, DASH_DASH=30, DOUBLE_QUOTED_STRING=31, + SINGLE_QUOTED_STRING=32, ENV_VAR=33, SPECIAL_VAR=34, COMMAND_SUBST=35, + BACKTICK_SUBST=36, DOLLAR=37, UNQUOTED_TEXT=38, WS=39, NEWLINE=40, COLON=41, + AT=42, AS=43, FLAG_END=44, HP_LINE_CONTINUATION=45, HP_WS=46, HP_COMMENT=47, + HP_LINE_COMMENT=48, HEREDOC_CONTENT=49, H_NEWLINE=50; public static final int RULE_dockerfile = 0, RULE_parserDirective = 1, RULE_globalArgs = 2, RULE_stage = 3, RULE_stageInstruction = 4, RULE_instruction = 5, RULE_fromInstruction = 6, @@ -49,17 +50,17 @@ public class DockerParser extends Parser { RULE_userInstruction = 16, RULE_workdirInstruction = 17, RULE_argInstruction = 18, RULE_onbuildInstruction = 19, RULE_stopsignalInstruction = 20, RULE_healthcheckInstruction = 21, RULE_healthcheckOptions = 22, RULE_healthcheckOption = 23, RULE_shellInstruction = 24, - RULE_maintainerInstruction = 25, RULE_flags = 26, RULE_flag = 27, RULE_execForm = 28, - RULE_shellForm = 29, RULE_shellFormText = 30, RULE_heredoc = 31, RULE_heredocPreamble = 32, - RULE_heredocBody = 33, RULE_heredocContent = 34, RULE_heredocEnd = 35, - RULE_jsonArray = 36, RULE_jsonArrayElements = 37, RULE_jsonString = 38, - RULE_imageReference = 39, RULE_imageName = 40, RULE_tag = 41, RULE_digest = 42, - RULE_stageName = 43, RULE_labelPairs = 44, RULE_labelPair = 45, RULE_labelKey = 46, - RULE_portList = 47, RULE_port = 48, RULE_envPairs = 49, RULE_envPair = 50, - RULE_envKey = 51, RULE_copyPaths = 52, RULE_pathArgument = 53, RULE_path = 54, - RULE_userSpec = 55, RULE_user = 56, RULE_group = 57, RULE_argName = 58, - RULE_argValue = 59, RULE_signal = 60, RULE_quoted = 61, RULE_text = 62, - RULE_value = 63, RULE_valueElement = 64, RULE_pathElement = 65, RULE_textElement = 66; + RULE_maintainerInstruction = 25, RULE_flags = 26, RULE_flag = 27, RULE_fromFlag = 28, + RULE_execForm = 29, RULE_shellForm = 30, RULE_shellFormText = 31, RULE_heredoc = 32, + RULE_heredocPreamble = 33, RULE_heredocBody = 34, RULE_heredocContent = 35, + RULE_heredocEnd = 36, RULE_jsonArray = 37, RULE_jsonArrayElements = 38, + RULE_jsonString = 39, RULE_imageReference = 40, RULE_imageName = 41, RULE_tag = 42, + RULE_digest = 43, RULE_stageName = 44, RULE_labelPairs = 45, RULE_labelPair = 46, + RULE_labelKey = 47, RULE_portList = 48, RULE_port = 49, RULE_envPairs = 50, + RULE_envPair = 51, RULE_envKey = 52, RULE_copyPaths = 53, RULE_pathArgument = 54, + RULE_path = 55, RULE_userSpec = 56, RULE_user = 57, RULE_group = 58, RULE_argName = 59, + RULE_argValue = 60, RULE_signal = 61, RULE_quoted = 62, RULE_text = 63, + RULE_value = 64, RULE_valueElement = 65, RULE_pathElement = 66, RULE_textElement = 67; private static String[] makeRuleNames() { return new String[] { "dockerfile", "parserDirective", "globalArgs", "stage", "stageInstruction", @@ -68,14 +69,14 @@ private static String[] makeRuleNames() { "copyInstruction", "entrypointInstruction", "volumeInstruction", "userInstruction", "workdirInstruction", "argInstruction", "onbuildInstruction", "stopsignalInstruction", "healthcheckInstruction", "healthcheckOptions", "healthcheckOption", - "shellInstruction", "maintainerInstruction", "flags", "flag", "execForm", - "shellForm", "shellFormText", "heredoc", "heredocPreamble", "heredocBody", - "heredocContent", "heredocEnd", "jsonArray", "jsonArrayElements", "jsonString", - "imageReference", "imageName", "tag", "digest", "stageName", "labelPairs", - "labelPair", "labelKey", "portList", "port", "envPairs", "envPair", "envKey", - "copyPaths", "pathArgument", "path", "userSpec", "user", "group", "argName", - "argValue", "signal", "quoted", "text", "value", "valueElement", "pathElement", - "textElement" + "shellInstruction", "maintainerInstruction", "flags", "flag", "fromFlag", + "execForm", "shellForm", "shellFormText", "heredoc", "heredocPreamble", + "heredocBody", "heredocContent", "heredocEnd", "jsonArray", "jsonArrayElements", + "jsonString", "imageReference", "imageName", "tag", "digest", "stageName", + "labelPairs", "labelPair", "labelKey", "portList", "port", "envPairs", + "envPair", "envKey", "copyPaths", "pathArgument", "path", "userSpec", + "user", "group", "argName", "argValue", "signal", "quoted", "text", "value", + "valueElement", "pathElement", "textElement" }; } public static final String[] ruleNames = makeRuleNames(); @@ -85,9 +86,9 @@ private static String[] makeLiteralNames() { null, null, null, "'FROM'", "'RUN'", "'CMD'", "'NONE'", "'LABEL'", "'EXPOSE'", "'ENV'", "'ADD'", "'COPY'", "'ENTRYPOINT'", "'VOLUME'", "'USER'", "'WORKDIR'", "'ARG'", "'ONBUILD'", "'STOPSIGNAL'", "'HEALTHCHECK'", "'SHELL'", "'MAINTAINER'", - null, null, "'['", "']'", "','", "'='", null, "'--'", null, null, null, - null, null, null, null, null, null, null, null, "'@'", "'AS'", null, - null, null, null, null, "'\\n'" + null, null, "'['", "']'", "','", "'='", null, null, "'--'", null, null, + null, null, null, null, null, null, null, null, null, null, "'AS'", null, + null, null, null, null, null, "'\\n'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -97,9 +98,9 @@ private static String[] makeSymbolicNames() { "EXPOSE", "ENV", "ADD", "COPY", "ENTRYPOINT", "VOLUME", "USER", "WORKDIR", "ARG", "ONBUILD", "STOPSIGNAL", "HEALTHCHECK", "SHELL", "MAINTAINER", "HEREDOC_START", "LINE_CONTINUATION", "LBRACKET", "RBRACKET", "COMMA", - "EQUALS", "FLAG", "DASH_DASH", "DOUBLE_QUOTED_STRING", "SINGLE_QUOTED_STRING", + "EQUALS", "FLAG", "FROM_FLAG", "DASH_DASH", "DOUBLE_QUOTED_STRING", "SINGLE_QUOTED_STRING", "ENV_VAR", "SPECIAL_VAR", "COMMAND_SUBST", "BACKTICK_SUBST", "DOLLAR", - "UNQUOTED_TEXT", "WS", "NEWLINE", "COLON", "AT", "AS", "HP_LINE_CONTINUATION", + "UNQUOTED_TEXT", "WS", "NEWLINE", "COLON", "AT", "AS", "FLAG_END", "HP_LINE_CONTINUATION", "HP_WS", "HP_COMMENT", "HP_LINE_COMMENT", "HEREDOC_CONTENT", "H_NEWLINE" }; } @@ -209,37 +210,37 @@ public final DockerfileContext dockerfile() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(137); + setState(139); _errHandler.sync(this); _la = _input.LA(1); while (_la==PARSER_DIRECTIVE) { { { - setState(134); + setState(136); parserDirective(); } } - setState(139); + setState(141); _errHandler.sync(this); _la = _input.LA(1); } - setState(140); - globalArgs(); setState(142); + globalArgs(); + setState(144); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(141); + setState(143); stage(); } } - setState(144); + setState(146); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==FROM ); - setState(146); + setState(148); match(EOF); } } @@ -282,7 +283,7 @@ public final ParserDirectiveContext parserDirective() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(148); + setState(150); match(PARSER_DIRECTIVE); } } @@ -331,17 +332,17 @@ public final GlobalArgsContext globalArgs() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(153); + setState(155); _errHandler.sync(this); _la = _input.LA(1); while (_la==ARG) { { { - setState(150); + setState(152); argInstruction(); } } - setState(155); + setState(157); _errHandler.sync(this); _la = _input.LA(1); } @@ -395,19 +396,19 @@ public final StageContext stage() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(156); + setState(158); fromInstruction(); - setState(160); + setState(162); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4194224L) != 0)) { { { - setState(157); + setState(159); stageInstruction(); } } - setState(162); + setState(164); _errHandler.sync(this); _la = _input.LA(1); } @@ -500,125 +501,125 @@ public final StageInstructionContext stageInstruction() throws RecognitionExcept StageInstructionContext _localctx = new StageInstructionContext(_ctx, getState()); enterRule(_localctx, 8, RULE_stageInstruction); try { - setState(180); + setState(182); _errHandler.sync(this); switch (_input.LA(1)) { case RUN: enterOuterAlt(_localctx, 1); { - setState(163); + setState(165); runInstruction(); } break; case CMD: enterOuterAlt(_localctx, 2); { - setState(164); + setState(166); cmdInstruction(); } break; case LABEL: enterOuterAlt(_localctx, 3); { - setState(165); + setState(167); labelInstruction(); } break; case EXPOSE: enterOuterAlt(_localctx, 4); { - setState(166); + setState(168); exposeInstruction(); } break; case ENV: enterOuterAlt(_localctx, 5); { - setState(167); + setState(169); envInstruction(); } break; case ADD: enterOuterAlt(_localctx, 6); { - setState(168); + setState(170); addInstruction(); } break; case COPY: enterOuterAlt(_localctx, 7); { - setState(169); + setState(171); copyInstruction(); } break; case ENTRYPOINT: enterOuterAlt(_localctx, 8); { - setState(170); + setState(172); entrypointInstruction(); } break; case VOLUME: enterOuterAlt(_localctx, 9); { - setState(171); + setState(173); volumeInstruction(); } break; case USER: enterOuterAlt(_localctx, 10); { - setState(172); + setState(174); userInstruction(); } break; case WORKDIR: enterOuterAlt(_localctx, 11); { - setState(173); + setState(175); workdirInstruction(); } break; case ARG: enterOuterAlt(_localctx, 12); { - setState(174); + setState(176); argInstruction(); } break; case ONBUILD: enterOuterAlt(_localctx, 13); { - setState(175); + setState(177); onbuildInstruction(); } break; case STOPSIGNAL: enterOuterAlt(_localctx, 14); { - setState(176); + setState(178); stopsignalInstruction(); } break; case HEALTHCHECK: enterOuterAlt(_localctx, 15); { - setState(177); + setState(179); healthcheckInstruction(); } break; case SHELL: enterOuterAlt(_localctx, 16); { - setState(178); + setState(180); shellInstruction(); } break; case MAINTAINER: enterOuterAlt(_localctx, 17); { - setState(179); + setState(181); maintainerInstruction(); } break; @@ -668,13 +669,13 @@ public final InstructionContext instruction() throws RecognitionException { InstructionContext _localctx = new InstructionContext(_ctx, getState()); enterRule(_localctx, 10, RULE_instruction); try { - setState(184); + setState(186); _errHandler.sync(this); switch (_input.LA(1)) { case FROM: enterOuterAlt(_localctx, 1); { - setState(182); + setState(184); fromInstruction(); } break; @@ -697,7 +698,7 @@ public final InstructionContext instruction() throws RecognitionException { case MAINTAINER: enterOuterAlt(_localctx, 2); { - setState(183); + setState(185); stageInstruction(); } break; @@ -755,28 +756,28 @@ public final FromInstructionContext fromInstruction() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(186); - match(FROM); setState(188); + match(FROM); + setState(190); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { case 1: { - setState(187); + setState(189); flags(); } break; } - setState(190); + setState(192); imageReference(); - setState(193); + setState(195); _errHandler.sync(this); _la = _input.LA(1); if (_la==AS) { { - setState(191); + setState(193); match(AS); - setState(192); + setState(194); stageName(); } } @@ -834,36 +835,36 @@ public final RunInstructionContext runInstruction() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(195); - match(RUN); setState(197); + match(RUN); + setState(199); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) { case 1: { - setState(196); + setState(198); flags(); } break; } - setState(202); + setState(204); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) { case 1: { - setState(199); + setState(201); execForm(); } break; case 2: { - setState(200); + setState(202); shellForm(); } break; case 3: { - setState(201); + setState(203); heredoc(); } break; @@ -915,20 +916,20 @@ public final CmdInstructionContext cmdInstruction() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(204); + setState(206); match(CMD); - setState(207); + setState(209); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { case 1: { - setState(205); + setState(207); execForm(); } break; case 2: { - setState(206); + setState(208); shellForm(); } break; @@ -977,9 +978,9 @@ public final LabelInstructionContext labelInstruction() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(209); + setState(211); match(LABEL); - setState(210); + setState(212); labelPairs(); } } @@ -1025,9 +1026,9 @@ public final ExposeInstructionContext exposeInstruction() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(212); + setState(214); match(EXPOSE); - setState(213); + setState(215); portList(); } } @@ -1073,9 +1074,9 @@ public final EnvInstructionContext envInstruction() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(215); + setState(217); match(ENV); - setState(216); + setState(218); envPairs(); } } @@ -1131,30 +1132,30 @@ public final AddInstructionContext addInstruction() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(218); - match(ADD); setState(220); + match(ADD); + setState(222); _errHandler.sync(this); _la = _input.LA(1); - if (_la==FLAG) { + if (_la==FLAG || _la==FROM_FLAG) { { - setState(219); + setState(221); flags(); } } - setState(225); + setState(227); _errHandler.sync(this); switch (_input.LA(1)) { case HEREDOC_START: { - setState(222); + setState(224); heredoc(); } break; case LBRACKET: { - setState(223); + setState(225); jsonArray(); } break; @@ -1169,7 +1170,7 @@ public final AddInstructionContext addInstruction() throws RecognitionException case DOLLAR: case UNQUOTED_TEXT: { - setState(224); + setState(226); copyPaths(); } break; @@ -1230,30 +1231,30 @@ public final CopyInstructionContext copyInstruction() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(227); - match(COPY); setState(229); + match(COPY); + setState(231); _errHandler.sync(this); _la = _input.LA(1); - if (_la==FLAG) { + if (_la==FLAG || _la==FROM_FLAG) { { - setState(228); + setState(230); flags(); } } - setState(234); + setState(236); _errHandler.sync(this); switch (_input.LA(1)) { case HEREDOC_START: { - setState(231); + setState(233); heredoc(); } break; case LBRACKET: { - setState(232); + setState(234); jsonArray(); } break; @@ -1268,7 +1269,7 @@ public final CopyInstructionContext copyInstruction() throws RecognitionExceptio case DOLLAR: case UNQUOTED_TEXT: { - setState(233); + setState(235); copyPaths(); } break; @@ -1322,20 +1323,20 @@ public final EntrypointInstructionContext entrypointInstruction() throws Recogni try { enterOuterAlt(_localctx, 1); { - setState(236); + setState(238); match(ENTRYPOINT); - setState(239); + setState(241); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(237); + setState(239); execForm(); } break; case 2: { - setState(238); + setState(240); shellForm(); } break; @@ -1391,14 +1392,14 @@ public final VolumeInstructionContext volumeInstruction() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(241); + setState(243); match(VOLUME); - setState(248); + setState(250); _errHandler.sync(this); switch (_input.LA(1)) { case LBRACKET: { - setState(242); + setState(244); jsonArray(); } break; @@ -1413,20 +1414,20 @@ public final VolumeInstructionContext volumeInstruction() throws RecognitionExce case DOLLAR: case UNQUOTED_TEXT: { - setState(244); + setState(246); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(243); + setState(245); pathArgument(); } } - setState(246); + setState(248); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 274005491712L) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 547809656832L) != 0) ); } break; default: @@ -1476,9 +1477,9 @@ public final UserInstructionContext userInstruction() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(250); + setState(252); match(USER); - setState(251); + setState(253); userSpec(); } } @@ -1524,9 +1525,9 @@ public final WorkdirInstructionContext workdirInstruction() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(253); + setState(255); match(WORKDIR); - setState(254); + setState(256); path(); } } @@ -1577,18 +1578,18 @@ public final ArgInstructionContext argInstruction() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(256); + setState(258); match(ARG); - setState(257); + setState(259); argName(); - setState(260); + setState(262); _errHandler.sync(this); _la = _input.LA(1); if (_la==EQUALS) { { - setState(258); + setState(260); match(EQUALS); - setState(259); + setState(261); argValue(); } } @@ -1637,9 +1638,9 @@ public final OnbuildInstructionContext onbuildInstruction() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(262); + setState(264); match(ONBUILD); - setState(263); + setState(265); instruction(); } } @@ -1685,9 +1686,9 @@ public final StopsignalInstructionContext stopsignalInstruction() throws Recogni try { enterOuterAlt(_localctx, 1); { - setState(265); + setState(267); match(STOPSIGNAL); - setState(266); + setState(268); signal(); } } @@ -1740,47 +1741,47 @@ public final HealthcheckInstructionContext healthcheckInstruction() throws Recog enterRule(_localctx, 42, RULE_healthcheckInstruction); int _la; try { - setState(279); + setState(281); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(268); + setState(270); match(HEALTHCHECK); - setState(269); + setState(271); match(NONE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(270); - match(HEALTHCHECK); setState(272); + match(HEALTHCHECK); + setState(274); _errHandler.sync(this); _la = _input.LA(1); if (_la==FLAG) { { - setState(271); + setState(273); healthcheckOptions(); } } - setState(274); + setState(276); match(CMD); - setState(277); + setState(279); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { case 1: { - setState(275); + setState(277); execForm(); } break; case 2: { - setState(276); + setState(278); shellForm(); } break; @@ -1834,17 +1835,17 @@ public final HealthcheckOptionsContext healthcheckOptions() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(282); + setState(284); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(281); + setState(283); healthcheckOption(); } } - setState(284); + setState(286); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==FLAG ); @@ -1889,7 +1890,7 @@ public final HealthcheckOptionContext healthcheckOption() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(286); + setState(288); match(FLAG); } } @@ -1935,9 +1936,9 @@ public final ShellInstructionContext shellInstruction() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(288); + setState(290); match(SHELL); - setState(289); + setState(291); jsonArray(); } } @@ -1983,9 +1984,9 @@ public final MaintainerInstructionContext maintainerInstruction() throws Recogni try { enterOuterAlt(_localctx, 1); { - setState(291); + setState(293); match(MAINTAINER); - setState(292); + setState(294); text(); } } @@ -2008,6 +2009,12 @@ public List flag() { public FlagContext flag(int i) { return getRuleContext(FlagContext.class,i); } + public List fromFlag() { + return getRuleContexts(FromFlagContext.class); + } + public FromFlagContext fromFlag(int i) { + return getRuleContext(FromFlagContext.class,i); + } public FlagsContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -2034,25 +2041,39 @@ public final FlagsContext flags() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(295); + setState(298); _errHandler.sync(this); _alt = 1; do { switch (_alt) { case 1: { - { - setState(294); - flag(); + setState(298); + _errHandler.sync(this); + switch (_input.LA(1)) { + case FLAG: + { + setState(296); + flag(); + } + break; + case FROM_FLAG: + { + setState(297); + fromFlag(); + } + break; + default: + throw new NoViableAltException(this); } } break; default: throw new NoViableAltException(this); } - setState(297); + setState(300); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,23,_ctx); + _alt = getInterpreter().adaptivePredict(_input,24,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -2095,7 +2116,7 @@ public final FlagContext flag() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(299); + setState(302); match(FLAG); } } @@ -2110,6 +2131,74 @@ public final FlagContext flag() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class FromFlagContext extends ParserRuleContext { + public TerminalNode FROM_FLAG() { return getToken(DockerParser.FROM_FLAG, 0); } + public ImageReferenceContext imageReference() { + return getRuleContext(ImageReferenceContext.class,0); + } + public TerminalNode FLAG_END() { return getToken(DockerParser.FLAG_END, 0); } + public FromFlagContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fromFlag; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DockerParserListener ) ((DockerParserListener)listener).enterFromFlag(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DockerParserListener ) ((DockerParserListener)listener).exitFromFlag(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DockerParserVisitor ) return ((DockerParserVisitor)visitor).visitFromFlag(this); + else return visitor.visitChildren(this); + } + } + + public final FromFlagContext fromFlag() throws RecognitionException { + FromFlagContext _localctx = new FromFlagContext(_ctx, getState()); + enterRule(_localctx, 56, RULE_fromFlag); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(304); + match(FROM_FLAG); + setState(306); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { + case 1: + { + setState(305); + imageReference(); + } + break; + } + setState(309); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FLAG_END) { + { + setState(308); + match(FLAG_END); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + @SuppressWarnings("CheckReturnValue") public static class ExecFormContext extends ParserRuleContext { public JsonArrayContext jsonArray() { @@ -2136,11 +2225,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExecFormContext execForm() throws RecognitionException { ExecFormContext _localctx = new ExecFormContext(_ctx, getState()); - enterRule(_localctx, 56, RULE_execForm); + enterRule(_localctx, 58, RULE_execForm); try { enterOuterAlt(_localctx, 1); { - setState(301); + setState(311); jsonArray(); } } @@ -2181,11 +2270,11 @@ public T accept(ParseTreeVisitor visitor) { public final ShellFormContext shellForm() throws RecognitionException { ShellFormContext _localctx = new ShellFormContext(_ctx, getState()); - enterRule(_localctx, 58, RULE_shellForm); + enterRule(_localctx, 60, RULE_shellForm); try { enterOuterAlt(_localctx, 1); { - setState(303); + setState(313); shellFormText(); } } @@ -2229,25 +2318,25 @@ public T accept(ParseTreeVisitor visitor) { public final ShellFormTextContext shellFormText() throws RecognitionException { ShellFormTextContext _localctx = new ShellFormTextContext(_ctx, getState()); - enterRule(_localctx, 60, RULE_shellFormText); + enterRule(_localctx, 62, RULE_shellFormText); int _la; try { enterOuterAlt(_localctx, 1); { - setState(306); + setState(316); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(305); + setState(315); textElement(); } } - setState(308); + setState(318); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 274861129728L) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 549202165760L) != 0) ); } } catch (RecognitionException re) { @@ -2294,29 +2383,29 @@ public T accept(ParseTreeVisitor visitor) { public final HeredocContext heredoc() throws RecognitionException { HeredocContext _localctx = new HeredocContext(_ctx, getState()); - enterRule(_localctx, 62, RULE_heredoc); + enterRule(_localctx, 64, RULE_heredoc); int _la; try { enterOuterAlt(_localctx, 1); { - setState(310); + setState(320); heredocPreamble(); - setState(311); + setState(321); match(NEWLINE); - setState(313); + setState(323); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(312); + setState(322); heredocBody(); } } - setState(315); + setState(325); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 141424683122688L) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 564324342956032L) != 0) ); } } catch (RecognitionException re) { @@ -2363,52 +2452,52 @@ public T accept(ParseTreeVisitor visitor) { public final HeredocPreambleContext heredocPreamble() throws RecognitionException { HeredocPreambleContext _localctx = new HeredocPreambleContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_heredocPreamble); + enterRule(_localctx, 66, RULE_heredocPreamble); int _la; try { enterOuterAlt(_localctx, 1); { - setState(317); + setState(327); match(HEREDOC_START); - setState(321); + setState(331); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 274861129728L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 549202165760L) != 0)) { { { - setState(318); + setState(328); textElement(); } } - setState(323); + setState(333); _errHandler.sync(this); _la = _input.LA(1); } - setState(333); + setState(343); _errHandler.sync(this); _la = _input.LA(1); while (_la==HEREDOC_START) { { { - setState(324); + setState(334); match(HEREDOC_START); - setState(328); + setState(338); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 274861129728L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 549202165760L) != 0)) { { { - setState(325); + setState(335); textElement(); } } - setState(330); + setState(340); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(335); + setState(345); _errHandler.sync(this); _la = _input.LA(1); } @@ -2454,13 +2543,13 @@ public T accept(ParseTreeVisitor visitor) { public final HeredocBodyContext heredocBody() throws RecognitionException { HeredocBodyContext _localctx = new HeredocBodyContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_heredocBody); + enterRule(_localctx, 68, RULE_heredocBody); try { enterOuterAlt(_localctx, 1); { - setState(336); + setState(346); heredocContent(); - setState(337); + setState(347); heredocEnd(); } } @@ -2506,18 +2595,18 @@ public T accept(ParseTreeVisitor visitor) { public final HeredocContentContext heredocContent() throws RecognitionException { HeredocContentContext _localctx = new HeredocContentContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_heredocContent); + enterRule(_localctx, 70, RULE_heredocContent); int _la; try { enterOuterAlt(_localctx, 1); { - setState(342); + setState(352); _errHandler.sync(this); _la = _input.LA(1); while (_la==NEWLINE || _la==HEREDOC_CONTENT) { { { - setState(339); + setState(349); _la = _input.LA(1); if ( !(_la==NEWLINE || _la==HEREDOC_CONTENT) ) { _errHandler.recoverInline(this); @@ -2529,7 +2618,7 @@ public final HeredocContentContext heredocContent() throws RecognitionException } } } - setState(344); + setState(354); _errHandler.sync(this); _la = _input.LA(1); } @@ -2570,11 +2659,11 @@ public T accept(ParseTreeVisitor visitor) { public final HeredocEndContext heredocEnd() throws RecognitionException { HeredocEndContext _localctx = new HeredocEndContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_heredocEnd); + enterRule(_localctx, 72, RULE_heredocEnd); try { enterOuterAlt(_localctx, 1); { - setState(345); + setState(355); match(UNQUOTED_TEXT); } } @@ -2617,24 +2706,24 @@ public T accept(ParseTreeVisitor visitor) { public final JsonArrayContext jsonArray() throws RecognitionException { JsonArrayContext _localctx = new JsonArrayContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_jsonArray); + enterRule(_localctx, 74, RULE_jsonArray); int _la; try { enterOuterAlt(_localctx, 1); { - setState(347); + setState(357); match(LBRACKET); - setState(349); + setState(359); _errHandler.sync(this); _la = _input.LA(1); if (_la==DOUBLE_QUOTED_STRING) { { - setState(348); + setState(358); jsonArrayElements(); } } - setState(351); + setState(361); match(RBRACKET); } } @@ -2682,26 +2771,26 @@ public T accept(ParseTreeVisitor visitor) { public final JsonArrayElementsContext jsonArrayElements() throws RecognitionException { JsonArrayElementsContext _localctx = new JsonArrayElementsContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_jsonArrayElements); + enterRule(_localctx, 76, RULE_jsonArrayElements); int _la; try { enterOuterAlt(_localctx, 1); { - setState(353); + setState(363); jsonString(); - setState(358); + setState(368); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(354); + setState(364); match(COMMA); - setState(355); + setState(365); jsonString(); } } - setState(360); + setState(370); _errHandler.sync(this); _la = _input.LA(1); } @@ -2742,11 +2831,11 @@ public T accept(ParseTreeVisitor visitor) { public final JsonStringContext jsonString() throws RecognitionException { JsonStringContext _localctx = new JsonStringContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_jsonString); + enterRule(_localctx, 78, RULE_jsonString); try { enterOuterAlt(_localctx, 1); { - setState(361); + setState(371); match(DOUBLE_QUOTED_STRING); } } @@ -2795,10 +2884,9 @@ public T accept(ParseTreeVisitor visitor) { public final ImageReferenceContext imageReference() throws RecognitionException { ImageReferenceContext _localctx = new ImageReferenceContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_imageReference); - int _la; + enterRule(_localctx, 80, RULE_imageReference); try { - setState(390); + setState(400); _errHandler.sync(this); switch (_input.LA(1)) { case LBRACKET: @@ -2817,102 +2905,102 @@ public final ImageReferenceContext imageReference() throws RecognitionException case UNQUOTED_TEXT: enterOuterAlt(_localctx, 1); { - setState(363); + setState(373); imageName(); - setState(368); + setState(378); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==COLON) { + switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { + case 1: { - setState(364); + setState(374); match(COLON); - setState(366); + setState(376); _errHandler.sync(this); - _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1374372757504L) != 0)) { + switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { + case 1: { - setState(365); + setState(375); tag(); } + break; } - } + break; } - - setState(374); + setState(384); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==AT) { + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + case 1: { - setState(370); + setState(380); match(AT); - setState(372); + setState(382); _errHandler.sync(this); - _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3573396013056L) != 0)) { + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + case 1: { - setState(371); + setState(381); digest(); } + break; } - } + break; } - } break; case COLON: enterOuterAlt(_localctx, 2); { - setState(376); + setState(386); match(COLON); - setState(378); + setState(388); _errHandler.sync(this); - _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1374372757504L) != 0)) { + switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { + case 1: { - setState(377); + setState(387); tag(); } + break; } - - setState(384); + setState(394); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==AT) { + switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { + case 1: { - setState(380); + setState(390); match(AT); - setState(382); + setState(392); _errHandler.sync(this); - _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3573396013056L) != 0)) { + switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { + case 1: { - setState(381); + setState(391); digest(); } + break; } - } + break; } - } break; case AT: enterOuterAlt(_localctx, 3); { - setState(386); + setState(396); match(AT); - setState(388); + setState(398); _errHandler.sync(this); - _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3573396013056L) != 0)) { + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + case 1: { - setState(387); + setState(397); digest(); } + break; } - } break; default: @@ -2962,36 +3050,42 @@ public T accept(ParseTreeVisitor visitor) { public final ImageNameContext imageName() throws RecognitionException { ImageNameContext _localctx = new ImageNameContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_imageName); - int _la; + enterRule(_localctx, 82, RULE_imageName); try { - setState(398); + int _alt; + setState(408); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(392); + setState(402); quoted(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(394); + setState(404); _errHandler.sync(this); - _la = _input.LA(1); + _alt = 1; do { - { - { - setState(393); - textElement(); - } + switch (_alt) { + case 1: + { + { + setState(403); + textElement(); + } + } + break; + default: + throw new NoViableAltException(this); } - setState(396); + setState(406); _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 274861129728L) != 0) ); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } break; } @@ -3043,63 +3137,69 @@ public T accept(ParseTreeVisitor visitor) { public final TagContext tag() throws RecognitionException { TagContext _localctx = new TagContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_tag); - int _la; + enterRule(_localctx, 84, RULE_tag); try { - setState(407); + int _alt; + setState(417); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(400); + setState(410); quoted(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(403); + setState(413); _errHandler.sync(this); - _la = _input.LA(1); + _alt = 1; do { - { - setState(403); - _errHandler.sync(this); - switch (_input.LA(1)) { - case LBRACKET: - case RBRACKET: - case COMMA: - case EQUALS: - case FLAG: - case DASH_DASH: - case DOUBLE_QUOTED_STRING: - case SINGLE_QUOTED_STRING: - case ENV_VAR: - case SPECIAL_VAR: - case COMMAND_SUBST: - case BACKTICK_SUBST: - case DOLLAR: - case UNQUOTED_TEXT: + switch (_alt) { + case 1: { - setState(401); - textElement(); + setState(413); + _errHandler.sync(this); + switch (_input.LA(1)) { + case LBRACKET: + case RBRACKET: + case COMMA: + case EQUALS: + case FLAG: + case DASH_DASH: + case DOUBLE_QUOTED_STRING: + case SINGLE_QUOTED_STRING: + case ENV_VAR: + case SPECIAL_VAR: + case COMMAND_SUBST: + case BACKTICK_SUBST: + case DOLLAR: + case UNQUOTED_TEXT: + { + setState(411); + textElement(); + } + break; + case COLON: + { + setState(412); + match(COLON); + } + break; + default: + throw new NoViableAltException(this); } - break; - case COLON: - { - setState(402); - match(COLON); } break; default: throw new NoViableAltException(this); } - } - setState(405); + setState(415); _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 1374372757504L) != 0) ); + _alt = getInterpreter().adaptivePredict(_input,47,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } break; } @@ -3155,69 +3255,75 @@ public T accept(ParseTreeVisitor visitor) { public final DigestContext digest() throws RecognitionException { DigestContext _localctx = new DigestContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_digest); - int _la; + enterRule(_localctx, 86, RULE_digest); try { - setState(417); + int _alt; + setState(427); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(409); + setState(419); quoted(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(413); + setState(423); _errHandler.sync(this); - _la = _input.LA(1); + _alt = 1; do { - { - setState(413); - _errHandler.sync(this); - switch (_input.LA(1)) { - case LBRACKET: - case RBRACKET: - case COMMA: - case EQUALS: - case FLAG: - case DASH_DASH: - case DOUBLE_QUOTED_STRING: - case SINGLE_QUOTED_STRING: - case ENV_VAR: - case SPECIAL_VAR: - case COMMAND_SUBST: - case BACKTICK_SUBST: - case DOLLAR: - case UNQUOTED_TEXT: - { - setState(410); - textElement(); - } - break; - case COLON: + switch (_alt) { + case 1: { - setState(411); - match(COLON); + setState(423); + _errHandler.sync(this); + switch (_input.LA(1)) { + case LBRACKET: + case RBRACKET: + case COMMA: + case EQUALS: + case FLAG: + case DASH_DASH: + case DOUBLE_QUOTED_STRING: + case SINGLE_QUOTED_STRING: + case ENV_VAR: + case SPECIAL_VAR: + case COMMAND_SUBST: + case BACKTICK_SUBST: + case DOLLAR: + case UNQUOTED_TEXT: + { + setState(420); + textElement(); + } + break; + case COLON: + { + setState(421); + match(COLON); + } + break; + case AT: + { + setState(422); + match(AT); + } + break; + default: + throw new NoViableAltException(this); } - break; - case AT: - { - setState(412); - match(AT); } break; default: throw new NoViableAltException(this); } - } - setState(415); + setState(425); _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 3573396013056L) != 0) ); + _alt = getInterpreter().adaptivePredict(_input,50,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } break; } @@ -3257,11 +3363,11 @@ public T accept(ParseTreeVisitor visitor) { public final StageNameContext stageName() throws RecognitionException { StageNameContext _localctx = new StageNameContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_stageName); + enterRule(_localctx, 88, RULE_stageName); try { enterOuterAlt(_localctx, 1); { - setState(419); + setState(429); match(UNQUOTED_TEXT); } } @@ -3305,25 +3411,25 @@ public T accept(ParseTreeVisitor visitor) { public final LabelPairsContext labelPairs() throws RecognitionException { LabelPairsContext _localctx = new LabelPairsContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_labelPairs); + enterRule(_localctx, 90, RULE_labelPairs); int _la; try { enterOuterAlt(_localctx, 1); { - setState(422); + setState(432); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(421); + setState(431); labelPair(); } } - setState(424); + setState(434); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 140660178944L) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 281320357888L) != 0) ); } } catch (RecognitionException re) { @@ -3370,28 +3476,28 @@ public T accept(ParseTreeVisitor visitor) { public final LabelPairContext labelPair() throws RecognitionException { LabelPairContext _localctx = new LabelPairContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_labelPair); + enterRule(_localctx, 92, RULE_labelPair); try { - setState(433); + setState(443); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(426); + setState(436); labelKey(); - setState(427); + setState(437); match(EQUALS); - setState(428); + setState(438); value(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(430); + setState(440); labelKey(); - setState(431); + setState(441); text(); } break; @@ -3435,23 +3541,23 @@ public T accept(ParseTreeVisitor visitor) { public final LabelKeyContext labelKey() throws RecognitionException { LabelKeyContext _localctx = new LabelKeyContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_labelKey); + enterRule(_localctx, 94, RULE_labelKey); try { - setState(437); + setState(447); _errHandler.sync(this); switch (_input.LA(1)) { case DOUBLE_QUOTED_STRING: case SINGLE_QUOTED_STRING: enterOuterAlt(_localctx, 1); { - setState(435); + setState(445); quoted(); } break; case UNQUOTED_TEXT: enterOuterAlt(_localctx, 2); { - setState(436); + setState(446); match(UNQUOTED_TEXT); } break; @@ -3499,25 +3605,25 @@ public T accept(ParseTreeVisitor visitor) { public final PortListContext portList() throws RecognitionException { PortListContext _localctx = new PortListContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_portList); + enterRule(_localctx, 96, RULE_portList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(440); + setState(450); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(439); + setState(449); port(); } } - setState(442); + setState(452); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 201863462912L) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 403726925824L) != 0) ); } } catch (RecognitionException re) { @@ -3559,14 +3665,14 @@ public T accept(ParseTreeVisitor visitor) { public final PortContext port() throws RecognitionException { PortContext _localctx = new PortContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_port); + enterRule(_localctx, 98, RULE_port); int _la; try { enterOuterAlt(_localctx, 1); { - setState(444); + setState(454); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 201863462912L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 403726925824L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -3616,22 +3722,22 @@ public T accept(ParseTreeVisitor visitor) { public final EnvPairsContext envPairs() throws RecognitionException { EnvPairsContext _localctx = new EnvPairsContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_envPairs); + enterRule(_localctx, 100, RULE_envPairs); int _la; try { enterOuterAlt(_localctx, 1); { - setState(447); + setState(457); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(446); + setState(456); envPair(); } } - setState(449); + setState(459); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==UNQUOTED_TEXT ); @@ -3681,28 +3787,28 @@ public T accept(ParseTreeVisitor visitor) { public final EnvPairContext envPair() throws RecognitionException { EnvPairContext _localctx = new EnvPairContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_envPair); + enterRule(_localctx, 102, RULE_envPair); try { - setState(458); + setState(468); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(451); + setState(461); envKey(); - setState(452); + setState(462); match(EQUALS); - setState(453); + setState(463); value(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(455); + setState(465); envKey(); - setState(456); + setState(466); text(); } break; @@ -3743,11 +3849,11 @@ public T accept(ParseTreeVisitor visitor) { public final EnvKeyContext envKey() throws RecognitionException { EnvKeyContext _localctx = new EnvKeyContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_envKey); + enterRule(_localctx, 104, RULE_envKey); try { enterOuterAlt(_localctx, 1); { - setState(460); + setState(470); match(UNQUOTED_TEXT); } } @@ -3791,27 +3897,27 @@ public T accept(ParseTreeVisitor visitor) { public final CopyPathsContext copyPaths() throws RecognitionException { CopyPathsContext _localctx = new CopyPathsContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_copyPaths); + enterRule(_localctx, 106, RULE_copyPaths); int _la; try { enterOuterAlt(_localctx, 1); { - setState(462); + setState(472); pathArgument(); - setState(464); + setState(474); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(463); + setState(473); pathArgument(); } } - setState(466); + setState(476); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 274005491712L) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 547809656832L) != 0) ); } } catch (RecognitionException re) { @@ -3857,41 +3963,41 @@ public T accept(ParseTreeVisitor visitor) { public final PathArgumentContext pathArgument() throws RecognitionException { PathArgumentContext _localctx = new PathArgumentContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_pathArgument); + enterRule(_localctx, 108, RULE_pathArgument); try { int _alt; - setState(477); + setState(487); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(468); + setState(478); quoted(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(469); + setState(479); pathElement(); - setState(474); + setState(484); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,56,_ctx); + _alt = getInterpreter().adaptivePredict(_input,59,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(470); + setState(480); if (!(adjacent())) throw new FailedPredicateException(this, "adjacent()"); - setState(471); + setState(481); pathElement(); } } } - setState(476); + setState(486); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,56,_ctx); + _alt = getInterpreter().adaptivePredict(_input,59,_ctx); } } break; @@ -3934,11 +4040,11 @@ public T accept(ParseTreeVisitor visitor) { public final PathContext path() throws RecognitionException { PathContext _localctx = new PathContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_path); + enterRule(_localctx, 110, RULE_path); try { enterOuterAlt(_localctx, 1); { - setState(479); + setState(489); text(); } } @@ -3983,10 +4089,10 @@ public T accept(ParseTreeVisitor visitor) { public final UserSpecContext userSpec() throws RecognitionException { UserSpecContext _localctx = new UserSpecContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_userSpec); + enterRule(_localctx, 112, RULE_userSpec); int _la; try { - setState(492); + setState(502); _errHandler.sync(this); switch (_input.LA(1)) { case LBRACKET: @@ -4005,21 +4111,21 @@ public final UserSpecContext userSpec() throws RecognitionException { case UNQUOTED_TEXT: enterOuterAlt(_localctx, 1); { - setState(481); + setState(491); user(); - setState(486); + setState(496); _errHandler.sync(this); _la = _input.LA(1); if (_la==COLON) { { - setState(482); + setState(492); match(COLON); - setState(484); + setState(494); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1374372757504L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2748225421312L) != 0)) { { - setState(483); + setState(493); group(); } } @@ -4032,14 +4138,14 @@ public final UserSpecContext userSpec() throws RecognitionException { case COLON: enterOuterAlt(_localctx, 2); { - setState(488); + setState(498); match(COLON); - setState(490); + setState(500); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1374372757504L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2748225421312L) != 0)) { { - setState(489); + setState(499); group(); } } @@ -4093,36 +4199,36 @@ public T accept(ParseTreeVisitor visitor) { public final UserContext user() throws RecognitionException { UserContext _localctx = new UserContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_user); + enterRule(_localctx, 114, RULE_user); int _la; try { - setState(500); + setState(510); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(494); + setState(504); quoted(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(496); + setState(506); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(495); + setState(505); textElement(); } } - setState(498); + setState(508); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 274861129728L) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 549202165760L) != 0) ); } break; } @@ -4174,28 +4280,28 @@ public T accept(ParseTreeVisitor visitor) { public final GroupContext group() throws RecognitionException { GroupContext _localctx = new GroupContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_group); + enterRule(_localctx, 116, RULE_group); int _la; try { - setState(509); + setState(519); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(502); + setState(512); quoted(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(505); + setState(515); _errHandler.sync(this); _la = _input.LA(1); do { { - setState(505); + setState(515); _errHandler.sync(this); switch (_input.LA(1)) { case LBRACKET: @@ -4213,13 +4319,13 @@ public final GroupContext group() throws RecognitionException { case DOLLAR: case UNQUOTED_TEXT: { - setState(503); + setState(513); textElement(); } break; case COLON: { - setState(504); + setState(514); match(COLON); } break; @@ -4227,10 +4333,10 @@ public final GroupContext group() throws RecognitionException { throw new NoViableAltException(this); } } - setState(507); + setState(517); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 1374372757504L) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 2748225421312L) != 0) ); } break; } @@ -4270,11 +4376,11 @@ public T accept(ParseTreeVisitor visitor) { public final ArgNameContext argName() throws RecognitionException { ArgNameContext _localctx = new ArgNameContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_argName); + enterRule(_localctx, 118, RULE_argName); try { enterOuterAlt(_localctx, 1); { - setState(511); + setState(521); match(UNQUOTED_TEXT); } } @@ -4315,11 +4421,11 @@ public T accept(ParseTreeVisitor visitor) { public final ArgValueContext argValue() throws RecognitionException { ArgValueContext _localctx = new ArgValueContext(_ctx, getState()); - enterRule(_localctx, 118, RULE_argValue); + enterRule(_localctx, 120, RULE_argValue); try { enterOuterAlt(_localctx, 1); { - setState(513); + setState(523); text(); } } @@ -4358,11 +4464,11 @@ public T accept(ParseTreeVisitor visitor) { public final SignalContext signal() throws RecognitionException { SignalContext _localctx = new SignalContext(_ctx, getState()); - enterRule(_localctx, 120, RULE_signal); + enterRule(_localctx, 122, RULE_signal); try { enterOuterAlt(_localctx, 1); { - setState(515); + setState(525); match(UNQUOTED_TEXT); } } @@ -4402,12 +4508,12 @@ public T accept(ParseTreeVisitor visitor) { public final QuotedContext quoted() throws RecognitionException { QuotedContext _localctx = new QuotedContext(_ctx, getState()); - enterRule(_localctx, 122, RULE_quoted); + enterRule(_localctx, 124, RULE_quoted); int _la; try { enterOuterAlt(_localctx, 1); { - setState(517); + setState(527); _la = _input.LA(1); if ( !(_la==DOUBLE_QUOTED_STRING || _la==SINGLE_QUOTED_STRING) ) { _errHandler.recoverInline(this); @@ -4462,18 +4568,18 @@ public T accept(ParseTreeVisitor visitor) { public final TextContext text() throws RecognitionException { TextContext _localctx = new TextContext(_ctx, getState()); - enterRule(_localctx, 124, RULE_text); + enterRule(_localctx, 126, RULE_text); try { int _alt; - setState(527); + setState(537); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(519); + setState(529); textElement(); - setState(521); + setState(531); _errHandler.sync(this); _alt = 1; do { @@ -4481,7 +4587,7 @@ public final TextContext text() throws RecognitionException { case 1: { { - setState(520); + setState(530); textElement(); } } @@ -4489,23 +4595,23 @@ public final TextContext text() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(523); + setState(533); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,67,_ctx); + _alt = getInterpreter().adaptivePredict(_input,70,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(525); + setState(535); quoted(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(526); + setState(536); textElement(); } break; @@ -4554,18 +4660,18 @@ public T accept(ParseTreeVisitor visitor) { public final ValueContext value() throws RecognitionException { ValueContext _localctx = new ValueContext(_ctx, getState()); - enterRule(_localctx, 126, RULE_value); + enterRule(_localctx, 128, RULE_value); try { int _alt; - setState(537); + setState(547); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(529); + setState(539); valueElement(); - setState(531); + setState(541); _errHandler.sync(this); _alt = 1; do { @@ -4573,7 +4679,7 @@ public final ValueContext value() throws RecognitionException { case 1: { { - setState(530); + setState(540); valueElement(); } } @@ -4581,23 +4687,23 @@ public final ValueContext value() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(533); + setState(543); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,69,_ctx); + _alt = getInterpreter().adaptivePredict(_input,72,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(535); + setState(545); quoted(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(536); + setState(546); valueElement(); } break; @@ -4645,14 +4751,14 @@ public T accept(ParseTreeVisitor visitor) { public final ValueElementContext valueElement() throws RecognitionException { ValueElementContext _localctx = new ValueElementContext(_ctx, getState()); - enterRule(_localctx, 128, RULE_valueElement); + enterRule(_localctx, 130, RULE_valueElement); int _la; try { enterOuterAlt(_localctx, 1); { - setState(539); + setState(549); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 273804165120L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 547608330240L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -4701,9 +4807,9 @@ public T accept(ParseTreeVisitor visitor) { public final PathElementContext pathElement() throws RecognitionException { PathElementContext _localctx = new PathElementContext(_ctx, getState()); - enterRule(_localctx, 130, RULE_pathElement); + enterRule(_localctx, 132, RULE_pathElement); try { - setState(544); + setState(554); _errHandler.sync(this); switch (_input.LA(1)) { case DOUBLE_QUOTED_STRING: @@ -4716,21 +4822,21 @@ public final PathElementContext pathElement() throws RecognitionException { case UNQUOTED_TEXT: enterOuterAlt(_localctx, 1); { - setState(541); + setState(551); valueElement(); } break; case EQUALS: enterOuterAlt(_localctx, 2); { - setState(542); + setState(552); match(EQUALS); } break; case COMMA: enterOuterAlt(_localctx, 3); { - setState(543); + setState(553); match(COMMA); } break; @@ -4786,14 +4892,14 @@ public T accept(ParseTreeVisitor visitor) { public final TextElementContext textElement() throws RecognitionException { TextElementContext _localctx = new TextElementContext(_ctx, getState()); - enterRule(_localctx, 132, RULE_textElement); + enterRule(_localctx, 134, RULE_textElement); int _la; try { enterOuterAlt(_localctx, 1); { - setState(546); + setState(556); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 274861129728L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 549202165760L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -4816,7 +4922,7 @@ public final TextElementContext textElement() throws RecognitionException { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 53: + case 54: return pathArgument_sempred((PathArgumentContext)_localctx, predIndex); } return true; @@ -4830,7 +4936,7 @@ private boolean pathArgument_sempred(PathArgumentContext _localctx, int predInde } public static final String _serializedATN = - "\u0004\u00010\u0225\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0004\u00012\u022f\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ @@ -4847,338 +4953,345 @@ private boolean pathArgument_sempred(PathArgumentContext _localctx, int predInde "2\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u0002"+ "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0002"+ "<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007@\u0002"+ - "A\u0007A\u0002B\u0007B\u0001\u0000\u0005\u0000\u0088\b\u0000\n\u0000\f"+ - "\u0000\u008b\t\u0000\u0001\u0000\u0001\u0000\u0004\u0000\u008f\b\u0000"+ - "\u000b\u0000\f\u0000\u0090\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001"+ - "\u0001\u0002\u0005\u0002\u0098\b\u0002\n\u0002\f\u0002\u009b\t\u0002\u0001"+ - "\u0003\u0001\u0003\u0005\u0003\u009f\b\u0003\n\u0003\f\u0003\u00a2\t\u0003"+ + "A\u0007A\u0002B\u0007B\u0002C\u0007C\u0001\u0000\u0005\u0000\u008a\b\u0000"+ + "\n\u0000\f\u0000\u008d\t\u0000\u0001\u0000\u0001\u0000\u0004\u0000\u0091"+ + "\b\u0000\u000b\u0000\f\u0000\u0092\u0001\u0000\u0001\u0000\u0001\u0001"+ + "\u0001\u0001\u0001\u0002\u0005\u0002\u009a\b\u0002\n\u0002\f\u0002\u009d"+ + "\t\u0002\u0001\u0003\u0001\u0003\u0005\u0003\u00a1\b\u0003\n\u0003\f\u0003"+ + "\u00a4\t\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004"+ - "\u00b5\b\u0004\u0001\u0005\u0001\u0005\u0003\u0005\u00b9\b\u0005\u0001"+ - "\u0006\u0001\u0006\u0003\u0006\u00bd\b\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0003\u0006\u00c2\b\u0006\u0001\u0007\u0001\u0007\u0003\u0007\u00c6"+ - "\b\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0003\u0007\u00cb\b\u0007"+ - "\u0001\b\u0001\b\u0001\b\u0003\b\u00d0\b\b\u0001\t\u0001\t\u0001\t\u0001"+ - "\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f"+ - "\u0003\f\u00dd\b\f\u0001\f\u0001\f\u0001\f\u0003\f\u00e2\b\f\u0001\r\u0001"+ - "\r\u0003\r\u00e6\b\r\u0001\r\u0001\r\u0001\r\u0003\r\u00eb\b\r\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0003\u000e\u00f0\b\u000e\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0004\u000f\u00f5\b\u000f\u000b\u000f\f\u000f\u00f6\u0003"+ - "\u000f\u00f9\b\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003"+ - "\u0012\u0105\b\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0003"+ - "\u0015\u0111\b\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0003\u0015\u0116"+ - "\b\u0015\u0003\u0015\u0118\b\u0015\u0001\u0016\u0004\u0016\u011b\b\u0016"+ - "\u000b\u0016\f\u0016\u011c\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0004\u001a"+ - "\u0128\b\u001a\u000b\u001a\f\u001a\u0129\u0001\u001b\u0001\u001b\u0001"+ - "\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001e\u0004\u001e\u0133"+ - "\b\u001e\u000b\u001e\f\u001e\u0134\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0004\u001f\u013a\b\u001f\u000b\u001f\f\u001f\u013b\u0001 \u0001 \u0005"+ - " \u0140\b \n \f \u0143\t \u0001 \u0001 \u0005 \u0147\b \n \f \u014a\t"+ - " \u0005 \u014c\b \n \f \u014f\t \u0001!\u0001!\u0001!\u0001\"\u0005\""+ - "\u0155\b\"\n\"\f\"\u0158\t\"\u0001#\u0001#\u0001$\u0001$\u0003$\u015e"+ - "\b$\u0001$\u0001$\u0001%\u0001%\u0001%\u0005%\u0165\b%\n%\f%\u0168\t%"+ - "\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0003\'\u016f\b\'\u0003\'\u0171"+ - "\b\'\u0001\'\u0001\'\u0003\'\u0175\b\'\u0003\'\u0177\b\'\u0001\'\u0001"+ - "\'\u0003\'\u017b\b\'\u0001\'\u0001\'\u0003\'\u017f\b\'\u0003\'\u0181\b"+ - "\'\u0001\'\u0001\'\u0003\'\u0185\b\'\u0003\'\u0187\b\'\u0001(\u0001(\u0004"+ - "(\u018b\b(\u000b(\f(\u018c\u0003(\u018f\b(\u0001)\u0001)\u0001)\u0004"+ - ")\u0194\b)\u000b)\f)\u0195\u0003)\u0198\b)\u0001*\u0001*\u0001*\u0001"+ - "*\u0004*\u019e\b*\u000b*\f*\u019f\u0003*\u01a2\b*\u0001+\u0001+\u0001"+ - ",\u0004,\u01a7\b,\u000b,\f,\u01a8\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0003-\u01b2\b-\u0001.\u0001.\u0003.\u01b6\b.\u0001/\u0004/\u01b9"+ - "\b/\u000b/\f/\u01ba\u00010\u00010\u00011\u00041\u01c0\b1\u000b1\f1\u01c1"+ - "\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00032\u01cb\b2\u0001"+ - "3\u00013\u00014\u00014\u00044\u01d1\b4\u000b4\f4\u01d2\u00015\u00015\u0001"+ - "5\u00015\u00055\u01d9\b5\n5\f5\u01dc\t5\u00035\u01de\b5\u00016\u00016"+ - "\u00017\u00017\u00017\u00037\u01e5\b7\u00037\u01e7\b7\u00017\u00017\u0003"+ - "7\u01eb\b7\u00037\u01ed\b7\u00018\u00018\u00048\u01f1\b8\u000b8\f8\u01f2"+ - "\u00038\u01f5\b8\u00019\u00019\u00019\u00049\u01fa\b9\u000b9\f9\u01fb"+ - "\u00039\u01fe\b9\u0001:\u0001:\u0001;\u0001;\u0001<\u0001<\u0001=\u0001"+ - "=\u0001>\u0001>\u0004>\u020a\b>\u000b>\f>\u020b\u0001>\u0001>\u0003>\u0210"+ - "\b>\u0001?\u0001?\u0004?\u0214\b?\u000b?\f?\u0215\u0001?\u0001?\u0003"+ - "?\u021a\b?\u0001@\u0001@\u0001A\u0001A\u0001A\u0003A\u0221\bA\u0001B\u0001"+ - "B\u0001B\u0000\u0000C\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012"+ - "\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\"+ - "^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0000\u0005\u0002\u0000\'\'//\u0002"+ - "\u0000 #%%\u0001\u0000\u001e\u001f\u0001\u0000\u001e%\u0001\u0000\u0018"+ - "%\u0240\u0000\u0089\u0001\u0000\u0000\u0000\u0002\u0094\u0001\u0000\u0000"+ - "\u0000\u0004\u0099\u0001\u0000\u0000\u0000\u0006\u009c\u0001\u0000\u0000"+ - "\u0000\b\u00b4\u0001\u0000\u0000\u0000\n\u00b8\u0001\u0000\u0000\u0000"+ - "\f\u00ba\u0001\u0000\u0000\u0000\u000e\u00c3\u0001\u0000\u0000\u0000\u0010"+ - "\u00cc\u0001\u0000\u0000\u0000\u0012\u00d1\u0001\u0000\u0000\u0000\u0014"+ - "\u00d4\u0001\u0000\u0000\u0000\u0016\u00d7\u0001\u0000\u0000\u0000\u0018"+ - "\u00da\u0001\u0000\u0000\u0000\u001a\u00e3\u0001\u0000\u0000\u0000\u001c"+ - "\u00ec\u0001\u0000\u0000\u0000\u001e\u00f1\u0001\u0000\u0000\u0000 \u00fa"+ - "\u0001\u0000\u0000\u0000\"\u00fd\u0001\u0000\u0000\u0000$\u0100\u0001"+ - "\u0000\u0000\u0000&\u0106\u0001\u0000\u0000\u0000(\u0109\u0001\u0000\u0000"+ - "\u0000*\u0117\u0001\u0000\u0000\u0000,\u011a\u0001\u0000\u0000\u0000."+ - "\u011e\u0001\u0000\u0000\u00000\u0120\u0001\u0000\u0000\u00002\u0123\u0001"+ - "\u0000\u0000\u00004\u0127\u0001\u0000\u0000\u00006\u012b\u0001\u0000\u0000"+ - "\u00008\u012d\u0001\u0000\u0000\u0000:\u012f\u0001\u0000\u0000\u0000<"+ - "\u0132\u0001\u0000\u0000\u0000>\u0136\u0001\u0000\u0000\u0000@\u013d\u0001"+ - "\u0000\u0000\u0000B\u0150\u0001\u0000\u0000\u0000D\u0156\u0001\u0000\u0000"+ - "\u0000F\u0159\u0001\u0000\u0000\u0000H\u015b\u0001\u0000\u0000\u0000J"+ - "\u0161\u0001\u0000\u0000\u0000L\u0169\u0001\u0000\u0000\u0000N\u0186\u0001"+ - "\u0000\u0000\u0000P\u018e\u0001\u0000\u0000\u0000R\u0197\u0001\u0000\u0000"+ - "\u0000T\u01a1\u0001\u0000\u0000\u0000V\u01a3\u0001\u0000\u0000\u0000X"+ - "\u01a6\u0001\u0000\u0000\u0000Z\u01b1\u0001\u0000\u0000\u0000\\\u01b5"+ - "\u0001\u0000\u0000\u0000^\u01b8\u0001\u0000\u0000\u0000`\u01bc\u0001\u0000"+ - "\u0000\u0000b\u01bf\u0001\u0000\u0000\u0000d\u01ca\u0001\u0000\u0000\u0000"+ - "f\u01cc\u0001\u0000\u0000\u0000h\u01ce\u0001\u0000\u0000\u0000j\u01dd"+ - "\u0001\u0000\u0000\u0000l\u01df\u0001\u0000\u0000\u0000n\u01ec\u0001\u0000"+ - "\u0000\u0000p\u01f4\u0001\u0000\u0000\u0000r\u01fd\u0001\u0000\u0000\u0000"+ - "t\u01ff\u0001\u0000\u0000\u0000v\u0201\u0001\u0000\u0000\u0000x\u0203"+ - "\u0001\u0000\u0000\u0000z\u0205\u0001\u0000\u0000\u0000|\u020f\u0001\u0000"+ - "\u0000\u0000~\u0219\u0001\u0000\u0000\u0000\u0080\u021b\u0001\u0000\u0000"+ - "\u0000\u0082\u0220\u0001\u0000\u0000\u0000\u0084\u0222\u0001\u0000\u0000"+ - "\u0000\u0086\u0088\u0003\u0002\u0001\u0000\u0087\u0086\u0001\u0000\u0000"+ - "\u0000\u0088\u008b\u0001\u0000\u0000\u0000\u0089\u0087\u0001\u0000\u0000"+ - "\u0000\u0089\u008a\u0001\u0000\u0000\u0000\u008a\u008c\u0001\u0000\u0000"+ - "\u0000\u008b\u0089\u0001\u0000\u0000\u0000\u008c\u008e\u0003\u0004\u0002"+ - "\u0000\u008d\u008f\u0003\u0006\u0003\u0000\u008e\u008d\u0001\u0000\u0000"+ - "\u0000\u008f\u0090\u0001\u0000\u0000\u0000\u0090\u008e\u0001\u0000\u0000"+ - "\u0000\u0090\u0091\u0001\u0000\u0000\u0000\u0091\u0092\u0001\u0000\u0000"+ - "\u0000\u0092\u0093\u0005\u0000\u0000\u0001\u0093\u0001\u0001\u0000\u0000"+ - "\u0000\u0094\u0095\u0005\u0001\u0000\u0000\u0095\u0003\u0001\u0000\u0000"+ - "\u0000\u0096\u0098\u0003$\u0012\u0000\u0097\u0096\u0001\u0000\u0000\u0000"+ - "\u0098\u009b\u0001\u0000\u0000\u0000\u0099\u0097\u0001\u0000\u0000\u0000"+ - "\u0099\u009a\u0001\u0000\u0000\u0000\u009a\u0005\u0001\u0000\u0000\u0000"+ - "\u009b\u0099\u0001\u0000\u0000\u0000\u009c\u00a0\u0003\f\u0006\u0000\u009d"+ - "\u009f\u0003\b\u0004\u0000\u009e\u009d\u0001\u0000\u0000\u0000\u009f\u00a2"+ - "\u0001\u0000\u0000\u0000\u00a0\u009e\u0001\u0000\u0000\u0000\u00a0\u00a1"+ - "\u0001\u0000\u0000\u0000\u00a1\u0007\u0001\u0000\u0000\u0000\u00a2\u00a0"+ - "\u0001\u0000\u0000\u0000\u00a3\u00b5\u0003\u000e\u0007\u0000\u00a4\u00b5"+ - "\u0003\u0010\b\u0000\u00a5\u00b5\u0003\u0012\t\u0000\u00a6\u00b5\u0003"+ - "\u0014\n\u0000\u00a7\u00b5\u0003\u0016\u000b\u0000\u00a8\u00b5\u0003\u0018"+ - "\f\u0000\u00a9\u00b5\u0003\u001a\r\u0000\u00aa\u00b5\u0003\u001c\u000e"+ - "\u0000\u00ab\u00b5\u0003\u001e\u000f\u0000\u00ac\u00b5\u0003 \u0010\u0000"+ - "\u00ad\u00b5\u0003\"\u0011\u0000\u00ae\u00b5\u0003$\u0012\u0000\u00af"+ - "\u00b5\u0003&\u0013\u0000\u00b0\u00b5\u0003(\u0014\u0000\u00b1\u00b5\u0003"+ - "*\u0015\u0000\u00b2\u00b5\u00030\u0018\u0000\u00b3\u00b5\u00032\u0019"+ - "\u0000\u00b4\u00a3\u0001\u0000\u0000\u0000\u00b4\u00a4\u0001\u0000\u0000"+ - "\u0000\u00b4\u00a5\u0001\u0000\u0000\u0000\u00b4\u00a6\u0001\u0000\u0000"+ - "\u0000\u00b4\u00a7\u0001\u0000\u0000\u0000\u00b4\u00a8\u0001\u0000\u0000"+ - "\u0000\u00b4\u00a9\u0001\u0000\u0000\u0000\u00b4\u00aa\u0001\u0000\u0000"+ - "\u0000\u00b4\u00ab\u0001\u0000\u0000\u0000\u00b4\u00ac\u0001\u0000\u0000"+ - "\u0000\u00b4\u00ad\u0001\u0000\u0000\u0000\u00b4\u00ae\u0001\u0000\u0000"+ - "\u0000\u00b4\u00af\u0001\u0000\u0000\u0000\u00b4\u00b0\u0001\u0000\u0000"+ - "\u0000\u00b4\u00b1\u0001\u0000\u0000\u0000\u00b4\u00b2\u0001\u0000\u0000"+ - "\u0000\u00b4\u00b3\u0001\u0000\u0000\u0000\u00b5\t\u0001\u0000\u0000\u0000"+ - "\u00b6\u00b9\u0003\f\u0006\u0000\u00b7\u00b9\u0003\b\u0004\u0000\u00b8"+ - "\u00b6\u0001\u0000\u0000\u0000\u00b8\u00b7\u0001\u0000\u0000\u0000\u00b9"+ - "\u000b\u0001\u0000\u0000\u0000\u00ba\u00bc\u0005\u0003\u0000\u0000\u00bb"+ - "\u00bd\u00034\u001a\u0000\u00bc\u00bb\u0001\u0000\u0000\u0000\u00bc\u00bd"+ - "\u0001\u0000\u0000\u0000\u00bd\u00be\u0001\u0000\u0000\u0000\u00be\u00c1"+ - "\u0003N\'\u0000\u00bf\u00c0\u0005*\u0000\u0000\u00c0\u00c2\u0003V+\u0000"+ - "\u00c1\u00bf\u0001\u0000\u0000\u0000\u00c1\u00c2\u0001\u0000\u0000\u0000"+ - "\u00c2\r\u0001\u0000\u0000\u0000\u00c3\u00c5\u0005\u0004\u0000\u0000\u00c4"+ - "\u00c6\u00034\u001a\u0000\u00c5\u00c4\u0001\u0000\u0000\u0000\u00c5\u00c6"+ - "\u0001\u0000\u0000\u0000\u00c6\u00ca\u0001\u0000\u0000\u0000\u00c7\u00cb"+ - "\u00038\u001c\u0000\u00c8\u00cb\u0003:\u001d\u0000\u00c9\u00cb\u0003>"+ - "\u001f\u0000\u00ca\u00c7\u0001\u0000\u0000\u0000\u00ca\u00c8\u0001\u0000"+ - "\u0000\u0000\u00ca\u00c9\u0001\u0000\u0000\u0000\u00cb\u000f\u0001\u0000"+ - "\u0000\u0000\u00cc\u00cf\u0005\u0005\u0000\u0000\u00cd\u00d0\u00038\u001c"+ - "\u0000\u00ce\u00d0\u0003:\u001d\u0000\u00cf\u00cd\u0001\u0000\u0000\u0000"+ - "\u00cf\u00ce\u0001\u0000\u0000\u0000\u00d0\u0011\u0001\u0000\u0000\u0000"+ - "\u00d1\u00d2\u0005\u0007\u0000\u0000\u00d2\u00d3\u0003X,\u0000\u00d3\u0013"+ - "\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005\b\u0000\u0000\u00d5\u00d6\u0003"+ - "^/\u0000\u00d6\u0015\u0001\u0000\u0000\u0000\u00d7\u00d8\u0005\t\u0000"+ - "\u0000\u00d8\u00d9\u0003b1\u0000\u00d9\u0017\u0001\u0000\u0000\u0000\u00da"+ - "\u00dc\u0005\n\u0000\u0000\u00db\u00dd\u00034\u001a\u0000\u00dc\u00db"+ - "\u0001\u0000\u0000\u0000\u00dc\u00dd\u0001\u0000\u0000\u0000\u00dd\u00e1"+ - "\u0001\u0000\u0000\u0000\u00de\u00e2\u0003>\u001f\u0000\u00df\u00e2\u0003"+ - "H$\u0000\u00e0\u00e2\u0003h4\u0000\u00e1\u00de\u0001\u0000\u0000\u0000"+ - "\u00e1\u00df\u0001\u0000\u0000\u0000\u00e1\u00e0\u0001\u0000\u0000\u0000"+ - "\u00e2\u0019\u0001\u0000\u0000\u0000\u00e3\u00e5\u0005\u000b\u0000\u0000"+ - "\u00e4\u00e6\u00034\u001a\u0000\u00e5\u00e4\u0001\u0000\u0000\u0000\u00e5"+ - "\u00e6\u0001\u0000\u0000\u0000\u00e6\u00ea\u0001\u0000\u0000\u0000\u00e7"+ - "\u00eb\u0003>\u001f\u0000\u00e8\u00eb\u0003H$\u0000\u00e9\u00eb\u0003"+ - "h4\u0000\u00ea\u00e7\u0001\u0000\u0000\u0000\u00ea\u00e8\u0001\u0000\u0000"+ - "\u0000\u00ea\u00e9\u0001\u0000\u0000\u0000\u00eb\u001b\u0001\u0000\u0000"+ - "\u0000\u00ec\u00ef\u0005\f\u0000\u0000\u00ed\u00f0\u00038\u001c\u0000"+ - "\u00ee\u00f0\u0003:\u001d\u0000\u00ef\u00ed\u0001\u0000\u0000\u0000\u00ef"+ - "\u00ee\u0001\u0000\u0000\u0000\u00f0\u001d\u0001\u0000\u0000\u0000\u00f1"+ - "\u00f8\u0005\r\u0000\u0000\u00f2\u00f9\u0003H$\u0000\u00f3\u00f5\u0003"+ - "j5\u0000\u00f4\u00f3\u0001\u0000\u0000\u0000\u00f5\u00f6\u0001\u0000\u0000"+ - "\u0000\u00f6\u00f4\u0001\u0000\u0000\u0000\u00f6\u00f7\u0001\u0000\u0000"+ - "\u0000\u00f7\u00f9\u0001\u0000\u0000\u0000\u00f8\u00f2\u0001\u0000\u0000"+ - "\u0000\u00f8\u00f4\u0001\u0000\u0000\u0000\u00f9\u001f\u0001\u0000\u0000"+ - "\u0000\u00fa\u00fb\u0005\u000e\u0000\u0000\u00fb\u00fc\u0003n7\u0000\u00fc"+ - "!\u0001\u0000\u0000\u0000\u00fd\u00fe\u0005\u000f\u0000\u0000\u00fe\u00ff"+ - "\u0003l6\u0000\u00ff#\u0001\u0000\u0000\u0000\u0100\u0101\u0005\u0010"+ - "\u0000\u0000\u0101\u0104\u0003t:\u0000\u0102\u0103\u0005\u001b\u0000\u0000"+ - "\u0103\u0105\u0003v;\u0000\u0104\u0102\u0001\u0000\u0000\u0000\u0104\u0105"+ - "\u0001\u0000\u0000\u0000\u0105%\u0001\u0000\u0000\u0000\u0106\u0107\u0005"+ - "\u0011\u0000\u0000\u0107\u0108\u0003\n\u0005\u0000\u0108\'\u0001\u0000"+ - "\u0000\u0000\u0109\u010a\u0005\u0012\u0000\u0000\u010a\u010b\u0003x<\u0000"+ - "\u010b)\u0001\u0000\u0000\u0000\u010c\u010d\u0005\u0013\u0000\u0000\u010d"+ - "\u0118\u0005\u0006\u0000\u0000\u010e\u0110\u0005\u0013\u0000\u0000\u010f"+ - "\u0111\u0003,\u0016\u0000\u0110\u010f\u0001\u0000\u0000\u0000\u0110\u0111"+ - "\u0001\u0000\u0000\u0000\u0111\u0112\u0001\u0000\u0000\u0000\u0112\u0115"+ - "\u0005\u0005\u0000\u0000\u0113\u0116\u00038\u001c\u0000\u0114\u0116\u0003"+ - ":\u001d\u0000\u0115\u0113\u0001\u0000\u0000\u0000\u0115\u0114\u0001\u0000"+ - "\u0000\u0000\u0116\u0118\u0001\u0000\u0000\u0000\u0117\u010c\u0001\u0000"+ - "\u0000\u0000\u0117\u010e\u0001\u0000\u0000\u0000\u0118+\u0001\u0000\u0000"+ - "\u0000\u0119\u011b\u0003.\u0017\u0000\u011a\u0119\u0001\u0000\u0000\u0000"+ - "\u011b\u011c\u0001\u0000\u0000\u0000\u011c\u011a\u0001\u0000\u0000\u0000"+ - "\u011c\u011d\u0001\u0000\u0000\u0000\u011d-\u0001\u0000\u0000\u0000\u011e"+ - "\u011f\u0005\u001c\u0000\u0000\u011f/\u0001\u0000\u0000\u0000\u0120\u0121"+ - "\u0005\u0014\u0000\u0000\u0121\u0122\u0003H$\u0000\u01221\u0001\u0000"+ - "\u0000\u0000\u0123\u0124\u0005\u0015\u0000\u0000\u0124\u0125\u0003|>\u0000"+ - "\u01253\u0001\u0000\u0000\u0000\u0126\u0128\u00036\u001b\u0000\u0127\u0126"+ - "\u0001\u0000\u0000\u0000\u0128\u0129\u0001\u0000\u0000\u0000\u0129\u0127"+ - "\u0001\u0000\u0000\u0000\u0129\u012a\u0001\u0000\u0000\u0000\u012a5\u0001"+ - "\u0000\u0000\u0000\u012b\u012c\u0005\u001c\u0000\u0000\u012c7\u0001\u0000"+ - "\u0000\u0000\u012d\u012e\u0003H$\u0000\u012e9\u0001\u0000\u0000\u0000"+ - "\u012f\u0130\u0003<\u001e\u0000\u0130;\u0001\u0000\u0000\u0000\u0131\u0133"+ - "\u0003\u0084B\u0000\u0132\u0131\u0001\u0000\u0000\u0000\u0133\u0134\u0001"+ - "\u0000\u0000\u0000\u0134\u0132\u0001\u0000\u0000\u0000\u0134\u0135\u0001"+ - "\u0000\u0000\u0000\u0135=\u0001\u0000\u0000\u0000\u0136\u0137\u0003@ "+ - "\u0000\u0137\u0139\u0005\'\u0000\u0000\u0138\u013a\u0003B!\u0000\u0139"+ - "\u0138\u0001\u0000\u0000\u0000\u013a\u013b\u0001\u0000\u0000\u0000\u013b"+ - "\u0139\u0001\u0000\u0000\u0000\u013b\u013c\u0001\u0000\u0000\u0000\u013c"+ - "?\u0001\u0000\u0000\u0000\u013d\u0141\u0005\u0016\u0000\u0000\u013e\u0140"+ - "\u0003\u0084B\u0000\u013f\u013e\u0001\u0000\u0000\u0000\u0140\u0143\u0001"+ - "\u0000\u0000\u0000\u0141\u013f\u0001\u0000\u0000\u0000\u0141\u0142\u0001"+ - "\u0000\u0000\u0000\u0142\u014d\u0001\u0000\u0000\u0000\u0143\u0141\u0001"+ - "\u0000\u0000\u0000\u0144\u0148\u0005\u0016\u0000\u0000\u0145\u0147\u0003"+ - "\u0084B\u0000\u0146\u0145\u0001\u0000\u0000\u0000\u0147\u014a\u0001\u0000"+ - "\u0000\u0000\u0148\u0146\u0001\u0000\u0000\u0000\u0148\u0149\u0001\u0000"+ - "\u0000\u0000\u0149\u014c\u0001\u0000\u0000\u0000\u014a\u0148\u0001\u0000"+ - "\u0000\u0000\u014b\u0144\u0001\u0000\u0000\u0000\u014c\u014f\u0001\u0000"+ - "\u0000\u0000\u014d\u014b\u0001\u0000\u0000\u0000\u014d\u014e\u0001\u0000"+ - "\u0000\u0000\u014eA\u0001\u0000\u0000\u0000\u014f\u014d\u0001\u0000\u0000"+ - "\u0000\u0150\u0151\u0003D\"\u0000\u0151\u0152\u0003F#\u0000\u0152C\u0001"+ - "\u0000\u0000\u0000\u0153\u0155\u0007\u0000\u0000\u0000\u0154\u0153\u0001"+ - "\u0000\u0000\u0000\u0155\u0158\u0001\u0000\u0000\u0000\u0156\u0154\u0001"+ - "\u0000\u0000\u0000\u0156\u0157\u0001\u0000\u0000\u0000\u0157E\u0001\u0000"+ - "\u0000\u0000\u0158\u0156\u0001\u0000\u0000\u0000\u0159\u015a\u0005%\u0000"+ - "\u0000\u015aG\u0001\u0000\u0000\u0000\u015b\u015d\u0005\u0018\u0000\u0000"+ - "\u015c\u015e\u0003J%\u0000\u015d\u015c\u0001\u0000\u0000\u0000\u015d\u015e"+ - "\u0001\u0000\u0000\u0000\u015e\u015f\u0001\u0000\u0000\u0000\u015f\u0160"+ - "\u0005\u0019\u0000\u0000\u0160I\u0001\u0000\u0000\u0000\u0161\u0166\u0003"+ - "L&\u0000\u0162\u0163\u0005\u001a\u0000\u0000\u0163\u0165\u0003L&\u0000"+ - "\u0164\u0162\u0001\u0000\u0000\u0000\u0165\u0168\u0001\u0000\u0000\u0000"+ - "\u0166\u0164\u0001\u0000\u0000\u0000\u0166\u0167\u0001\u0000\u0000\u0000"+ - "\u0167K\u0001\u0000\u0000\u0000\u0168\u0166\u0001\u0000\u0000\u0000\u0169"+ - "\u016a\u0005\u001e\u0000\u0000\u016aM\u0001\u0000\u0000\u0000\u016b\u0170"+ - "\u0003P(\u0000\u016c\u016e\u0005(\u0000\u0000\u016d\u016f\u0003R)\u0000"+ - "\u016e\u016d\u0001\u0000\u0000\u0000\u016e\u016f\u0001\u0000\u0000\u0000"+ - "\u016f\u0171\u0001\u0000\u0000\u0000\u0170\u016c\u0001\u0000\u0000\u0000"+ - "\u0170\u0171\u0001\u0000\u0000\u0000\u0171\u0176\u0001\u0000\u0000\u0000"+ - "\u0172\u0174\u0005)\u0000\u0000\u0173\u0175\u0003T*\u0000\u0174\u0173"+ - "\u0001\u0000\u0000\u0000\u0174\u0175\u0001\u0000\u0000\u0000\u0175\u0177"+ - "\u0001\u0000\u0000\u0000\u0176\u0172\u0001\u0000\u0000\u0000\u0176\u0177"+ - "\u0001\u0000\u0000\u0000\u0177\u0187\u0001\u0000\u0000\u0000\u0178\u017a"+ - "\u0005(\u0000\u0000\u0179\u017b\u0003R)\u0000\u017a\u0179\u0001\u0000"+ - "\u0000\u0000\u017a\u017b\u0001\u0000\u0000\u0000\u017b\u0180\u0001\u0000"+ - "\u0000\u0000\u017c\u017e\u0005)\u0000\u0000\u017d\u017f\u0003T*\u0000"+ - "\u017e\u017d\u0001\u0000\u0000\u0000\u017e\u017f\u0001\u0000\u0000\u0000"+ - "\u017f\u0181\u0001\u0000\u0000\u0000\u0180\u017c\u0001\u0000\u0000\u0000"+ - "\u0180\u0181\u0001\u0000\u0000\u0000\u0181\u0187\u0001\u0000\u0000\u0000"+ - "\u0182\u0184\u0005)\u0000\u0000\u0183\u0185\u0003T*\u0000\u0184\u0183"+ - "\u0001\u0000\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000\u0185\u0187"+ - "\u0001\u0000\u0000\u0000\u0186\u016b\u0001\u0000\u0000\u0000\u0186\u0178"+ - "\u0001\u0000\u0000\u0000\u0186\u0182\u0001\u0000\u0000\u0000\u0187O\u0001"+ - "\u0000\u0000\u0000\u0188\u018f\u0003z=\u0000\u0189\u018b\u0003\u0084B"+ - "\u0000\u018a\u0189\u0001\u0000\u0000\u0000\u018b\u018c\u0001\u0000\u0000"+ - "\u0000\u018c\u018a\u0001\u0000\u0000\u0000\u018c\u018d\u0001\u0000\u0000"+ - "\u0000\u018d\u018f\u0001\u0000\u0000\u0000\u018e\u0188\u0001\u0000\u0000"+ - "\u0000\u018e\u018a\u0001\u0000\u0000\u0000\u018fQ\u0001\u0000\u0000\u0000"+ - "\u0190\u0198\u0003z=\u0000\u0191\u0194\u0003\u0084B\u0000\u0192\u0194"+ - "\u0005(\u0000\u0000\u0193\u0191\u0001\u0000\u0000\u0000\u0193\u0192\u0001"+ - "\u0000\u0000\u0000\u0194\u0195\u0001\u0000\u0000\u0000\u0195\u0193\u0001"+ - "\u0000\u0000\u0000\u0195\u0196\u0001\u0000\u0000\u0000\u0196\u0198\u0001"+ - "\u0000\u0000\u0000\u0197\u0190\u0001\u0000\u0000\u0000\u0197\u0193\u0001"+ - "\u0000\u0000\u0000\u0198S\u0001\u0000\u0000\u0000\u0199\u01a2\u0003z="+ - "\u0000\u019a\u019e\u0003\u0084B\u0000\u019b\u019e\u0005(\u0000\u0000\u019c"+ - "\u019e\u0005)\u0000\u0000\u019d\u019a\u0001\u0000\u0000\u0000\u019d\u019b"+ - "\u0001\u0000\u0000\u0000\u019d\u019c\u0001\u0000\u0000\u0000\u019e\u019f"+ - "\u0001\u0000\u0000\u0000\u019f\u019d\u0001\u0000\u0000\u0000\u019f\u01a0"+ - "\u0001\u0000\u0000\u0000\u01a0\u01a2\u0001\u0000\u0000\u0000\u01a1\u0199"+ - "\u0001\u0000\u0000\u0000\u01a1\u019d\u0001\u0000\u0000\u0000\u01a2U\u0001"+ - "\u0000\u0000\u0000\u01a3\u01a4\u0005%\u0000\u0000\u01a4W\u0001\u0000\u0000"+ - "\u0000\u01a5\u01a7\u0003Z-\u0000\u01a6\u01a5\u0001\u0000\u0000\u0000\u01a7"+ - "\u01a8\u0001\u0000\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a8"+ - "\u01a9\u0001\u0000\u0000\u0000\u01a9Y\u0001\u0000\u0000\u0000\u01aa\u01ab"+ - "\u0003\\.\u0000\u01ab\u01ac\u0005\u001b\u0000\u0000\u01ac\u01ad\u0003"+ - "~?\u0000\u01ad\u01b2\u0001\u0000\u0000\u0000\u01ae\u01af\u0003\\.\u0000"+ - "\u01af\u01b0\u0003|>\u0000\u01b0\u01b2\u0001\u0000\u0000\u0000\u01b1\u01aa"+ - "\u0001\u0000\u0000\u0000\u01b1\u01ae\u0001\u0000\u0000\u0000\u01b2[\u0001"+ - "\u0000\u0000\u0000\u01b3\u01b6\u0003z=\u0000\u01b4\u01b6\u0005%\u0000"+ - "\u0000\u01b5\u01b3\u0001\u0000\u0000\u0000\u01b5\u01b4\u0001\u0000\u0000"+ - "\u0000\u01b6]\u0001\u0000\u0000\u0000\u01b7\u01b9\u0003`0\u0000\u01b8"+ - "\u01b7\u0001\u0000\u0000\u0000\u01b9\u01ba\u0001\u0000\u0000\u0000\u01ba"+ - "\u01b8\u0001\u0000\u0000\u0000\u01ba\u01bb\u0001\u0000\u0000\u0000\u01bb"+ - "_\u0001\u0000\u0000\u0000\u01bc\u01bd\u0007\u0001\u0000\u0000\u01bda\u0001"+ - "\u0000\u0000\u0000\u01be\u01c0\u0003d2\u0000\u01bf\u01be\u0001\u0000\u0000"+ - "\u0000\u01c0\u01c1\u0001\u0000\u0000\u0000\u01c1\u01bf\u0001\u0000\u0000"+ - "\u0000\u01c1\u01c2\u0001\u0000\u0000\u0000\u01c2c\u0001\u0000\u0000\u0000"+ - "\u01c3\u01c4\u0003f3\u0000\u01c4\u01c5\u0005\u001b\u0000\u0000\u01c5\u01c6"+ - "\u0003~?\u0000\u01c6\u01cb\u0001\u0000\u0000\u0000\u01c7\u01c8\u0003f"+ - "3\u0000\u01c8\u01c9\u0003|>\u0000\u01c9\u01cb\u0001\u0000\u0000\u0000"+ - "\u01ca\u01c3\u0001\u0000\u0000\u0000\u01ca\u01c7\u0001\u0000\u0000\u0000"+ - "\u01cbe\u0001\u0000\u0000\u0000\u01cc\u01cd\u0005%\u0000\u0000\u01cdg"+ - "\u0001\u0000\u0000\u0000\u01ce\u01d0\u0003j5\u0000\u01cf\u01d1\u0003j"+ - "5\u0000\u01d0\u01cf\u0001\u0000\u0000\u0000\u01d1\u01d2\u0001\u0000\u0000"+ - "\u0000\u01d2\u01d0\u0001\u0000\u0000\u0000\u01d2\u01d3\u0001\u0000\u0000"+ - "\u0000\u01d3i\u0001\u0000\u0000\u0000\u01d4\u01de\u0003z=\u0000\u01d5"+ - "\u01da\u0003\u0082A\u0000\u01d6\u01d7\u00045\u0000\u0000\u01d7\u01d9\u0003"+ - "\u0082A\u0000\u01d8\u01d6\u0001\u0000\u0000\u0000\u01d9\u01dc\u0001\u0000"+ - "\u0000\u0000\u01da\u01d8\u0001\u0000\u0000\u0000\u01da\u01db\u0001\u0000"+ - "\u0000\u0000\u01db\u01de\u0001\u0000\u0000\u0000\u01dc\u01da\u0001\u0000"+ - "\u0000\u0000\u01dd\u01d4\u0001\u0000\u0000\u0000\u01dd\u01d5\u0001\u0000"+ - "\u0000\u0000\u01dek\u0001\u0000\u0000\u0000\u01df\u01e0\u0003|>\u0000"+ - "\u01e0m\u0001\u0000\u0000\u0000\u01e1\u01e6\u0003p8\u0000\u01e2\u01e4"+ - "\u0005(\u0000\u0000\u01e3\u01e5\u0003r9\u0000\u01e4\u01e3\u0001\u0000"+ - "\u0000\u0000\u01e4\u01e5\u0001\u0000\u0000\u0000\u01e5\u01e7\u0001\u0000"+ - "\u0000\u0000\u01e6\u01e2\u0001\u0000\u0000\u0000\u01e6\u01e7\u0001\u0000"+ - "\u0000\u0000\u01e7\u01ed\u0001\u0000\u0000\u0000\u01e8\u01ea\u0005(\u0000"+ - "\u0000\u01e9\u01eb\u0003r9\u0000\u01ea\u01e9\u0001\u0000\u0000\u0000\u01ea"+ - "\u01eb\u0001\u0000\u0000\u0000\u01eb\u01ed\u0001\u0000\u0000\u0000\u01ec"+ - "\u01e1\u0001\u0000\u0000\u0000\u01ec\u01e8\u0001\u0000\u0000\u0000\u01ed"+ - "o\u0001\u0000\u0000\u0000\u01ee\u01f5\u0003z=\u0000\u01ef\u01f1\u0003"+ - "\u0084B\u0000\u01f0\u01ef\u0001\u0000\u0000\u0000\u01f1\u01f2\u0001\u0000"+ - "\u0000\u0000\u01f2\u01f0\u0001\u0000\u0000\u0000\u01f2\u01f3\u0001\u0000"+ - "\u0000\u0000\u01f3\u01f5\u0001\u0000\u0000\u0000\u01f4\u01ee\u0001\u0000"+ - "\u0000\u0000\u01f4\u01f0\u0001\u0000\u0000\u0000\u01f5q\u0001\u0000\u0000"+ - "\u0000\u01f6\u01fe\u0003z=\u0000\u01f7\u01fa\u0003\u0084B\u0000\u01f8"+ - "\u01fa\u0005(\u0000\u0000\u01f9\u01f7\u0001\u0000\u0000\u0000\u01f9\u01f8"+ - "\u0001\u0000\u0000\u0000\u01fa\u01fb\u0001\u0000\u0000\u0000\u01fb\u01f9"+ - "\u0001\u0000\u0000\u0000\u01fb\u01fc\u0001\u0000\u0000\u0000\u01fc\u01fe"+ - "\u0001\u0000\u0000\u0000\u01fd\u01f6\u0001\u0000\u0000\u0000\u01fd\u01f9"+ - "\u0001\u0000\u0000\u0000\u01fes\u0001\u0000\u0000\u0000\u01ff\u0200\u0005"+ - "%\u0000\u0000\u0200u\u0001\u0000\u0000\u0000\u0201\u0202\u0003|>\u0000"+ - "\u0202w\u0001\u0000\u0000\u0000\u0203\u0204\u0005%\u0000\u0000\u0204y"+ - "\u0001\u0000\u0000\u0000\u0205\u0206\u0007\u0002\u0000\u0000\u0206{\u0001"+ - "\u0000\u0000\u0000\u0207\u0209\u0003\u0084B\u0000\u0208\u020a\u0003\u0084"+ - "B\u0000\u0209\u0208\u0001\u0000\u0000\u0000\u020a\u020b\u0001\u0000\u0000"+ - "\u0000\u020b\u0209\u0001\u0000\u0000\u0000\u020b\u020c\u0001\u0000\u0000"+ - "\u0000\u020c\u0210\u0001\u0000\u0000\u0000\u020d\u0210\u0003z=\u0000\u020e"+ - "\u0210\u0003\u0084B\u0000\u020f\u0207\u0001\u0000\u0000\u0000\u020f\u020d"+ - "\u0001\u0000\u0000\u0000\u020f\u020e\u0001\u0000\u0000\u0000\u0210}\u0001"+ - "\u0000\u0000\u0000\u0211\u0213\u0003\u0080@\u0000\u0212\u0214\u0003\u0080"+ - "@\u0000\u0213\u0212\u0001\u0000\u0000\u0000\u0214\u0215\u0001\u0000\u0000"+ - "\u0000\u0215\u0213\u0001\u0000\u0000\u0000\u0215\u0216\u0001\u0000\u0000"+ - "\u0000\u0216\u021a\u0001\u0000\u0000\u0000\u0217\u021a\u0003z=\u0000\u0218"+ - "\u021a\u0003\u0080@\u0000\u0219\u0211\u0001\u0000\u0000\u0000\u0219\u0217"+ - "\u0001\u0000\u0000\u0000\u0219\u0218\u0001\u0000\u0000\u0000\u021a\u007f"+ - "\u0001\u0000\u0000\u0000\u021b\u021c\u0007\u0003\u0000\u0000\u021c\u0081"+ - "\u0001\u0000\u0000\u0000\u021d\u0221\u0003\u0080@\u0000\u021e\u0221\u0005"+ - "\u001b\u0000\u0000\u021f\u0221\u0005\u001a\u0000\u0000\u0220\u021d\u0001"+ - "\u0000\u0000\u0000\u0220\u021e\u0001\u0000\u0000\u0000\u0220\u021f\u0001"+ - "\u0000\u0000\u0000\u0221\u0083\u0001\u0000\u0000\u0000\u0222\u0223\u0007"+ - "\u0004\u0000\u0000\u0223\u0085\u0001\u0000\u0000\u0000H\u0089\u0090\u0099"+ - "\u00a0\u00b4\u00b8\u00bc\u00c1\u00c5\u00ca\u00cf\u00dc\u00e1\u00e5\u00ea"+ - "\u00ef\u00f6\u00f8\u0104\u0110\u0115\u0117\u011c\u0129\u0134\u013b\u0141"+ - "\u0148\u014d\u0156\u015d\u0166\u016e\u0170\u0174\u0176\u017a\u017e\u0180"+ - "\u0184\u0186\u018c\u018e\u0193\u0195\u0197\u019d\u019f\u01a1\u01a8\u01b1"+ - "\u01b5\u01ba\u01c1\u01ca\u01d2\u01da\u01dd\u01e4\u01e6\u01ea\u01ec\u01f2"+ - "\u01f4\u01f9\u01fb\u01fd\u020b\u020f\u0215\u0219\u0220"; + "\u0003\u0004\u00b7\b\u0004\u0001\u0005\u0001\u0005\u0003\u0005\u00bb\b"+ + "\u0005\u0001\u0006\u0001\u0006\u0003\u0006\u00bf\b\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0003\u0006\u00c4\b\u0006\u0001\u0007\u0001\u0007\u0003"+ + "\u0007\u00c8\b\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0003\u0007\u00cd"+ + "\b\u0007\u0001\b\u0001\b\u0001\b\u0003\b\u00d2\b\b\u0001\t\u0001\t\u0001"+ + "\t\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f"+ + "\u0001\f\u0003\f\u00df\b\f\u0001\f\u0001\f\u0001\f\u0003\f\u00e4\b\f\u0001"+ + "\r\u0001\r\u0003\r\u00e8\b\r\u0001\r\u0001\r\u0001\r\u0003\r\u00ed\b\r"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0003\u000e\u00f2\b\u000e\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0004\u000f\u00f7\b\u000f\u000b\u000f\f\u000f"+ + "\u00f8\u0003\u000f\u00fb\b\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0003\u0012\u0107\b\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ + "\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0003\u0015\u0113\b\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0003"+ + "\u0015\u0118\b\u0015\u0003\u0015\u011a\b\u0015\u0001\u0016\u0004\u0016"+ + "\u011d\b\u0016\u000b\u0016\f\u0016\u011e\u0001\u0017\u0001\u0017\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u001a\u0001\u001a\u0004\u001a\u012b\b\u001a\u000b\u001a\f\u001a\u012c"+ + "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0003\u001c\u0133\b\u001c"+ + "\u0001\u001c\u0003\u001c\u0136\b\u001c\u0001\u001d\u0001\u001d\u0001\u001e"+ + "\u0001\u001e\u0001\u001f\u0004\u001f\u013d\b\u001f\u000b\u001f\f\u001f"+ + "\u013e\u0001 \u0001 \u0001 \u0004 \u0144\b \u000b \f \u0145\u0001!\u0001"+ + "!\u0005!\u014a\b!\n!\f!\u014d\t!\u0001!\u0001!\u0005!\u0151\b!\n!\f!\u0154"+ + "\t!\u0005!\u0156\b!\n!\f!\u0159\t!\u0001\"\u0001\"\u0001\"\u0001#\u0005"+ + "#\u015f\b#\n#\f#\u0162\t#\u0001$\u0001$\u0001%\u0001%\u0003%\u0168\b%"+ + "\u0001%\u0001%\u0001&\u0001&\u0001&\u0005&\u016f\b&\n&\f&\u0172\t&\u0001"+ + "\'\u0001\'\u0001(\u0001(\u0001(\u0003(\u0179\b(\u0003(\u017b\b(\u0001"+ + "(\u0001(\u0003(\u017f\b(\u0003(\u0181\b(\u0001(\u0001(\u0003(\u0185\b"+ + "(\u0001(\u0001(\u0003(\u0189\b(\u0003(\u018b\b(\u0001(\u0001(\u0003(\u018f"+ + "\b(\u0003(\u0191\b(\u0001)\u0001)\u0004)\u0195\b)\u000b)\f)\u0196\u0003"+ + ")\u0199\b)\u0001*\u0001*\u0001*\u0004*\u019e\b*\u000b*\f*\u019f\u0003"+ + "*\u01a2\b*\u0001+\u0001+\u0001+\u0001+\u0004+\u01a8\b+\u000b+\f+\u01a9"+ + "\u0003+\u01ac\b+\u0001,\u0001,\u0001-\u0004-\u01b1\b-\u000b-\f-\u01b2"+ + "\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u01bc\b.\u0001"+ + "/\u0001/\u0003/\u01c0\b/\u00010\u00040\u01c3\b0\u000b0\f0\u01c4\u0001"+ + "1\u00011\u00012\u00042\u01ca\b2\u000b2\f2\u01cb\u00013\u00013\u00013\u0001"+ + "3\u00013\u00013\u00013\u00033\u01d5\b3\u00014\u00014\u00015\u00015\u0004"+ + "5\u01db\b5\u000b5\f5\u01dc\u00016\u00016\u00016\u00016\u00056\u01e3\b"+ + "6\n6\f6\u01e6\t6\u00036\u01e8\b6\u00017\u00017\u00018\u00018\u00018\u0003"+ + "8\u01ef\b8\u00038\u01f1\b8\u00018\u00018\u00038\u01f5\b8\u00038\u01f7"+ + "\b8\u00019\u00019\u00049\u01fb\b9\u000b9\f9\u01fc\u00039\u01ff\b9\u0001"+ + ":\u0001:\u0001:\u0004:\u0204\b:\u000b:\f:\u0205\u0003:\u0208\b:\u0001"+ + ";\u0001;\u0001<\u0001<\u0001=\u0001=\u0001>\u0001>\u0001?\u0001?\u0004"+ + "?\u0214\b?\u000b?\f?\u0215\u0001?\u0001?\u0003?\u021a\b?\u0001@\u0001"+ + "@\u0004@\u021e\b@\u000b@\f@\u021f\u0001@\u0001@\u0003@\u0224\b@\u0001"+ + "A\u0001A\u0001B\u0001B\u0001B\u0003B\u022b\bB\u0001C\u0001C\u0001C\u0000"+ + "\u0000D\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+ + "\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ + "\u0082\u0084\u0086\u0000\u0005\u0002\u0000((11\u0002\u0000!$&&\u0001\u0000"+ + "\u001f \u0001\u0000\u001f&\u0002\u0000\u0018\u001c\u001e&\u024c\u0000"+ + "\u008b\u0001\u0000\u0000\u0000\u0002\u0096\u0001\u0000\u0000\u0000\u0004"+ + "\u009b\u0001\u0000\u0000\u0000\u0006\u009e\u0001\u0000\u0000\u0000\b\u00b6"+ + "\u0001\u0000\u0000\u0000\n\u00ba\u0001\u0000\u0000\u0000\f\u00bc\u0001"+ + "\u0000\u0000\u0000\u000e\u00c5\u0001\u0000\u0000\u0000\u0010\u00ce\u0001"+ + "\u0000\u0000\u0000\u0012\u00d3\u0001\u0000\u0000\u0000\u0014\u00d6\u0001"+ + "\u0000\u0000\u0000\u0016\u00d9\u0001\u0000\u0000\u0000\u0018\u00dc\u0001"+ + "\u0000\u0000\u0000\u001a\u00e5\u0001\u0000\u0000\u0000\u001c\u00ee\u0001"+ + "\u0000\u0000\u0000\u001e\u00f3\u0001\u0000\u0000\u0000 \u00fc\u0001\u0000"+ + "\u0000\u0000\"\u00ff\u0001\u0000\u0000\u0000$\u0102\u0001\u0000\u0000"+ + "\u0000&\u0108\u0001\u0000\u0000\u0000(\u010b\u0001\u0000\u0000\u0000*"+ + "\u0119\u0001\u0000\u0000\u0000,\u011c\u0001\u0000\u0000\u0000.\u0120\u0001"+ + "\u0000\u0000\u00000\u0122\u0001\u0000\u0000\u00002\u0125\u0001\u0000\u0000"+ + "\u00004\u012a\u0001\u0000\u0000\u00006\u012e\u0001\u0000\u0000\u00008"+ + "\u0130\u0001\u0000\u0000\u0000:\u0137\u0001\u0000\u0000\u0000<\u0139\u0001"+ + "\u0000\u0000\u0000>\u013c\u0001\u0000\u0000\u0000@\u0140\u0001\u0000\u0000"+ + "\u0000B\u0147\u0001\u0000\u0000\u0000D\u015a\u0001\u0000\u0000\u0000F"+ + "\u0160\u0001\u0000\u0000\u0000H\u0163\u0001\u0000\u0000\u0000J\u0165\u0001"+ + "\u0000\u0000\u0000L\u016b\u0001\u0000\u0000\u0000N\u0173\u0001\u0000\u0000"+ + "\u0000P\u0190\u0001\u0000\u0000\u0000R\u0198\u0001\u0000\u0000\u0000T"+ + "\u01a1\u0001\u0000\u0000\u0000V\u01ab\u0001\u0000\u0000\u0000X\u01ad\u0001"+ + "\u0000\u0000\u0000Z\u01b0\u0001\u0000\u0000\u0000\\\u01bb\u0001\u0000"+ + "\u0000\u0000^\u01bf\u0001\u0000\u0000\u0000`\u01c2\u0001\u0000\u0000\u0000"+ + "b\u01c6\u0001\u0000\u0000\u0000d\u01c9\u0001\u0000\u0000\u0000f\u01d4"+ + "\u0001\u0000\u0000\u0000h\u01d6\u0001\u0000\u0000\u0000j\u01d8\u0001\u0000"+ + "\u0000\u0000l\u01e7\u0001\u0000\u0000\u0000n\u01e9\u0001\u0000\u0000\u0000"+ + "p\u01f6\u0001\u0000\u0000\u0000r\u01fe\u0001\u0000\u0000\u0000t\u0207"+ + "\u0001\u0000\u0000\u0000v\u0209\u0001\u0000\u0000\u0000x\u020b\u0001\u0000"+ + "\u0000\u0000z\u020d\u0001\u0000\u0000\u0000|\u020f\u0001\u0000\u0000\u0000"+ + "~\u0219\u0001\u0000\u0000\u0000\u0080\u0223\u0001\u0000\u0000\u0000\u0082"+ + "\u0225\u0001\u0000\u0000\u0000\u0084\u022a\u0001\u0000\u0000\u0000\u0086"+ + "\u022c\u0001\u0000\u0000\u0000\u0088\u008a\u0003\u0002\u0001\u0000\u0089"+ + "\u0088\u0001\u0000\u0000\u0000\u008a\u008d\u0001\u0000\u0000\u0000\u008b"+ + "\u0089\u0001\u0000\u0000\u0000\u008b\u008c\u0001\u0000\u0000\u0000\u008c"+ + "\u008e\u0001\u0000\u0000\u0000\u008d\u008b\u0001\u0000\u0000\u0000\u008e"+ + "\u0090\u0003\u0004\u0002\u0000\u008f\u0091\u0003\u0006\u0003\u0000\u0090"+ + "\u008f\u0001\u0000\u0000\u0000\u0091\u0092\u0001\u0000\u0000\u0000\u0092"+ + "\u0090\u0001\u0000\u0000\u0000\u0092\u0093\u0001\u0000\u0000\u0000\u0093"+ + "\u0094\u0001\u0000\u0000\u0000\u0094\u0095\u0005\u0000\u0000\u0001\u0095"+ + "\u0001\u0001\u0000\u0000\u0000\u0096\u0097\u0005\u0001\u0000\u0000\u0097"+ + "\u0003\u0001\u0000\u0000\u0000\u0098\u009a\u0003$\u0012\u0000\u0099\u0098"+ + "\u0001\u0000\u0000\u0000\u009a\u009d\u0001\u0000\u0000\u0000\u009b\u0099"+ + "\u0001\u0000\u0000\u0000\u009b\u009c\u0001\u0000\u0000\u0000\u009c\u0005"+ + "\u0001\u0000\u0000\u0000\u009d\u009b\u0001\u0000\u0000\u0000\u009e\u00a2"+ + "\u0003\f\u0006\u0000\u009f\u00a1\u0003\b\u0004\u0000\u00a0\u009f\u0001"+ + "\u0000\u0000\u0000\u00a1\u00a4\u0001\u0000\u0000\u0000\u00a2\u00a0\u0001"+ + "\u0000\u0000\u0000\u00a2\u00a3\u0001\u0000\u0000\u0000\u00a3\u0007\u0001"+ + "\u0000\u0000\u0000\u00a4\u00a2\u0001\u0000\u0000\u0000\u00a5\u00b7\u0003"+ + "\u000e\u0007\u0000\u00a6\u00b7\u0003\u0010\b\u0000\u00a7\u00b7\u0003\u0012"+ + "\t\u0000\u00a8\u00b7\u0003\u0014\n\u0000\u00a9\u00b7\u0003\u0016\u000b"+ + "\u0000\u00aa\u00b7\u0003\u0018\f\u0000\u00ab\u00b7\u0003\u001a\r\u0000"+ + "\u00ac\u00b7\u0003\u001c\u000e\u0000\u00ad\u00b7\u0003\u001e\u000f\u0000"+ + "\u00ae\u00b7\u0003 \u0010\u0000\u00af\u00b7\u0003\"\u0011\u0000\u00b0"+ + "\u00b7\u0003$\u0012\u0000\u00b1\u00b7\u0003&\u0013\u0000\u00b2\u00b7\u0003"+ + "(\u0014\u0000\u00b3\u00b7\u0003*\u0015\u0000\u00b4\u00b7\u00030\u0018"+ + "\u0000\u00b5\u00b7\u00032\u0019\u0000\u00b6\u00a5\u0001\u0000\u0000\u0000"+ + "\u00b6\u00a6\u0001\u0000\u0000\u0000\u00b6\u00a7\u0001\u0000\u0000\u0000"+ + "\u00b6\u00a8\u0001\u0000\u0000\u0000\u00b6\u00a9\u0001\u0000\u0000\u0000"+ + "\u00b6\u00aa\u0001\u0000\u0000\u0000\u00b6\u00ab\u0001\u0000\u0000\u0000"+ + "\u00b6\u00ac\u0001\u0000\u0000\u0000\u00b6\u00ad\u0001\u0000\u0000\u0000"+ + "\u00b6\u00ae\u0001\u0000\u0000\u0000\u00b6\u00af\u0001\u0000\u0000\u0000"+ + "\u00b6\u00b0\u0001\u0000\u0000\u0000\u00b6\u00b1\u0001\u0000\u0000\u0000"+ + "\u00b6\u00b2\u0001\u0000\u0000\u0000\u00b6\u00b3\u0001\u0000\u0000\u0000"+ + "\u00b6\u00b4\u0001\u0000\u0000\u0000\u00b6\u00b5\u0001\u0000\u0000\u0000"+ + "\u00b7\t\u0001\u0000\u0000\u0000\u00b8\u00bb\u0003\f\u0006\u0000\u00b9"+ + "\u00bb\u0003\b\u0004\u0000\u00ba\u00b8\u0001\u0000\u0000\u0000\u00ba\u00b9"+ + "\u0001\u0000\u0000\u0000\u00bb\u000b\u0001\u0000\u0000\u0000\u00bc\u00be"+ + "\u0005\u0003\u0000\u0000\u00bd\u00bf\u00034\u001a\u0000\u00be\u00bd\u0001"+ + "\u0000\u0000\u0000\u00be\u00bf\u0001\u0000\u0000\u0000\u00bf\u00c0\u0001"+ + "\u0000\u0000\u0000\u00c0\u00c3\u0003P(\u0000\u00c1\u00c2\u0005+\u0000"+ + "\u0000\u00c2\u00c4\u0003X,\u0000\u00c3\u00c1\u0001\u0000\u0000\u0000\u00c3"+ + "\u00c4\u0001\u0000\u0000\u0000\u00c4\r\u0001\u0000\u0000\u0000\u00c5\u00c7"+ + "\u0005\u0004\u0000\u0000\u00c6\u00c8\u00034\u001a\u0000\u00c7\u00c6\u0001"+ + "\u0000\u0000\u0000\u00c7\u00c8\u0001\u0000\u0000\u0000\u00c8\u00cc\u0001"+ + "\u0000\u0000\u0000\u00c9\u00cd\u0003:\u001d\u0000\u00ca\u00cd\u0003<\u001e"+ + "\u0000\u00cb\u00cd\u0003@ \u0000\u00cc\u00c9\u0001\u0000\u0000\u0000\u00cc"+ + "\u00ca\u0001\u0000\u0000\u0000\u00cc\u00cb\u0001\u0000\u0000\u0000\u00cd"+ + "\u000f\u0001\u0000\u0000\u0000\u00ce\u00d1\u0005\u0005\u0000\u0000\u00cf"+ + "\u00d2\u0003:\u001d\u0000\u00d0\u00d2\u0003<\u001e\u0000\u00d1\u00cf\u0001"+ + "\u0000\u0000\u0000\u00d1\u00d0\u0001\u0000\u0000\u0000\u00d2\u0011\u0001"+ + "\u0000\u0000\u0000\u00d3\u00d4\u0005\u0007\u0000\u0000\u00d4\u00d5\u0003"+ + "Z-\u0000\u00d5\u0013\u0001\u0000\u0000\u0000\u00d6\u00d7\u0005\b\u0000"+ + "\u0000\u00d7\u00d8\u0003`0\u0000\u00d8\u0015\u0001\u0000\u0000\u0000\u00d9"+ + "\u00da\u0005\t\u0000\u0000\u00da\u00db\u0003d2\u0000\u00db\u0017\u0001"+ + "\u0000\u0000\u0000\u00dc\u00de\u0005\n\u0000\u0000\u00dd\u00df\u00034"+ + "\u001a\u0000\u00de\u00dd\u0001\u0000\u0000\u0000\u00de\u00df\u0001\u0000"+ + "\u0000\u0000\u00df\u00e3\u0001\u0000\u0000\u0000\u00e0\u00e4\u0003@ \u0000"+ + "\u00e1\u00e4\u0003J%\u0000\u00e2\u00e4\u0003j5\u0000\u00e3\u00e0\u0001"+ + "\u0000\u0000\u0000\u00e3\u00e1\u0001\u0000\u0000\u0000\u00e3\u00e2\u0001"+ + "\u0000\u0000\u0000\u00e4\u0019\u0001\u0000\u0000\u0000\u00e5\u00e7\u0005"+ + "\u000b\u0000\u0000\u00e6\u00e8\u00034\u001a\u0000\u00e7\u00e6\u0001\u0000"+ + "\u0000\u0000\u00e7\u00e8\u0001\u0000\u0000\u0000\u00e8\u00ec\u0001\u0000"+ + "\u0000\u0000\u00e9\u00ed\u0003@ \u0000\u00ea\u00ed\u0003J%\u0000\u00eb"+ + "\u00ed\u0003j5\u0000\u00ec\u00e9\u0001\u0000\u0000\u0000\u00ec\u00ea\u0001"+ + "\u0000\u0000\u0000\u00ec\u00eb\u0001\u0000\u0000\u0000\u00ed\u001b\u0001"+ + "\u0000\u0000\u0000\u00ee\u00f1\u0005\f\u0000\u0000\u00ef\u00f2\u0003:"+ + "\u001d\u0000\u00f0\u00f2\u0003<\u001e\u0000\u00f1\u00ef\u0001\u0000\u0000"+ + "\u0000\u00f1\u00f0\u0001\u0000\u0000\u0000\u00f2\u001d\u0001\u0000\u0000"+ + "\u0000\u00f3\u00fa\u0005\r\u0000\u0000\u00f4\u00fb\u0003J%\u0000\u00f5"+ + "\u00f7\u0003l6\u0000\u00f6\u00f5\u0001\u0000\u0000\u0000\u00f7\u00f8\u0001"+ + "\u0000\u0000\u0000\u00f8\u00f6\u0001\u0000\u0000\u0000\u00f8\u00f9\u0001"+ + "\u0000\u0000\u0000\u00f9\u00fb\u0001\u0000\u0000\u0000\u00fa\u00f4\u0001"+ + "\u0000\u0000\u0000\u00fa\u00f6\u0001\u0000\u0000\u0000\u00fb\u001f\u0001"+ + "\u0000\u0000\u0000\u00fc\u00fd\u0005\u000e\u0000\u0000\u00fd\u00fe\u0003"+ + "p8\u0000\u00fe!\u0001\u0000\u0000\u0000\u00ff\u0100\u0005\u000f\u0000"+ + "\u0000\u0100\u0101\u0003n7\u0000\u0101#\u0001\u0000\u0000\u0000\u0102"+ + "\u0103\u0005\u0010\u0000\u0000\u0103\u0106\u0003v;\u0000\u0104\u0105\u0005"+ + "\u001b\u0000\u0000\u0105\u0107\u0003x<\u0000\u0106\u0104\u0001\u0000\u0000"+ + "\u0000\u0106\u0107\u0001\u0000\u0000\u0000\u0107%\u0001\u0000\u0000\u0000"+ + "\u0108\u0109\u0005\u0011\u0000\u0000\u0109\u010a\u0003\n\u0005\u0000\u010a"+ + "\'\u0001\u0000\u0000\u0000\u010b\u010c\u0005\u0012\u0000\u0000\u010c\u010d"+ + "\u0003z=\u0000\u010d)\u0001\u0000\u0000\u0000\u010e\u010f\u0005\u0013"+ + "\u0000\u0000\u010f\u011a\u0005\u0006\u0000\u0000\u0110\u0112\u0005\u0013"+ + "\u0000\u0000\u0111\u0113\u0003,\u0016\u0000\u0112\u0111\u0001\u0000\u0000"+ + "\u0000\u0112\u0113\u0001\u0000\u0000\u0000\u0113\u0114\u0001\u0000\u0000"+ + "\u0000\u0114\u0117\u0005\u0005\u0000\u0000\u0115\u0118\u0003:\u001d\u0000"+ + "\u0116\u0118\u0003<\u001e\u0000\u0117\u0115\u0001\u0000\u0000\u0000\u0117"+ + "\u0116\u0001\u0000\u0000\u0000\u0118\u011a\u0001\u0000\u0000\u0000\u0119"+ + "\u010e\u0001\u0000\u0000\u0000\u0119\u0110\u0001\u0000\u0000\u0000\u011a"+ + "+\u0001\u0000\u0000\u0000\u011b\u011d\u0003.\u0017\u0000\u011c\u011b\u0001"+ + "\u0000\u0000\u0000\u011d\u011e\u0001\u0000\u0000\u0000\u011e\u011c\u0001"+ + "\u0000\u0000\u0000\u011e\u011f\u0001\u0000\u0000\u0000\u011f-\u0001\u0000"+ + "\u0000\u0000\u0120\u0121\u0005\u001c\u0000\u0000\u0121/\u0001\u0000\u0000"+ + "\u0000\u0122\u0123\u0005\u0014\u0000\u0000\u0123\u0124\u0003J%\u0000\u0124"+ + "1\u0001\u0000\u0000\u0000\u0125\u0126\u0005\u0015\u0000\u0000\u0126\u0127"+ + "\u0003~?\u0000\u01273\u0001\u0000\u0000\u0000\u0128\u012b\u00036\u001b"+ + "\u0000\u0129\u012b\u00038\u001c\u0000\u012a\u0128\u0001\u0000\u0000\u0000"+ + "\u012a\u0129\u0001\u0000\u0000\u0000\u012b\u012c\u0001\u0000\u0000\u0000"+ + "\u012c\u012a\u0001\u0000\u0000\u0000\u012c\u012d\u0001\u0000\u0000\u0000"+ + "\u012d5\u0001\u0000\u0000\u0000\u012e\u012f\u0005\u001c\u0000\u0000\u012f"+ + "7\u0001\u0000\u0000\u0000\u0130\u0132\u0005\u001d\u0000\u0000\u0131\u0133"+ + "\u0003P(\u0000\u0132\u0131\u0001\u0000\u0000\u0000\u0132\u0133\u0001\u0000"+ + "\u0000\u0000\u0133\u0135\u0001\u0000\u0000\u0000\u0134\u0136\u0005,\u0000"+ + "\u0000\u0135\u0134\u0001\u0000\u0000\u0000\u0135\u0136\u0001\u0000\u0000"+ + "\u0000\u01369\u0001\u0000\u0000\u0000\u0137\u0138\u0003J%\u0000\u0138"+ + ";\u0001\u0000\u0000\u0000\u0139\u013a\u0003>\u001f\u0000\u013a=\u0001"+ + "\u0000\u0000\u0000\u013b\u013d\u0003\u0086C\u0000\u013c\u013b\u0001\u0000"+ + "\u0000\u0000\u013d\u013e\u0001\u0000\u0000\u0000\u013e\u013c\u0001\u0000"+ + "\u0000\u0000\u013e\u013f\u0001\u0000\u0000\u0000\u013f?\u0001\u0000\u0000"+ + "\u0000\u0140\u0141\u0003B!\u0000\u0141\u0143\u0005(\u0000\u0000\u0142"+ + "\u0144\u0003D\"\u0000\u0143\u0142\u0001\u0000\u0000\u0000\u0144\u0145"+ + "\u0001\u0000\u0000\u0000\u0145\u0143\u0001\u0000\u0000\u0000\u0145\u0146"+ + "\u0001\u0000\u0000\u0000\u0146A\u0001\u0000\u0000\u0000\u0147\u014b\u0005"+ + "\u0016\u0000\u0000\u0148\u014a\u0003\u0086C\u0000\u0149\u0148\u0001\u0000"+ + "\u0000\u0000\u014a\u014d\u0001\u0000\u0000\u0000\u014b\u0149\u0001\u0000"+ + "\u0000\u0000\u014b\u014c\u0001\u0000\u0000\u0000\u014c\u0157\u0001\u0000"+ + "\u0000\u0000\u014d\u014b\u0001\u0000\u0000\u0000\u014e\u0152\u0005\u0016"+ + "\u0000\u0000\u014f\u0151\u0003\u0086C\u0000\u0150\u014f\u0001\u0000\u0000"+ + "\u0000\u0151\u0154\u0001\u0000\u0000\u0000\u0152\u0150\u0001\u0000\u0000"+ + "\u0000\u0152\u0153\u0001\u0000\u0000\u0000\u0153\u0156\u0001\u0000\u0000"+ + "\u0000\u0154\u0152\u0001\u0000\u0000\u0000\u0155\u014e\u0001\u0000\u0000"+ + "\u0000\u0156\u0159\u0001\u0000\u0000\u0000\u0157\u0155\u0001\u0000\u0000"+ + "\u0000\u0157\u0158\u0001\u0000\u0000\u0000\u0158C\u0001\u0000\u0000\u0000"+ + "\u0159\u0157\u0001\u0000\u0000\u0000\u015a\u015b\u0003F#\u0000\u015b\u015c"+ + "\u0003H$\u0000\u015cE\u0001\u0000\u0000\u0000\u015d\u015f\u0007\u0000"+ + "\u0000\u0000\u015e\u015d\u0001\u0000\u0000\u0000\u015f\u0162\u0001\u0000"+ + "\u0000\u0000\u0160\u015e\u0001\u0000\u0000\u0000\u0160\u0161\u0001\u0000"+ + "\u0000\u0000\u0161G\u0001\u0000\u0000\u0000\u0162\u0160\u0001\u0000\u0000"+ + "\u0000\u0163\u0164\u0005&\u0000\u0000\u0164I\u0001\u0000\u0000\u0000\u0165"+ + "\u0167\u0005\u0018\u0000\u0000\u0166\u0168\u0003L&\u0000\u0167\u0166\u0001"+ + "\u0000\u0000\u0000\u0167\u0168\u0001\u0000\u0000\u0000\u0168\u0169\u0001"+ + "\u0000\u0000\u0000\u0169\u016a\u0005\u0019\u0000\u0000\u016aK\u0001\u0000"+ + "\u0000\u0000\u016b\u0170\u0003N\'\u0000\u016c\u016d\u0005\u001a\u0000"+ + "\u0000\u016d\u016f\u0003N\'\u0000\u016e\u016c\u0001\u0000\u0000\u0000"+ + "\u016f\u0172\u0001\u0000\u0000\u0000\u0170\u016e\u0001\u0000\u0000\u0000"+ + "\u0170\u0171\u0001\u0000\u0000\u0000\u0171M\u0001\u0000\u0000\u0000\u0172"+ + "\u0170\u0001\u0000\u0000\u0000\u0173\u0174\u0005\u001f\u0000\u0000\u0174"+ + "O\u0001\u0000\u0000\u0000\u0175\u017a\u0003R)\u0000\u0176\u0178\u0005"+ + ")\u0000\u0000\u0177\u0179\u0003T*\u0000\u0178\u0177\u0001\u0000\u0000"+ + "\u0000\u0178\u0179\u0001\u0000\u0000\u0000\u0179\u017b\u0001\u0000\u0000"+ + "\u0000\u017a\u0176\u0001\u0000\u0000\u0000\u017a\u017b\u0001\u0000\u0000"+ + "\u0000\u017b\u0180\u0001\u0000\u0000\u0000\u017c\u017e\u0005*\u0000\u0000"+ + "\u017d\u017f\u0003V+\u0000\u017e\u017d\u0001\u0000\u0000\u0000\u017e\u017f"+ + "\u0001\u0000\u0000\u0000\u017f\u0181\u0001\u0000\u0000\u0000\u0180\u017c"+ + "\u0001\u0000\u0000\u0000\u0180\u0181\u0001\u0000\u0000\u0000\u0181\u0191"+ + "\u0001\u0000\u0000\u0000\u0182\u0184\u0005)\u0000\u0000\u0183\u0185\u0003"+ + "T*\u0000\u0184\u0183\u0001\u0000\u0000\u0000\u0184\u0185\u0001\u0000\u0000"+ + "\u0000\u0185\u018a\u0001\u0000\u0000\u0000\u0186\u0188\u0005*\u0000\u0000"+ + "\u0187\u0189\u0003V+\u0000\u0188\u0187\u0001\u0000\u0000\u0000\u0188\u0189"+ + "\u0001\u0000\u0000\u0000\u0189\u018b\u0001\u0000\u0000\u0000\u018a\u0186"+ + "\u0001\u0000\u0000\u0000\u018a\u018b\u0001\u0000\u0000\u0000\u018b\u0191"+ + "\u0001\u0000\u0000\u0000\u018c\u018e\u0005*\u0000\u0000\u018d\u018f\u0003"+ + "V+\u0000\u018e\u018d\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000\u0000"+ + "\u0000\u018f\u0191\u0001\u0000\u0000\u0000\u0190\u0175\u0001\u0000\u0000"+ + "\u0000\u0190\u0182\u0001\u0000\u0000\u0000\u0190\u018c\u0001\u0000\u0000"+ + "\u0000\u0191Q\u0001\u0000\u0000\u0000\u0192\u0199\u0003|>\u0000\u0193"+ + "\u0195\u0003\u0086C\u0000\u0194\u0193\u0001\u0000\u0000\u0000\u0195\u0196"+ + "\u0001\u0000\u0000\u0000\u0196\u0194\u0001\u0000\u0000\u0000\u0196\u0197"+ + "\u0001\u0000\u0000\u0000\u0197\u0199\u0001\u0000\u0000\u0000\u0198\u0192"+ + "\u0001\u0000\u0000\u0000\u0198\u0194\u0001\u0000\u0000\u0000\u0199S\u0001"+ + "\u0000\u0000\u0000\u019a\u01a2\u0003|>\u0000\u019b\u019e\u0003\u0086C"+ + "\u0000\u019c\u019e\u0005)\u0000\u0000\u019d\u019b\u0001\u0000\u0000\u0000"+ + "\u019d\u019c\u0001\u0000\u0000\u0000\u019e\u019f\u0001\u0000\u0000\u0000"+ + "\u019f\u019d\u0001\u0000\u0000\u0000\u019f\u01a0\u0001\u0000\u0000\u0000"+ + "\u01a0\u01a2\u0001\u0000\u0000\u0000\u01a1\u019a\u0001\u0000\u0000\u0000"+ + "\u01a1\u019d\u0001\u0000\u0000\u0000\u01a2U\u0001\u0000\u0000\u0000\u01a3"+ + "\u01ac\u0003|>\u0000\u01a4\u01a8\u0003\u0086C\u0000\u01a5\u01a8\u0005"+ + ")\u0000\u0000\u01a6\u01a8\u0005*\u0000\u0000\u01a7\u01a4\u0001\u0000\u0000"+ + "\u0000\u01a7\u01a5\u0001\u0000\u0000\u0000\u01a7\u01a6\u0001\u0000\u0000"+ + "\u0000\u01a8\u01a9\u0001\u0000\u0000\u0000\u01a9\u01a7\u0001\u0000\u0000"+ + "\u0000\u01a9\u01aa\u0001\u0000\u0000\u0000\u01aa\u01ac\u0001\u0000\u0000"+ + "\u0000\u01ab\u01a3\u0001\u0000\u0000\u0000\u01ab\u01a7\u0001\u0000\u0000"+ + "\u0000\u01acW\u0001\u0000\u0000\u0000\u01ad\u01ae\u0005&\u0000\u0000\u01ae"+ + "Y\u0001\u0000\u0000\u0000\u01af\u01b1\u0003\\.\u0000\u01b0\u01af\u0001"+ + "\u0000\u0000\u0000\u01b1\u01b2\u0001\u0000\u0000\u0000\u01b2\u01b0\u0001"+ + "\u0000\u0000\u0000\u01b2\u01b3\u0001\u0000\u0000\u0000\u01b3[\u0001\u0000"+ + "\u0000\u0000\u01b4\u01b5\u0003^/\u0000\u01b5\u01b6\u0005\u001b\u0000\u0000"+ + "\u01b6\u01b7\u0003\u0080@\u0000\u01b7\u01bc\u0001\u0000\u0000\u0000\u01b8"+ + "\u01b9\u0003^/\u0000\u01b9\u01ba\u0003~?\u0000\u01ba\u01bc\u0001\u0000"+ + "\u0000\u0000\u01bb\u01b4\u0001\u0000\u0000\u0000\u01bb\u01b8\u0001\u0000"+ + "\u0000\u0000\u01bc]\u0001\u0000\u0000\u0000\u01bd\u01c0\u0003|>\u0000"+ + "\u01be\u01c0\u0005&\u0000\u0000\u01bf\u01bd\u0001\u0000\u0000\u0000\u01bf"+ + "\u01be\u0001\u0000\u0000\u0000\u01c0_\u0001\u0000\u0000\u0000\u01c1\u01c3"+ + "\u0003b1\u0000\u01c2\u01c1\u0001\u0000\u0000\u0000\u01c3\u01c4\u0001\u0000"+ + "\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c4\u01c5\u0001\u0000"+ + "\u0000\u0000\u01c5a\u0001\u0000\u0000\u0000\u01c6\u01c7\u0007\u0001\u0000"+ + "\u0000\u01c7c\u0001\u0000\u0000\u0000\u01c8\u01ca\u0003f3\u0000\u01c9"+ + "\u01c8\u0001\u0000\u0000\u0000\u01ca\u01cb\u0001\u0000\u0000\u0000\u01cb"+ + "\u01c9\u0001\u0000\u0000\u0000\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc"+ + "e\u0001\u0000\u0000\u0000\u01cd\u01ce\u0003h4\u0000\u01ce\u01cf\u0005"+ + "\u001b\u0000\u0000\u01cf\u01d0\u0003\u0080@\u0000\u01d0\u01d5\u0001\u0000"+ + "\u0000\u0000\u01d1\u01d2\u0003h4\u0000\u01d2\u01d3\u0003~?\u0000\u01d3"+ + "\u01d5\u0001\u0000\u0000\u0000\u01d4\u01cd\u0001\u0000\u0000\u0000\u01d4"+ + "\u01d1\u0001\u0000\u0000\u0000\u01d5g\u0001\u0000\u0000\u0000\u01d6\u01d7"+ + "\u0005&\u0000\u0000\u01d7i\u0001\u0000\u0000\u0000\u01d8\u01da\u0003l"+ + "6\u0000\u01d9\u01db\u0003l6\u0000\u01da\u01d9\u0001\u0000\u0000\u0000"+ + "\u01db\u01dc\u0001\u0000\u0000\u0000\u01dc\u01da\u0001\u0000\u0000\u0000"+ + "\u01dc\u01dd\u0001\u0000\u0000\u0000\u01ddk\u0001\u0000\u0000\u0000\u01de"+ + "\u01e8\u0003|>\u0000\u01df\u01e4\u0003\u0084B\u0000\u01e0\u01e1\u0004"+ + "6\u0000\u0000\u01e1\u01e3\u0003\u0084B\u0000\u01e2\u01e0\u0001\u0000\u0000"+ + "\u0000\u01e3\u01e6\u0001\u0000\u0000\u0000\u01e4\u01e2\u0001\u0000\u0000"+ + "\u0000\u01e4\u01e5\u0001\u0000\u0000\u0000\u01e5\u01e8\u0001\u0000\u0000"+ + "\u0000\u01e6\u01e4\u0001\u0000\u0000\u0000\u01e7\u01de\u0001\u0000\u0000"+ + "\u0000\u01e7\u01df\u0001\u0000\u0000\u0000\u01e8m\u0001\u0000\u0000\u0000"+ + "\u01e9\u01ea\u0003~?\u0000\u01eao\u0001\u0000\u0000\u0000\u01eb\u01f0"+ + "\u0003r9\u0000\u01ec\u01ee\u0005)\u0000\u0000\u01ed\u01ef\u0003t:\u0000"+ + "\u01ee\u01ed\u0001\u0000\u0000\u0000\u01ee\u01ef\u0001\u0000\u0000\u0000"+ + "\u01ef\u01f1\u0001\u0000\u0000\u0000\u01f0\u01ec\u0001\u0000\u0000\u0000"+ + "\u01f0\u01f1\u0001\u0000\u0000\u0000\u01f1\u01f7\u0001\u0000\u0000\u0000"+ + "\u01f2\u01f4\u0005)\u0000\u0000\u01f3\u01f5\u0003t:\u0000\u01f4\u01f3"+ + "\u0001\u0000\u0000\u0000\u01f4\u01f5\u0001\u0000\u0000\u0000\u01f5\u01f7"+ + "\u0001\u0000\u0000\u0000\u01f6\u01eb\u0001\u0000\u0000\u0000\u01f6\u01f2"+ + "\u0001\u0000\u0000\u0000\u01f7q\u0001\u0000\u0000\u0000\u01f8\u01ff\u0003"+ + "|>\u0000\u01f9\u01fb\u0003\u0086C\u0000\u01fa\u01f9\u0001\u0000\u0000"+ + "\u0000\u01fb\u01fc\u0001\u0000\u0000\u0000\u01fc\u01fa\u0001\u0000\u0000"+ + "\u0000\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd\u01ff\u0001\u0000\u0000"+ + "\u0000\u01fe\u01f8\u0001\u0000\u0000\u0000\u01fe\u01fa\u0001\u0000\u0000"+ + "\u0000\u01ffs\u0001\u0000\u0000\u0000\u0200\u0208\u0003|>\u0000\u0201"+ + "\u0204\u0003\u0086C\u0000\u0202\u0204\u0005)\u0000\u0000\u0203\u0201\u0001"+ + "\u0000\u0000\u0000\u0203\u0202\u0001\u0000\u0000\u0000\u0204\u0205\u0001"+ + "\u0000\u0000\u0000\u0205\u0203\u0001\u0000\u0000\u0000\u0205\u0206\u0001"+ + "\u0000\u0000\u0000\u0206\u0208\u0001\u0000\u0000\u0000\u0207\u0200\u0001"+ + "\u0000\u0000\u0000\u0207\u0203\u0001\u0000\u0000\u0000\u0208u\u0001\u0000"+ + "\u0000\u0000\u0209\u020a\u0005&\u0000\u0000\u020aw\u0001\u0000\u0000\u0000"+ + "\u020b\u020c\u0003~?\u0000\u020cy\u0001\u0000\u0000\u0000\u020d\u020e"+ + "\u0005&\u0000\u0000\u020e{\u0001\u0000\u0000\u0000\u020f\u0210\u0007\u0002"+ + "\u0000\u0000\u0210}\u0001\u0000\u0000\u0000\u0211\u0213\u0003\u0086C\u0000"+ + "\u0212\u0214\u0003\u0086C\u0000\u0213\u0212\u0001\u0000\u0000\u0000\u0214"+ + "\u0215\u0001\u0000\u0000\u0000\u0215\u0213\u0001\u0000\u0000\u0000\u0215"+ + "\u0216\u0001\u0000\u0000\u0000\u0216\u021a\u0001\u0000\u0000\u0000\u0217"+ + "\u021a\u0003|>\u0000\u0218\u021a\u0003\u0086C\u0000\u0219\u0211\u0001"+ + "\u0000\u0000\u0000\u0219\u0217\u0001\u0000\u0000\u0000\u0219\u0218\u0001"+ + "\u0000\u0000\u0000\u021a\u007f\u0001\u0000\u0000\u0000\u021b\u021d\u0003"+ + "\u0082A\u0000\u021c\u021e\u0003\u0082A\u0000\u021d\u021c\u0001\u0000\u0000"+ + "\u0000\u021e\u021f\u0001\u0000\u0000\u0000\u021f\u021d\u0001\u0000\u0000"+ + "\u0000\u021f\u0220\u0001\u0000\u0000\u0000\u0220\u0224\u0001\u0000\u0000"+ + "\u0000\u0221\u0224\u0003|>\u0000\u0222\u0224\u0003\u0082A\u0000\u0223"+ + "\u021b\u0001\u0000\u0000\u0000\u0223\u0221\u0001\u0000\u0000\u0000\u0223"+ + "\u0222\u0001\u0000\u0000\u0000\u0224\u0081\u0001\u0000\u0000\u0000\u0225"+ + "\u0226\u0007\u0003\u0000\u0000\u0226\u0083\u0001\u0000\u0000\u0000\u0227"+ + "\u022b\u0003\u0082A\u0000\u0228\u022b\u0005\u001b\u0000\u0000\u0229\u022b"+ + "\u0005\u001a\u0000\u0000\u022a\u0227\u0001\u0000\u0000\u0000\u022a\u0228"+ + "\u0001\u0000\u0000\u0000\u022a\u0229\u0001\u0000\u0000\u0000\u022b\u0085"+ + "\u0001\u0000\u0000\u0000\u022c\u022d\u0007\u0004\u0000\u0000\u022d\u0087"+ + "\u0001\u0000\u0000\u0000K\u008b\u0092\u009b\u00a2\u00b6\u00ba\u00be\u00c3"+ + "\u00c7\u00cc\u00d1\u00de\u00e3\u00e7\u00ec\u00f1\u00f8\u00fa\u0106\u0112"+ + "\u0117\u0119\u011e\u012a\u012c\u0132\u0135\u013e\u0145\u014b\u0152\u0157"+ + "\u0160\u0167\u0170\u0178\u017a\u017e\u0180\u0184\u0188\u018a\u018e\u0190"+ + "\u0196\u0198\u019d\u019f\u01a1\u01a7\u01a9\u01ab\u01b2\u01bb\u01bf\u01c4"+ + "\u01cb\u01d4\u01dc\u01e4\u01e7\u01ee\u01f0\u01f4\u01f6\u01fc\u01fe\u0203"+ + "\u0205\u0207\u0215\u0219\u021f\u0223\u022a"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParser.tokens b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParser.tokens index 7e80664958..475a62a132 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParser.tokens +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParser.tokens @@ -26,26 +26,28 @@ RBRACKET=25 COMMA=26 EQUALS=27 FLAG=28 -DASH_DASH=29 -DOUBLE_QUOTED_STRING=30 -SINGLE_QUOTED_STRING=31 -ENV_VAR=32 -SPECIAL_VAR=33 -COMMAND_SUBST=34 -BACKTICK_SUBST=35 -DOLLAR=36 -UNQUOTED_TEXT=37 -WS=38 -NEWLINE=39 -COLON=40 -AT=41 -AS=42 -HP_LINE_CONTINUATION=43 -HP_WS=44 -HP_COMMENT=45 -HP_LINE_COMMENT=46 -HEREDOC_CONTENT=47 -H_NEWLINE=48 +FROM_FLAG=29 +DASH_DASH=30 +DOUBLE_QUOTED_STRING=31 +SINGLE_QUOTED_STRING=32 +ENV_VAR=33 +SPECIAL_VAR=34 +COMMAND_SUBST=35 +BACKTICK_SUBST=36 +DOLLAR=37 +UNQUOTED_TEXT=38 +WS=39 +NEWLINE=40 +COLON=41 +AT=42 +AS=43 +FLAG_END=44 +HP_LINE_CONTINUATION=45 +HP_WS=46 +HP_COMMENT=47 +HP_LINE_COMMENT=48 +HEREDOC_CONTENT=49 +H_NEWLINE=50 'FROM'=3 'RUN'=4 'CMD'=5 @@ -69,7 +71,6 @@ H_NEWLINE=48 ']'=25 ','=26 '='=27 -'--'=29 -'@'=41 -'AS'=42 -'\n'=48 +'--'=30 +'AS'=43 +'\n'=50 diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserBaseListener.java b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserBaseListener.java index 43b74d8e5d..b2b97151bc 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserBaseListener.java +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserBaseListener.java @@ -363,6 +363,18 @@ public class DockerParserBaseListener implements DockerParserListener { *

The default implementation does nothing.

*/ @Override public void exitFlag(DockerParser.FlagContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFromFlag(DockerParser.FromFlagContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFromFlag(DockerParser.FromFlagContext ctx) { } /** * {@inheritDoc} * diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserBaseVisitor.java b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserBaseVisitor.java index fb23055ead..a7e5ff6432 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserBaseVisitor.java +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserBaseVisitor.java @@ -223,6 +223,13 @@ public class DockerParserBaseVisitor extends AbstractParseTreeVisitor impl * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitFlag(DockerParser.FlagContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFromFlag(DockerParser.FromFlagContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserListener.java b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserListener.java index 3b0d6ead31..82ea94a879 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserListener.java +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserListener.java @@ -302,6 +302,16 @@ public interface DockerParserListener extends ParseTreeListener { * @param ctx the parse tree */ void exitFlag(DockerParser.FlagContext ctx); + /** + * Enter a parse tree produced by {@link DockerParser#fromFlag}. + * @param ctx the parse tree + */ + void enterFromFlag(DockerParser.FromFlagContext ctx); + /** + * Exit a parse tree produced by {@link DockerParser#fromFlag}. + * @param ctx the parse tree + */ + void exitFromFlag(DockerParser.FromFlagContext ctx); /** * Enter a parse tree produced by {@link DockerParser#execForm}. * @param ctx the parse tree diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserVisitor.java b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserVisitor.java index 336255eb6c..4b37171713 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserVisitor.java +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/internal/grammar/DockerParserVisitor.java @@ -193,6 +193,12 @@ public interface DockerParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitFlag(DockerParser.FlagContext ctx); + /** + * Visit a parse tree produced by {@link DockerParser#fromFlag}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFromFlag(DockerParser.FromFlagContext ctx); /** * Visit a parse tree produced by {@link DockerParser#execForm}. * @param ctx the parse tree diff --git a/rewrite-docker/src/main/java/org/openrewrite/docker/trait/DockerCopyFrom.java b/rewrite-docker/src/main/java/org/openrewrite/docker/trait/DockerCopyFrom.java index 93c81ac4f1..6767e4dc4e 100644 --- a/rewrite-docker/src/main/java/org/openrewrite/docker/trait/DockerCopyFrom.java +++ b/rewrite-docker/src/main/java/org/openrewrite/docker/trait/DockerCopyFrom.java @@ -23,7 +23,6 @@ import org.openrewrite.Tree; import org.openrewrite.TreeVisitor; import org.openrewrite.docker.DockerVisitor; -import org.openrewrite.docker.internal.ArgumentContents; import org.openrewrite.docker.internal.ImageReferences; import org.openrewrite.docker.tree.Docker; import org.openrewrite.internal.ListUtils; @@ -90,10 +89,7 @@ public class DockerCopyFrom implements DockerImageReference return null; } Docker.Argument arg = fromArgument(); - if (arg == null) { - return null; - } - return ImageReferences.split(arg.getContents(), arg.getPrefix()); + return arg == null ? null : ImageReferences.split(arg.getContents(), arg.getPrefix()); } /** @@ -189,7 +185,7 @@ public Docker.Instruction withImageReference(String reference) { if (arg == null) { return getTree(); } - Docker.Argument newValue = arg.withContents(ArgumentContents.of(reference, null)); + Docker.Argument newValue = arg.withContents(ImageReferences.contents(reference)); List newFlags = ListUtils.map(flags(), f -> "from".equals(f.getName()) ? f.withValue(newValue) : f); Docker.Instruction instruction = getTree(); diff --git a/rewrite-docker/src/test/java/org/openrewrite/docker/trait/DockerCopyFromTest.java b/rewrite-docker/src/test/java/org/openrewrite/docker/trait/DockerCopyFromTest.java index 30b25f4121..29c1b8c40f 100644 --- a/rewrite-docker/src/test/java/org/openrewrite/docker/trait/DockerCopyFromTest.java +++ b/rewrite-docker/src/test/java/org/openrewrite/docker/trait/DockerCopyFromTest.java @@ -16,7 +16,9 @@ package org.openrewrite.docker.trait; import org.junit.jupiter.api.Test; +import org.openrewrite.Cursor; import org.openrewrite.DocumentExample; +import org.openrewrite.docker.tree.Docker; import org.openrewrite.marker.SearchResult; import org.openrewrite.test.RewriteTest; @@ -457,6 +459,55 @@ void quotedValueKeepsItsColon() { ); } + @Test + void variableTagIsSplitFromItsVariableImageName() { + rewriteRun( + spec -> spec.recipe(RewriteTest.toRecipe(() -> + new DockerCopyFrom.Matcher().asVisitor((image, ctx) -> { + assertThat(image.getImageName()).contains("${IMAGE}"); + assertThat(image.getTag()).contains("${TAG}"); + return SearchResult.found(image.getTree()); + }) + )), + docker( + """ + FROM ubuntu + COPY --from=${IMAGE}:${TAG} /out /app + """, + """ + FROM ubuntu + ~~>COPY --from=${IMAGE}:${TAG} /out /app + """ + ) + ); + } + + @Test + void aReferenceARecipeWroteIsReadBackAsItsParts() { + rewriteRun( + spec -> spec.recipe(RewriteTest.toRecipe(() -> + new DockerCopyFrom.Matcher().imageName("nginx").asVisitor((image, ctx) -> { + Docker.Instruction updated = image.withImageReference("registry.example.com:5000/nginx:1.25@sha256:abc"); + DockerCopyFrom reread = new DockerCopyFrom(new Cursor(image.getCursor().getParentOrThrow(), updated)); + assertThat(reread.getImageName()).contains("registry.example.com:5000/nginx"); + assertThat(reread.getTag()).contains("1.25"); + assertThat(reread.getDigest()).contains("sha256:abc"); + return updated; + }) + )), + docker( + """ + FROM ubuntu + COPY --from=nginx /out /app + """, + """ + FROM ubuntu + COPY --from=registry.example.com:5000/nginx:1.25@sha256:abc /out /app + """ + ) + ); + } + @Test void variableDefaultIsNotATag() { rewriteRun( diff --git a/rewrite-docker/src/test/java/org/openrewrite/docker/tree/CopyTest.java b/rewrite-docker/src/test/java/org/openrewrite/docker/tree/CopyTest.java index 71160311be..d46d9d892b 100644 --- a/rewrite-docker/src/test/java/org/openrewrite/docker/tree/CopyTest.java +++ b/rewrite-docker/src/test/java/org/openrewrite/docker/tree/CopyTest.java @@ -431,7 +431,93 @@ void pathHoldingAVariableReferenceIsOneDestination() { ); } + @Test + void fromFlagValueIsSplitOnItsSeparators() { + rewriteRun( + docker( + """ + FROM ubuntu:20.04 + COPY --from=host:5000/img:1.2@sha256:abc /build /app + """, + spec -> spec.afterRecipe(doc -> { + var copy = (Docker.Copy) doc.getStages().getFirst().getInstructions().getLast(); + assertThat(copy.getFlags()).hasSize(1); + Docker.Flag from = copy.getFlags().getFirst(); + assertThat(from.getName()).isEqualTo("from"); + assertThat(from.getValue()).isNotNull(); + assertThat(from.getValue().getContents()).map(CopyTest::literal) + .containsExactly("host:5000/img", ":", "1.2", "@", "sha256:abc"); + }) + ) + ); + } + + @Test + void onlyTheFromFlagCarriesAnImageReference() { + rewriteRun( + docker( + """ + FROM ubuntu:20.04 + COPY --chown=1:2 --from=nginx:1.25 /build /app + """, + spec -> spec.afterRecipe(doc -> { + var copy = (Docker.Copy) doc.getStages().getFirst().getInstructions().getLast(); + assertThat(copy.getFlags()).map(Docker.Flag::getName).containsExactly("chown", "from"); + assertThat(copy.getFlags().getFirst().getValue().getContents()).map(CopyTest::literal) + .containsExactly("1:2"); + assertThat(copy.getFlags().getLast().getValue().getContents()).map(CopyTest::literal) + .containsExactly("nginx", ":", "1.25"); + }) + ) + ); + } + + @Test + void whatFollowsAFromFlagIsNotPartOfItsValue() { + rewriteRun( + docker( + """ + FROM golang AS build + FROM ubuntu:20.04 + COPY --from=build --link /target/ / + """, + spec -> spec.afterRecipe(doc -> { + var copy = (Docker.Copy) doc.getStages().getLast().getInstructions().getLast(); + assertThat(copy.getFlags()).map(Docker.Flag::getName).containsExactly("from", "link"); + assertThat(copy.getFlags().getFirst().getValue().getContents()).map(CopyTest::literal) + .containsExactly("build"); + assertThat(copy.getFlags().getLast().getValue()).isNull(); + assertThat(copy.getShellForm()).isNotNull(); + assertThat(copy.getShellForm().getSources()).map(CopyTest::text).containsExactly("/target/"); + assertThat(text(copy.getShellForm().getDestination())).isEqualTo("/"); + }) + ) + ); + } + + @Test + void aLineContinuationEndsAFromFlagValue() { + rewriteRun( + docker( + """ + FROM ubuntu:20.04 + COPY --from=nginx:1.25\\ + /build /app + """, + spec -> spec.afterRecipe(doc -> { + var copy = (Docker.Copy) doc.getStages().getFirst().getInstructions().getLast(); + assertThat(copy.getFlags().getFirst().getValue().getContents()).map(CopyTest::literal) + .containsExactly("nginx", ":", "1.25"); + }) + ) + ); + } + private static String text(Docker.Argument argument) { - return ((Docker.Literal) argument.getContents().getFirst()).getText(); + return literal(argument.getContents().getFirst()); + } + + private static String literal(Docker.ArgumentContent content) { + return ((Docker.Literal) content).getText(); } }