From f1246f84e01b3eedb9a54fde94ee1b0a5800303a Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Fri, 28 Jan 2022 01:49:26 -0800 Subject: [PATCH] [kernel] Add capabilities to handles This change finally adds capabilities to handles. Included changes: - j6_handle_t is now again 64 bits, with the highest 8 bits being a type code, and the next highest 24 bits being the capability mask, so that programs can check type/caps without calling the kernel. - The definitions grammar now includes a `capabilities [ ]` section on objects, to list what capabilities are relevant. - j6/caps.h is auto-generated from object capability lists - init_libj6 again sets __handle_self and __handle_sys, this is a bit of a hack. - A new syscall, j6_handle_list, will return the list of existing handles owned by the calling process. - syscall_verify.cpp.cog now actually checks that the needed capabilities exist on handles before allowing the call. --- assets/grammars/definitions.g | 4 +- definitions/objects/channel.def | 14 ++++-- definitions/objects/endpoint.def | 11 +++-- definitions/objects/process.def | 7 ++- definitions/objects/system.def | 15 +++++-- definitions/objects/thread.def | 8 +++- definitions/objects/vma.def | 14 ++++-- definitions/syscalls.def | 16 +++++-- scripts/definitions/context.py | 8 ++++ scripts/definitions/errors.py | 1 + scripts/definitions/generate.py | 62 -------------------------- scripts/definitions/parser.py | 4 +- scripts/definitions/transformer.py | 10 ++++- scripts/definitions/types/__init__.py | 7 +-- scripts/definitions/types/function.py | 5 +++ scripts/definitions/types/object.py | 6 ++- src/kernel/kernel.module | 1 + src/kernel/objects/channel.h | 3 +- src/kernel/objects/endpoint.h | 3 +- src/kernel/objects/handle.h | 29 +++++++----- src/kernel/objects/kobject.h | 2 +- src/kernel/objects/process.cpp | 20 +++++++-- src/kernel/objects/process.h | 14 ++++-- src/kernel/objects/system.h | 3 +- src/kernel/objects/thread.h | 5 ++- src/kernel/objects/vm_area.h | 3 +- src/kernel/syscall_verify.cpp.cog | 21 +++++++-- src/kernel/syscalls/handle.cpp | 27 +++++++++++ src/libraries/j6/include/j6/caps.h.cog | 25 +++++++++++ src/libraries/j6/include/j6/errors.h | 1 + src/libraries/j6/include/j6/types.h | 12 ++--- src/libraries/j6/init.cpp | 58 ++++++++++++------------ src/libraries/j6/j6.module | 2 + src/libraries/libc/j6libc/sbrk.c | 2 +- src/user/drv.uart/main.cpp | 18 ++++---- src/user/drv.uefi_fb/main.cpp | 1 - src/user/srv.init/loader.cpp | 16 +++---- src/user/srv.init/main.cpp | 9 ++-- 38 files changed, 290 insertions(+), 177 deletions(-) delete mode 100644 scripts/definitions/generate.py create mode 100644 src/kernel/syscalls/handle.cpp create mode 100644 src/libraries/j6/include/j6/caps.h.cog diff --git a/assets/grammars/definitions.g b/assets/grammars/definitions.g index 5a0dd7a..20cb47f 100644 --- a/assets/grammars/definitions.g +++ b/assets/grammars/definitions.g @@ -2,7 +2,7 @@ start: import_statement* (object|interface)+ import_statement: "import" PATH -object: description? "object" name options? super? "{" uid cname? method* "}" +object: description? "object" name options? super? "{" uid cname? capabilities? method* "}" interface: description? "interface" name options? "{" uid interface_param* "}" @@ -14,6 +14,8 @@ uid: "uid" UID cname: "cname" IDENTIFIER +capabilities: "capabilities" "[" IDENTIFIER+ "]" + super: ":" name function: description? "function" name options? ("{" param* "}")? diff --git a/definitions/objects/channel.def b/definitions/objects/channel.def index ad1815a..84a8a37 100644 --- a/definitions/objects/channel.def +++ b/definitions/objects/channel.def @@ -1,14 +1,20 @@ object channel : kobject { uid 3ea38b96aa0e54c8 - method create [constructor] - method close [destructor] + capabilities [ + send + receive + close + ] - method send { + method create [constructor] + method close [destructor cap:close] + + method send [cap:send] { param data buffer [inout] } - method receive { + method receive [cap:receive] { param data buffer [out] } } diff --git a/definitions/objects/endpoint.def b/definitions/objects/endpoint.def index e753894..ba566f1 100644 --- a/definitions/objects/endpoint.def +++ b/definitions/objects/endpoint.def @@ -4,18 +4,23 @@ object endpoint : kobject { uid c5882f24a4c03b7e + capabilities [ + send + receive + ] + method create [constructor] # Send a message on a channel. Blocks until the message # is received. - method send { + method send [cap:send] { param tag uint64 param data buffer } # Receieve a message on a channel. Blocks until a message # is available. - method receive { + method receive [cap:receive] { param tag uint64 [out] param data buffer [out optional] param timeout uint64 # Receive timeout in nanoseconds @@ -24,7 +29,7 @@ object endpoint : kobject { # Send a message on a channel and then await a new message. # Equivalent to calling send and then recieve, as a single # operation. - method sendrecv { + method sendrecv [cap:send cap:receive] { param tag uint64 [inout] param data buffer [inout] param timeout uint64 # Receive timeout in nanoseconds diff --git a/definitions/objects/process.def b/definitions/objects/process.def index ac7848f..7c8e301 100644 --- a/definitions/objects/process.def +++ b/definitions/objects/process.def @@ -6,11 +6,16 @@ import "objects/kobject.def" object process : kobject { uid 0c69ee0b7502ba31 + capabilities [ + kill + create_thread + ] + # Create a new empty process method create [constructor] # Stop all threads and exit the given process - method kill [destructor] + method kill [destructor cap:kill] # Stop all threads and exit the current process method exit [static] { diff --git a/definitions/objects/system.def b/definitions/objects/system.def index cacb726..4f858dd 100644 --- a/definitions/objects/system.def +++ b/definitions/objects/system.def @@ -6,21 +6,28 @@ import "objects/vma.def" object system : kobject { uid fa72506a2cf71a30 + capabilities [ + get_log + bind_irq + map_phys + change_iopl + ] + # Get a log line from the kernel log - method get_log { + method get_log [cap:get_log] { param buffer buffer [out optional] # Buffer for the log message data structure } # Ask the kernel to send this process messages whenever # the given IRQ fires - method bind_irq { + method bind_irq [cap:bind_irq] { param dest object endpoint # Endpoint that will receive messages param irq uint # IRQ number to bind } # Create a VMA and map an area of physical memory into it, # also mapping that VMA into the current process - method map_phys { + method map_phys [cap:map_phys] { param area object vma [out] # Receives a handle to the VMA created param phys address # The physical address of the area param size size # Size of the area, in pages @@ -29,7 +36,7 @@ object system : kobject { # Request the kernel change the IOPL for this process. The only values # that make sense are 0 and 3. - method request_iopl { + method request_iopl [cap:change_iopl] { param iopl uint # The IOPL to set for this process } } diff --git a/definitions/objects/thread.def b/definitions/objects/thread.def index 9113ae1..d944e81 100644 --- a/definitions/objects/thread.def +++ b/definitions/objects/thread.def @@ -1,13 +1,17 @@ object thread : kobject { uid 11f23e593d5761bd + capabilities [ + kill + ] + method create [constructor] { - param process object process + param process object process [cap:create_thread] param stack_top address param entrypoint address } - method kill [destructor] + method kill [destructor cap:kill] method exit [static] { param status int32 diff --git a/definitions/objects/vma.def b/definitions/objects/vma.def index 36ae4d1..3986724 100644 --- a/definitions/objects/vma.def +++ b/definitions/objects/vma.def @@ -4,27 +4,33 @@ object vma : kobject { uid d6a12b63b3ed3937 cname vm_area + capabilities [ + map + unmap + resize + ] + method create [constructor] { param size size param flags uint32 } - method create_map [constructor] { + method create_map [constructor cap:map] { param size size param address address param flags uint32 } - method map { + method map [cap:map] { param process object process param address address } - method unmap { + method unmap [cap:unmap] { param process object process } - method resize { + method resize [cap:resize] { param size size [inout] } } diff --git a/definitions/syscalls.def b/definitions/syscalls.def index 23eefe2..e7442a1 100644 --- a/definitions/syscalls.def +++ b/definitions/syscalls.def @@ -1,9 +1,11 @@ -import "objects/system.def" import "objects/kobject.def" -import "objects/process.def" -import "objects/thread.def" + import "objects/channel.def" import "objects/endpoint.def" +import "objects/event.def" +import "objects/process.def" +import "objects/system.def" +import "objects/thread.def" import "objects/vma.def" interface syscalls [syscall] { @@ -11,6 +13,7 @@ interface syscalls [syscall] { expose object system expose object kobject + expose object event expose object process expose object thread expose object channel @@ -24,4 +27,11 @@ interface syscalls [syscall] { function log { param message string } + + # Get a list of handles owned by this process. If the + # supplied list is not big enough, will set the size + # needed in `size` and return j6_err_insufficient + function handle_list { + param handles object kobject [list inout optional] # A list of handles to be filled + } } diff --git a/scripts/definitions/context.py b/scripts/definitions/context.py index 2aa9257..20d211f 100644 --- a/scripts/definitions/context.py +++ b/scripts/definitions/context.py @@ -68,6 +68,14 @@ class Context: from .types import ObjectRef ObjectRef.connect(objects) + for obj in objects.values(): + for method in obj.methods: + caps = method.options.get("cap", list()) + for cap in caps: + if not cap in obj.caps: + from .errors import UnknownCapError + raise UnknownCapError(f"Unknown capability {cap} on {obj.name}::{method.name}") + self.objects.update(objects) self.interfaces.update(interfaces) diff --git a/scripts/definitions/errors.py b/scripts/definitions/errors.py index c4034ba..8b6da57 100644 --- a/scripts/definitions/errors.py +++ b/scripts/definitions/errors.py @@ -1,2 +1,3 @@ class InvalidType(Exception): pass class UnknownTypeError(Exception): pass +class UnknownCapError(Exception): pass diff --git a/scripts/definitions/generate.py b/scripts/definitions/generate.py deleted file mode 100644 index 03dfabe..0000000 --- a/scripts/definitions/generate.py +++ /dev/null @@ -1,62 +0,0 @@ -def generate_template(template, outfile, **kwargs): - from hashlib import md5 - from os import makedirs - from os.path import dirname, exists - - content = template.render(**kwargs) - h = md5(content.encode('utf-8')).hexdigest() - - if exists(outfile): - existing = open(outfile, 'r').read().encode('utf-8') - if md5(existing).hexdigest() == h: - return False - - makedirs(dirname(outfile), exist_ok=True) - open(outfile, 'w').write(content) - - return True - -def generate(ctx, outdir, template_type): - from os.path import basename, join, split, splitext - from jinja2 import Environment, PackageLoader - - for name, interface in ctx.interfaces.items(): - base = "_".join(sorted(interface.options)) - - path = join("templates", base, template_type) - env = Environment( - loader = PackageLoader('definitions', package_path=path), - trim_blocks = True, lstrip_blocks = True) - - env.filters - - for template_name in env.list_templates(): - template = env.get_template(template_name) - - basepath, filename = split(template_name) - filename, ext = splitext(filename) - - if filename == "_object_": - for obj in ctx.objects.values(): - outfile = join(outdir, basepath, obj.name + ext) - wrote = generate_template( - template, outfile, - filename=obj.name + ext, - basepath=basepath, - object=obj, - interface=interface, - objects=ctx.objects) - - if wrote and ctx.verbose: - print(f"Writing {outfile}") - - else: - outfile = join(outdir, template_name) - wrote = generate_template( - template, outfile, - filename=basename(template_name), - interface=interface, - objects=ctx.objects) - - if wrote and ctx.verbose: - print(f"Writing {outfile}") diff --git a/scripts/definitions/parser.py b/scripts/definitions/parser.py index 5eaf680..0ad8877 100644 --- a/scripts/definitions/parser.py +++ b/scripts/definitions/parser.py @@ -2894,10 +2894,10 @@ class Indenter(PostLex): import pickle, zlib, base64 DATA = ( -{'parser': {'lexer_conf': {'terminals': [{'@': 0}, {'@': 1}, {'@': 2}, {'@': 3}, {'@': 4}, {'@': 5}, {'@': 6}, {'@': 7}, {'@': 8}, {'@': 9}, {'@': 10}, {'@': 11}, {'@': 12}, {'@': 13}, {'@': 14}, {'@': 15}, {'@': 16}, {'@': 17}, {'@': 18}, {'@': 19}, {'@': 20}], 'ignore': ['WS'], 'g_regex_flags': 0, 'use_bytes': False, 'lexer_type': 'contextual', '__type__': 'LexerConf'}, 'parser_conf': {'rules': [{'@': 21}, {'@': 22}, {'@': 23}, {'@': 24}, {'@': 25}, {'@': 26}, {'@': 27}, {'@': 28}, {'@': 29}, {'@': 30}, {'@': 31}, {'@': 32}, {'@': 33}, {'@': 34}, {'@': 35}, {'@': 36}, {'@': 37}, {'@': 38}, {'@': 39}, {'@': 40}, {'@': 41}, {'@': 42}, {'@': 43}, {'@': 44}, {'@': 45}, {'@': 46}, {'@': 47}, {'@': 48}, {'@': 49}, {'@': 50}, {'@': 51}, {'@': 52}, {'@': 53}, {'@': 54}, {'@': 55}, {'@': 56}, {'@': 57}, {'@': 58}, {'@': 59}, {'@': 60}, {'@': 61}, {'@': 62}, {'@': 63}, {'@': 64}, {'@': 65}, {'@': 66}, {'@': 67}, {'@': 68}, {'@': 69}, {'@': 70}, {'@': 71}, {'@': 72}, {'@': 73}, {'@': 74}, {'@': 75}, {'@': 76}, {'@': 77}, {'@': 78}, {'@': 79}, {'@': 80}, {'@': 81}, {'@': 82}, {'@': 83}, {'@': 84}, {'@': 85}, {'@': 86}, {'@': 87}, {'@': 88}, {'@': 89}, {'@': 90}, {'@': 91}, {'@': 92}, {'@': 93}, {'@': 94}, {'@': 95}, {'@': 96}, {'@': 97}, {'@': 98}, {'@': 99}, {'@': 100}, {'@': 101}, {'@': 102}, {'@': 103}, {'@': 104}, {'@': 105}, {'@': 106}, {'@': 107}, {'@': 108}, {'@': 109}, {'@': 110}, {'@': 111}, {'@': 112}, {'@': 113}, {'@': 114}, {'@': 115}, {'@': 116}, {'@': 117}, {'@': 118}, {'@': 119}, {'@': 120}, {'@': 121}], 'start': ['start'], 'parser_type': 'lalr', '__type__': 'ParserConf'}, 'parser': {'tokens': {0: 'INTERFACE', 1: '$END', 2: 'COMMENT', 3: 'OBJECT', 4: '__description_plus_6', 5: 'METHOD', 6: 'description', 7: 'method', 8: 'RBRACE', 9: 'name', 10: 'IDENTIFIER', 11: 'LBRACE', 12: 'LSQB', 13: 'options', 14: 'EXPOSE', 15: 'FUNCTION', 16: 'expose', 17: 'interface_param', 18: 'function', 19: 'PARAM', 20: 'PRIMITIVE', 21: 'type', 22: 'object_name', 23: '__object_star_2', 24: 'cname', 25: 'CNAME', 26: '__function_star_4', 27: 'param', 28: '__interface_star_3', 29: 'IMPORT', 30: 'OPTION', 31: 'RSQB', 32: 'uid', 33: '__ANON_0', 34: '__options_plus_5', 35: 'UID', 36: 'super', 37: 'COLON', 38: 'object', 39: 'interface', 40: 'PATH', 41: '__start_plus_1', 42: '__start_star_0', 43: 'start', 44: 'import_statement'}, 'states': {0: {0: (1, {'@': 55}), 1: (1, {'@': 55}), 2: (1, {'@': 55}), 3: (1, {'@': 55})}, 1: {4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35), 8: (0, 82)}, 2: {4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35), 8: (0, 153)}, 3: {9: (0, 18), 10: (0, 165)}, 4: {5: (1, {'@': 110}), 8: (1, {'@': 110}), 2: (1, {'@': 110})}, 5: {0: (1, {'@': 60}), 1: (1, {'@': 60}), 2: (1, {'@': 60}), 3: (1, {'@': 60})}, 6: {0: (1, {'@': 29}), 1: (1, {'@': 29}), 2: (1, {'@': 29}), 3: (1, {'@': 29})}, 7: {0: (1, {'@': 45}), 1: (1, {'@': 45}), 2: (1, {'@': 45}), 3: (1, {'@': 45})}, 8: {11: (0, 110), 12: (0, 140), 13: (0, 10), 14: (1, {'@': 75}), 15: (1, {'@': 75}), 8: (1, {'@': 75}), 2: (1, {'@': 75})}, 9: {9: (0, 92), 10: (0, 165)}, 10: {11: (0, 57), 14: (1, {'@': 72}), 15: (1, {'@': 72}), 8: (1, {'@': 72}), 2: (1, {'@': 72})}, 11: {4: (0, 94), 16: (0, 95), 6: (0, 68), 17: (0, 75), 15: (0, 34), 2: (0, 197), 8: (0, 105), 18: (0, 81), 14: (0, 16)}, 12: {0: (1, {'@': 30}), 1: (1, {'@': 30}), 2: (1, {'@': 30}), 3: (1, {'@': 30})}, 13: {4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35), 8: (0, 58)}, 14: {15: (1, {'@': 99}), 8: (1, {'@': 99}), 2: (1, {'@': 99}), 14: (1, {'@': 99}), 12: (1, {'@': 99}), 19: (1, {'@': 99})}, 15: {11: (0, 122), 14: (1, {'@': 78}), 15: (1, {'@': 78}), 8: (1, {'@': 78}), 2: (1, {'@': 78})}, 16: {20: (0, 76), 21: (0, 96), 22: (0, 14), 3: (0, 111)}, 17: {8: (0, 65), 4: (0, 94), 16: (0, 95), 6: (0, 68), 17: (0, 75), 15: (0, 34), 2: (0, 197), 18: (0, 81), 14: (0, 16)}, 18: {12: (0, 140), 11: (0, 25), 13: (0, 85), 5: (1, {'@': 93}), 8: (1, {'@': 93}), 2: (1, {'@': 93})}, 19: {4: (0, 94), 16: (0, 95), 6: (0, 68), 8: (0, 88), 17: (0, 75), 15: (0, 34), 2: (0, 197), 18: (0, 81), 14: (0, 16)}, 20: {4: (0, 94), 23: (0, 98), 5: (0, 3), 8: (0, 21), 6: (0, 104), 24: (0, 114), 2: (0, 197), 25: (0, 90), 7: (0, 4)}, 21: {0: (1, {'@': 51}), 1: (1, {'@': 51}), 2: (1, {'@': 51}), 3: (1, {'@': 51})}, 22: {0: (1, {'@': 36}), 1: (1, {'@': 36}), 2: (1, {'@': 36}), 3: (1, {'@': 36})}, 23: {4: (0, 94), 8: (0, 87), 23: (0, 42), 5: (0, 3), 24: (0, 37), 6: (0, 104), 2: (0, 197), 25: (0, 90), 7: (0, 4)}, 24: {4: (0, 94), 23: (0, 135), 5: (0, 3), 6: (0, 104), 2: (0, 197), 8: (0, 167), 7: (0, 4)}, 25: {19: (0, 120), 26: (0, 50), 8: (0, 66), 27: (0, 108)}, 26: {0: (1, {'@': 26}), 1: (1, {'@': 26}), 2: (1, {'@': 26}), 3: (1, {'@': 26})}, 27: {4: (0, 94), 23: (0, 2), 5: (0, 3), 6: (0, 104), 2: (0, 197), 25: (0, 90), 24: (0, 24), 7: (0, 4), 8: (0, 43)}, 28: {8: (0, 36), 4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35)}, 29: {0: (1, {'@': 59}), 1: (1, {'@': 59}), 2: (1, {'@': 59}), 3: (1, {'@': 59})}, 30: {8: (0, 152), 4: (0, 94), 16: (0, 95), 6: (0, 68), 15: (0, 34), 2: (0, 197), 17: (0, 101), 18: (0, 81), 14: (0, 16), 28: (0, 19)}, 31: {0: (1, {'@': 40}), 1: (1, {'@': 40}), 2: (1, {'@': 40}), 3: (1, {'@': 40})}, 32: {5: (1, {'@': 91}), 8: (1, {'@': 91}), 2: (1, {'@': 91})}, 33: {14: (1, {'@': 76}), 15: (1, {'@': 76}), 8: (1, {'@': 76}), 2: (1, {'@': 76})}, 34: {9: (0, 64), 10: (0, 165)}, 35: {5: (1, {'@': 111}), 8: (1, {'@': 111}), 2: (1, {'@': 111})}, 36: {0: (1, {'@': 48}), 1: (1, {'@': 48}), 2: (1, {'@': 48}), 3: (1, {'@': 48})}, 37: {4: (0, 94), 23: (0, 56), 5: (0, 3), 6: (0, 104), 2: (0, 197), 8: (0, 7), 7: (0, 4)}, 38: {19: (0, 120), 8: (0, 84), 27: (0, 61)}, 39: {0: (1, {'@': 46}), 1: (1, {'@': 46}), 2: (1, {'@': 46}), 3: (1, {'@': 46})}, 40: {0: (1, {'@': 32}), 1: (1, {'@': 32}), 2: (1, {'@': 32}), 3: (1, {'@': 32})}, 41: {11: (0, 176)}, 42: {4: (0, 94), 8: (0, 39), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35)}, 43: {0: (1, {'@': 43}), 1: (1, {'@': 43}), 2: (1, {'@': 43}), 3: (1, {'@': 43})}, 44: {8: (0, 109), 4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35)}, 45: {19: (0, 120), 27: (0, 61), 8: (0, 121)}, 46: {0: (1, {'@': 28}), 1: (1, {'@': 28}), 2: (1, {'@': 28}), 3: (1, {'@': 28})}, 47: {0: (1, {'@': 53}), 1: (1, {'@': 53}), 2: (1, {'@': 53}), 3: (1, {'@': 53})}, 48: {4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35), 8: (0, 12)}, 49: {4: (0, 94), 24: (0, 115), 23: (0, 48), 5: (0, 3), 6: (0, 104), 2: (0, 197), 25: (0, 90), 7: (0, 4), 8: (0, 55)}, 50: {19: (0, 120), 27: (0, 61), 8: (0, 32)}, 51: {4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35), 8: (0, 89)}, 52: {0: (1, {'@': 25}), 1: (1, {'@': 25}), 2: (1, {'@': 25}), 3: (1, {'@': 25})}, 53: {5: (1, {'@': 89}), 8: (1, {'@': 89}), 2: (1, {'@': 89})}, 54: {0: (1, {'@': 63}), 1: (1, {'@': 63}), 2: (1, {'@': 63}), 3: (1, {'@': 63})}, 55: {0: (1, {'@': 31}), 1: (1, {'@': 31}), 2: (1, {'@': 31}), 3: (1, {'@': 31})}, 56: {4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35), 8: (0, 179)}, 57: {26: (0, 127), 19: (0, 120), 27: (0, 108), 8: (0, 132)}, 58: {0: (1, {'@': 54}), 1: (1, {'@': 54}), 2: (1, {'@': 54}), 3: (1, {'@': 54})}, 59: {0: (1, {'@': 49}), 1: (1, {'@': 49}), 2: (1, {'@': 49}), 3: (1, {'@': 49})}, 60: {14: (1, {'@': 80}), 15: (1, {'@': 80}), 8: (1, {'@': 80}), 2: (1, {'@': 80})}, 61: {8: (1, {'@': 115}), 19: (1, {'@': 115})}, 62: {19: (0, 120), 27: (0, 108), 26: (0, 45), 8: (0, 53)}, 63: {4: (0, 94), 23: (0, 204), 5: (0, 3), 6: (0, 104), 24: (0, 198), 2: (0, 197), 8: (0, 196), 25: (0, 90), 7: (0, 4)}, 64: {12: (0, 140), 13: (0, 15), 11: (0, 106), 14: (1, {'@': 81}), 15: (1, {'@': 81}), 8: (1, {'@': 81}), 2: (1, {'@': 81})}, 65: {0: (1, {'@': 62}), 1: (1, {'@': 62}), 2: (1, {'@': 62}), 3: (1, {'@': 62})}, 66: {5: (1, {'@': 92}), 8: (1, {'@': 92}), 2: (1, {'@': 92})}, 67: {8: (0, 47), 4: (0, 94), 23: (0, 51), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 4)}, 68: {15: (0, 91)}, 69: {21: (0, 107), 20: (0, 76), 22: (0, 14), 3: (0, 111)}, 70: {5: (1, {'@': 68}), 8: (1, {'@': 68}), 2: (1, {'@': 68})}, 71: {4: (0, 94), 16: (0, 95), 6: (0, 68), 17: (0, 75), 15: (0, 34), 2: (0, 197), 18: (0, 81), 8: (0, 5), 14: (0, 16)}, 72: {19: (0, 120), 27: (0, 108), 26: (0, 80), 8: (0, 86)}, 73: {0: (1, {'@': 107}), 1: (1, {'@': 107}), 2: (1, {'@': 107}), 3: (1, {'@': 107})}, 74: {4: (0, 94), 16: (0, 95), 6: (0, 68), 15: (0, 34), 2: (0, 197), 28: (0, 71), 17: (0, 101), 18: (0, 81), 8: (0, 103), 14: (0, 16)}, 75: {14: (1, {'@': 113}), 15: (1, {'@': 113}), 8: (1, {'@': 113}), 2: (1, {'@': 113})}, 76: {15: (1, {'@': 98}), 8: (1, {'@': 98}), 2: (1, {'@': 98}), 14: (1, {'@': 98}), 12: (1, {'@': 98}), 19: (1, {'@': 98})}, 77: {4: (0, 94), 23: (0, 202), 5: (0, 3), 6: (0, 104), 2: (0, 197), 8: (0, 143), 7: (0, 4)}, 78: {8: (0, 124), 19: (0, 120), 27: (0, 61)}, 79: {4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35), 8: (0, 46)}, 80: {8: (0, 174), 19: (0, 120), 27: (0, 61)}, 81: {14: (1, {'@': 65}), 15: (1, {'@': 65}), 8: (1, {'@': 65}), 2: (1, {'@': 65})}, 82: {0: (1, {'@': 38}), 1: (1, {'@': 38}), 2: (1, {'@': 38}), 3: (1, {'@': 38})}, 83: {11: (0, 130), 5: (1, {'@': 84}), 8: (1, {'@': 84}), 2: (1, {'@': 84})}, 84: {14: (1, {'@': 79}), 15: (1, {'@': 79}), 8: (1, {'@': 79}), 2: (1, {'@': 79})}, 85: {11: (0, 62), 5: (1, {'@': 90}), 8: (1, {'@': 90}), 2: (1, {'@': 90})}, 86: {5: (1, {'@': 86}), 8: (1, {'@': 86}), 2: (1, {'@': 86})}, 87: {0: (1, {'@': 47}), 1: (1, {'@': 47}), 2: (1, {'@': 47}), 3: (1, {'@': 47})}, 88: {0: (1, {'@': 56}), 1: (1, {'@': 56}), 2: (1, {'@': 56}), 3: (1, {'@': 56})}, 89: {0: (1, {'@': 52}), 1: (1, {'@': 52}), 2: (1, {'@': 52}), 3: (1, {'@': 52})}, 90: {10: (0, 70)}, 91: {9: (0, 8), 10: (0, 165)}, 92: {13: (0, 83), 12: (0, 140), 11: (0, 72), 5: (1, {'@': 87}), 8: (1, {'@': 87}), 2: (1, {'@': 87})}, 93: {14: (1, {'@': 74}), 15: (1, {'@': 74}), 8: (1, {'@': 74}), 2: (1, {'@': 74})}, 94: {2: (0, 172), 5: (1, {'@': 103}), 15: (1, {'@': 103}), 8: (1, {'@': 103}), 19: (1, {'@': 103}), 3: (1, {'@': 103}), 0: (1, {'@': 103})}, 95: {14: (1, {'@': 64}), 15: (1, {'@': 64}), 8: (1, {'@': 64}), 2: (1, {'@': 64})}, 96: {14: (1, {'@': 66}), 15: (1, {'@': 66}), 8: (1, {'@': 66}), 2: (1, {'@': 66})}, 97: {19: (0, 120), 27: (0, 61), 8: (0, 33)}, 98: {4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35), 8: (0, 162)}, 99: {3: (0, 150), 0: (0, 158)}, 100: {14: (1, {'@': 100}), 15: (1, {'@': 100}), 8: (1, {'@': 100}), 2: (1, {'@': 100}), 12: (1, {'@': 100}), 19: (1, {'@': 100})}, 101: {14: (1, {'@': 112}), 15: (1, {'@': 112}), 8: (1, {'@': 112}), 2: (1, {'@': 112})}, 102: {14: (1, {'@': 77}), 15: (1, {'@': 77}), 8: (1, {'@': 77}), 2: (1, {'@': 77})}, 103: {0: (1, {'@': 61}), 1: (1, {'@': 61}), 2: (1, {'@': 61}), 3: (1, {'@': 61})}, 104: {5: (0, 9)}, 105: {0: (1, {'@': 58}), 1: (1, {'@': 58}), 2: (1, {'@': 58}), 3: (1, {'@': 58})}, 106: {19: (0, 120), 27: (0, 108), 26: (0, 38), 8: (0, 60)}, 107: {12: (0, 140), 4: (0, 94), 6: (0, 139), 13: (0, 144), 2: (0, 197), 8: (1, {'@': 97}), 19: (1, {'@': 97})}, 108: {8: (1, {'@': 114}), 19: (1, {'@': 114})}, 109: {0: (1, {'@': 24}), 1: (1, {'@': 24}), 2: (1, {'@': 24}), 3: (1, {'@': 24})}, 110: {19: (0, 120), 27: (0, 108), 26: (0, 78), 8: (0, 93)}, 111: {9: (0, 100), 10: (0, 165)}, 112: {8: (1, {'@': 94}), 19: (1, {'@': 94})}, 113: {0: (1, {'@': 39}), 1: (1, {'@': 39}), 2: (1, {'@': 39}), 3: (1, {'@': 39})}, 114: {4: (0, 94), 23: (0, 28), 5: (0, 3), 6: (0, 104), 2: (0, 197), 8: (0, 59), 7: (0, 4)}, 115: {4: (0, 94), 23: (0, 79), 5: (0, 3), 6: (0, 104), 2: (0, 197), 8: (0, 6), 7: (0, 4)}, 116: {5: (1, {'@': 83}), 8: (1, {'@': 83}), 2: (1, {'@': 83})}, 117: {0: (1, {'@': 27}), 1: (1, {'@': 27}), 2: (1, {'@': 27}), 3: (1, {'@': 27})}, 118: {19: (0, 120), 8: (0, 128), 27: (0, 61)}, 119: {0: (1, {'@': 104}), 29: (1, {'@': 104}), 2: (1, {'@': 104}), 3: (1, {'@': 104})}, 120: {10: (0, 165), 9: (0, 69)}, 121: {5: (1, {'@': 88}), 8: (1, {'@': 88}), 2: (1, {'@': 88})}, 122: {19: (0, 120), 27: (0, 108), 26: (0, 97), 8: (0, 102)}, 123: {10: (1, {'@': 117}), 30: (1, {'@': 117}), 31: (1, {'@': 117})}, 124: {14: (1, {'@': 73}), 15: (1, {'@': 73}), 8: (1, {'@': 73}), 2: (1, {'@': 73})}, 125: {0: (1, {'@': 23}), 29: (1, {'@': 23}), 2: (1, {'@': 23}), 3: (1, {'@': 23})}, 126: {0: (1, {'@': 108}), 1: (1, {'@': 108}), 2: (1, {'@': 108}), 3: (1, {'@': 108})}, 127: {19: (0, 120), 8: (0, 148), 27: (0, 61)}, 128: {5: (1, {'@': 82}), 8: (1, {'@': 82}), 2: (1, {'@': 82})}, 129: {12: (0, 140), 11: (0, 142), 13: (0, 181)}, 130: {19: (0, 120), 8: (0, 116), 27: (0, 108), 26: (0, 118)}, 131: {32: (0, 27), 33: (0, 141)}, 132: {14: (1, {'@': 71}), 15: (1, {'@': 71}), 8: (1, {'@': 71}), 2: (1, {'@': 71})}, 133: {5: (1, {'@': 67}), 8: (1, {'@': 67}), 25: (1, {'@': 67}), 2: (1, {'@': 67}), 14: (1, {'@': 67}), 15: (1, {'@': 67})}, 134: {10: (1, {'@': 118}), 30: (1, {'@': 118}), 31: (1, {'@': 118})}, 135: {4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35), 8: (0, 31)}, 136: {10: (1, {'@': 116}), 30: (1, {'@': 116}), 31: (1, {'@': 116})}, 137: {4: (0, 94), 28: (0, 11), 16: (0, 95), 6: (0, 68), 15: (0, 34), 2: (0, 197), 17: (0, 101), 18: (0, 81), 8: (0, 29), 14: (0, 16)}, 138: {32: (0, 30), 33: (0, 141)}, 139: {8: (1, {'@': 96}), 19: (1, {'@': 96})}, 140: {34: (0, 168), 30: (0, 136), 10: (0, 123)}, 141: {35: (0, 133)}, 142: {32: (0, 137), 33: (0, 141)}, 143: {0: (1, {'@': 37}), 1: (1, {'@': 37}), 2: (1, {'@': 37}), 3: (1, {'@': 37})}, 144: {6: (0, 112), 4: (0, 94), 2: (0, 197), 8: (1, {'@': 95}), 19: (1, {'@': 95})}, 145: {4: (0, 94), 23: (0, 1), 5: (0, 3), 6: (0, 104), 2: (0, 197), 24: (0, 77), 25: (0, 90), 8: (0, 113), 7: (0, 4)}, 146: {32: (0, 63), 33: (0, 141)}, 147: {13: (0, 191), 11: (0, 154), 36: (0, 185), 12: (0, 140), 37: (0, 151)}, 148: {14: (1, {'@': 70}), 15: (1, {'@': 70}), 8: (1, {'@': 70}), 2: (1, {'@': 70})}, 149: {}, 150: {9: (0, 147), 10: (0, 165)}, 151: {10: (0, 165), 9: (0, 190)}, 152: {0: (1, {'@': 57}), 1: (1, {'@': 57}), 2: (1, {'@': 57}), 3: (1, {'@': 57})}, 153: {0: (1, {'@': 42}), 1: (1, {'@': 42}), 2: (1, {'@': 42}), 3: (1, {'@': 42})}, 154: {32: (0, 145), 33: (0, 141)}, 155: {32: (0, 20), 33: (0, 141)}, 156: {32: (0, 74), 33: (0, 141)}, 157: {13: (0, 166), 12: (0, 140), 11: (0, 186)}, 158: {9: (0, 129), 10: (0, 165)}, 159: {38: (0, 126), 6: (0, 99), 4: (0, 94), 2: (0, 197), 3: (0, 164), 0: (0, 203), 39: (0, 188), 1: (1, {'@': 21})}, 160: {0: (1, {'@': 106}), 1: (1, {'@': 106}), 2: (1, {'@': 106}), 3: (1, {'@': 106})}, 161: {11: (1, {'@': 102}), 15: (1, {'@': 102}), 8: (1, {'@': 102}), 2: (1, {'@': 102}), 14: (1, {'@': 102}), 5: (1, {'@': 102}), 19: (1, {'@': 102}), 37: (1, {'@': 102})}, 162: {0: (1, {'@': 50}), 1: (1, {'@': 50}), 2: (1, {'@': 50}), 3: (1, {'@': 50})}, 163: {4: (0, 94), 5: (0, 3), 8: (0, 26), 6: (0, 104), 2: (0, 197), 7: (0, 35)}, 164: {9: (0, 173), 10: (0, 165)}, 165: {5: (1, {'@': 101}), 11: (1, {'@': 101}), 12: (1, {'@': 101}), 2: (1, {'@': 101}), 8: (1, {'@': 101}), 15: (1, {'@': 101}), 14: (1, {'@': 101}), 19: (1, {'@': 101}), 20: (1, {'@': 101}), 3: (1, {'@': 101}), 37: (1, {'@': 101})}, 166: {11: (0, 156)}, 167: {0: (1, {'@': 41}), 1: (1, {'@': 41}), 2: (1, {'@': 41}), 3: (1, {'@': 41})}, 168: {10: (0, 195), 31: (0, 161), 30: (0, 134)}, 169: {8: (0, 52), 4: (0, 94), 23: (0, 44), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 4)}, 170: {40: (0, 125)}, 171: {11: (0, 183), 37: (0, 151), 36: (0, 192)}, 172: {5: (1, {'@': 121}), 2: (1, {'@': 121}), 15: (1, {'@': 121}), 8: (1, {'@': 121}), 19: (1, {'@': 121}), 0: (1, {'@': 121}), 3: (1, {'@': 121})}, 173: {13: (0, 171), 36: (0, 201), 11: (0, 177), 12: (0, 140), 37: (0, 151)}, 174: {5: (1, {'@': 85}), 8: (1, {'@': 85}), 2: (1, {'@': 85})}, 175: {6: (0, 99), 4: (0, 94), 39: (0, 73), 2: (0, 197), 41: (0, 180), 29: (0, 170), 3: (0, 164), 42: (0, 193), 38: (0, 160), 0: (0, 203), 43: (0, 149), 44: (0, 119)}, 176: {32: (0, 178), 33: (0, 141)}, 177: {32: (0, 194), 33: (0, 141)}, 178: {8: (0, 117), 4: (0, 94), 23: (0, 163), 5: (0, 3), 6: (0, 104), 2: (0, 197), 24: (0, 169), 25: (0, 90), 7: (0, 4)}, 179: {0: (1, {'@': 44}), 1: (1, {'@': 44}), 2: (1, {'@': 44}), 3: (1, {'@': 44})}, 180: {38: (0, 126), 6: (0, 99), 4: (0, 94), 2: (0, 197), 3: (0, 164), 0: (0, 203), 39: (0, 188), 1: (1, {'@': 22})}, 181: {11: (0, 138)}, 182: {0: (1, {'@': 33}), 1: (1, {'@': 33}), 2: (1, {'@': 33}), 3: (1, {'@': 33})}, 183: {32: (0, 23), 33: (0, 141)}, 184: {32: (0, 49), 33: (0, 141)}, 185: {11: (0, 146)}, 186: {32: (0, 200), 33: (0, 141)}, 187: {4: (0, 94), 5: (0, 3), 8: (0, 40), 6: (0, 104), 2: (0, 197), 7: (0, 35)}, 188: {0: (1, {'@': 109}), 1: (1, {'@': 109}), 2: (1, {'@': 109}), 3: (1, {'@': 109})}, 189: {0: (1, {'@': 105}), 29: (1, {'@': 105}), 2: (1, {'@': 105}), 3: (1, {'@': 105})}, 190: {11: (1, {'@': 69})}, 191: {11: (0, 184), 36: (0, 41), 37: (0, 151)}, 192: {11: (0, 131)}, 193: {6: (0, 99), 4: (0, 94), 39: (0, 73), 41: (0, 159), 2: (0, 197), 3: (0, 164), 29: (0, 170), 38: (0, 160), 0: (0, 203), 44: (0, 189)}, 194: {4: (0, 94), 23: (0, 13), 5: (0, 3), 6: (0, 104), 2: (0, 197), 24: (0, 67), 25: (0, 90), 7: (0, 4), 8: (0, 0)}, 195: {10: (1, {'@': 119}), 30: (1, {'@': 119}), 31: (1, {'@': 119})}, 196: {0: (1, {'@': 35}), 1: (1, {'@': 35}), 2: (1, {'@': 35}), 3: (1, {'@': 35})}, 197: {5: (1, {'@': 120}), 2: (1, {'@': 120}), 15: (1, {'@': 120}), 8: (1, {'@': 120}), 19: (1, {'@': 120}), 0: (1, {'@': 120}), 3: (1, {'@': 120})}, 198: {4: (0, 94), 23: (0, 187), 5: (0, 3), 6: (0, 104), 2: (0, 197), 8: (0, 182), 7: (0, 4)}, 199: {0: (1, {'@': 34}), 1: (1, {'@': 34}), 2: (1, {'@': 34}), 3: (1, {'@': 34})}, 200: {4: (0, 94), 16: (0, 95), 6: (0, 68), 15: (0, 34), 2: (0, 197), 8: (0, 54), 17: (0, 101), 18: (0, 81), 28: (0, 17), 14: (0, 16)}, 201: {11: (0, 155)}, 202: {4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35), 8: (0, 22)}, 203: {10: (0, 165), 9: (0, 157)}, 204: {4: (0, 94), 5: (0, 3), 6: (0, 104), 2: (0, 197), 7: (0, 35), 8: (0, 199)}}, 'start_states': {'start': 175}, 'end_states': {'start': 149}}, 'options': {'debug': False, 'keep_all_tokens': False, 'tree_class': None, 'cache': False, 'postlex': None, 'parser': 'lalr', 'lexer': 'contextual', 'transformer': None, 'start': ['start'], 'priority': 'normal', 'ambiguity': 'auto', 'regex': False, 'propagate_positions': False, 'lexer_callbacks': {}, 'maybe_placeholders': False, 'edit_terminals': None, 'g_regex_flags': 0, 'use_bytes': False, 'import_paths': [], 'source_path': None}, '__type__': 'ParsingFrontend'}, 'rules': [{'@': 21}, {'@': 22}, {'@': 23}, {'@': 24}, {'@': 25}, {'@': 26}, {'@': 27}, {'@': 28}, {'@': 29}, {'@': 30}, {'@': 31}, {'@': 32}, {'@': 33}, {'@': 34}, {'@': 35}, {'@': 36}, {'@': 37}, {'@': 38}, {'@': 39}, {'@': 40}, {'@': 41}, {'@': 42}, {'@': 43}, {'@': 44}, {'@': 45}, {'@': 46}, {'@': 47}, {'@': 48}, {'@': 49}, {'@': 50}, {'@': 51}, {'@': 52}, {'@': 53}, {'@': 54}, {'@': 55}, {'@': 56}, {'@': 57}, {'@': 58}, {'@': 59}, {'@': 60}, {'@': 61}, {'@': 62}, {'@': 63}, {'@': 64}, {'@': 65}, {'@': 66}, {'@': 67}, {'@': 68}, {'@': 69}, {'@': 70}, {'@': 71}, {'@': 72}, {'@': 73}, {'@': 74}, {'@': 75}, {'@': 76}, {'@': 77}, {'@': 78}, {'@': 79}, {'@': 80}, {'@': 81}, {'@': 82}, {'@': 83}, {'@': 84}, {'@': 85}, {'@': 86}, {'@': 87}, {'@': 88}, {'@': 89}, {'@': 90}, {'@': 91}, {'@': 92}, {'@': 93}, {'@': 94}, {'@': 95}, {'@': 96}, {'@': 97}, {'@': 98}, {'@': 99}, {'@': 100}, {'@': 101}, {'@': 102}, {'@': 103}, {'@': 104}, {'@': 105}, {'@': 106}, {'@': 107}, {'@': 108}, {'@': 109}, {'@': 110}, {'@': 111}, {'@': 112}, {'@': 113}, {'@': 114}, {'@': 115}, {'@': 116}, {'@': 117}, {'@': 118}, {'@': 119}, {'@': 120}, {'@': 121}], 'options': {'debug': False, 'keep_all_tokens': False, 'tree_class': None, 'cache': False, 'postlex': None, 'parser': 'lalr', 'lexer': 'contextual', 'transformer': None, 'start': ['start'], 'priority': 'normal', 'ambiguity': 'auto', 'regex': False, 'propagate_positions': False, 'lexer_callbacks': {}, 'maybe_placeholders': False, 'edit_terminals': None, 'g_regex_flags': 0, 'use_bytes': False, 'import_paths': [], 'source_path': None}, '__type__': 'Lark'} +{'parser': {'lexer_conf': {'terminals': [{'@': 0}, {'@': 1}, {'@': 2}, {'@': 3}, {'@': 4}, {'@': 5}, {'@': 6}, {'@': 7}, {'@': 8}, {'@': 9}, {'@': 10}, {'@': 11}, {'@': 12}, {'@': 13}, {'@': 14}, {'@': 15}, {'@': 16}, {'@': 17}, {'@': 18}, {'@': 19}, {'@': 20}, {'@': 21}], 'ignore': ['WS'], 'g_regex_flags': 0, 'use_bytes': False, 'lexer_type': 'contextual', '__type__': 'LexerConf'}, 'parser_conf': {'rules': [{'@': 22}, {'@': 23}, {'@': 24}, {'@': 25}, {'@': 26}, {'@': 27}, {'@': 28}, {'@': 29}, {'@': 30}, {'@': 31}, {'@': 32}, {'@': 33}, {'@': 34}, {'@': 35}, {'@': 36}, {'@': 37}, {'@': 38}, {'@': 39}, {'@': 40}, {'@': 41}, {'@': 42}, {'@': 43}, {'@': 44}, {'@': 45}, {'@': 46}, {'@': 47}, {'@': 48}, {'@': 49}, {'@': 50}, {'@': 51}, {'@': 52}, {'@': 53}, {'@': 54}, {'@': 55}, {'@': 56}, {'@': 57}, {'@': 58}, {'@': 59}, {'@': 60}, {'@': 61}, {'@': 62}, {'@': 63}, {'@': 64}, {'@': 65}, {'@': 66}, {'@': 67}, {'@': 68}, {'@': 69}, {'@': 70}, {'@': 71}, {'@': 72}, {'@': 73}, {'@': 74}, {'@': 75}, {'@': 76}, {'@': 77}, {'@': 78}, {'@': 79}, {'@': 80}, {'@': 81}, {'@': 82}, {'@': 83}, {'@': 84}, {'@': 85}, {'@': 86}, {'@': 87}, {'@': 88}, {'@': 89}, {'@': 90}, {'@': 91}, {'@': 92}, {'@': 93}, {'@': 94}, {'@': 95}, {'@': 96}, {'@': 97}, {'@': 98}, {'@': 99}, {'@': 100}, {'@': 101}, {'@': 102}, {'@': 103}, {'@': 104}, {'@': 105}, {'@': 106}, {'@': 107}, {'@': 108}, {'@': 109}, {'@': 110}, {'@': 111}, {'@': 112}, {'@': 113}, {'@': 114}, {'@': 115}, {'@': 116}, {'@': 117}, {'@': 118}, {'@': 119}, {'@': 120}, {'@': 121}, {'@': 122}, {'@': 123}, {'@': 124}, {'@': 125}, {'@': 126}, {'@': 127}, {'@': 128}, {'@': 129}, {'@': 130}, {'@': 131}, {'@': 132}, {'@': 133}, {'@': 134}, {'@': 135}, {'@': 136}, {'@': 137}, {'@': 138}, {'@': 139}, {'@': 140}, {'@': 141}, {'@': 142}, {'@': 143}, {'@': 144}, {'@': 145}, {'@': 146}, {'@': 147}, {'@': 148}, {'@': 149}, {'@': 150}, {'@': 151}, {'@': 152}, {'@': 153}, {'@': 154}, {'@': 155}, {'@': 156}, {'@': 157}], 'start': ['start'], 'parser_type': 'lalr', '__type__': 'ParserConf'}, 'parser': {'tokens': {0: 'RSQB', 1: 'OPTION', 2: 'IDENTIFIER', 3: '__object_star_2', 4: 'METHOD', 5: 'description', 6: 'RBRACE', 7: '__description_plus_7', 8: 'COMMENT', 9: 'method', 10: 'OBJECT', 11: '$END', 12: 'INTERFACE', 13: '__options_plus_6', 14: 'LBRACE', 15: 'PARAM', 16: 'param', 17: 'options', 18: 'LSQB', 19: 'FUNCTION', 20: 'capabilities', 21: 'CAPABILITIES', 22: '__ANON_0', 23: 'uid', 24: 'PRIMITIVE', 25: 'object_name', 26: 'type', 27: 'cname', 28: 'CNAME', 29: 'IMPORT', 30: 'name', 31: 'EXPOSE', 32: '__interface_star_3', 33: 'interface_param', 34: 'function', 35: 'expose', 36: 'PATH', 37: '__function_star_5', 38: '__start_star_0', 39: '__start_plus_1', 40: 'object', 41: 'interface', 42: 'start', 43: 'import_statement', 44: 'COLON', 45: 'super', 46: '__capabilities_plus_4', 47: 'UID'}, 'states': {0: {}, 1: {0: (1, {'@': 153}), 1: (1, {'@': 153}), 2: (1, {'@': 153})}, 2: {3: (0, 141), 4: (0, 50), 5: (0, 101), 6: (0, 156), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 3: {10: (1, {'@': 65}), 8: (1, {'@': 65}), 11: (1, {'@': 65}), 12: (1, {'@': 65})}, 4: {13: (0, 8), 1: (0, 19), 2: (0, 1)}, 5: {4: (0, 50), 5: (0, 101), 6: (0, 41), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 6: {4: (1, {'@': 120}), 8: (1, {'@': 120}), 6: (1, {'@': 120})}, 7: {14: (0, 48)}, 8: {2: (0, 226), 0: (0, 131), 1: (0, 51)}, 9: {4: (0, 50), 3: (0, 95), 5: (0, 101), 6: (0, 247), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 10: {15: (0, 167), 16: (0, 174), 6: (0, 81)}, 11: {4: (1, {'@': 117}), 8: (1, {'@': 117}), 6: (1, {'@': 117})}, 12: {17: (0, 225), 14: (0, 244), 18: (0, 4), 4: (1, {'@': 127}), 8: (1, {'@': 127}), 6: (1, {'@': 127})}, 13: {10: (1, {'@': 38}), 8: (1, {'@': 38}), 11: (1, {'@': 38}), 12: (1, {'@': 38})}, 14: {15: (0, 167), 16: (0, 174), 6: (0, 65)}, 15: {4: (1, {'@': 156}), 8: (1, {'@': 156}), 19: (1, {'@': 156}), 15: (1, {'@': 156}), 6: (1, {'@': 156}), 10: (1, {'@': 156}), 12: (1, {'@': 156})}, 16: {20: (0, 142), 4: (0, 50), 5: (0, 101), 21: (0, 91), 3: (0, 148), 7: (0, 38), 6: (0, 152), 8: (0, 15), 9: (0, 123)}, 17: {20: (0, 70), 4: (0, 50), 5: (0, 101), 21: (0, 91), 3: (0, 77), 7: (0, 38), 6: (0, 85), 8: (0, 15), 9: (0, 123)}, 18: {10: (1, {'@': 57}), 8: (1, {'@': 57}), 11: (1, {'@': 57}), 12: (1, {'@': 57})}, 19: {0: (1, {'@': 152}), 1: (1, {'@': 152}), 2: (1, {'@': 152})}, 20: {4: (1, {'@': 145}), 8: (1, {'@': 145}), 6: (1, {'@': 145})}, 21: {10: (1, {'@': 88}), 8: (1, {'@': 88}), 11: (1, {'@': 88}), 12: (1, {'@': 88})}, 22: {10: (1, {'@': 36}), 8: (1, {'@': 36}), 11: (1, {'@': 36}), 12: (1, {'@': 36})}, 23: {10: (1, {'@': 58}), 8: (1, {'@': 58}), 11: (1, {'@': 58}), 12: (1, {'@': 58})}, 24: {10: (1, {'@': 33}), 8: (1, {'@': 33}), 11: (1, {'@': 33}), 12: (1, {'@': 33})}, 25: {10: (1, {'@': 87}), 8: (1, {'@': 87}), 11: (1, {'@': 87}), 12: (1, {'@': 87})}, 26: {4: (0, 50), 5: (0, 101), 6: (0, 45), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 27: {6: (0, 18), 4: (0, 50), 5: (0, 101), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 28: {10: (1, {'@': 27}), 8: (1, {'@': 27}), 11: (1, {'@': 27}), 12: (1, {'@': 27})}, 29: {4: (0, 50), 5: (0, 101), 6: (0, 88), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 30: {22: (0, 206), 23: (0, 46)}, 31: {4: (0, 50), 6: (0, 54), 5: (0, 101), 3: (0, 61), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 32: {10: (1, {'@': 61}), 8: (1, {'@': 61}), 11: (1, {'@': 61}), 12: (1, {'@': 61})}, 33: {14: (0, 67)}, 34: {10: (1, {'@': 50}), 8: (1, {'@': 50}), 11: (1, {'@': 50}), 12: (1, {'@': 50})}, 35: {10: (1, {'@': 26}), 8: (1, {'@': 26}), 11: (1, {'@': 26}), 12: (1, {'@': 26})}, 36: {4: (0, 50), 5: (0, 101), 3: (0, 255), 6: (0, 262), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 37: {10: (1, {'@': 73}), 8: (1, {'@': 73}), 11: (1, {'@': 73}), 12: (1, {'@': 73})}, 38: {8: (0, 261), 4: (1, {'@': 137}), 19: (1, {'@': 137}), 15: (1, {'@': 137}), 6: (1, {'@': 137}), 10: (1, {'@': 137}), 12: (1, {'@': 137})}, 39: {4: (0, 50), 5: (0, 101), 6: (0, 25), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 40: {10: (1, {'@': 29}), 8: (1, {'@': 29}), 11: (1, {'@': 29}), 12: (1, {'@': 29})}, 41: {10: (1, {'@': 37}), 8: (1, {'@': 37}), 11: (1, {'@': 37}), 12: (1, {'@': 37})}, 42: {24: (0, 258), 10: (0, 190), 25: (0, 212), 26: (0, 217)}, 43: {10: (1, {'@': 41}), 8: (1, {'@': 41}), 11: (1, {'@': 41}), 12: (1, {'@': 41})}, 44: {10: (1, {'@': 140}), 8: (1, {'@': 140}), 11: (1, {'@': 140}), 12: (1, {'@': 140})}, 45: {10: (1, {'@': 35}), 8: (1, {'@': 35}), 11: (1, {'@': 35}), 12: (1, {'@': 35})}, 46: {27: (0, 136), 20: (0, 165), 3: (0, 176), 4: (0, 50), 28: (0, 127), 5: (0, 101), 21: (0, 91), 7: (0, 38), 8: (0, 15), 6: (0, 185), 9: (0, 123)}, 47: {10: (1, {'@': 138}), 8: (1, {'@': 138}), 29: (1, {'@': 138}), 12: (1, {'@': 138})}, 48: {23: (0, 132), 22: (0, 206)}, 49: {4: (0, 50), 3: (0, 128), 5: (0, 101), 6: (0, 90), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 50: {2: (0, 238), 30: (0, 12)}, 51: {0: (1, {'@': 154}), 1: (1, {'@': 154}), 2: (1, {'@': 154})}, 52: {20: (0, 213), 4: (0, 50), 28: (0, 127), 5: (0, 101), 3: (0, 220), 21: (0, 91), 27: (0, 228), 7: (0, 38), 8: (0, 15), 6: (0, 242), 9: (0, 123)}, 53: {10: (1, {'@': 47}), 8: (1, {'@': 47}), 11: (1, {'@': 47}), 12: (1, {'@': 47})}, 54: {10: (1, {'@': 34}), 8: (1, {'@': 34}), 11: (1, {'@': 34}), 12: (1, {'@': 34})}, 55: {15: (0, 167), 16: (0, 174), 6: (0, 86)}, 56: {4: (1, {'@': 116}), 8: (1, {'@': 116}), 6: (1, {'@': 116})}, 57: {17: (0, 149), 18: (0, 4), 14: (0, 154), 31: (1, {'@': 115}), 8: (1, {'@': 115}), 19: (1, {'@': 115}), 6: (1, {'@': 115})}, 58: {10: (1, {'@': 32}), 8: (1, {'@': 32}), 11: (1, {'@': 32}), 12: (1, {'@': 32})}, 59: {31: (1, {'@': 105}), 8: (1, {'@': 105}), 19: (1, {'@': 105}), 6: (1, {'@': 105})}, 60: {23: (0, 271), 22: (0, 206)}, 61: {4: (0, 50), 5: (0, 101), 6: (0, 24), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 62: {5: (0, 173), 19: (0, 219), 6: (0, 160), 32: (0, 164), 33: (0, 223), 31: (0, 42), 34: (0, 63), 7: (0, 38), 35: (0, 108), 8: (0, 15)}, 63: {31: (1, {'@': 98}), 8: (1, {'@': 98}), 19: (1, {'@': 98}), 6: (1, {'@': 98})}, 64: {4: (0, 50), 6: (0, 203), 5: (0, 101), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 65: {31: (1, {'@': 110}), 8: (1, {'@': 110}), 19: (1, {'@': 110}), 6: (1, {'@': 110})}, 66: {4: (0, 50), 5: (0, 101), 20: (0, 36), 21: (0, 91), 3: (0, 99), 6: (0, 92), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 67: {22: (0, 206), 23: (0, 169)}, 68: {31: (1, {'@': 113}), 8: (1, {'@': 113}), 19: (1, {'@': 113}), 6: (1, {'@': 113})}, 69: {30: (0, 171), 2: (0, 238)}, 70: {3: (0, 29), 4: (0, 50), 5: (0, 101), 6: (0, 35), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 71: {5: (0, 112), 7: (0, 38), 8: (0, 15), 15: (1, {'@': 129}), 6: (1, {'@': 129})}, 72: {5: (0, 173), 19: (0, 219), 32: (0, 105), 33: (0, 223), 6: (0, 113), 31: (0, 42), 34: (0, 63), 7: (0, 38), 35: (0, 108), 8: (0, 15)}, 73: {10: (1, {'@': 55}), 8: (1, {'@': 55}), 11: (1, {'@': 55}), 12: (1, {'@': 55})}, 74: {4: (0, 50), 5: (0, 101), 6: (0, 151), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 75: {0: (1, {'@': 148}), 2: (1, {'@': 148})}, 76: {4: (0, 50), 5: (0, 101), 6: (0, 100), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 77: {4: (0, 50), 5: (0, 101), 6: (0, 28), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 78: {36: (0, 264)}, 79: {14: (0, 82)}, 80: {4: (0, 50), 5: (0, 101), 7: (0, 38), 6: (0, 111), 8: (0, 15), 9: (0, 20)}, 81: {4: (1, {'@': 119}), 8: (1, {'@': 119}), 6: (1, {'@': 119})}, 82: {23: (0, 153), 22: (0, 206)}, 83: {15: (1, {'@': 130}), 6: (1, {'@': 130})}, 84: {10: (1, {'@': 44}), 8: (1, {'@': 44}), 11: (1, {'@': 44}), 12: (1, {'@': 44})}, 85: {10: (1, {'@': 28}), 8: (1, {'@': 28}), 11: (1, {'@': 28}), 12: (1, {'@': 28})}, 86: {31: (1, {'@': 104}), 8: (1, {'@': 104}), 19: (1, {'@': 104}), 6: (1, {'@': 104})}, 87: {22: (0, 206), 23: (0, 72)}, 88: {10: (1, {'@': 25}), 8: (1, {'@': 25}), 11: (1, {'@': 25}), 12: (1, {'@': 25})}, 89: {6: (0, 107), 4: (0, 50), 3: (0, 110), 5: (0, 101), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 90: {10: (1, {'@': 30}), 8: (1, {'@': 30}), 11: (1, {'@': 30}), 12: (1, {'@': 30})}, 91: {18: (0, 183)}, 92: {10: (1, {'@': 84}), 8: (1, {'@': 84}), 11: (1, {'@': 84}), 12: (1, {'@': 84})}, 93: {4: (1, {'@': 123}), 8: (1, {'@': 123}), 6: (1, {'@': 123})}, 94: {22: (0, 206), 23: (0, 140)}, 95: {4: (0, 50), 5: (0, 101), 6: (0, 227), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 96: {10: (1, {'@': 49}), 8: (1, {'@': 49}), 11: (1, {'@': 49}), 12: (1, {'@': 49})}, 97: {4: (1, {'@': 125}), 8: (1, {'@': 125}), 6: (1, {'@': 125})}, 98: {10: (1, {'@': 141}), 8: (1, {'@': 141}), 11: (1, {'@': 141}), 12: (1, {'@': 141})}, 99: {4: (0, 50), 6: (0, 207), 5: (0, 101), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 100: {10: (1, {'@': 43}), 8: (1, {'@': 43}), 11: (1, {'@': 43}), 12: (1, {'@': 43})}, 101: {4: (0, 104)}, 102: {3: (0, 144), 4: (0, 50), 5: (0, 101), 21: (0, 91), 20: (0, 161), 7: (0, 38), 6: (0, 197), 8: (0, 15), 9: (0, 123)}, 103: {10: (1, {'@': 46}), 8: (1, {'@': 46}), 11: (1, {'@': 46}), 12: (1, {'@': 46})}, 104: {30: (0, 194), 2: (0, 238)}, 105: {5: (0, 173), 19: (0, 219), 6: (0, 266), 33: (0, 191), 31: (0, 42), 34: (0, 63), 7: (0, 38), 35: (0, 108), 8: (0, 15)}, 106: {14: (0, 121), 31: (1, {'@': 106}), 8: (1, {'@': 106}), 19: (1, {'@': 106}), 6: (1, {'@': 106})}, 107: {10: (1, {'@': 42}), 8: (1, {'@': 42}), 11: (1, {'@': 42}), 12: (1, {'@': 42})}, 108: {31: (1, {'@': 97}), 8: (1, {'@': 97}), 19: (1, {'@': 97}), 6: (1, {'@': 97})}, 109: {15: (0, 167), 6: (0, 119), 16: (0, 199), 37: (0, 122)}, 110: {4: (0, 50), 5: (0, 101), 6: (0, 43), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 111: {10: (1, {'@': 71}), 8: (1, {'@': 71}), 11: (1, {'@': 71}), 12: (1, {'@': 71})}, 112: {15: (1, {'@': 128}), 6: (1, {'@': 128})}, 113: {10: (1, {'@': 92}), 8: (1, {'@': 92}), 11: (1, {'@': 92}), 12: (1, {'@': 92})}, 114: {10: (0, 204), 5: (0, 218), 38: (0, 175), 39: (0, 179), 12: (0, 222), 8: (0, 15), 40: (0, 44), 29: (0, 78), 41: (0, 98), 42: (0, 0), 43: (0, 47), 7: (0, 38)}, 115: {10: (1, {'@': 79}), 8: (1, {'@': 79}), 11: (1, {'@': 79}), 12: (1, {'@': 79})}, 116: {24: (0, 258), 26: (0, 134), 10: (0, 190), 25: (0, 212)}, 117: {31: (1, {'@': 134}), 8: (1, {'@': 134}), 19: (1, {'@': 134}), 6: (1, {'@': 134}), 18: (1, {'@': 134}), 15: (1, {'@': 134})}, 118: {31: (1, {'@': 114}), 8: (1, {'@': 114}), 19: (1, {'@': 114}), 6: (1, {'@': 114})}, 119: {31: (1, {'@': 108}), 8: (1, {'@': 108}), 19: (1, {'@': 108}), 6: (1, {'@': 108})}, 120: {15: (0, 167), 16: (0, 174), 6: (0, 68)}, 121: {15: (0, 167), 16: (0, 199), 37: (0, 55), 6: (0, 59)}, 122: {15: (0, 167), 16: (0, 174), 6: (0, 124)}, 123: {4: (1, {'@': 144}), 8: (1, {'@': 144}), 6: (1, {'@': 144})}, 124: {31: (1, {'@': 107}), 8: (1, {'@': 107}), 19: (1, {'@': 107}), 6: (1, {'@': 107})}, 125: {15: (0, 167), 16: (0, 174), 6: (0, 129)}, 126: {31: (1, {'@': 111}), 8: (1, {'@': 111}), 19: (1, {'@': 111}), 6: (1, {'@': 111})}, 127: {2: (0, 230)}, 128: {4: (0, 50), 5: (0, 101), 6: (0, 40), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 129: {4: (1, {'@': 122}), 8: (1, {'@': 122}), 6: (1, {'@': 122})}, 130: {15: (0, 167), 16: (0, 174), 6: (0, 56)}, 131: {4: (1, {'@': 136}), 14: (1, {'@': 136}), 8: (1, {'@': 136}), 6: (1, {'@': 136}), 31: (1, {'@': 136}), 19: (1, {'@': 136}), 15: (1, {'@': 136}), 44: (1, {'@': 136})}, 132: {5: (0, 173), 19: (0, 219), 32: (0, 231), 33: (0, 223), 31: (0, 42), 34: (0, 63), 7: (0, 38), 6: (0, 240), 35: (0, 108), 8: (0, 15)}, 133: {4: (0, 50), 5: (0, 101), 6: (0, 37), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 134: {17: (0, 71), 5: (0, 83), 7: (0, 38), 18: (0, 4), 8: (0, 15), 15: (1, {'@': 131}), 6: (1, {'@': 131})}, 135: {22: (0, 206), 23: (0, 52)}, 136: {4: (0, 50), 3: (0, 211), 5: (0, 101), 20: (0, 208), 21: (0, 91), 9: (0, 123), 7: (0, 38), 6: (0, 251), 8: (0, 15)}, 137: {4: (0, 50), 5: (0, 101), 7: (0, 38), 6: (0, 53), 8: (0, 15), 9: (0, 20)}, 138: {15: (0, 167), 6: (0, 6), 16: (0, 199), 37: (0, 10)}, 139: {14: (0, 267), 45: (0, 33), 44: (0, 168)}, 140: {5: (0, 173), 19: (0, 219), 32: (0, 232), 33: (0, 223), 31: (0, 42), 34: (0, 63), 7: (0, 38), 6: (0, 269), 35: (0, 108), 8: (0, 15)}, 141: {4: (0, 50), 5: (0, 101), 6: (0, 229), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 142: {4: (0, 50), 5: (0, 101), 6: (0, 215), 3: (0, 221), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 143: {10: (1, {'@': 48}), 8: (1, {'@': 48}), 11: (1, {'@': 48}), 12: (1, {'@': 48})}, 144: {4: (0, 50), 5: (0, 101), 6: (0, 263), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 145: {14: (0, 253), 17: (0, 139), 45: (0, 195), 44: (0, 168), 18: (0, 4)}, 146: {4: (0, 50), 3: (0, 74), 6: (0, 103), 5: (0, 101), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 147: {4: (0, 50), 5: (0, 101), 3: (0, 234), 7: (0, 38), 6: (0, 202), 8: (0, 15), 9: (0, 123)}, 148: {4: (0, 50), 5: (0, 101), 7: (0, 38), 8: (0, 15), 9: (0, 20), 6: (0, 209)}, 149: {14: (0, 237), 31: (1, {'@': 112}), 8: (1, {'@': 112}), 19: (1, {'@': 112}), 6: (1, {'@': 112})}, 150: {4: (0, 50), 28: (0, 127), 5: (0, 101), 27: (0, 102), 21: (0, 91), 20: (0, 147), 3: (0, 250), 7: (0, 38), 6: (0, 265), 8: (0, 15), 9: (0, 123)}, 151: {10: (1, {'@': 45}), 8: (1, {'@': 45}), 11: (1, {'@': 45}), 12: (1, {'@': 45})}, 152: {10: (1, {'@': 68}), 8: (1, {'@': 68}), 11: (1, {'@': 68}), 12: (1, {'@': 68})}, 153: {4: (0, 50), 28: (0, 127), 5: (0, 101), 21: (0, 91), 27: (0, 268), 3: (0, 137), 6: (0, 143), 7: (0, 38), 20: (0, 146), 8: (0, 15), 9: (0, 123)}, 154: {6: (0, 118), 15: (0, 167), 37: (0, 120), 16: (0, 199)}, 155: {10: (1, {'@': 143}), 8: (1, {'@': 143}), 11: (1, {'@': 143}), 12: (1, {'@': 143})}, 156: {10: (1, {'@': 70}), 8: (1, {'@': 70}), 11: (1, {'@': 70}), 12: (1, {'@': 70})}, 157: {14: (0, 178), 4: (1, {'@': 118}), 8: (1, {'@': 118}), 6: (1, {'@': 118})}, 158: {10: (1, {'@': 93}), 8: (1, {'@': 93}), 11: (1, {'@': 93}), 12: (1, {'@': 93})}, 159: {10: (1, {'@': 53}), 8: (1, {'@': 53}), 11: (1, {'@': 53}), 12: (1, {'@': 53})}, 160: {10: (1, {'@': 96}), 8: (1, {'@': 96}), 11: (1, {'@': 96}), 12: (1, {'@': 96})}, 161: {4: (0, 50), 6: (0, 272), 5: (0, 101), 3: (0, 133), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 162: {20: (0, 241), 4: (0, 50), 5: (0, 101), 21: (0, 91), 3: (0, 246), 6: (0, 252), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 163: {4: (1, {'@': 102}), 8: (1, {'@': 102}), 6: (1, {'@': 102})}, 164: {5: (0, 173), 19: (0, 219), 33: (0, 191), 31: (0, 42), 34: (0, 63), 7: (0, 38), 6: (0, 205), 35: (0, 108), 8: (0, 15)}, 165: {4: (0, 50), 3: (0, 198), 5: (0, 101), 6: (0, 256), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 166: {15: (0, 167), 6: (0, 93), 16: (0, 199), 37: (0, 125)}, 167: {30: (0, 116), 2: (0, 238)}, 168: {30: (0, 189), 2: (0, 238)}, 169: {27: (0, 162), 4: (0, 50), 28: (0, 127), 20: (0, 177), 5: (0, 101), 21: (0, 91), 3: (0, 186), 7: (0, 38), 6: (0, 192), 8: (0, 15), 9: (0, 123)}, 170: {2: (0, 181), 0: (0, 163)}, 171: {17: (0, 106), 14: (0, 109), 18: (0, 4), 31: (1, {'@': 109}), 8: (1, {'@': 109}), 19: (1, {'@': 109}), 6: (1, {'@': 109})}, 172: {14: (0, 135), 45: (0, 254), 44: (0, 168)}, 173: {19: (0, 69)}, 174: {15: (1, {'@': 151}), 6: (1, {'@': 151})}, 175: {10: (0, 204), 5: (0, 218), 39: (0, 210), 12: (0, 222), 8: (0, 15), 40: (0, 44), 29: (0, 78), 41: (0, 98), 43: (0, 200), 7: (0, 38)}, 176: {4: (0, 50), 5: (0, 101), 6: (0, 73), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 177: {4: (0, 50), 5: (0, 101), 3: (0, 235), 6: (0, 259), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 178: {15: (0, 167), 37: (0, 130), 16: (0, 199), 6: (0, 11)}, 179: {40: (0, 184), 10: (0, 204), 5: (0, 218), 12: (0, 222), 8: (0, 15), 41: (0, 155), 7: (0, 38), 11: (1, {'@': 23})}, 180: {4: (0, 50), 20: (0, 9), 28: (0, 127), 6: (0, 21), 3: (0, 39), 27: (0, 66), 5: (0, 101), 21: (0, 91), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 181: {0: (1, {'@': 149}), 2: (1, {'@': 149})}, 182: {22: (0, 206), 23: (0, 62)}, 183: {2: (0, 75), 46: (0, 170)}, 184: {10: (1, {'@': 142}), 8: (1, {'@': 142}), 11: (1, {'@': 142}), 12: (1, {'@': 142})}, 185: {10: (1, {'@': 56}), 8: (1, {'@': 56}), 11: (1, {'@': 56}), 12: (1, {'@': 56})}, 186: {6: (0, 236), 4: (0, 50), 5: (0, 101), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 187: {15: (0, 167), 16: (0, 174), 6: (0, 97)}, 188: {22: (0, 206), 23: (0, 150)}, 189: {14: (1, {'@': 103})}, 190: {30: (0, 117), 2: (0, 238)}, 191: {31: (1, {'@': 147}), 8: (1, {'@': 147}), 19: (1, {'@': 147}), 6: (1, {'@': 147})}, 192: {10: (1, {'@': 64}), 8: (1, {'@': 64}), 11: (1, {'@': 64}), 12: (1, {'@': 64})}, 193: {4: (1, {'@': 126}), 8: (1, {'@': 126}), 6: (1, {'@': 126})}, 194: {17: (0, 157), 14: (0, 138), 18: (0, 4), 4: (1, {'@': 121}), 8: (1, {'@': 121}), 6: (1, {'@': 121})}, 195: {14: (0, 188)}, 196: {30: (0, 201), 2: (0, 238)}, 197: {10: (1, {'@': 76}), 8: (1, {'@': 76}), 11: (1, {'@': 76}), 12: (1, {'@': 76})}, 198: {4: (0, 50), 5: (0, 101), 6: (0, 159), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 199: {15: (1, {'@': 150}), 6: (1, {'@': 150})}, 200: {10: (1, {'@': 139}), 8: (1, {'@': 139}), 29: (1, {'@': 139}), 12: (1, {'@': 139})}, 201: {17: (0, 172), 14: (0, 30), 45: (0, 79), 44: (0, 168), 18: (0, 4)}, 202: {10: (1, {'@': 78}), 8: (1, {'@': 78}), 11: (1, {'@': 78}), 12: (1, {'@': 78})}, 203: {10: (1, {'@': 31}), 8: (1, {'@': 31}), 11: (1, {'@': 31}), 12: (1, {'@': 31})}, 204: {30: (0, 145), 2: (0, 238)}, 205: {10: (1, {'@': 95}), 8: (1, {'@': 95}), 11: (1, {'@': 95}), 12: (1, {'@': 95})}, 206: {47: (0, 249)}, 207: {10: (1, {'@': 83}), 8: (1, {'@': 83}), 11: (1, {'@': 83}), 12: (1, {'@': 83})}, 208: {4: (0, 50), 5: (0, 101), 3: (0, 248), 6: (0, 34), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 209: {10: (1, {'@': 67}), 8: (1, {'@': 67}), 11: (1, {'@': 67}), 12: (1, {'@': 67})}, 210: {40: (0, 184), 10: (0, 204), 5: (0, 218), 12: (0, 222), 8: (0, 15), 41: (0, 155), 7: (0, 38), 11: (1, {'@': 22})}, 211: {4: (0, 50), 5: (0, 101), 6: (0, 243), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 212: {8: (1, {'@': 133}), 6: (1, {'@': 133}), 31: (1, {'@': 133}), 19: (1, {'@': 133}), 15: (1, {'@': 133}), 18: (1, {'@': 133})}, 213: {3: (0, 5), 4: (0, 50), 5: (0, 101), 6: (0, 13), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 214: {10: (1, {'@': 89}), 8: (1, {'@': 89}), 11: (1, {'@': 89}), 12: (1, {'@': 89})}, 215: {10: (1, {'@': 66}), 8: (1, {'@': 66}), 11: (1, {'@': 66}), 12: (1, {'@': 66})}, 216: {4: (0, 50), 28: (0, 127), 27: (0, 16), 5: (0, 101), 20: (0, 2), 21: (0, 91), 3: (0, 80), 7: (0, 38), 8: (0, 15), 6: (0, 257), 9: (0, 123)}, 217: {31: (1, {'@': 99}), 8: (1, {'@': 99}), 19: (1, {'@': 99}), 6: (1, {'@': 99})}, 218: {10: (0, 196), 12: (0, 233)}, 219: {30: (0, 57), 2: (0, 238)}, 220: {4: (0, 50), 5: (0, 101), 7: (0, 38), 6: (0, 270), 8: (0, 15), 9: (0, 20)}, 221: {4: (0, 50), 5: (0, 101), 7: (0, 38), 8: (0, 15), 6: (0, 3), 9: (0, 20)}, 222: {2: (0, 238), 30: (0, 274)}, 223: {31: (1, {'@': 146}), 8: (1, {'@': 146}), 19: (1, {'@': 146}), 6: (1, {'@': 146})}, 224: {10: (1, {'@': 77}), 8: (1, {'@': 77}), 11: (1, {'@': 77}), 12: (1, {'@': 77})}, 225: {14: (0, 166), 4: (1, {'@': 124}), 8: (1, {'@': 124}), 6: (1, {'@': 124})}, 226: {0: (1, {'@': 155}), 1: (1, {'@': 155}), 2: (1, {'@': 155})}, 227: {10: (1, {'@': 85}), 8: (1, {'@': 85}), 11: (1, {'@': 85}), 12: (1, {'@': 85})}, 228: {7: (0, 38), 4: (0, 50), 6: (0, 22), 5: (0, 101), 3: (0, 26), 21: (0, 91), 20: (0, 31), 8: (0, 15), 9: (0, 123)}, 229: {10: (1, {'@': 69}), 8: (1, {'@': 69}), 11: (1, {'@': 69}), 12: (1, {'@': 69})}, 230: {4: (1, {'@': 101}), 8: (1, {'@': 101}), 6: (1, {'@': 101}), 21: (1, {'@': 101})}, 231: {5: (0, 173), 19: (0, 219), 33: (0, 191), 31: (0, 42), 34: (0, 63), 7: (0, 38), 35: (0, 108), 8: (0, 15), 6: (0, 158)}, 232: {5: (0, 173), 19: (0, 219), 6: (0, 214), 33: (0, 191), 31: (0, 42), 34: (0, 63), 7: (0, 38), 35: (0, 108), 8: (0, 15)}, 233: {30: (0, 245), 2: (0, 238)}, 234: {4: (0, 50), 5: (0, 101), 6: (0, 224), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 235: {6: (0, 32), 4: (0, 50), 5: (0, 101), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 236: {10: (1, {'@': 63}), 8: (1, {'@': 63}), 11: (1, {'@': 63}), 12: (1, {'@': 63})}, 237: {15: (0, 167), 37: (0, 14), 6: (0, 126), 16: (0, 199)}, 238: {4: (1, {'@': 135}), 14: (1, {'@': 135}), 8: (1, {'@': 135}), 18: (1, {'@': 135}), 6: (1, {'@': 135}), 31: (1, {'@': 135}), 19: (1, {'@': 135}), 10: (1, {'@': 135}), 24: (1, {'@': 135}), 15: (1, {'@': 135}), 44: (1, {'@': 135})}, 239: {14: (0, 94)}, 240: {10: (1, {'@': 94}), 8: (1, {'@': 94}), 11: (1, {'@': 94}), 12: (1, {'@': 94})}, 241: {4: (0, 50), 5: (0, 101), 6: (0, 23), 3: (0, 27), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 242: {10: (1, {'@': 40}), 8: (1, {'@': 40}), 11: (1, {'@': 40}), 12: (1, {'@': 40})}, 243: {10: (1, {'@': 51}), 8: (1, {'@': 51}), 11: (1, {'@': 51}), 12: (1, {'@': 51})}, 244: {15: (0, 167), 37: (0, 187), 6: (0, 193), 16: (0, 199)}, 245: {14: (0, 87), 17: (0, 239), 18: (0, 4)}, 246: {4: (0, 50), 5: (0, 101), 7: (0, 38), 8: (0, 15), 9: (0, 20), 6: (0, 260)}, 247: {10: (1, {'@': 86}), 8: (1, {'@': 86}), 11: (1, {'@': 86}), 12: (1, {'@': 86})}, 248: {4: (0, 50), 5: (0, 101), 6: (0, 96), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 249: {4: (1, {'@': 100}), 21: (1, {'@': 100}), 8: (1, {'@': 100}), 28: (1, {'@': 100}), 6: (1, {'@': 100}), 31: (1, {'@': 100}), 19: (1, {'@': 100})}, 250: {6: (0, 115), 4: (0, 50), 5: (0, 101), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 251: {10: (1, {'@': 52}), 8: (1, {'@': 52}), 11: (1, {'@': 52}), 12: (1, {'@': 52})}, 252: {10: (1, {'@': 60}), 8: (1, {'@': 60}), 11: (1, {'@': 60}), 12: (1, {'@': 60})}, 253: {22: (0, 206), 23: (0, 180)}, 254: {14: (0, 60)}, 255: {4: (0, 50), 5: (0, 101), 6: (0, 273), 7: (0, 38), 8: (0, 15), 9: (0, 20)}, 256: {10: (1, {'@': 54}), 8: (1, {'@': 54}), 11: (1, {'@': 54}), 12: (1, {'@': 54})}, 257: {10: (1, {'@': 72}), 8: (1, {'@': 72}), 11: (1, {'@': 72}), 12: (1, {'@': 72})}, 258: {8: (1, {'@': 132}), 6: (1, {'@': 132}), 31: (1, {'@': 132}), 19: (1, {'@': 132}), 15: (1, {'@': 132}), 18: (1, {'@': 132})}, 259: {10: (1, {'@': 62}), 8: (1, {'@': 62}), 11: (1, {'@': 62}), 12: (1, {'@': 62})}, 260: {10: (1, {'@': 59}), 8: (1, {'@': 59}), 11: (1, {'@': 59}), 12: (1, {'@': 59})}, 261: {4: (1, {'@': 157}), 8: (1, {'@': 157}), 19: (1, {'@': 157}), 15: (1, {'@': 157}), 6: (1, {'@': 157}), 10: (1, {'@': 157}), 12: (1, {'@': 157})}, 262: {10: (1, {'@': 82}), 8: (1, {'@': 82}), 11: (1, {'@': 82}), 12: (1, {'@': 82})}, 263: {10: (1, {'@': 75}), 8: (1, {'@': 75}), 11: (1, {'@': 75}), 12: (1, {'@': 75})}, 264: {10: (1, {'@': 24}), 8: (1, {'@': 24}), 29: (1, {'@': 24}), 12: (1, {'@': 24})}, 265: {10: (1, {'@': 80}), 8: (1, {'@': 80}), 11: (1, {'@': 80}), 12: (1, {'@': 80})}, 266: {10: (1, {'@': 91}), 8: (1, {'@': 91}), 11: (1, {'@': 91}), 12: (1, {'@': 91})}, 267: {22: (0, 206), 23: (0, 216)}, 268: {3: (0, 76), 4: (0, 50), 5: (0, 101), 6: (0, 84), 21: (0, 91), 20: (0, 89), 7: (0, 38), 8: (0, 15), 9: (0, 123)}, 269: {10: (1, {'@': 90}), 8: (1, {'@': 90}), 11: (1, {'@': 90}), 12: (1, {'@': 90})}, 270: {10: (1, {'@': 39}), 8: (1, {'@': 39}), 11: (1, {'@': 39}), 12: (1, {'@': 39})}, 271: {27: (0, 17), 4: (0, 50), 28: (0, 127), 20: (0, 49), 5: (0, 101), 6: (0, 58), 21: (0, 91), 3: (0, 64), 9: (0, 123), 7: (0, 38), 8: (0, 15)}, 272: {10: (1, {'@': 74}), 8: (1, {'@': 74}), 11: (1, {'@': 74}), 12: (1, {'@': 74})}, 273: {10: (1, {'@': 81}), 8: (1, {'@': 81}), 11: (1, {'@': 81}), 12: (1, {'@': 81})}, 274: {14: (0, 182), 17: (0, 7), 18: (0, 4)}}, 'start_states': {'start': 114}, 'end_states': {'start': 0}}, 'options': {'debug': False, 'keep_all_tokens': False, 'tree_class': None, 'cache': False, 'postlex': None, 'parser': 'lalr', 'lexer': 'contextual', 'transformer': None, 'start': ['start'], 'priority': 'normal', 'ambiguity': 'auto', 'regex': False, 'propagate_positions': False, 'lexer_callbacks': {}, 'maybe_placeholders': False, 'edit_terminals': None, 'g_regex_flags': 0, 'use_bytes': False, 'import_paths': [], 'source_path': None}, '__type__': 'ParsingFrontend'}, 'rules': [{'@': 22}, {'@': 23}, {'@': 24}, {'@': 25}, {'@': 26}, {'@': 27}, {'@': 28}, {'@': 29}, {'@': 30}, {'@': 31}, {'@': 32}, {'@': 33}, {'@': 34}, {'@': 35}, {'@': 36}, {'@': 37}, {'@': 38}, {'@': 39}, {'@': 40}, {'@': 41}, {'@': 42}, {'@': 43}, {'@': 44}, {'@': 45}, {'@': 46}, {'@': 47}, {'@': 48}, {'@': 49}, {'@': 50}, {'@': 51}, {'@': 52}, {'@': 53}, {'@': 54}, {'@': 55}, {'@': 56}, {'@': 57}, {'@': 58}, {'@': 59}, {'@': 60}, {'@': 61}, {'@': 62}, {'@': 63}, {'@': 64}, {'@': 65}, {'@': 66}, {'@': 67}, {'@': 68}, {'@': 69}, {'@': 70}, {'@': 71}, {'@': 72}, {'@': 73}, {'@': 74}, {'@': 75}, {'@': 76}, {'@': 77}, {'@': 78}, {'@': 79}, {'@': 80}, {'@': 81}, {'@': 82}, {'@': 83}, {'@': 84}, {'@': 85}, {'@': 86}, {'@': 87}, {'@': 88}, {'@': 89}, {'@': 90}, {'@': 91}, {'@': 92}, {'@': 93}, {'@': 94}, {'@': 95}, {'@': 96}, {'@': 97}, {'@': 98}, {'@': 99}, {'@': 100}, {'@': 101}, {'@': 102}, {'@': 103}, {'@': 104}, {'@': 105}, {'@': 106}, {'@': 107}, {'@': 108}, {'@': 109}, {'@': 110}, {'@': 111}, {'@': 112}, {'@': 113}, {'@': 114}, {'@': 115}, {'@': 116}, {'@': 117}, {'@': 118}, {'@': 119}, {'@': 120}, {'@': 121}, {'@': 122}, {'@': 123}, {'@': 124}, {'@': 125}, {'@': 126}, {'@': 127}, {'@': 128}, {'@': 129}, {'@': 130}, {'@': 131}, {'@': 132}, {'@': 133}, {'@': 134}, {'@': 135}, {'@': 136}, {'@': 137}, {'@': 138}, {'@': 139}, {'@': 140}, {'@': 141}, {'@': 142}, {'@': 143}, {'@': 144}, {'@': 145}, {'@': 146}, {'@': 147}, {'@': 148}, {'@': 149}, {'@': 150}, {'@': 151}, {'@': 152}, {'@': 153}, {'@': 154}, {'@': 155}, {'@': 156}, {'@': 157}], 'options': {'debug': False, 'keep_all_tokens': False, 'tree_class': None, 'cache': False, 'postlex': None, 'parser': 'lalr', 'lexer': 'contextual', 'transformer': None, 'start': ['start'], 'priority': 'normal', 'ambiguity': 'auto', 'regex': False, 'propagate_positions': False, 'lexer_callbacks': {}, 'maybe_placeholders': False, 'edit_terminals': None, 'g_regex_flags': 0, 'use_bytes': False, 'import_paths': [], 'source_path': None}, '__type__': 'Lark'} ) MEMO = ( -{0: {'name': 'IDENTIFIER', 'pattern': {'value': '(?:(?:[A-Z]|[a-z])|_)(?:(?:(?:[A-Z]|[a-z])|[0-9]|_))*', 'flags': [], '_width': [1, 4294967295], '__type__': 'PatternRE'}, 'priority': 1, '__type__': 'TerminalDef'}, 1: {'name': 'WS', 'pattern': {'value': '(?:[ \t\x0c\r\n])+', 'flags': [], '_width': [1, 4294967295], '__type__': 'PatternRE'}, 'priority': 1, '__type__': 'TerminalDef'}, 2: {'name': 'PRIMITIVE', 'pattern': {'value': '(?:address|string|buffer|u?int(8|16|32|64)?|size)', 'flags': [], '_width': [3, 7], '__type__': 'PatternRE'}, 'priority': 1, '__type__': 'TerminalDef'}, 3: {'name': 'UID', 'pattern': {'value': '[0-9a-fA-F]{16}', 'flags': [], '_width': [16, 16], '__type__': 'PatternRE'}, 'priority': 1, '__type__': 'TerminalDef'}, 4: {'name': 'OPTION', 'pattern': {'value': '(?:(?:[A-Z]|[a-z])|_)(?:(?:(?:[A-Z]|[a-z])|[0-9]|_))*:(?:(?:[A-Z]|[a-z])|_)(?:(?:(?:[A-Z]|[a-z])|[0-9]|_))*', 'flags': [], '_width': [3, 4294967295], '__type__': 'PatternRE'}, 'priority': 2, '__type__': 'TerminalDef'}, 5: {'name': 'COMMENT', 'pattern': {'value': '#.*', 'flags': [], '_width': [1, 4294967295], '__type__': 'PatternRE'}, 'priority': 1, '__type__': 'TerminalDef'}, 6: {'name': 'PATH', 'pattern': {'value': '"[^"]*"', 'flags': [], '_width': [2, 4294967295], '__type__': 'PatternRE'}, 'priority': 1, '__type__': 'TerminalDef'}, 7: {'name': 'IMPORT', 'pattern': {'value': 'import', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 8: {'name': 'OBJECT', 'pattern': {'value': 'object', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 9: {'name': 'LBRACE', 'pattern': {'value': '{', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 10: {'name': 'RBRACE', 'pattern': {'value': '}', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 11: {'name': 'INTERFACE', 'pattern': {'value': 'interface', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 12: {'name': 'EXPOSE', 'pattern': {'value': 'expose', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 13: {'name': '__ANON_0', 'pattern': {'value': 'uid', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 14: {'name': 'CNAME', 'pattern': {'value': 'cname', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 15: {'name': 'COLON', 'pattern': {'value': ':', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 16: {'name': 'FUNCTION', 'pattern': {'value': 'function', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 17: {'name': 'METHOD', 'pattern': {'value': 'method', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 18: {'name': 'PARAM', 'pattern': {'value': 'param', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 19: {'name': 'LSQB', 'pattern': {'value': '[', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 20: {'name': 'RSQB', 'pattern': {'value': ']', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 21: {'origin': {'name': 'start', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__start_star_0', '__type__': 'NonTerminal'}, {'name': '__start_plus_1', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 22: {'origin': {'name': 'start', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__start_plus_1', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 23: {'origin': {'name': 'import_statement', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'IMPORT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'PATH', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 24: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 25: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 26: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 27: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 28: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 4, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 29: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 5, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 30: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 6, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 31: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 7, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 32: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 8, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 33: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 9, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 34: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 10, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 35: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 11, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 36: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 12, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 37: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 13, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 38: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 14, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 39: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 15, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 40: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 16, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 41: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 17, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 42: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 18, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 43: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 19, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 44: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 20, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 45: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 21, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 46: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 22, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 47: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 23, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 48: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 24, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 49: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 25, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 50: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 26, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 51: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 27, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 52: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 28, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 53: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 29, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 54: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 30, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 55: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 31, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 56: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__interface_star_3', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 57: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 58: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__interface_star_3', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 59: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 60: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__interface_star_3', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 4, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 61: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 5, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 62: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__interface_star_3', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 6, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 63: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 7, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 64: {'origin': {'name': 'interface_param', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'expose', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': True, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 65: {'origin': {'name': 'interface_param', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'function', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': True, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 66: {'origin': {'name': 'expose', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'EXPOSE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'type', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 67: {'origin': {'name': 'uid', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__ANON_0', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'UID', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 68: {'origin': {'name': 'cname', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'CNAME', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'IDENTIFIER', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 69: {'origin': {'name': 'super', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'COLON', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 70: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_4', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 71: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 72: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 73: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_4', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 74: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 4, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 75: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}], 'order': 5, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 76: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_4', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 6, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 77: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 7, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 78: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}], 'order': 8, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 79: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_4', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 9, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 80: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 10, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 81: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}], 'order': 11, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 82: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_4', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 83: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 84: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 85: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_4', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 86: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 4, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 87: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}], 'order': 5, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 88: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_4', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 6, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 89: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 7, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 90: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}], 'order': 8, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 91: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_4', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 9, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 92: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 10, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 93: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}], 'order': 11, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 94: {'origin': {'name': 'param', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'PARAM', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'type', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'description', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 95: {'origin': {'name': 'param', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'PARAM', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'type', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 96: {'origin': {'name': 'param', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'PARAM', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'type', '__type__': 'NonTerminal'}, {'name': 'description', '__type__': 'NonTerminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 97: {'origin': {'name': 'param', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'PARAM', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'type', '__type__': 'NonTerminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 98: {'origin': {'name': 'type', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'PRIMITIVE', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': True, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 99: {'origin': {'name': 'type', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'object_name', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': True, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 100: {'origin': {'name': 'object_name', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 101: {'origin': {'name': 'name', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'IDENTIFIER', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 102: {'origin': {'name': 'options', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'LSQB', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__options_plus_5', '__type__': 'NonTerminal'}, {'name': 'RSQB', 'filter_out': True, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 103: {'origin': {'name': 'description', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__description_plus_6', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 104: {'origin': {'name': '__start_star_0', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'import_statement', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 105: {'origin': {'name': '__start_star_0', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__start_star_0', '__type__': 'NonTerminal'}, {'name': 'import_statement', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 106: {'origin': {'name': '__start_plus_1', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'object', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 107: {'origin': {'name': '__start_plus_1', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'interface', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 108: {'origin': {'name': '__start_plus_1', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__start_plus_1', '__type__': 'NonTerminal'}, {'name': 'object', '__type__': 'NonTerminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 109: {'origin': {'name': '__start_plus_1', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__start_plus_1', '__type__': 'NonTerminal'}, {'name': 'interface', '__type__': 'NonTerminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 110: {'origin': {'name': '__object_star_2', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'method', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 111: {'origin': {'name': '__object_star_2', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'method', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 112: {'origin': {'name': '__interface_star_3', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'interface_param', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 113: {'origin': {'name': '__interface_star_3', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__interface_star_3', '__type__': 'NonTerminal'}, {'name': 'interface_param', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 114: {'origin': {'name': '__function_star_4', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'param', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 115: {'origin': {'name': '__function_star_4', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__function_star_4', '__type__': 'NonTerminal'}, {'name': 'param', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 116: {'origin': {'name': '__options_plus_5', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OPTION', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 117: {'origin': {'name': '__options_plus_5', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'IDENTIFIER', 'filter_out': False, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 118: {'origin': {'name': '__options_plus_5', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__options_plus_5', '__type__': 'NonTerminal'}, {'name': 'OPTION', 'filter_out': False, '__type__': 'Terminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 119: {'origin': {'name': '__options_plus_5', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__options_plus_5', '__type__': 'NonTerminal'}, {'name': 'IDENTIFIER', 'filter_out': False, '__type__': 'Terminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 120: {'origin': {'name': '__description_plus_6', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'COMMENT', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 121: {'origin': {'name': '__description_plus_6', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__description_plus_6', '__type__': 'NonTerminal'}, {'name': 'COMMENT', 'filter_out': False, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}} +{0: {'name': 'IDENTIFIER', 'pattern': {'value': '(?:(?:[A-Z]|[a-z])|_)(?:(?:(?:[A-Z]|[a-z])|[0-9]|_))*', 'flags': [], '_width': [1, 4294967295], '__type__': 'PatternRE'}, 'priority': 1, '__type__': 'TerminalDef'}, 1: {'name': 'WS', 'pattern': {'value': '(?:[ \t\x0c\r\n])+', 'flags': [], '_width': [1, 4294967295], '__type__': 'PatternRE'}, 'priority': 1, '__type__': 'TerminalDef'}, 2: {'name': 'PRIMITIVE', 'pattern': {'value': '(?:address|string|buffer|u?int(8|16|32|64)?|size)', 'flags': [], '_width': [3, 7], '__type__': 'PatternRE'}, 'priority': 1, '__type__': 'TerminalDef'}, 3: {'name': 'UID', 'pattern': {'value': '[0-9a-fA-F]{16}', 'flags': [], '_width': [16, 16], '__type__': 'PatternRE'}, 'priority': 1, '__type__': 'TerminalDef'}, 4: {'name': 'OPTION', 'pattern': {'value': '(?:(?:[A-Z]|[a-z])|_)(?:(?:(?:[A-Z]|[a-z])|[0-9]|_))*:(?:(?:[A-Z]|[a-z])|_)(?:(?:(?:[A-Z]|[a-z])|[0-9]|_))*', 'flags': [], '_width': [3, 4294967295], '__type__': 'PatternRE'}, 'priority': 2, '__type__': 'TerminalDef'}, 5: {'name': 'COMMENT', 'pattern': {'value': '#.*', 'flags': [], '_width': [1, 4294967295], '__type__': 'PatternRE'}, 'priority': 1, '__type__': 'TerminalDef'}, 6: {'name': 'PATH', 'pattern': {'value': '"[^"]*"', 'flags': [], '_width': [2, 4294967295], '__type__': 'PatternRE'}, 'priority': 1, '__type__': 'TerminalDef'}, 7: {'name': 'IMPORT', 'pattern': {'value': 'import', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 8: {'name': 'OBJECT', 'pattern': {'value': 'object', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 9: {'name': 'LBRACE', 'pattern': {'value': '{', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 10: {'name': 'RBRACE', 'pattern': {'value': '}', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 11: {'name': 'INTERFACE', 'pattern': {'value': 'interface', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 12: {'name': 'EXPOSE', 'pattern': {'value': 'expose', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 13: {'name': '__ANON_0', 'pattern': {'value': 'uid', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 14: {'name': 'CNAME', 'pattern': {'value': 'cname', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 15: {'name': 'CAPABILITIES', 'pattern': {'value': 'capabilities', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 16: {'name': 'LSQB', 'pattern': {'value': '[', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 17: {'name': 'RSQB', 'pattern': {'value': ']', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 18: {'name': 'COLON', 'pattern': {'value': ':', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 19: {'name': 'FUNCTION', 'pattern': {'value': 'function', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 20: {'name': 'METHOD', 'pattern': {'value': 'method', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 21: {'name': 'PARAM', 'pattern': {'value': 'param', 'flags': [], '__type__': 'PatternStr'}, 'priority': 1, '__type__': 'TerminalDef'}, 22: {'origin': {'name': 'start', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__start_star_0', '__type__': 'NonTerminal'}, {'name': '__start_plus_1', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 23: {'origin': {'name': 'start', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__start_plus_1', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 24: {'origin': {'name': 'import_statement', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'IMPORT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'PATH', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 25: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 26: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 27: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 28: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 29: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 4, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 30: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 5, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 31: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 6, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 32: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 7, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 33: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 8, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 34: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 9, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 35: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 10, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 36: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 11, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 37: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 12, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 38: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 13, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 39: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 14, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 40: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 15, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 41: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 16, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 42: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 17, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 43: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 18, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 44: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 19, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 45: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 20, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 46: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 21, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 47: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 22, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 48: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 23, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 49: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 24, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 50: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 25, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 51: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 26, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 52: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 27, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 53: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 28, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 54: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 29, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 55: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 30, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 56: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 31, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 57: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 32, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 58: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 33, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 59: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 34, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 60: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 35, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 61: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 36, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 62: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 37, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 63: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 38, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 64: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 39, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 65: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 40, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 66: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 41, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 67: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 42, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 68: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 43, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 69: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 44, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 70: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 45, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 71: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 46, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 72: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 47, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 73: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 48, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 74: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 49, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 75: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 50, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 76: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 51, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 77: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 52, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 78: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 53, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 79: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 54, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 80: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'super', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 55, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 81: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 56, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 82: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 57, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 83: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 58, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 84: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'cname', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 59, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 85: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 60, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 86: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'capabilities', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 61, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 87: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 62, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 88: {'origin': {'name': 'object', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 63, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 89: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__interface_star_3', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 90: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 91: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__interface_star_3', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 92: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 93: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__interface_star_3', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 4, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 94: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 5, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 95: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': '__interface_star_3', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 6, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 96: {'origin': {'name': 'interface', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'INTERFACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'uid', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 7, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 97: {'origin': {'name': 'interface_param', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'expose', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': True, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 98: {'origin': {'name': 'interface_param', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'function', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': True, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 99: {'origin': {'name': 'expose', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'EXPOSE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'type', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 100: {'origin': {'name': 'uid', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__ANON_0', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'UID', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 101: {'origin': {'name': 'cname', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'CNAME', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'IDENTIFIER', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 102: {'origin': {'name': 'capabilities', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'CAPABILITIES', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'LSQB', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__capabilities_plus_4', '__type__': 'NonTerminal'}, {'name': 'RSQB', 'filter_out': True, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 103: {'origin': {'name': 'super', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'COLON', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 104: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_5', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 105: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 106: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 107: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_5', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 108: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 4, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 109: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}], 'order': 5, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 110: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_5', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 6, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 111: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 7, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 112: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}], 'order': 8, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 113: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_5', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 9, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 114: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 10, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 115: {'origin': {'name': 'function', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'FUNCTION', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}], 'order': 11, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 116: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_5', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 117: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 118: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 119: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_5', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 120: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 4, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 121: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'description', '__type__': 'NonTerminal'}, {'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}], 'order': 5, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 122: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_5', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 6, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 123: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 7, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 124: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}], 'order': 8, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 125: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__function_star_5', '__type__': 'NonTerminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 9, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 126: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'LBRACE', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'RBRACE', 'filter_out': True, '__type__': 'Terminal'}], 'order': 10, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 127: {'origin': {'name': 'method', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'METHOD', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}], 'order': 11, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 128: {'origin': {'name': 'param', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'PARAM', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'type', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}, {'name': 'description', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 129: {'origin': {'name': 'param', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'PARAM', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'type', '__type__': 'NonTerminal'}, {'name': 'options', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 130: {'origin': {'name': 'param', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'PARAM', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'type', '__type__': 'NonTerminal'}, {'name': 'description', '__type__': 'NonTerminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 131: {'origin': {'name': 'param', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'PARAM', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}, {'name': 'type', '__type__': 'NonTerminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 132: {'origin': {'name': 'type', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'PRIMITIVE', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': True, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 133: {'origin': {'name': 'type', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'object_name', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': True, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 134: {'origin': {'name': 'object_name', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OBJECT', 'filter_out': True, '__type__': 'Terminal'}, {'name': 'name', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 135: {'origin': {'name': 'name', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'IDENTIFIER', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 136: {'origin': {'name': 'options', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'LSQB', 'filter_out': True, '__type__': 'Terminal'}, {'name': '__options_plus_6', '__type__': 'NonTerminal'}, {'name': 'RSQB', 'filter_out': True, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 137: {'origin': {'name': 'description', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__description_plus_7', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 138: {'origin': {'name': '__start_star_0', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'import_statement', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 139: {'origin': {'name': '__start_star_0', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__start_star_0', '__type__': 'NonTerminal'}, {'name': 'import_statement', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 140: {'origin': {'name': '__start_plus_1', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'object', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 141: {'origin': {'name': '__start_plus_1', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'interface', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 142: {'origin': {'name': '__start_plus_1', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__start_plus_1', '__type__': 'NonTerminal'}, {'name': 'object', '__type__': 'NonTerminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 143: {'origin': {'name': '__start_plus_1', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__start_plus_1', '__type__': 'NonTerminal'}, {'name': 'interface', '__type__': 'NonTerminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 144: {'origin': {'name': '__object_star_2', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'method', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 145: {'origin': {'name': '__object_star_2', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__object_star_2', '__type__': 'NonTerminal'}, {'name': 'method', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 146: {'origin': {'name': '__interface_star_3', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'interface_param', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 147: {'origin': {'name': '__interface_star_3', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__interface_star_3', '__type__': 'NonTerminal'}, {'name': 'interface_param', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 148: {'origin': {'name': '__capabilities_plus_4', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'IDENTIFIER', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 149: {'origin': {'name': '__capabilities_plus_4', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__capabilities_plus_4', '__type__': 'NonTerminal'}, {'name': 'IDENTIFIER', 'filter_out': False, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 150: {'origin': {'name': '__function_star_5', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'param', '__type__': 'NonTerminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 151: {'origin': {'name': '__function_star_5', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__function_star_5', '__type__': 'NonTerminal'}, {'name': 'param', '__type__': 'NonTerminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 152: {'origin': {'name': '__options_plus_6', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'OPTION', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 153: {'origin': {'name': '__options_plus_6', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'IDENTIFIER', 'filter_out': False, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 154: {'origin': {'name': '__options_plus_6', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__options_plus_6', '__type__': 'NonTerminal'}, {'name': 'OPTION', 'filter_out': False, '__type__': 'Terminal'}], 'order': 2, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 155: {'origin': {'name': '__options_plus_6', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__options_plus_6', '__type__': 'NonTerminal'}, {'name': 'IDENTIFIER', 'filter_out': False, '__type__': 'Terminal'}], 'order': 3, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 156: {'origin': {'name': '__description_plus_7', '__type__': 'NonTerminal'}, 'expansion': [{'name': 'COMMENT', 'filter_out': False, '__type__': 'Terminal'}], 'order': 0, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}, 157: {'origin': {'name': '__description_plus_7', '__type__': 'NonTerminal'}, 'expansion': [{'name': '__description_plus_7', '__type__': 'NonTerminal'}, {'name': 'COMMENT', 'filter_out': False, '__type__': 'Terminal'}], 'order': 1, 'alias': None, 'options': {'keep_all_tokens': False, 'expand1': False, 'priority': None, 'template_source': None, 'empty_indices': (), '__type__': 'RuleOptions'}, '__type__': 'Rule'}} ) Shift = 0 Reduce = 1 diff --git a/scripts/definitions/transformer.py b/scripts/definitions/transformer.py index f2746a0..1bd30ee 100644 --- a/scripts/definitions/transformer.py +++ b/scripts/definitions/transformer.py @@ -1,12 +1,13 @@ from .parser import Transformer, v_args def get_opts(args): - from .types import CName, Description, Options, Type, UID + from .types import Caps, CName, Description, Options, Type, UID kinds = { Description: "desc", Options: "opts", CName: "cname", + Caps: "caps", UID: "uid", Type: "typename", } @@ -112,6 +113,10 @@ class DefTransformer(Transformer): from .types import Options return Options([str(s) for s in args]) + def capabilities(self, args): + from .types import Caps + return Caps([str(s) for s in args]) + def description(self, s): from .types import Description return Description("\n".join(s)) @@ -140,6 +145,9 @@ class DefTransformer(Transformer): def COMMENT(self, s): return s[2:].strip() + def OPTION(self, s): + return str(s) + def IDENTIFIER(self, s): return str(s) diff --git a/scripts/definitions/types/__init__.py b/scripts/definitions/types/__init__.py index c898314..9971eab 100644 --- a/scripts/definitions/types/__init__.py +++ b/scripts/definitions/types/__init__.py @@ -5,16 +5,13 @@ def _indent(x): class CName(str): pass class Description(str): pass class Import(str): pass +class Caps(list): pass class Options(dict): def __init__(self, opts = tuple()): for opt in opts: parts = opt.split(":", 1) - self[parts[0]] = "".join(parts[1:]) - - def __str__(self): - if not self: return "" - return "[{}]".format(" ".join(self.keys())) + self[parts[0]] = self.get(parts[0], []) + ["".join(parts[1:])] class UID(int): def __str__(self): diff --git a/scripts/definitions/types/function.py b/scripts/definitions/types/function.py index 354285d..501cade 100644 --- a/scripts/definitions/types/function.py +++ b/scripts/definitions/types/function.py @@ -43,6 +43,11 @@ class Param: self.options = opts self.desc = desc + self.caps = set() + for key, values in opts.items(): + if key == "cap": + self.caps.update(values) + def __str__(self): return "param {} {} {} {}".format( self.name, repr(self.type), self.options, self.desc or "") diff --git a/scripts/definitions/types/object.py b/scripts/definitions/types/object.py index 079c3a1..b0061ba 100644 --- a/scripts/definitions/types/object.py +++ b/scripts/definitions/types/object.py @@ -1,8 +1,8 @@ from . import _indent -from . import Options +from . import Caps, Options class Object: - def __init__(self, name, uid, typename=None, opts=Options(), desc="", children=tuple(), cname=None): + def __init__(self, name, uid, typename=None, opts=Options(), caps=Caps(), desc="", children=tuple(), cname=None): self.name = name self.uid = uid self.options = opts @@ -11,6 +11,8 @@ class Object: self.methods = children self.cname = cname or name + self.caps = set(caps) + from . import ObjectRef self.__ref = ObjectRef(name) diff --git a/src/kernel/kernel.module b/src/kernel/kernel.module index 6299385..62c2ec8 100644 --- a/src/kernel/kernel.module +++ b/src/kernel/kernel.module @@ -53,6 +53,7 @@ kernel = module("kernel", "syscalls.inc.cog", "syscalls/channel.cpp", "syscalls/endpoint.cpp", + "syscalls/handle.cpp", "syscalls/object.cpp", "syscalls/process.cpp", "syscalls/system.cpp", diff --git a/src/kernel/objects/channel.h b/src/kernel/objects/channel.h index 15b3077..09d70a2 100644 --- a/src/kernel/objects/channel.h +++ b/src/kernel/objects/channel.h @@ -2,6 +2,7 @@ /// \file channel.h /// Definition of channel objects and related functions +#include #include #include #include @@ -17,7 +18,7 @@ class channel : { public: /// Capabilities on a newly constructed channel handle - constexpr static j6_cap_t creation_caps = 0; + constexpr static j6_cap_t creation_caps = j6_cap_channel_all; channel(); virtual ~channel(); diff --git a/src/kernel/objects/endpoint.h b/src/kernel/objects/endpoint.h index c044929..2c582c3 100644 --- a/src/kernel/objects/endpoint.h +++ b/src/kernel/objects/endpoint.h @@ -2,6 +2,7 @@ /// \file endpoint.h /// Definition of endpoint kobject types +#include #include #include #include @@ -16,7 +17,7 @@ class endpoint : { public: /// Capabilities on a newly constructed endpoint handle - constexpr static j6_cap_t creation_caps = 0; + constexpr static j6_cap_t creation_caps = j6_cap_endpoint_all; endpoint(); virtual ~endpoint(); diff --git a/src/kernel/objects/handle.h b/src/kernel/objects/handle.h index 46c7d4c..2fa4995 100644 --- a/src/kernel/objects/handle.h +++ b/src/kernel/objects/handle.h @@ -9,34 +9,40 @@ namespace obj { struct handle { - inline handle(j6_handle_t in_id, kobject *in_object, j6_cap_t in_caps) : - id {in_id}, object {in_object}, caps {in_caps} { + // A j6_handle_t is an id in the low 32 bits, caps in bits 32-55, and type in 56-63 + static inline j6_handle_t make_id(j6_handle_t id, j6_cap_t caps, kobject *obj) { + return (id & 0xffffffffull) | + static_cast(caps) << 32 | + static_cast(obj ? obj->get_type() : kobject::type::none) << 56; + } + + inline handle(j6_handle_t in_id, kobject *in_obj, j6_cap_t caps) : + id {make_id(in_id, caps, in_obj)}, object {in_obj} { if (object) object->handle_retain(); } inline handle(const handle &other) : - id {other.id}, object {other.object}, caps {other.caps} { + id {other.id}, object {other.object} { if (object) object->handle_retain(); } inline handle(handle &&other) : - id {other.id}, object {other.object}, caps {other.caps} { + id {other.id}, object {other.object} { other.id = 0; - other.caps = 0; other.object = nullptr; } inline handle & operator=(const handle &other) { if (object) object->handle_release(); - id = other.id; caps = other.caps; object = other.object; + id = other.id; object = other.object; if (object) object->handle_retain(); return *this; } inline handle & operator=(handle &&other) { if (object) object->handle_release(); - id = other.id; caps = other.caps; object = other.object; - other.id = other.caps = 0; other.object = nullptr; + id = other.id; object = other.object; + other.id = 0; other.object = nullptr; return *this; } @@ -44,12 +50,14 @@ struct handle if (object) object->handle_release(); } + inline j6_cap_t caps() const { return id >> 32; } + inline bool has_cap(j6_cap_t test) const { - return (caps & test) == test; + return (caps() & test) == test; } inline kobject::type type() const { - return object->get_type(); + return static_cast(id >> 56); } inline int compare(const handle &o) { @@ -75,7 +83,6 @@ struct handle inline const kobject * as() const { return object; } j6_handle_t id; - j6_cap_t caps; kobject *object; }; diff --git a/src/kernel/objects/kobject.h b/src/kernel/objects/kobject.h index 1ab9bfa..6160195 100644 --- a/src/kernel/objects/kobject.h +++ b/src/kernel/objects/kobject.h @@ -16,7 +16,7 @@ class kobject { public: /// Types of kernel objects. - enum class type : uint16_t + enum class type : uint8_t { #define OBJECT_TYPE( name, val ) name = val, #include diff --git a/src/kernel/objects/process.cpp b/src/kernel/objects/process.cpp index c3b1262..6041255 100644 --- a/src/kernel/objects/process.cpp +++ b/src/kernel/objects/process.cpp @@ -22,8 +22,7 @@ process::process() : m_next_handle {1}, m_state {state::running} { - j6_handle_t self = add_handle(this, process::self_caps); - kassert(self == self_handle(), "Process self-handle is not 1"); + m_self_handle = add_handle(this, process::self_caps); } // The "kernel process"-only constructor @@ -129,9 +128,10 @@ process::add_handle(kobject *obj, j6_cap_t caps) if (!obj) return j6_handle_invalid; - j6_handle_t id = m_next_handle++; - m_handles.insert(id, {id, obj, caps}); + handle h {m_next_handle++, obj, caps}; + j6_handle_t id = h.id; + m_handles.insert(id, h); return id; } @@ -147,4 +147,16 @@ process::lookup_handle(j6_handle_t id) return m_handles.find(id); } +size_t +process::list_handles(j6_handle_t *handles, size_t len) +{ + for (const auto &i : m_handles) { + if (len-- == 0) + break; + *handles++ = i.key; + } + + return m_handles.count(); +} + } // namespace obj diff --git a/src/kernel/objects/process.h b/src/kernel/objects/process.h index 1b6fb37..1e19b45 100644 --- a/src/kernel/objects/process.h +++ b/src/kernel/objects/process.h @@ -2,6 +2,7 @@ /// \file process.h /// Definition of process kobject types +#include #include #include @@ -17,10 +18,10 @@ class process : { public: /// Capabilities on a newly constructed process handle - constexpr static j6_cap_t creation_caps = 0; + constexpr static j6_cap_t creation_caps = j6_cap_process_all; /// Capabilities on a process to itself - constexpr static j6_cap_t self_caps = 0; + constexpr static j6_cap_t self_caps = j6_cap_process_all; /// Top of memory area where thread stacks are allocated constexpr static uintptr_t stacks_top = 0x0000800000000000; @@ -74,13 +75,19 @@ public: /// \returns Pointer to the handle struct, or null if not found handle * lookup_handle(j6_handle_t handle); + /// Get the list of handle ids this process owns + /// \arg handles Pointer to an array of handles to copy into + /// \arg len Size of the array + /// \returns Total number of handles (may be more than number copied) + size_t list_handles(j6_handle_t *handles, size_t len); + /// Inform the process of an exited thread /// \args th The thread which has exited /// \returns True if this thread ending has ended the process bool thread_exited(thread *th); /// Get the handle for this process to refer to itself - inline j6_handle_t self_handle() const { return 1; } + inline j6_handle_t self_handle() const { return m_self_handle; } /// Get the process object that owns kernel threads and the /// kernel address space @@ -95,6 +102,7 @@ private: // This constructor is called by create_kernel_process process(page_table *kpml4); + j6_handle_t m_self_handle; int32_t m_return_code; vm_space m_space; diff --git a/src/kernel/objects/system.h b/src/kernel/objects/system.h index 21e7d76..8a93bd2 100644 --- a/src/kernel/objects/system.h +++ b/src/kernel/objects/system.h @@ -2,6 +2,7 @@ /// \file system.h /// Definition of kobject type representing the system +#include #include "objects/kobject.h" namespace obj { @@ -11,7 +12,7 @@ class system : { public: /// Capabilities on system given to init - constexpr static j6_cap_t init_caps = 0; + constexpr static j6_cap_t init_caps = j6_cap_system_all; static constexpr kobject::type type = kobject::type::system; diff --git a/src/kernel/objects/thread.h b/src/kernel/objects/thread.h index 22675d2..2338258 100644 --- a/src/kernel/objects/thread.h +++ b/src/kernel/objects/thread.h @@ -2,6 +2,7 @@ /// \file thread.h /// Definition of thread kobject types +#include #include #include #include @@ -60,10 +61,10 @@ class thread : { public: /// Capabilities on a newly constructed thread handle - constexpr static j6_cap_t creation_caps = 0; + constexpr static j6_cap_t creation_caps = j6_cap_thread_all; /// Capabilities the parent process gets on new thread handles - constexpr static j6_cap_t parent_caps = 0; + constexpr static j6_cap_t parent_caps = j6_cap_thread_all; enum class state : uint8_t { ready = 0x01, diff --git a/src/kernel/objects/vm_area.h b/src/kernel/objects/vm_area.h index 102300e..585d746 100644 --- a/src/kernel/objects/vm_area.h +++ b/src/kernel/objects/vm_area.h @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -34,7 +35,7 @@ class vm_area : { public: /// Capabilities on a newly constructed vma handle - constexpr static j6_cap_t creation_caps = 0; + constexpr static j6_cap_t creation_caps = j6_cap_vma_all; static constexpr kobject::type type = kobject::type::vma; diff --git a/src/kernel/syscall_verify.cpp.cog b/src/kernel/syscall_verify.cpp.cog index a54258d..0162d9c 100644 --- a/src/kernel/syscall_verify.cpp.cog +++ b/src/kernel/syscall_verify.cpp.cog @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -36,6 +37,10 @@ using util::buffer; /*[[[cog code generation cbool = {True: "true", False: "false"} +def get_caps(opts, type): + caps = opts.get("cap", list()) + return [f"j6_cap_{type.name}_{c}" for c in caps] + for id, scope, method in syscalls.methods: if scope: name = f"{scope.name}_{method.name}" @@ -58,7 +63,11 @@ for id, scope, method in syscalls.methods: argdefs.append("j6_handle_t self") cxxargdefs.append(f"obj::{scope.cname} *self") args.append("self_obj") - handles.append((f"obj::{scope.cname} *", "self", "self_obj")) + handles.append(( + f"obj::{scope.cname} *", + "self", + "self_obj", + get_caps(method.options, scope))) for param in method.params: needs_obj = param.type.needs_object(param.options) @@ -73,7 +82,7 @@ for id, scope, method in syscalls.methods: if needs_obj: oarg = f"{arg}_obj" - handles.append((type, arg, oarg)) + handles.append((type, arg, oarg, get_caps(param.options, param.type.object))) args.append(oarg) else: args.append(arg) @@ -94,12 +103,18 @@ for id, scope, method in syscalls.methods: cog.outl( " return j6_err_invalid_arg;") cog.outl() - for type, inarg, outarg in handles: + for type, inarg, outarg, caps in handles: if type.endswith('*'): type = type[:-1].strip() cog.outl(f" obj::handle *{inarg}_handle = get_handle({inarg});") cog.outl(f" if (!{inarg}_handle) return j6_err_invalid_arg;") + + if caps: + allcaps = " | ".join(caps) + cog.outl(f" j6_cap_t {inarg}_caps_req = {allcaps};") + cog.outl(f" if (!{inarg}_handle->has_cap({inarg}_caps_req)) return j6_err_denied;") + cog.outl(f" {type} *{outarg} = {inarg}_handle->as();") cog.outl(f" if (!{outarg}) return j6_err_invalid_arg;") cog.outl() diff --git a/src/kernel/syscalls/handle.cpp b/src/kernel/syscalls/handle.cpp new file mode 100644 index 0000000..f65a3c6 --- /dev/null +++ b/src/kernel/syscalls/handle.cpp @@ -0,0 +1,27 @@ +#include +#include + +#include "objects/process.h" + +using namespace obj; + +namespace syscalls { + +j6_status_t +handle_list(j6_handle_t *handles, size_t *handles_len) +{ + if (!handles_len || (*handles_len && !handles)) + return j6_err_invalid_arg; + + process &p = process::current(); + size_t requested = *handles_len; + + *handles_len = p.list_handles(handles, requested); + + if (*handles_len < requested) + return j6_err_insufficient; + + return j6_status_ok; +} + +} // namespace syscalls diff --git a/src/libraries/j6/include/j6/caps.h.cog b/src/libraries/j6/include/j6/caps.h.cog new file mode 100644 index 0000000..1bc7744 --- /dev/null +++ b/src/libraries/j6/include/j6/caps.h.cog @@ -0,0 +1,25 @@ +#pragma once +// vim: ft=cpp + +/// \file caps.h +/// Capability bitfield constants + +/*[[[cog code generation +from definitions.context import Context + +ctx = Context(definitions_path) +ctx.parse("syscalls.def") +syscalls = ctx.interfaces["syscalls"] + +for obj in syscalls.exposes: + i = 0 + for cap in obj.object.caps: + name = f"j6_cap_{obj.object.name}_{cap}" + cog.outl(f"#define {name:<30} (1 << {i})") + i += 1 + + name = f"j6_cap_{obj.object.name}_all" + cog.outl(f"#define {name:<30} ((1<<{i})-1)") + cog.outl() +]]]*/ +/// [[[end]]] diff --git a/src/libraries/j6/include/j6/errors.h b/src/libraries/j6/include/j6/errors.h index 3052cd6..7dd6ec7 100644 --- a/src/libraries/j6/include/j6/errors.h +++ b/src/libraries/j6/include/j6/errors.h @@ -18,4 +18,5 @@ #define j6_err_not_ready j6_err(0x0004) #define j6_err_insufficient j6_err(0x0005) #define j6_err_timed_out j6_err(0x0006) +#define j6_err_denied j6_err(0x0007) diff --git a/src/libraries/j6/include/j6/types.h b/src/libraries/j6/include/j6/types.h index ae2204e..a556883 100644 --- a/src/libraries/j6/include/j6/types.h +++ b/src/libraries/j6/include/j6/types.h @@ -27,14 +27,16 @@ typedef uint64_t j6_tag_t; #define j6_tag_from_irq(x) ((x) | j6_tag_irq_base) #define j6_tag_to_irq(x) ((x) & ~j6_tag_irq_base) -/// Handles are references and capabilities to other objects. -typedef uint32_t j6_handle_t; +/// Handles are references and capabilities to other objects. A handle is +/// an id in the lower 32 bits, a bitfield of capabilities in bits 32-55 +/// and a type id in bits 56-63. +typedef uint64_t j6_handle_t; + +/// Bitfield for storage of capabilities on their own +typedef uint32_t j6_cap_t; #define j6_handle_invalid ((j6_handle_t)-1) -/// Bitfield for storage of capabilities -typedef uint32_t j6_cap_t; - enum j6_object_type { #define OBJECT_TYPE( name, val ) j6_object_type_ ## name = val, #include diff --git a/src/libraries/j6/init.cpp b/src/libraries/j6/init.cpp index 85604ba..c12b155 100644 --- a/src/libraries/j6/init.cpp +++ b/src/libraries/j6/init.cpp @@ -3,45 +3,47 @@ #ifndef __j6kernel #include +#include #include +#include #include -static size_t __initc = 0; -static struct j6_init_value *__initv = 0; - j6_handle_t __handle_sys = j6_handle_invalid; j6_handle_t __handle_self = j6_handle_invalid; -extern "C" void -_get_init(size_t *initc, struct j6_init_value **initv) -{ - if (!initc) - return; +namespace { + constexpr size_t __static_arr_size = 4; + j6_handle_t __handle_array[__static_arr_size]; - *initc = __initc; - if (initv) - *initv = __initv; -} + static j6_status_t + __load_handles() + { + size_t count = __static_arr_size; + j6_handle_t *handles = __handle_array; + j6_status_t s = j6_handle_list(handles, &count); + + if (s != j6_err_insufficient && s != j6_status_ok) + return s; + + if (count > __static_arr_size) + count = __static_arr_size; + + for (size_t i = 0; i < count; ++i) { + uint8_t type = (handles[i] >> 56); + if (type == j6_object_type_system && __handle_sys == j6_handle_invalid) + __handle_sys = handles[i]; + else if (type == j6_object_type_process && __handle_self == j6_handle_invalid) + __handle_self = handles[i]; + } + + return s; + } +} // namespace extern "C" void _init_libj6(uint64_t *rsp) { - uint64_t argc = *rsp++; - rsp += argc; - - __initc = *rsp++; - __initv = (struct j6_init_value *)rsp; - - for (unsigned i = 0; i < __initc; ++i) { - if (__initv[i].type == j6_init_handle_other && - __initv[i].handle.type == j6_object_type_system) { - __handle_sys = __initv[i].handle.handle; - } - else if (__initv[i].type == j6_init_handle_self && - __initv[i].handle.type == j6_object_type_process) { - __handle_self = __initv[i].handle.handle; - } - } + __load_handles(); } #endif // __j6kernel diff --git a/src/libraries/j6/j6.module b/src/libraries/j6/j6.module index ef4c13c..c15db8e 100644 --- a/src/libraries/j6/j6.module +++ b/src/libraries/j6/j6.module @@ -5,6 +5,7 @@ j6 = module("j6", includes = [ "include" ], sources = [ "init.cpp", + "include/j6/caps.h.cog", "include/j6/syscalls.h.cog", "include/j6/sysconf.h.cog", "syscalls.s.cog", @@ -18,6 +19,7 @@ sysconf = join(source_root, "definitions/sysconf.yaml") definitions = glob('definitions/**/*.def', recursive=True) j6.add_depends([ + "include/j6/caps.h.cog", "include/j6/syscalls.h.cog", "syscalls.s.cog", ], definitions) diff --git a/src/libraries/libc/j6libc/sbrk.c b/src/libraries/libc/j6libc/sbrk.c index 59e6e3d..e1c9572 100644 --- a/src/libraries/libc/j6libc/sbrk.c +++ b/src/libraries/libc/j6libc/sbrk.c @@ -3,7 +3,7 @@ #include //void *sbrk(intptr_t) __attribute__ ((weak)); -static j6_handle_t __core_handle = 0; +static j6_handle_t __core_handle = j6_handle_invalid; static intptr_t __core_size = 0; static const uintptr_t __core_base = 0x1c0000000; diff --git a/src/user/drv.uart/main.cpp b/src/user/drv.uart/main.cpp index 95cdaa2..f9b8ebd 100644 --- a/src/user/drv.uart/main.cpp +++ b/src/user/drv.uart/main.cpp @@ -18,8 +18,8 @@ extern "C" { int main(int, const char **); } -constexpr j6_handle_t handle_self = 1; -constexpr j6_handle_t handle_sys = 2; +extern j6_handle_t __handle_self; +extern j6_handle_t __handle_sys; struct entry { @@ -76,13 +76,13 @@ log_pump_proc() void *message_buffer = nullptr; char stringbuf[300]; - j6_status_t result = j6_system_request_iopl(handle_sys, 3); + j6_status_t result = j6_system_request_iopl(__handle_sys, 3); if (result != j6_status_ok) return; while (true) { size_t size = buffer_size; - j6_status_t s = j6_system_get_log(handle_sys, message_buffer, &size); + j6_status_t s = j6_system_get_log(__handle_sys, message_buffer, &size); if (s == j6_err_insufficient) { free(message_buffer); @@ -96,7 +96,7 @@ log_pump_proc() if (size == 0) { j6_signal_t sigs = 0; - j6_kobject_wait(handle_sys, j6_signal_system_has_log, &sigs); + j6_kobject_wait(__handle_sys, j6_signal_system_has_log, &sigs); continue; } @@ -121,7 +121,7 @@ main(int argc, const char **argv) j6_handle_t endp = j6_handle_invalid; j6_status_t result = j6_status_ok; - result = j6_system_request_iopl(handle_sys, 3); + result = j6_system_request_iopl(__handle_sys, 3); if (result != j6_status_ok) return result; @@ -129,11 +129,11 @@ main(int argc, const char **argv) if (result != j6_status_ok) return result; - result = j6_system_bind_irq(handle_sys, endp, 3); + result = j6_system_bind_irq(__handle_sys, endp, 3); if (result != j6_status_ok) return result; - result = j6_system_bind_irq(handle_sys, endp, 4); + result = j6_system_bind_irq(__handle_sys, endp, 4); if (result != j6_status_ok) return result; @@ -153,7 +153,7 @@ main(int argc, const char **argv) sp[0] = sp[1] = 0; j6_handle_t child = j6_handle_invalid; - result = j6_thread_create(&child, handle_self, stack_top - 0x10, reinterpret_cast(&log_pump_proc)); + result = j6_thread_create(&child, __handle_self, stack_top - 0x10, reinterpret_cast(&log_pump_proc)); if (result != j6_status_ok) return result; diff --git a/src/user/drv.uefi_fb/main.cpp b/src/user/drv.uefi_fb/main.cpp index 409f902..d66bc8c 100644 --- a/src/user/drv.uefi_fb/main.cpp +++ b/src/user/drv.uefi_fb/main.cpp @@ -37,7 +37,6 @@ main(int argc, const char **argv) size_t initc = 0; j6_init_value *initv = nullptr; - _get_init(&initc, &initv); j6_init_framebuffer *fb = nullptr; for (unsigned i = 0; i < initc; ++i) { diff --git a/src/user/srv.init/loader.cpp b/src/user/srv.init/loader.cpp index ddb1bc9..7805fc4 100644 --- a/src/user/srv.init/loader.cpp +++ b/src/user/srv.init/loader.cpp @@ -12,8 +12,8 @@ using bootproto::module_flags; using bootproto::module_program; -extern j6_handle_t handle_self; -extern j6_handle_t handle_system; +extern j6_handle_t __handle_self; +extern j6_handle_t __handle_sys; constexpr uintptr_t load_addr_base = 0xf8000000; constexpr size_t stack_size = 0x10000; @@ -28,13 +28,13 @@ load_program(const module_program &prog, char *err_msg) } j6_handle_t elf_vma = j6_handle_invalid; - j6_status_t res = j6_system_map_phys(handle_system, &elf_vma, prog.base_address, prog.size, 0); + j6_status_t res = j6_system_map_phys(__handle_sys, &elf_vma, prog.base_address, prog.size, 0); if (res != j6_status_ok) { sprintf(err_msg, " ** error loading program '%s': creating physical vma: %lx", prog.filename, res); return false; } - res = j6_vma_map(elf_vma, handle_self, prog.base_address); + res = j6_vma_map(elf_vma, __handle_self, prog.base_address); if (res != j6_status_ok) { sprintf(err_msg, " ** error loading program '%s': mapping vma: %lx", prog.filename, res); return false; @@ -55,7 +55,7 @@ load_program(const module_program &prog, char *err_msg) return false; } - res = j6_process_give_handle(proc, handle_system, nullptr); + res = j6_process_give_handle(proc, __handle_sys, nullptr); if (res != j6_status_ok) { sprintf(err_msg, " ** error loading program '%s': giving system handle: %lx", prog.filename, res); return false; @@ -90,7 +90,7 @@ load_program(const module_program &prog, char *err_msg) return false; } - res = j6_vma_unmap(sub_vma, handle_self); + res = j6_vma_unmap(sub_vma, __handle_self); if (res != j6_status_ok) { sprintf(err_msg, " ** error loading program '%s': unmapping sub vma: %lx", prog.filename, res); return false; @@ -115,7 +115,7 @@ load_program(const module_program &prog, char *err_msg) return false; } - res = j6_vma_unmap(stack_vma, handle_self); + res = j6_vma_unmap(stack_vma, __handle_self); if (res != j6_status_ok) { sprintf(err_msg, " ** error loading program '%s': unmapping stack vma: %lx", prog.filename, res); return false; @@ -128,7 +128,7 @@ load_program(const module_program &prog, char *err_msg) return false; } - res = j6_vma_unmap(elf_vma, handle_self); + res = j6_vma_unmap(elf_vma, __handle_self); if (res != j6_status_ok) { sprintf(err_msg, " ** error loading program '%s': unmapping elf vma: %lx", prog.filename, res); return false; diff --git a/src/user/srv.init/main.cpp b/src/user/srv.init/main.cpp index 893857e..18624b4 100644 --- a/src/user/srv.init/main.cpp +++ b/src/user/srv.init/main.cpp @@ -1,6 +1,9 @@ #include +#include +#include #include +#include #include #include "loader.h" @@ -16,15 +19,15 @@ extern "C" { uintptr_t _arg_modules_phys; // This gets filled in in _start -j6_handle_t handle_self = 1; // Self program handle is always 1 -j6_handle_t handle_system = 2; // boot protocol is that init gets the system as handle 2 +extern j6_handle_t __handle_self; +extern j6_handle_t __handle_sys; int main(int argc, const char **argv) { j6_log("srv.init starting"); - modules mods = modules::load_modules(_arg_modules_phys, handle_system, handle_self); + modules mods = modules::load_modules(_arg_modules_phys, __handle_sys, __handle_self); for (auto &mod : mods.of_type(module_type::program)) { auto &prog = static_cast(mod);