lexcql-parser 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
lexcql/LexLexer.g4 ADDED
@@ -0,0 +1,39 @@
1
+ lexer grammar LexLexer;
2
+
3
+ /* search clauses */
4
+
5
+ L_PAREN: '(';
6
+ R_PAREN: ')';
7
+
8
+ /* relations */
9
+
10
+ EQUAL: '=';
11
+ GREATER: '>';
12
+ LESSER: '<';
13
+ GREATER_EQUAL: '>=';
14
+ LESSER_EQUAL: '<=';
15
+ NOT_EQUAL: '<>';
16
+ EQUAL_EQUAL: '==';
17
+
18
+ /* modifiers */
19
+
20
+ SLASH: '/';
21
+
22
+ /* booleans */
23
+
24
+ AND: [Aa][Nn][Dd];
25
+ OR: [Oo][Rr];
26
+ NOT: [Nn][Oo][Tt];
27
+
28
+ /* terminals */
29
+
30
+ DOT: '.';
31
+
32
+ QUOTED_STRING: '"' ('\\' ["\\] | ~["\\])* '"';
33
+
34
+ // whitespace must be explicit here as inverted sets can use rules/fragments
35
+ SIMPLE_STRING: (~["\\()/<=> \t\n\r])+;
36
+
37
+ /* whitespace */
38
+
39
+ WS: [ \t\n\r] -> channel(HIDDEN);
lexcql/LexLexer.interp ADDED
@@ -0,0 +1,68 @@
1
+ token literal names:
2
+ null
3
+ '('
4
+ ')'
5
+ '='
6
+ '>'
7
+ '<'
8
+ '>='
9
+ '<='
10
+ '<>'
11
+ '=='
12
+ '/'
13
+ null
14
+ null
15
+ null
16
+ '.'
17
+ null
18
+ null
19
+ null
20
+
21
+ token symbolic names:
22
+ null
23
+ L_PAREN
24
+ R_PAREN
25
+ EQUAL
26
+ GREATER
27
+ LESSER
28
+ GREATER_EQUAL
29
+ LESSER_EQUAL
30
+ NOT_EQUAL
31
+ EQUAL_EQUAL
32
+ SLASH
33
+ AND
34
+ OR
35
+ NOT
36
+ DOT
37
+ QUOTED_STRING
38
+ SIMPLE_STRING
39
+ WS
40
+
41
+ rule names:
42
+ L_PAREN
43
+ R_PAREN
44
+ EQUAL
45
+ GREATER
46
+ LESSER
47
+ GREATER_EQUAL
48
+ LESSER_EQUAL
49
+ NOT_EQUAL
50
+ EQUAL_EQUAL
51
+ SLASH
52
+ AND
53
+ OR
54
+ NOT
55
+ DOT
56
+ QUOTED_STRING
57
+ SIMPLE_STRING
58
+ WS
59
+
60
+ channel names:
61
+ DEFAULT_TOKEN_CHANNEL
62
+ HIDDEN
63
+
64
+ mode names:
65
+ DEFAULT_MODE
66
+
67
+ atn:
68
+ [4, 0, 17, 92, 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, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 77, 8, 14, 10, 14, 12, 14, 80, 9, 14, 1, 14, 1, 14, 1, 15, 4, 15, 85, 8, 15, 11, 15, 12, 15, 86, 1, 16, 1, 16, 1, 16, 1, 16, 0, 0, 17, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 1, 0, 9, 2, 0, 65, 65, 97, 97, 2, 0, 78, 78, 110, 110, 2, 0, 68, 68, 100, 100, 2, 0, 79, 79, 111, 111, 2, 0, 82, 82, 114, 114, 2, 0, 84, 84, 116, 116, 2, 0, 34, 34, 92, 92, 8, 0, 9, 10, 13, 13, 32, 32, 34, 34, 40, 41, 47, 47, 60, 62, 92, 92, 3, 0, 9, 10, 13, 13, 32, 32, 94, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 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, 1, 35, 1, 0, 0, 0, 3, 37, 1, 0, 0, 0, 5, 39, 1, 0, 0, 0, 7, 41, 1, 0, 0, 0, 9, 43, 1, 0, 0, 0, 11, 45, 1, 0, 0, 0, 13, 48, 1, 0, 0, 0, 15, 51, 1, 0, 0, 0, 17, 54, 1, 0, 0, 0, 19, 57, 1, 0, 0, 0, 21, 59, 1, 0, 0, 0, 23, 63, 1, 0, 0, 0, 25, 66, 1, 0, 0, 0, 27, 70, 1, 0, 0, 0, 29, 72, 1, 0, 0, 0, 31, 84, 1, 0, 0, 0, 33, 88, 1, 0, 0, 0, 35, 36, 5, 40, 0, 0, 36, 2, 1, 0, 0, 0, 37, 38, 5, 41, 0, 0, 38, 4, 1, 0, 0, 0, 39, 40, 5, 61, 0, 0, 40, 6, 1, 0, 0, 0, 41, 42, 5, 62, 0, 0, 42, 8, 1, 0, 0, 0, 43, 44, 5, 60, 0, 0, 44, 10, 1, 0, 0, 0, 45, 46, 5, 62, 0, 0, 46, 47, 5, 61, 0, 0, 47, 12, 1, 0, 0, 0, 48, 49, 5, 60, 0, 0, 49, 50, 5, 61, 0, 0, 50, 14, 1, 0, 0, 0, 51, 52, 5, 60, 0, 0, 52, 53, 5, 62, 0, 0, 53, 16, 1, 0, 0, 0, 54, 55, 5, 61, 0, 0, 55, 56, 5, 61, 0, 0, 56, 18, 1, 0, 0, 0, 57, 58, 5, 47, 0, 0, 58, 20, 1, 0, 0, 0, 59, 60, 7, 0, 0, 0, 60, 61, 7, 1, 0, 0, 61, 62, 7, 2, 0, 0, 62, 22, 1, 0, 0, 0, 63, 64, 7, 3, 0, 0, 64, 65, 7, 4, 0, 0, 65, 24, 1, 0, 0, 0, 66, 67, 7, 1, 0, 0, 67, 68, 7, 3, 0, 0, 68, 69, 7, 5, 0, 0, 69, 26, 1, 0, 0, 0, 70, 71, 5, 46, 0, 0, 71, 28, 1, 0, 0, 0, 72, 78, 5, 34, 0, 0, 73, 74, 5, 92, 0, 0, 74, 77, 7, 6, 0, 0, 75, 77, 8, 6, 0, 0, 76, 73, 1, 0, 0, 0, 76, 75, 1, 0, 0, 0, 77, 80, 1, 0, 0, 0, 78, 76, 1, 0, 0, 0, 78, 79, 1, 0, 0, 0, 79, 81, 1, 0, 0, 0, 80, 78, 1, 0, 0, 0, 81, 82, 5, 34, 0, 0, 82, 30, 1, 0, 0, 0, 83, 85, 8, 7, 0, 0, 84, 83, 1, 0, 0, 0, 85, 86, 1, 0, 0, 0, 86, 84, 1, 0, 0, 0, 86, 87, 1, 0, 0, 0, 87, 32, 1, 0, 0, 0, 88, 89, 7, 8, 0, 0, 89, 90, 1, 0, 0, 0, 90, 91, 6, 16, 0, 0, 91, 34, 1, 0, 0, 0, 4, 0, 76, 78, 86, 1, 0, 1, 0]
lexcql/LexLexer.py ADDED
@@ -0,0 +1,98 @@
1
+ # Generated from LexLexer.g4 by ANTLR 4.13.2
2
+ from antlr4 import *
3
+ from io import StringIO
4
+ import sys
5
+ if sys.version_info[1] > 5:
6
+ from typing import TextIO
7
+ else:
8
+ from typing.io import TextIO
9
+
10
+
11
+ def serializedATN():
12
+ return [
13
+ 4,0,17,92,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,
14
+ 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,
15
+ 7,13,2,14,7,14,2,15,7,15,2,16,7,16,1,0,1,0,1,1,1,1,1,2,1,2,1,3,1,
16
+ 3,1,4,1,4,1,5,1,5,1,5,1,6,1,6,1,6,1,7,1,7,1,7,1,8,1,8,1,8,1,9,1,
17
+ 9,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,13,1,
18
+ 13,1,14,1,14,1,14,1,14,5,14,77,8,14,10,14,12,14,80,9,14,1,14,1,14,
19
+ 1,15,4,15,85,8,15,11,15,12,15,86,1,16,1,16,1,16,1,16,0,0,17,1,1,
20
+ 3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,
21
+ 29,15,31,16,33,17,1,0,9,2,0,65,65,97,97,2,0,78,78,110,110,2,0,68,
22
+ 68,100,100,2,0,79,79,111,111,2,0,82,82,114,114,2,0,84,84,116,116,
23
+ 2,0,34,34,92,92,8,0,9,10,13,13,32,32,34,34,40,41,47,47,60,62,92,
24
+ 92,3,0,9,10,13,13,32,32,94,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,
25
+ 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,
26
+ 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,
27
+ 1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,1,35,1,0,0,0,3,37,
28
+ 1,0,0,0,5,39,1,0,0,0,7,41,1,0,0,0,9,43,1,0,0,0,11,45,1,0,0,0,13,
29
+ 48,1,0,0,0,15,51,1,0,0,0,17,54,1,0,0,0,19,57,1,0,0,0,21,59,1,0,0,
30
+ 0,23,63,1,0,0,0,25,66,1,0,0,0,27,70,1,0,0,0,29,72,1,0,0,0,31,84,
31
+ 1,0,0,0,33,88,1,0,0,0,35,36,5,40,0,0,36,2,1,0,0,0,37,38,5,41,0,0,
32
+ 38,4,1,0,0,0,39,40,5,61,0,0,40,6,1,0,0,0,41,42,5,62,0,0,42,8,1,0,
33
+ 0,0,43,44,5,60,0,0,44,10,1,0,0,0,45,46,5,62,0,0,46,47,5,61,0,0,47,
34
+ 12,1,0,0,0,48,49,5,60,0,0,49,50,5,61,0,0,50,14,1,0,0,0,51,52,5,60,
35
+ 0,0,52,53,5,62,0,0,53,16,1,0,0,0,54,55,5,61,0,0,55,56,5,61,0,0,56,
36
+ 18,1,0,0,0,57,58,5,47,0,0,58,20,1,0,0,0,59,60,7,0,0,0,60,61,7,1,
37
+ 0,0,61,62,7,2,0,0,62,22,1,0,0,0,63,64,7,3,0,0,64,65,7,4,0,0,65,24,
38
+ 1,0,0,0,66,67,7,1,0,0,67,68,7,3,0,0,68,69,7,5,0,0,69,26,1,0,0,0,
39
+ 70,71,5,46,0,0,71,28,1,0,0,0,72,78,5,34,0,0,73,74,5,92,0,0,74,77,
40
+ 7,6,0,0,75,77,8,6,0,0,76,73,1,0,0,0,76,75,1,0,0,0,77,80,1,0,0,0,
41
+ 78,76,1,0,0,0,78,79,1,0,0,0,79,81,1,0,0,0,80,78,1,0,0,0,81,82,5,
42
+ 34,0,0,82,30,1,0,0,0,83,85,8,7,0,0,84,83,1,0,0,0,85,86,1,0,0,0,86,
43
+ 84,1,0,0,0,86,87,1,0,0,0,87,32,1,0,0,0,88,89,7,8,0,0,89,90,1,0,0,
44
+ 0,90,91,6,16,0,0,91,34,1,0,0,0,4,0,76,78,86,1,0,1,0
45
+ ]
46
+
47
+ class LexLexer(Lexer):
48
+
49
+ atn = ATNDeserializer().deserialize(serializedATN())
50
+
51
+ decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ]
52
+
53
+ L_PAREN = 1
54
+ R_PAREN = 2
55
+ EQUAL = 3
56
+ GREATER = 4
57
+ LESSER = 5
58
+ GREATER_EQUAL = 6
59
+ LESSER_EQUAL = 7
60
+ NOT_EQUAL = 8
61
+ EQUAL_EQUAL = 9
62
+ SLASH = 10
63
+ AND = 11
64
+ OR = 12
65
+ NOT = 13
66
+ DOT = 14
67
+ QUOTED_STRING = 15
68
+ SIMPLE_STRING = 16
69
+ WS = 17
70
+
71
+ channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ]
72
+
73
+ modeNames = [ "DEFAULT_MODE" ]
74
+
75
+ literalNames = [ "<INVALID>",
76
+ "'('", "')'", "'='", "'>'", "'<'", "'>='", "'<='", "'<>'", "'=='",
77
+ "'/'", "'.'" ]
78
+
79
+ symbolicNames = [ "<INVALID>",
80
+ "L_PAREN", "R_PAREN", "EQUAL", "GREATER", "LESSER", "GREATER_EQUAL",
81
+ "LESSER_EQUAL", "NOT_EQUAL", "EQUAL_EQUAL", "SLASH", "AND",
82
+ "OR", "NOT", "DOT", "QUOTED_STRING", "SIMPLE_STRING", "WS" ]
83
+
84
+ ruleNames = [ "L_PAREN", "R_PAREN", "EQUAL", "GREATER", "LESSER", "GREATER_EQUAL",
85
+ "LESSER_EQUAL", "NOT_EQUAL", "EQUAL_EQUAL", "SLASH", "AND",
86
+ "OR", "NOT", "DOT", "QUOTED_STRING", "SIMPLE_STRING",
87
+ "WS" ]
88
+
89
+ grammarFileName = "LexLexer.g4"
90
+
91
+ def __init__(self, input=None, output:TextIO = sys.stdout):
92
+ super().__init__(input, output)
93
+ self.checkVersion("4.13.2")
94
+ self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache())
95
+ self._actions = None
96
+ self._predicates = None
97
+
98
+
lexcql/LexLexer.tokens ADDED
@@ -0,0 +1,28 @@
1
+ L_PAREN=1
2
+ R_PAREN=2
3
+ EQUAL=3
4
+ GREATER=4
5
+ LESSER=5
6
+ GREATER_EQUAL=6
7
+ LESSER_EQUAL=7
8
+ NOT_EQUAL=8
9
+ EQUAL_EQUAL=9
10
+ SLASH=10
11
+ AND=11
12
+ OR=12
13
+ NOT=13
14
+ DOT=14
15
+ QUOTED_STRING=15
16
+ SIMPLE_STRING=16
17
+ WS=17
18
+ '('=1
19
+ ')'=2
20
+ '='=3
21
+ '>'=4
22
+ '<'=5
23
+ '>='=6
24
+ '<='=7
25
+ '<>'=8
26
+ '=='=9
27
+ '/'=10
28
+ '.'=14
lexcql/LexParser.g4 ADDED
@@ -0,0 +1,79 @@
1
+ parser grammar LexParser;
2
+ options {
3
+ tokenVocab = LexLexer;
4
+ }
5
+
6
+ /* ABNF: https://docs.oasis-open.org/search-ws/searchRetrieve/v1.0/os/part5-cql/searchRetrieve-v1.0-os-part5-cql.html */
7
+ /* Test in: http://lab.antlr.org/ */
8
+ /* Slides: https://www.esa.informatik.tu-darmstadt.de/archive/twiki/pub/Lectures/Compiler113De/antlr-v4-handout.pdf */
9
+
10
+ /* search clauses */
11
+
12
+ // ! original ABNF rule: does not work due to left-recursion
13
+ //
14
+ // query: search_clause_group;
15
+ // search_clause_group: (search_clause_group boolean_modified subquery) | subquery;
16
+ // subquery: (L_PAREN query R_PAREN) | search_clause;
17
+
18
+ // flat lists as alternative? need to be interpreted left to right
19
+ //
20
+ // search_clause_group: (subquery boolean_modified)* subquery;
21
+ // search_clause_group: subquery (boolean_modified subquery)*;
22
+
23
+ // simplify and make it flat
24
+ query: boolean_query EOF;
25
+
26
+ boolean_query: subquery (boolean_modified subquery)*;
27
+
28
+ subquery: L_PAREN boolean_query R_PAREN | search_clause;
29
+
30
+ search_clause: (index relation_modified)? search_term;
31
+
32
+ search_term: SIMPLE_STRING | QUOTED_STRING;
33
+
34
+ /* indexes */
35
+
36
+ index: simple_name | prefix_name;
37
+
38
+ /* relations */
39
+
40
+ relation_modified: relation modifier_list?;
41
+
42
+ relation: relation_name | relation_symbol;
43
+
44
+ relation_name: simple_name | prefix_name;
45
+
46
+ relation_symbol:
47
+ EQUAL
48
+ | GREATER
49
+ | LESSER
50
+ | GREATER_EQUAL
51
+ | LESSER_EQUAL
52
+ | NOT_EQUAL
53
+ | EQUAL_EQUAL;
54
+
55
+ /* booleans */
56
+
57
+ boolean_modified: r_boolean modifier_list?;
58
+
59
+ r_boolean: AND | OR | NOT;
60
+
61
+ /* modifiers */
62
+
63
+ modifier_list: modifier+;
64
+
65
+ modifier: SLASH modifier_name modifier_relation?;
66
+
67
+ modifier_name: simple_name;
68
+
69
+ modifier_relation: relation_symbol modifier_value;
70
+
71
+ modifier_value: SIMPLE_STRING | QUOTED_STRING;
72
+
73
+ /* terminal aliases */
74
+
75
+ prefix_name: prefix DOT simple_name;
76
+
77
+ prefix: simple_name;
78
+
79
+ simple_name: SIMPLE_STRING;
@@ -0,0 +1,65 @@
1
+ token literal names:
2
+ null
3
+ '('
4
+ ')'
5
+ '='
6
+ '>'
7
+ '<'
8
+ '>='
9
+ '<='
10
+ '<>'
11
+ '=='
12
+ '/'
13
+ null
14
+ null
15
+ null
16
+ '.'
17
+ null
18
+ null
19
+ null
20
+
21
+ token symbolic names:
22
+ null
23
+ L_PAREN
24
+ R_PAREN
25
+ EQUAL
26
+ GREATER
27
+ LESSER
28
+ GREATER_EQUAL
29
+ LESSER_EQUAL
30
+ NOT_EQUAL
31
+ EQUAL_EQUAL
32
+ SLASH
33
+ AND
34
+ OR
35
+ NOT
36
+ DOT
37
+ QUOTED_STRING
38
+ SIMPLE_STRING
39
+ WS
40
+
41
+ rule names:
42
+ query
43
+ boolean_query
44
+ subquery
45
+ search_clause
46
+ search_term
47
+ index
48
+ relation_modified
49
+ relation
50
+ relation_name
51
+ relation_symbol
52
+ boolean_modified
53
+ r_boolean
54
+ modifier_list
55
+ modifier
56
+ modifier_name
57
+ modifier_relation
58
+ modifier_value
59
+ prefix_name
60
+ prefix
61
+ simple_name
62
+
63
+
64
+ atn:
65
+ [4, 1, 17, 118, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 48, 8, 1, 10, 1, 12, 1, 51, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 58, 8, 2, 1, 3, 1, 3, 1, 3, 3, 3, 63, 8, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 3, 5, 71, 8, 5, 1, 6, 1, 6, 3, 6, 75, 8, 6, 1, 7, 1, 7, 3, 7, 79, 8, 7, 1, 8, 1, 8, 3, 8, 83, 8, 8, 1, 9, 1, 9, 1, 10, 1, 10, 3, 10, 89, 8, 10, 1, 11, 1, 11, 1, 12, 4, 12, 94, 8, 12, 11, 12, 12, 12, 95, 1, 13, 1, 13, 1, 13, 3, 13, 101, 8, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 0, 0, 20, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 0, 3, 1, 0, 15, 16, 1, 0, 3, 9, 1, 0, 11, 13, 107, 0, 40, 1, 0, 0, 0, 2, 43, 1, 0, 0, 0, 4, 57, 1, 0, 0, 0, 6, 62, 1, 0, 0, 0, 8, 66, 1, 0, 0, 0, 10, 70, 1, 0, 0, 0, 12, 72, 1, 0, 0, 0, 14, 78, 1, 0, 0, 0, 16, 82, 1, 0, 0, 0, 18, 84, 1, 0, 0, 0, 20, 86, 1, 0, 0, 0, 22, 90, 1, 0, 0, 0, 24, 93, 1, 0, 0, 0, 26, 97, 1, 0, 0, 0, 28, 102, 1, 0, 0, 0, 30, 104, 1, 0, 0, 0, 32, 107, 1, 0, 0, 0, 34, 109, 1, 0, 0, 0, 36, 113, 1, 0, 0, 0, 38, 115, 1, 0, 0, 0, 40, 41, 3, 2, 1, 0, 41, 42, 5, 0, 0, 1, 42, 1, 1, 0, 0, 0, 43, 49, 3, 4, 2, 0, 44, 45, 3, 20, 10, 0, 45, 46, 3, 4, 2, 0, 46, 48, 1, 0, 0, 0, 47, 44, 1, 0, 0, 0, 48, 51, 1, 0, 0, 0, 49, 47, 1, 0, 0, 0, 49, 50, 1, 0, 0, 0, 50, 3, 1, 0, 0, 0, 51, 49, 1, 0, 0, 0, 52, 53, 5, 1, 0, 0, 53, 54, 3, 2, 1, 0, 54, 55, 5, 2, 0, 0, 55, 58, 1, 0, 0, 0, 56, 58, 3, 6, 3, 0, 57, 52, 1, 0, 0, 0, 57, 56, 1, 0, 0, 0, 58, 5, 1, 0, 0, 0, 59, 60, 3, 10, 5, 0, 60, 61, 3, 12, 6, 0, 61, 63, 1, 0, 0, 0, 62, 59, 1, 0, 0, 0, 62, 63, 1, 0, 0, 0, 63, 64, 1, 0, 0, 0, 64, 65, 3, 8, 4, 0, 65, 7, 1, 0, 0, 0, 66, 67, 7, 0, 0, 0, 67, 9, 1, 0, 0, 0, 68, 71, 3, 38, 19, 0, 69, 71, 3, 34, 17, 0, 70, 68, 1, 0, 0, 0, 70, 69, 1, 0, 0, 0, 71, 11, 1, 0, 0, 0, 72, 74, 3, 14, 7, 0, 73, 75, 3, 24, 12, 0, 74, 73, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 13, 1, 0, 0, 0, 76, 79, 3, 16, 8, 0, 77, 79, 3, 18, 9, 0, 78, 76, 1, 0, 0, 0, 78, 77, 1, 0, 0, 0, 79, 15, 1, 0, 0, 0, 80, 83, 3, 38, 19, 0, 81, 83, 3, 34, 17, 0, 82, 80, 1, 0, 0, 0, 82, 81, 1, 0, 0, 0, 83, 17, 1, 0, 0, 0, 84, 85, 7, 1, 0, 0, 85, 19, 1, 0, 0, 0, 86, 88, 3, 22, 11, 0, 87, 89, 3, 24, 12, 0, 88, 87, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 21, 1, 0, 0, 0, 90, 91, 7, 2, 0, 0, 91, 23, 1, 0, 0, 0, 92, 94, 3, 26, 13, 0, 93, 92, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 93, 1, 0, 0, 0, 95, 96, 1, 0, 0, 0, 96, 25, 1, 0, 0, 0, 97, 98, 5, 10, 0, 0, 98, 100, 3, 28, 14, 0, 99, 101, 3, 30, 15, 0, 100, 99, 1, 0, 0, 0, 100, 101, 1, 0, 0, 0, 101, 27, 1, 0, 0, 0, 102, 103, 3, 38, 19, 0, 103, 29, 1, 0, 0, 0, 104, 105, 3, 18, 9, 0, 105, 106, 3, 32, 16, 0, 106, 31, 1, 0, 0, 0, 107, 108, 7, 0, 0, 0, 108, 33, 1, 0, 0, 0, 109, 110, 3, 36, 18, 0, 110, 111, 5, 14, 0, 0, 111, 112, 3, 38, 19, 0, 112, 35, 1, 0, 0, 0, 113, 114, 3, 38, 19, 0, 114, 37, 1, 0, 0, 0, 115, 116, 5, 16, 0, 0, 116, 39, 1, 0, 0, 0, 10, 49, 57, 62, 70, 74, 78, 82, 88, 95, 100]