Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion rewrite-xml/src/main/antlr/XMLParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,16 @@ content
: (element | reference | processinginstruction | CDATA | COMMENT |
jspscriptlet | jspexpression | jspdeclaration | jspcomment | chardata) ;

// Strict XML and HTML-like sources get separate alternatives rather than one shared, left-factored shape.
// The shape of this rule determines the resynchronization sets ANTLR's error recovery uses, so folding the
// two together would let HTML void element support change how malformed *XML* recovers -- e.g. an attribute
// whose value contains an unescaped quote could recover with a synthesized '=' that the printer then emits
// into the source. Keeping the strict-XML alternatives exactly as they were before void element support
// existed is what makes "HTML support does not affect XML parsing" true of recovery and not just of matching.
element
: OPEN name=Name attribute*
: {!isHtmlMode()}? OPEN name=Name attribute* CLOSE content* OPEN '/' Name CLOSE
| {!isHtmlMode()}? OPEN name=Name attribute* '/>'
| {isHtmlMode()}? OPEN name=Name attribute*
( '/>'
| CLOSE
( {isVoidElement($name.text)}? voidClose // HTML void element, e.g. <br> with no closing tag
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,9 @@ public Xml visitJspcomment(XMLParser.JspcommentContext ctx) {

@Override
public Xml.Tag visitElement(XMLParser.ElementContext ctx) {
if (ctx != null && ctx.Name(0) == null) {
throw malformed(ctx.getStart(), "an element is missing its name");
}
return convert(ctx, (c, prefix) -> {
String name = convert(ctx.Name(0), (n, p) -> n.getText());

Expand Down Expand Up @@ -389,6 +392,7 @@ public Xml.Tag visitElement(XMLParser.ElementContext ctx) {

@Override
public Xml.Attribute visitAttribute(XMLParser.AttributeContext ctx) {
requireWellFormed(ctx);
return convert(ctx, (c, prefix) -> {
Xml.Ident key = convert(c.Name(), (t, p) -> new Xml.Ident(randomId(), p, Markers.EMPTY, t.getText()));

Expand All @@ -407,6 +411,33 @@ public Xml.Attribute visitAttribute(XMLParser.AttributeContext ctx) {
});
}

/**
* An attribute is only reachable here with a part missing, or with a part ANTLR invented, when error recovery
* built it out of tokens that were never an attribute in the source. Reading such a context yields a tree that no
* longer represents the source: a synthesized {@code =} is indistinguishable from a real one once built, and the
* printer then emits it back into the attribute value.
*/
private void requireWellFormed(XMLParser.@Nullable AttributeContext ctx) {
if (ctx != null && (ctx.Name() == null || ctx.STRING() == null || isSynthesized(ctx.EQUALS()))) {
throw malformed(ctx.getStart(), "an attribute value contains an unescaped '\"' or '<'");
}
}

private static boolean isSynthesized(@Nullable TerminalNode node) {
return node == null || node.getSymbol().getTokenIndex() < 0;
}

/**
* Rejects input that is not well-formed XML, so the caller falls back to a
* {@link org.openrewrite.tree.ParseError} that preserves the original text rather than building an LST out of
* whatever ANTLR error recovery happened to leave behind.
*/
private IllegalStateException malformed(Token start, String detail) {
return new IllegalStateException(String.format(
"%s is not well-formed XML: %s at line %d:%d.",
path, detail, start.getLine(), start.getCharPositionInLine()));
}

@Override
public Xml.DocTypeDecl visitDoctypedecl(XMLParser.DoctypedeclContext ctx) {
return convert(ctx, (c, prefix) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,4 +113,4 @@ chardata


atn:
[4, 1, 42, 212, 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, 1, 0, 3, 0, 44, 8, 0, 1, 0, 1, 0, 3, 0, 48, 8, 0, 1, 1, 3, 1, 51, 8, 1, 1, 1, 5, 1, 54, 8, 1, 10, 1, 12, 1, 57, 9, 1, 1, 1, 5, 1, 60, 8, 1, 10, 1, 12, 1, 63, 9, 1, 1, 2, 1, 2, 5, 2, 67, 8, 2, 10, 2, 12, 2, 70, 9, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 79, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 86, 8, 4, 10, 4, 12, 4, 89, 9, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 95, 8, 4, 1, 4, 1, 4, 1, 5, 1, 5, 5, 5, 101, 8, 5, 10, 5, 12, 5, 104, 9, 5, 1, 6, 1, 6, 5, 6, 108, 8, 6, 10, 6, 12, 6, 111, 9, 6, 1, 6, 5, 6, 114, 8, 6, 10, 6, 12, 6, 117, 9, 6, 1, 6, 5, 6, 120, 8, 6, 10, 6, 12, 6, 123, 9, 6, 1, 6, 1, 6, 1, 6, 3, 6, 128, 8, 6, 1, 7, 1, 7, 1, 8, 3, 8, 133, 8, 8, 1, 9, 1, 9, 5, 9, 137, 8, 9, 10, 9, 12, 9, 140, 9, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 154, 8, 10, 1, 11, 1, 11, 1, 11, 5, 11, 159, 8, 11, 10, 11, 12, 11, 162, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 169, 8, 11, 10, 11, 12, 11, 172, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 178, 8, 11, 3, 11, 180, 8, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 188, 8, 13, 10, 13, 12, 13, 191, 9, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 0, 0, 21, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 0, 3, 1, 0, 28, 29, 1, 0, 5, 6, 3, 0, 7, 7, 9, 9, 18, 18, 225, 0, 43, 1, 0, 0, 0, 2, 50, 1, 0, 0, 0, 4, 64, 1, 0, 0, 0, 6, 78, 1, 0, 0, 0, 8, 80, 1, 0, 0, 0, 10, 102, 1, 0, 0, 0, 12, 127, 1, 0, 0, 0, 14, 129, 1, 0, 0, 0, 16, 132, 1, 0, 0, 0, 18, 134, 1, 0, 0, 0, 20, 153, 1, 0, 0, 0, 22, 155, 1, 0, 0, 0, 24, 181, 1, 0, 0, 0, 26, 183, 1, 0, 0, 0, 28, 195, 1, 0, 0, 0, 30, 197, 1, 0, 0, 0, 32, 199, 1, 0, 0, 0, 34, 201, 1, 0, 0, 0, 36, 203, 1, 0, 0, 0, 38, 205, 1, 0, 0, 0, 40, 209, 1, 0, 0, 0, 42, 44, 5, 8, 0, 0, 43, 42, 1, 0, 0, 0, 43, 44, 1, 0, 0, 0, 44, 45, 1, 0, 0, 0, 45, 47, 3, 2, 1, 0, 46, 48, 3, 22, 11, 0, 47, 46, 1, 0, 0, 0, 47, 48, 1, 0, 0, 0, 48, 1, 1, 0, 0, 0, 49, 51, 3, 4, 2, 0, 50, 49, 1, 0, 0, 0, 50, 51, 1, 0, 0, 0, 51, 55, 1, 0, 0, 0, 52, 54, 3, 6, 3, 0, 53, 52, 1, 0, 0, 0, 54, 57, 1, 0, 0, 0, 55, 53, 1, 0, 0, 0, 55, 56, 1, 0, 0, 0, 56, 61, 1, 0, 0, 0, 57, 55, 1, 0, 0, 0, 58, 60, 3, 26, 13, 0, 59, 58, 1, 0, 0, 0, 60, 63, 1, 0, 0, 0, 61, 59, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 3, 1, 0, 0, 0, 63, 61, 1, 0, 0, 0, 64, 68, 5, 10, 0, 0, 65, 67, 3, 38, 19, 0, 66, 65, 1, 0, 0, 0, 67, 70, 1, 0, 0, 0, 68, 66, 1, 0, 0, 0, 68, 69, 1, 0, 0, 0, 69, 71, 1, 0, 0, 0, 70, 68, 1, 0, 0, 0, 71, 72, 5, 34, 0, 0, 72, 5, 1, 0, 0, 0, 73, 79, 5, 2, 0, 0, 74, 79, 3, 8, 4, 0, 75, 79, 3, 18, 9, 0, 76, 79, 3, 32, 16, 0, 77, 79, 3, 34, 17, 0, 78, 73, 1, 0, 0, 0, 78, 74, 1, 0, 0, 0, 78, 75, 1, 0, 0, 0, 78, 76, 1, 0, 0, 0, 78, 77, 1, 0, 0, 0, 79, 7, 1, 0, 0, 0, 80, 81, 5, 13, 0, 0, 81, 82, 5, 22, 0, 0, 82, 83, 5, 42, 0, 0, 83, 87, 3, 16, 8, 0, 84, 86, 5, 41, 0, 0, 85, 84, 1, 0, 0, 0, 86, 89, 1, 0, 0, 0, 87, 85, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 94, 1, 0, 0, 0, 89, 87, 1, 0, 0, 0, 90, 91, 5, 20, 0, 0, 91, 92, 3, 10, 5, 0, 92, 93, 5, 23, 0, 0, 93, 95, 1, 0, 0, 0, 94, 90, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 1, 0, 0, 0, 96, 97, 5, 19, 0, 0, 97, 9, 1, 0, 0, 0, 98, 101, 3, 12, 6, 0, 99, 101, 3, 14, 7, 0, 100, 98, 1, 0, 0, 0, 100, 99, 1, 0, 0, 0, 101, 104, 1, 0, 0, 0, 102, 100, 1, 0, 0, 0, 102, 103, 1, 0, 0, 0, 103, 11, 1, 0, 0, 0, 104, 102, 1, 0, 0, 0, 105, 109, 5, 24, 0, 0, 106, 108, 7, 0, 0, 0, 107, 106, 1, 0, 0, 0, 108, 111, 1, 0, 0, 0, 109, 107, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 115, 1, 0, 0, 0, 111, 109, 1, 0, 0, 0, 112, 114, 5, 30, 0, 0, 113, 112, 1, 0, 0, 0, 114, 117, 1, 0, 0, 0, 115, 113, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 121, 1, 0, 0, 0, 117, 115, 1, 0, 0, 0, 118, 120, 7, 0, 0, 0, 119, 118, 1, 0, 0, 0, 120, 123, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 122, 1, 0, 0, 0, 122, 124, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 124, 128, 5, 26, 0, 0, 125, 128, 3, 18, 9, 0, 126, 128, 5, 2, 0, 0, 127, 105, 1, 0, 0, 0, 127, 125, 1, 0, 0, 0, 127, 126, 1, 0, 0, 0, 128, 13, 1, 0, 0, 0, 129, 130, 5, 4, 0, 0, 130, 15, 1, 0, 0, 0, 131, 133, 5, 42, 0, 0, 132, 131, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 17, 1, 0, 0, 0, 134, 138, 5, 12, 0, 0, 135, 137, 5, 32, 0, 0, 136, 135, 1, 0, 0, 0, 137, 140, 1, 0, 0, 0, 138, 136, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 141, 1, 0, 0, 0, 140, 138, 1, 0, 0, 0, 141, 142, 5, 34, 0, 0, 142, 19, 1, 0, 0, 0, 143, 154, 3, 22, 11, 0, 144, 154, 3, 36, 18, 0, 145, 154, 3, 18, 9, 0, 146, 154, 5, 3, 0, 0, 147, 154, 5, 2, 0, 0, 148, 154, 3, 28, 14, 0, 149, 154, 3, 30, 15, 0, 150, 154, 3, 32, 16, 0, 151, 154, 3, 34, 17, 0, 152, 154, 3, 40, 20, 0, 153, 143, 1, 0, 0, 0, 153, 144, 1, 0, 0, 0, 153, 145, 1, 0, 0, 0, 153, 146, 1, 0, 0, 0, 153, 147, 1, 0, 0, 0, 153, 148, 1, 0, 0, 0, 153, 149, 1, 0, 0, 0, 153, 150, 1, 0, 0, 0, 153, 151, 1, 0, 0, 0, 153, 152, 1, 0, 0, 0, 154, 21, 1, 0, 0, 0, 155, 156, 5, 11, 0, 0, 156, 160, 5, 42, 0, 0, 157, 159, 3, 38, 19, 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, 179, 1, 0, 0, 0, 162, 160, 1, 0, 0, 0, 163, 180, 5, 35, 0, 0, 164, 177, 5, 33, 0, 0, 165, 166, 4, 11, 0, 1, 166, 178, 3, 24, 12, 0, 167, 169, 3, 20, 10, 0, 168, 167, 1, 0, 0, 0, 169, 172, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 173, 1, 0, 0, 0, 172, 170, 1, 0, 0, 0, 173, 174, 5, 11, 0, 0, 174, 175, 5, 39, 0, 0, 175, 176, 5, 42, 0, 0, 176, 178, 5, 33, 0, 0, 177, 165, 1, 0, 0, 0, 177, 170, 1, 0, 0, 0, 178, 180, 1, 0, 0, 0, 179, 163, 1, 0, 0, 0, 179, 164, 1, 0, 0, 0, 180, 23, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 25, 1, 0, 0, 0, 183, 184, 5, 11, 0, 0, 184, 185, 5, 37, 0, 0, 185, 189, 5, 42, 0, 0, 186, 188, 3, 38, 19, 0, 187, 186, 1, 0, 0, 0, 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 193, 5, 38, 0, 0, 193, 194, 5, 33, 0, 0, 194, 27, 1, 0, 0, 0, 195, 196, 5, 17, 0, 0, 196, 29, 1, 0, 0, 0, 197, 198, 5, 16, 0, 0, 198, 31, 1, 0, 0, 0, 199, 200, 5, 15, 0, 0, 200, 33, 1, 0, 0, 0, 201, 202, 5, 14, 0, 0, 202, 35, 1, 0, 0, 0, 203, 204, 7, 1, 0, 0, 204, 37, 1, 0, 0, 0, 205, 206, 5, 42, 0, 0, 206, 207, 5, 40, 0, 0, 207, 208, 5, 41, 0, 0, 208, 39, 1, 0, 0, 0, 209, 210, 7, 2, 0, 0, 210, 41, 1, 0, 0, 0, 23, 43, 47, 50, 55, 61, 68, 78, 87, 94, 100, 102, 109, 115, 121, 127, 132, 138, 153, 160, 170, 177, 179, 189]
[4, 1, 42, 245, 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, 1, 0, 3, 0, 44, 8, 0, 1, 0, 1, 0, 3, 0, 48, 8, 0, 1, 1, 3, 1, 51, 8, 1, 1, 1, 5, 1, 54, 8, 1, 10, 1, 12, 1, 57, 9, 1, 1, 1, 5, 1, 60, 8, 1, 10, 1, 12, 1, 63, 9, 1, 1, 2, 1, 2, 5, 2, 67, 8, 2, 10, 2, 12, 2, 70, 9, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 79, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 86, 8, 4, 10, 4, 12, 4, 89, 9, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 95, 8, 4, 1, 4, 1, 4, 1, 5, 1, 5, 5, 5, 101, 8, 5, 10, 5, 12, 5, 104, 9, 5, 1, 6, 1, 6, 5, 6, 108, 8, 6, 10, 6, 12, 6, 111, 9, 6, 1, 6, 5, 6, 114, 8, 6, 10, 6, 12, 6, 117, 9, 6, 1, 6, 5, 6, 120, 8, 6, 10, 6, 12, 6, 123, 9, 6, 1, 6, 1, 6, 1, 6, 3, 6, 128, 8, 6, 1, 7, 1, 7, 1, 8, 3, 8, 133, 8, 8, 1, 9, 1, 9, 5, 9, 137, 8, 9, 10, 9, 12, 9, 140, 9, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 154, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 160, 8, 11, 10, 11, 12, 11, 163, 9, 11, 1, 11, 1, 11, 5, 11, 167, 8, 11, 10, 11, 12, 11, 170, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 180, 8, 11, 10, 11, 12, 11, 183, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 190, 8, 11, 10, 11, 12, 11, 193, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 200, 8, 11, 10, 11, 12, 11, 203, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 209, 8, 11, 3, 11, 211, 8, 11, 3, 11, 213, 8, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 221, 8, 13, 10, 13, 12, 13, 224, 9, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 0, 0, 21, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 0, 3, 1, 0, 28, 29, 1, 0, 5, 6, 3, 0, 7, 7, 9, 9, 18, 18, 263, 0, 43, 1, 0, 0, 0, 2, 50, 1, 0, 0, 0, 4, 64, 1, 0, 0, 0, 6, 78, 1, 0, 0, 0, 8, 80, 1, 0, 0, 0, 10, 102, 1, 0, 0, 0, 12, 127, 1, 0, 0, 0, 14, 129, 1, 0, 0, 0, 16, 132, 1, 0, 0, 0, 18, 134, 1, 0, 0, 0, 20, 153, 1, 0, 0, 0, 22, 212, 1, 0, 0, 0, 24, 214, 1, 0, 0, 0, 26, 216, 1, 0, 0, 0, 28, 228, 1, 0, 0, 0, 30, 230, 1, 0, 0, 0, 32, 232, 1, 0, 0, 0, 34, 234, 1, 0, 0, 0, 36, 236, 1, 0, 0, 0, 38, 238, 1, 0, 0, 0, 40, 242, 1, 0, 0, 0, 42, 44, 5, 8, 0, 0, 43, 42, 1, 0, 0, 0, 43, 44, 1, 0, 0, 0, 44, 45, 1, 0, 0, 0, 45, 47, 3, 2, 1, 0, 46, 48, 3, 22, 11, 0, 47, 46, 1, 0, 0, 0, 47, 48, 1, 0, 0, 0, 48, 1, 1, 0, 0, 0, 49, 51, 3, 4, 2, 0, 50, 49, 1, 0, 0, 0, 50, 51, 1, 0, 0, 0, 51, 55, 1, 0, 0, 0, 52, 54, 3, 6, 3, 0, 53, 52, 1, 0, 0, 0, 54, 57, 1, 0, 0, 0, 55, 53, 1, 0, 0, 0, 55, 56, 1, 0, 0, 0, 56, 61, 1, 0, 0, 0, 57, 55, 1, 0, 0, 0, 58, 60, 3, 26, 13, 0, 59, 58, 1, 0, 0, 0, 60, 63, 1, 0, 0, 0, 61, 59, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 3, 1, 0, 0, 0, 63, 61, 1, 0, 0, 0, 64, 68, 5, 10, 0, 0, 65, 67, 3, 38, 19, 0, 66, 65, 1, 0, 0, 0, 67, 70, 1, 0, 0, 0, 68, 66, 1, 0, 0, 0, 68, 69, 1, 0, 0, 0, 69, 71, 1, 0, 0, 0, 70, 68, 1, 0, 0, 0, 71, 72, 5, 34, 0, 0, 72, 5, 1, 0, 0, 0, 73, 79, 5, 2, 0, 0, 74, 79, 3, 8, 4, 0, 75, 79, 3, 18, 9, 0, 76, 79, 3, 32, 16, 0, 77, 79, 3, 34, 17, 0, 78, 73, 1, 0, 0, 0, 78, 74, 1, 0, 0, 0, 78, 75, 1, 0, 0, 0, 78, 76, 1, 0, 0, 0, 78, 77, 1, 0, 0, 0, 79, 7, 1, 0, 0, 0, 80, 81, 5, 13, 0, 0, 81, 82, 5, 22, 0, 0, 82, 83, 5, 42, 0, 0, 83, 87, 3, 16, 8, 0, 84, 86, 5, 41, 0, 0, 85, 84, 1, 0, 0, 0, 86, 89, 1, 0, 0, 0, 87, 85, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 94, 1, 0, 0, 0, 89, 87, 1, 0, 0, 0, 90, 91, 5, 20, 0, 0, 91, 92, 3, 10, 5, 0, 92, 93, 5, 23, 0, 0, 93, 95, 1, 0, 0, 0, 94, 90, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 1, 0, 0, 0, 96, 97, 5, 19, 0, 0, 97, 9, 1, 0, 0, 0, 98, 101, 3, 12, 6, 0, 99, 101, 3, 14, 7, 0, 100, 98, 1, 0, 0, 0, 100, 99, 1, 0, 0, 0, 101, 104, 1, 0, 0, 0, 102, 100, 1, 0, 0, 0, 102, 103, 1, 0, 0, 0, 103, 11, 1, 0, 0, 0, 104, 102, 1, 0, 0, 0, 105, 109, 5, 24, 0, 0, 106, 108, 7, 0, 0, 0, 107, 106, 1, 0, 0, 0, 108, 111, 1, 0, 0, 0, 109, 107, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 115, 1, 0, 0, 0, 111, 109, 1, 0, 0, 0, 112, 114, 5, 30, 0, 0, 113, 112, 1, 0, 0, 0, 114, 117, 1, 0, 0, 0, 115, 113, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 121, 1, 0, 0, 0, 117, 115, 1, 0, 0, 0, 118, 120, 7, 0, 0, 0, 119, 118, 1, 0, 0, 0, 120, 123, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 122, 1, 0, 0, 0, 122, 124, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 124, 128, 5, 26, 0, 0, 125, 128, 3, 18, 9, 0, 126, 128, 5, 2, 0, 0, 127, 105, 1, 0, 0, 0, 127, 125, 1, 0, 0, 0, 127, 126, 1, 0, 0, 0, 128, 13, 1, 0, 0, 0, 129, 130, 5, 4, 0, 0, 130, 15, 1, 0, 0, 0, 131, 133, 5, 42, 0, 0, 132, 131, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 17, 1, 0, 0, 0, 134, 138, 5, 12, 0, 0, 135, 137, 5, 32, 0, 0, 136, 135, 1, 0, 0, 0, 137, 140, 1, 0, 0, 0, 138, 136, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 141, 1, 0, 0, 0, 140, 138, 1, 0, 0, 0, 141, 142, 5, 34, 0, 0, 142, 19, 1, 0, 0, 0, 143, 154, 3, 22, 11, 0, 144, 154, 3, 36, 18, 0, 145, 154, 3, 18, 9, 0, 146, 154, 5, 3, 0, 0, 147, 154, 5, 2, 0, 0, 148, 154, 3, 28, 14, 0, 149, 154, 3, 30, 15, 0, 150, 154, 3, 32, 16, 0, 151, 154, 3, 34, 17, 0, 152, 154, 3, 40, 20, 0, 153, 143, 1, 0, 0, 0, 153, 144, 1, 0, 0, 0, 153, 145, 1, 0, 0, 0, 153, 146, 1, 0, 0, 0, 153, 147, 1, 0, 0, 0, 153, 148, 1, 0, 0, 0, 153, 149, 1, 0, 0, 0, 153, 150, 1, 0, 0, 0, 153, 151, 1, 0, 0, 0, 153, 152, 1, 0, 0, 0, 154, 21, 1, 0, 0, 0, 155, 156, 4, 11, 0, 0, 156, 157, 5, 11, 0, 0, 157, 161, 5, 42, 0, 0, 158, 160, 3, 38, 19, 0, 159, 158, 1, 0, 0, 0, 160, 163, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 164, 1, 0, 0, 0, 163, 161, 1, 0, 0, 0, 164, 168, 5, 33, 0, 0, 165, 167, 3, 20, 10, 0, 166, 165, 1, 0, 0, 0, 167, 170, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 171, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 171, 172, 5, 11, 0, 0, 172, 173, 5, 39, 0, 0, 173, 174, 5, 42, 0, 0, 174, 213, 5, 33, 0, 0, 175, 176, 4, 11, 1, 0, 176, 177, 5, 11, 0, 0, 177, 181, 5, 42, 0, 0, 178, 180, 3, 38, 19, 0, 179, 178, 1, 0, 0, 0, 180, 183, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 184, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 184, 213, 5, 35, 0, 0, 185, 186, 4, 11, 2, 0, 186, 187, 5, 11, 0, 0, 187, 191, 5, 42, 0, 0, 188, 190, 3, 38, 19, 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, 210, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 194, 211, 5, 35, 0, 0, 195, 208, 5, 33, 0, 0, 196, 197, 4, 11, 3, 1, 197, 209, 3, 24, 12, 0, 198, 200, 3, 20, 10, 0, 199, 198, 1, 0, 0, 0, 200, 203, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 204, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 204, 205, 5, 11, 0, 0, 205, 206, 5, 39, 0, 0, 206, 207, 5, 42, 0, 0, 207, 209, 5, 33, 0, 0, 208, 196, 1, 0, 0, 0, 208, 201, 1, 0, 0, 0, 209, 211, 1, 0, 0, 0, 210, 194, 1, 0, 0, 0, 210, 195, 1, 0, 0, 0, 211, 213, 1, 0, 0, 0, 212, 155, 1, 0, 0, 0, 212, 175, 1, 0, 0, 0, 212, 185, 1, 0, 0, 0, 213, 23, 1, 0, 0, 0, 214, 215, 1, 0, 0, 0, 215, 25, 1, 0, 0, 0, 216, 217, 5, 11, 0, 0, 217, 218, 5, 37, 0, 0, 218, 222, 5, 42, 0, 0, 219, 221, 3, 38, 19, 0, 220, 219, 1, 0, 0, 0, 221, 224, 1, 0, 0, 0, 222, 220, 1, 0, 0, 0, 222, 223, 1, 0, 0, 0, 223, 225, 1, 0, 0, 0, 224, 222, 1, 0, 0, 0, 225, 226, 5, 38, 0, 0, 226, 227, 5, 33, 0, 0, 227, 27, 1, 0, 0, 0, 228, 229, 5, 17, 0, 0, 229, 29, 1, 0, 0, 0, 230, 231, 5, 16, 0, 0, 231, 31, 1, 0, 0, 0, 232, 233, 5, 15, 0, 0, 233, 33, 1, 0, 0, 0, 234, 235, 5, 14, 0, 0, 235, 35, 1, 0, 0, 0, 236, 237, 7, 1, 0, 0, 237, 37, 1, 0, 0, 0, 238, 239, 5, 42, 0, 0, 239, 240, 5, 40, 0, 0, 240, 241, 5, 41, 0, 0, 241, 39, 1, 0, 0, 0, 242, 243, 7, 2, 0, 0, 243, 41, 1, 0, 0, 0, 27, 43, 47, 50, 55, 61, 68, 78, 87, 94, 100, 102, 109, 115, 121, 127, 132, 138, 153, 161, 168, 181, 191, 201, 208, 210, 212, 222]
Loading