Matter simplify code (#21729)

This commit is contained in:
s-hadinger 2024-07-04 19:41:53 +02:00 committed by GitHub
parent 522d7f6ee4
commit 152239c3ac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 5439 additions and 5638 deletions

View File

@ -318,7 +318,7 @@ class Matter_IM
# 0 = EnableTagCompression bool opt
# 1 = Node
# 2 = Endpoint
# 3 = Cluste
# 3 = Cluster
# 4 = Attribute
# 5 = ListIndex (opt)
#
@ -602,7 +602,6 @@ class Matter_IM
# returns `true` if processed, `false` if silently ignored,
# or raises an exception
def process_read_request_pull(msg, val)
matter.profiler.log("read_request_start_pull")
var query = matter.ReadRequestMessage().from_TLV(val)
var generator_or_arr = self.process_read_or_subscribe_request_pull(query, msg)
var event_generator_or_arr = self.process_read_or_subscribe_request_event_pull(query, msg)
@ -767,7 +766,6 @@ class Matter_IM
ctx.status = matter.UNSUPPORTED_ATTRIBUTE # new fallback error
res = pi.read_attribute(msg.session, ctx, self.tlv_solo)
end
matter.profiler.log("read_request_solo read done")
if res != nil
@ -826,8 +824,6 @@ class Matter_IM
responder.send_response_frame(resp)
# postpone lengthy operations after sending back response
matter.profiler.log("RESPONSE SENT")
var attr_name
if tasmota.loglevel(3)
attr_name = matter.get_attribute_name(ctx.cluster, ctx.attribute)
@ -909,7 +905,6 @@ class Matter_IM
# import debug
# structure is `ReadRequestMessage` 10.6.2 p.558
# log("MTR: IM:invoke_request processing start", 4)
matter.profiler.log("invoke_request_start")
var ctx = matter.Path()
ctx.msg = msg
@ -929,7 +924,6 @@ class Matter_IM
var cmd_name = matter.get_command_name(ctx.cluster, ctx.command)
var ctx_str = str(ctx) # keep string before invoking, it is modified by response
var res = self.device.invoke_request(msg.session, q.command_fields, ctx)
matter.profiler.log("COMMAND DONE")
var params_log = (ctx.log != nil) ? "(" + str(ctx.log) + ") " : ""
log(format("MTR: >Command (%6i) %s %s %s", msg.session.local_session_id, ctx_str, cmd_name ? cmd_name : "", params_log), 3)
# log("MTR: Perf/Command = " + str(debug.counters()), 4)
@ -983,14 +977,12 @@ class Matter_IM
# or raises an exception
def process_invoke_request_solo(msg, ctx)
# import debug
matter.profiler.log("invoke_request_solo_start")
ctx.msg = msg
ctx.status = matter.UNSUPPORTED_COMMAND #default error if returned `nil`
var cmd_name = matter.get_command_name(ctx.cluster, ctx.command)
var ctx_str = str(ctx) # keep string before invoking, it is modified by response
var res = self.device.invoke_request(msg.session, ctx.command_fields, ctx)
matter.profiler.log("COMMAND DONE")
var params_log = (ctx.log != nil) ? "(" + str(ctx.log) + ") " : ""
if tasmota.loglevel(3)
log(format("MTR: >Command1 (%6i) %s %s %s", msg.session.local_session_id, ctx_str, cmd_name ? cmd_name : "", params_log), 3)
@ -1041,7 +1033,6 @@ class Matter_IM
resp.encode_frame(raw, msg_raw) # payload in cleartext
resp.encrypt()
responder.send_response_frame(resp)
matter.profiler.log("RESPONSE SENT")
return true
end
@ -1225,6 +1216,7 @@ class Matter_IM
var event_generator_or_arr = sub.update_event_generator_array()
var report_data_msg = matter.IM_ReportDataSubscribed_Pull(session._message_handler, session, generator_or_arr, event_generator_or_arr, sub)
self.send_queue.push(report_data_msg) # push message to queue
self.send_enqueued(session._message_handler) # and send queued messages now
end

View File

@ -86,7 +86,6 @@ class Matter_MessageHandler
def msg_received(raw, addr, port)
var ret = false
matter.profiler.log("msg_received")
try
# log("MTR: MessageHandler::msg_received raw="+raw.tohex(), 4)
var frame = matter.Frame(self, raw, addr, port)
@ -170,7 +169,7 @@ class Matter_MessageHandler
end
var decrypt_ok = frame.decrypt()
matter.profiler.log("msg_received_header_frame_decrypted")
# matter.profiler.log("msg_received_header_frame_decrypted")
if !decrypt_ok return false end
# matter.profiler.log("msg_received_payload_undecoded")
@ -201,9 +200,7 @@ class Matter_MessageHandler
ret = true
elif protocol_id == 0x0001 # PROTOCOL_ID_INTERACTION_MODEL
# dispatch to IM Protocol Messages
matter.profiler.log("process_IM_start")
ret = self.im.process_incoming(frame)
matter.profiler.log("process_IM_end")
# if `ret` is true, we have something to send
if ret
self.im.send_enqueued(self)
@ -250,7 +247,6 @@ class Matter_MessageHandler
# msg.exchange_id: exchange id (int)
# msg.local_session_id: local session (for logging)
def send_response_frame(msg)
matter.profiler.log("send_response_frame")
self.device.msg_send(msg)
end

View File

@ -221,7 +221,7 @@ class Matter_Plugin_Root : Matter_Plugin
elif attribute == 0x0001 # ---------- VendorName / string ----------
return tlv_solo.set(TLV.UTF1, "Tasmota")
elif attribute == 0x0002 # ---------- VendorID / vendor-id ----------
return tlv_solo.set(TLV.U2, self.device.vendorid) # Vendor ID reserved for development
return tlv_solo.set(TLV.U2, self.device.VENDOR_ID) # Vendor ID reserved for development
elif attribute == 0x0003 # ---------- ProductName / string ----------
return tlv_solo.set(TLV.UTF1, tasmota.cmd("DeviceName", true)['DeviceName'])
elif attribute == 0x0004 # ---------- ProductID / u16 (opt) ----------

View File

@ -139,7 +139,7 @@ class Matter_UDPServer
end
# log("MTR: Perf/UDP_received = " + str(debug.counters()), 4)
if self.dispatch_cb
profiler.log("udp_loop_dispatch")
# profiler.log("udp_loop_dispatch")
self.dispatch_cb(packet, from_addr, from_port)
end
profiler.dump(2)

View File

@ -55,8 +55,6 @@ class Matter_Device
var commissioning_instance_eth # random instance name for commissioning (mDNS)
var hostname_wifi # MAC-derived hostname for commissioning
var hostname_eth # MAC-derived hostname for commissioning
var vendorid
var productid
# mDNS active announces
var mdns_pase_eth # do we have an active PASE mDNS announce for eth
var mdns_pase_wifi # do we have an active PASE mDNS announce for wifi
@ -69,12 +67,6 @@ class Matter_Device
var disable_bridge_mode # default is bridge mode, this flag disables this mode for some non-compliant controllers
var next_ep # next endpoint to be allocated for bridge, start at 1
var debug # debug mode, output all values when responding to read request with wildcard
# context for PBKDF
var root_iterations # PBKDF number of iterations
# PBKDF information used only during PASE (freed afterwards)
var root_salt
var root_w0
var root_L
# cron equivalent to call `read_sensors()` regularly and dispatch to all entpoints
var probe_sensor_time # number of milliseconds to wait between each `read_sensors()` or `nil` if none active
var probe_sensor_timestamp # timestamp for `read_sensors()` probe (in millis())
@ -95,11 +87,7 @@ class Matter_Device
self.plugins = []
self.plugins_persist = false # plugins need to saved only when the first fabric is associated
self.plugins_config_remotes = {}
self.vendorid = self.VENDOR_ID
self.productid = self.PRODUCT_ID
self.root_iterations = self.PBKDF_ITERATIONS
self.next_ep = 1 # start at endpoint 1 for dynamically allocated endpoints
self.root_salt = crypto.random(16)
self.next_ep = 2 # start at endpoint 2 for dynamically allocated endpoints (1 reserved for aggregator)
self.ipv4only = false
self.disable_bridge_mode = false
self.load_param()
@ -173,8 +161,21 @@ class Matter_Device
tasmota.publish_result(format('{"Matter":{"Commissioning":1,"PairingCode":"%s","QRCode":"%s"}}', pairing_code, qr_code), 'Matter')
# compute PBKDF
self._compute_pbkdf(self.root_passcode, self.root_iterations, self.root_salt)
self.start_basic_commissioning(timeout_s, self.root_iterations, self.root_discriminator, self.root_salt, self.root_w0, #-self.root_w1,-# self.root_L, nil)
import crypto
var root_salt = crypto.random(16)
# Compute the PBKDF parameters for SPAKE2+ from root parameters
var passcode = bytes().add(self.root_passcode, 4)
var tv = crypto.PBKDF2_HMAC_SHA256().derive(passcode, root_salt, self.PBKDF_ITERATIONS, 80)
var w0s = tv[0..39]
var w1s = tv[40..79]
var root_w0 = crypto.EC_P256().mod(w0s)
var w1 = crypto.EC_P256().mod(w1s) # w1 is temporarily computed then discarded
# self.root_w1 = crypto.EC_P256().mod(w1s)
var root_L = crypto.EC_P256().public_key(w1)
self.start_basic_commissioning(timeout_s, self.PBKDF_ITERATIONS, self.root_discriminator, root_salt, root_w0, #-self.root_w1,-# root_L, nil)
end
#####################################################################
@ -254,37 +255,13 @@ class Matter_Device
return self.commissioning_open != nil
end
#############################################################
# (internal) Compute the PBKDF parameters for SPAKE2+ from root parameters
#
def _compute_pbkdf(passcode_int, iterations, salt)
import crypto
var passcode = bytes().add(passcode_int, 4)
var tv = crypto.PBKDF2_HMAC_SHA256().derive(passcode, salt, iterations, 80)
var w0s = tv[0..39]
var w1s = tv[40..79]
self.root_w0 = crypto.EC_P256().mod(w0s)
var w1 = crypto.EC_P256().mod(w1s) # w1 is temporarily computed then discarded
# self.root_w1 = crypto.EC_P256().mod(w1s)
self.root_L = crypto.EC_P256().public_key(w1)
# log("MTR: ******************************", 4)
# log("MTR: salt = " + self.root_salt.tohex(), 4)
# log("MTR: passcode_hex = " + passcode.tohex(), 4)
# log("MTR: w0 = " + self.root_w0.tohex(), 4)
# log("MTR: L = " + self.root_L.tohex(), 4)
# log("MTR: ******************************", 4)
end
#############################################################
# Compute QR Code content - can be done only for root PASE
def compute_qrcode_content()
var raw = bytes().resize(11) # we don't use TLV Data so it's only 88 bits or 11 bytes
# version is `000` dont touch
raw.setbits(3, 16, self.vendorid)
raw.setbits(19, 16, self.productid)
raw.setbits(3, 16, self.VENDOR_ID)
raw.setbits(19, 16, self.PRODUCT_ID)
# custom flow = 0 (offset=35, len=2)
raw.setbits(37, 8, 0x04) # already on IP network
raw.setbits(45, 12, self.root_discriminator & 0xFFF)
@ -452,10 +429,6 @@ class Matter_Device
import mdns
self.stop_basic_commissioning() # close all PASE commissioning information
# clear any PBKDF information to free memory
self.root_w0 = nil
# self.root_w1 = nil
self.root_L = nil
self.mdns_announce_op_discovery(fabric)
end
@ -878,7 +851,7 @@ class Matter_Device
import crypto
var services = {
"VP":str(self.vendorid) + "+" + str(self.productid),
"VP": f"{self.VENDOR_ID}+{self.PRODUCT_ID}",
"D": self.commissioning_discriminator,
"CM":1, # requires passcode
"T":0, # no support for TCP
@ -904,7 +877,7 @@ class Matter_Device
subtype = "_S" + str((self.commissioning_discriminator & 0xF00) >> 8)
log("MTR: adding subtype: "+subtype, 3)
mdns.add_subtype("_matterc", "_udp", self.commissioning_instance_eth, self.hostname_eth, subtype)
subtype = "_V" + str(self.vendorid)
subtype = "_V" + str(self.VENDOR_ID)
log("MTR: adding subtype: "+subtype, 3)
mdns.add_subtype("_matterc", "_udp", self.commissioning_instance_eth, self.hostname_eth, subtype)
subtype = "_CM1"
@ -926,7 +899,7 @@ class Matter_Device
subtype = "_S" + str((self.commissioning_discriminator & 0xF00) >> 8)
log("MTR: adding subtype: "+subtype, 3)
mdns.add_subtype("_matterc", "_udp", self.commissioning_instance_wifi, self.hostname_wifi, subtype)
subtype = "_V" + str(self.vendorid)
subtype = "_V" + str(self.VENDOR_ID)
log("MTR: adding subtype: "+subtype, 3)
mdns.add_subtype("_matterc", "_udp", self.commissioning_instance_wifi, self.hostname_wifi, subtype)
subtype = "_CM1"

File diff suppressed because it is too large Load Diff

View File

@ -147,435 +147,410 @@ be_local_closure(class_Matter_MessageHandler_msg_received, /* name */
0, /* has sup protos */
&be_class_Matter_MessageHandler,
1, /* has constants */
( &(const bvalue[70]) { /* constants */
( &(const bvalue[65]) { /* constants */
/* K0 */ be_nested_str_weak(matter),
/* K1 */ be_nested_str_weak(profiler),
/* K2 */ be_nested_str_weak(log),
/* K3 */ be_nested_str_weak(msg_received),
/* K4 */ be_nested_str_weak(Frame),
/* K5 */ be_nested_str_weak(decode_header),
/* K6 */ be_nested_str_weak(sec_p),
/* K7 */ be_nested_str_weak(device),
/* K8 */ be_nested_str_weak(sessions),
/* K9 */ be_nested_str_weak(find_session_source_id_unsecure),
/* K10 */ be_nested_str_weak(source_node_id),
/* K11 */ be_nested_str_weak(control_message),
/* K12 */ be_nested_str_weak(process_incoming_control_message),
/* K13 */ be_nested_str_weak(local_session_id),
/* K14 */ be_const_int(0),
/* K15 */ be_nested_str_weak(sec_sesstype),
/* K16 */ be_nested_str_weak(_ip),
/* K17 */ be_nested_str_weak(_port),
/* K18 */ be_nested_str_weak(_message_handler),
/* K19 */ be_nested_str_weak(session),
/* K20 */ be_nested_str_weak(_counter_insecure_rcv),
/* K21 */ be_nested_str_weak(validate),
/* K22 */ be_nested_str_weak(message_counter),
/* K23 */ be_nested_str_weak(tasmota),
/* K24 */ be_nested_str_weak(loglevel),
/* K25 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20unencrypted_X20message_X20_X3D_X20_X25i_X20ref_X20_X3D_X20_X25i),
/* K26 */ be_nested_str_weak(val),
/* K27 */ be_nested_str_weak(send_simple_ack),
/* K28 */ be_nested_str_weak(decode_payload),
/* K29 */ be_nested_str_weak(received_ack),
/* K30 */ be_nested_str_weak(opcode),
/* K31 */ be_nested_str_weak(get_opcode_name),
/* K32 */ be_nested_str_weak(0x_X2502X),
/* K33 */ be_const_int(3),
/* K34 */ be_nested_str_weak(MTR_X3A_X20_X3EReceived_X20_X20_X28_X256i_X29_X20_X25s_X20from_X20_X5B_X25s_X5D_X3A_X25i),
/* K35 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20Ack_X20_X20_X20_X28_X256i_X29_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i),
/* K36 */ be_nested_str_weak(x_flag_r),
/* K37 */ be_nested_str_weak(_X7Breliable_X7D_X20),
/* K38 */ be_nested_str_weak(),
/* K39 */ be_nested_str_weak(exchange_id),
/* K40 */ be_nested_str_weak(ack_message_counter),
/* K41 */ be_nested_str_weak(commissioning),
/* K42 */ be_nested_str_weak(process_incoming),
/* K43 */ be_nested_str_weak(MTR_X3A_X20decode_X20header_X3A_X20local_session_id_X3D_X25i_X20message_counter_X3D_X25i),
/* K44 */ be_nested_str_weak(get_session_by_local_session_id),
/* K45 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D),
/* K46 */ be_nested_str_weak(counter_rcv_validate),
/* K47 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20encrypted_X20message_X20_X3D_X20),
/* K48 */ be_nested_str_weak(_X20counter_X3D),
/* K49 */ be_nested_str_weak(counter_rcv),
/* K50 */ be_nested_str_weak(send_encrypted_ack),
/* K51 */ be_nested_str_weak(decrypt),
/* K52 */ be_nested_str_weak(msg_received_header_frame_decrypted),
/* K53 */ be_nested_str_weak(MTR_X3A_X20_X3E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Decrypted_X20message_X3A_X20protocol_id_X3A),
/* K54 */ be_nested_str_weak(protocol_id),
/* K55 */ be_nested_str_weak(_X20opcode_X3D),
/* K56 */ be_nested_str_weak(_X20exchange_id_X3D),
/* K57 */ be_nested_str_weak(im),
/* K58 */ be_nested_str_weak(process_incoming_ack),
/* K59 */ be_nested_str_weak(send_enqueued),
/* K60 */ be_const_int(1),
/* K61 */ be_nested_str_weak(process_IM_start),
/* K62 */ be_nested_str_weak(process_IM_end),
/* K63 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A),
/* K64 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20),
/* K65 */ be_nested_str_weak(_X3B),
/* K66 */ be_const_int(2),
/* K67 */ be_nested_str_weak(_debug_present),
/* K68 */ be_nested_str_weak(debug),
/* K69 */ be_nested_str_weak(traceback),
/* K1 */ be_nested_str_weak(Frame),
/* K2 */ be_nested_str_weak(decode_header),
/* K3 */ be_nested_str_weak(sec_p),
/* K4 */ be_nested_str_weak(device),
/* K5 */ be_nested_str_weak(sessions),
/* K6 */ be_nested_str_weak(find_session_source_id_unsecure),
/* K7 */ be_nested_str_weak(source_node_id),
/* K8 */ be_nested_str_weak(control_message),
/* K9 */ be_nested_str_weak(process_incoming_control_message),
/* K10 */ be_nested_str_weak(local_session_id),
/* K11 */ be_const_int(0),
/* K12 */ be_nested_str_weak(sec_sesstype),
/* K13 */ be_nested_str_weak(_ip),
/* K14 */ be_nested_str_weak(_port),
/* K15 */ be_nested_str_weak(_message_handler),
/* K16 */ be_nested_str_weak(session),
/* K17 */ be_nested_str_weak(_counter_insecure_rcv),
/* K18 */ be_nested_str_weak(validate),
/* K19 */ be_nested_str_weak(message_counter),
/* K20 */ be_nested_str_weak(tasmota),
/* K21 */ be_nested_str_weak(loglevel),
/* K22 */ be_nested_str_weak(log),
/* K23 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20unencrypted_X20message_X20_X3D_X20_X25i_X20ref_X20_X3D_X20_X25i),
/* K24 */ be_nested_str_weak(val),
/* K25 */ be_nested_str_weak(send_simple_ack),
/* K26 */ be_nested_str_weak(decode_payload),
/* K27 */ be_nested_str_weak(received_ack),
/* K28 */ be_nested_str_weak(opcode),
/* K29 */ be_nested_str_weak(get_opcode_name),
/* K30 */ be_nested_str_weak(0x_X2502X),
/* K31 */ be_const_int(3),
/* K32 */ be_nested_str_weak(MTR_X3A_X20_X3EReceived_X20_X20_X28_X256i_X29_X20_X25s_X20from_X20_X5B_X25s_X5D_X3A_X25i),
/* K33 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20Ack_X20_X20_X20_X28_X256i_X29_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i),
/* K34 */ be_nested_str_weak(x_flag_r),
/* K35 */ be_nested_str_weak(_X7Breliable_X7D_X20),
/* K36 */ be_nested_str_weak(),
/* K37 */ be_nested_str_weak(exchange_id),
/* K38 */ be_nested_str_weak(ack_message_counter),
/* K39 */ be_nested_str_weak(commissioning),
/* K40 */ be_nested_str_weak(process_incoming),
/* K41 */ be_nested_str_weak(MTR_X3A_X20decode_X20header_X3A_X20local_session_id_X3D_X25i_X20message_counter_X3D_X25i),
/* K42 */ be_nested_str_weak(get_session_by_local_session_id),
/* K43 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D),
/* K44 */ be_nested_str_weak(counter_rcv_validate),
/* K45 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20encrypted_X20message_X20_X3D_X20),
/* K46 */ be_nested_str_weak(_X20counter_X3D),
/* K47 */ be_nested_str_weak(counter_rcv),
/* K48 */ be_nested_str_weak(send_encrypted_ack),
/* K49 */ be_nested_str_weak(decrypt),
/* K50 */ be_nested_str_weak(MTR_X3A_X20_X3E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Decrypted_X20message_X3A_X20protocol_id_X3A),
/* K51 */ be_nested_str_weak(protocol_id),
/* K52 */ be_nested_str_weak(_X20opcode_X3D),
/* K53 */ be_nested_str_weak(_X20exchange_id_X3D),
/* K54 */ be_nested_str_weak(im),
/* K55 */ be_nested_str_weak(process_incoming_ack),
/* K56 */ be_nested_str_weak(send_enqueued),
/* K57 */ be_const_int(1),
/* K58 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A),
/* K59 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20),
/* K60 */ be_nested_str_weak(_X3B),
/* K61 */ be_const_int(2),
/* K62 */ be_nested_str_weak(_debug_present),
/* K63 */ be_nested_str_weak(debug),
/* K64 */ be_nested_str_weak(traceback),
}),
be_str_weak(msg_received),
&be_const_str_solidified,
( &(const binstruction[354]) { /* code */
( &(const binstruction[334]) { /* code */
0x50100000, // 0000 LDBOOL R4 0 0
0xB8160000, // 0001 GETNGBL R5 K0
0x88140B01, // 0002 GETMBR R5 R5 K1
0x8C140B02, // 0003 GETMET R5 R5 K2
0x581C0003, // 0004 LDCONST R7 K3
0x7C140400, // 0005 CALL R5 2
0xA8020141, // 0006 EXBLK 0 #0149
0xB8160000, // 0007 GETNGBL R5 K0
0x8C140B04, // 0008 GETMET R5 R5 K4
0x5C1C0000, // 0009 MOVE R7 R0
0x5C200200, // 000A MOVE R8 R1
0x5C240400, // 000B MOVE R9 R2
0x5C280600, // 000C MOVE R10 R3
0x7C140A00, // 000D CALL R5 5
0x8C180B05, // 000E GETMET R6 R5 K5
0x7C180200, // 000F CALL R6 1
0x5C1C0C00, // 0010 MOVE R7 R6
0x741E0002, // 0011 JMPT R7 #0015
0x501C0000, // 0012 LDBOOL R7 0 0
0xA8040001, // 0013 EXBLK 1 1
0x80040E00, // 0014 RET 1 R7
0x881C0B06, // 0015 GETMBR R7 R5 K6
0x781E000C, // 0016 JMPF R7 #0024
0x881C0107, // 0017 GETMBR R7 R0 K7
0x881C0F08, // 0018 GETMBR R7 R7 K8
0x8C1C0F09, // 0019 GETMET R7 R7 K9
0x88240B0A, // 001A GETMBR R9 R5 K10
0x542A0059, // 001B LDINT R10 90
0x7C1C0600, // 001C CALL R7 3
0x8820010B, // 001D GETMBR R8 R0 K11
0x8C20110C, // 001E GETMET R8 R8 K12
0x5C280A00, // 001F MOVE R10 R5
0x7C200400, // 0020 CALL R8 2
0xA8040001, // 0021 EXBLK 1 1
0x80041000, // 0022 RET 1 R8
0x70020120, // 0023 JMP #0145
0x881C0B0D, // 0024 GETMBR R7 R5 K13
0x1C1C0F0E, // 0025 EQ R7 R7 K14
0x781E007A, // 0026 JMPF R7 #00A2
0x881C0B0F, // 0027 GETMBR R7 R5 K15
0x1C1C0F0E, // 0028 EQ R7 R7 K14
0x781E0077, // 0029 JMPF R7 #00A2
0x881C0107, // 002A GETMBR R7 R0 K7
0x881C0F08, // 002B GETMBR R7 R7 K8
0x8C1C0F09, // 002C GETMET R7 R7 K9
0x88240B0A, // 002D GETMBR R9 R5 K10
0x542A0059, // 002E LDINT R10 90
0x7C1C0600, // 002F CALL R7 3
0x780A0000, // 0030 JMPF R2 #0032
0x901E2002, // 0031 SETMBR R7 K16 R2
0x780E0000, // 0032 JMPF R3 #0034
0x901E2203, // 0033 SETMBR R7 K17 R3
0x901E2400, // 0034 SETMBR R7 K18 R0
0x90162607, // 0035 SETMBR R5 K19 R7
0x88200F14, // 0036 GETMBR R8 R7 K20
0x8C201115, // 0037 GETMET R8 R8 K21
0x88280B16, // 0038 GETMBR R10 R5 K22
0x502C0000, // 0039 LDBOOL R11 0 0
0x7C200600, // 003A CALL R8 3
0x74220015, // 003B JMPT R8 #0052
0xB8222E00, // 003C GETNGBL R8 K23
0x8C201118, // 003D GETMET R8 R8 K24
0x542A0003, // 003E LDINT R10 4
0x7C200400, // 003F CALL R8 2
0x78220009, // 0040 JMPF R8 #004B
0xB8220400, // 0041 GETNGBL R8 K2
0x60240018, // 0042 GETGBL R9 G24
0x58280019, // 0043 LDCONST R10 K25
0x882C0B16, // 0044 GETMBR R11 R5 K22
0x88300F14, // 0045 GETMBR R12 R7 K20
0x8C30191A, // 0046 GETMET R12 R12 K26
0x7C300200, // 0047 CALL R12 1
0x7C240600, // 0048 CALL R9 3
0x542A0003, // 0049 LDINT R10 4
0x7C200400, // 004A CALL R8 2
0x8C20011B, // 004B GETMET R8 R0 K27
0x5C280A00, // 004C MOVE R10 R5
0x502C0000, // 004D LDBOOL R11 0 0
0x7C200600, // 004E CALL R8 3
0x50200000, // 004F LDBOOL R8 0 0
0xA8040001, // 0050 EXBLK 1 1
0x80041000, // 0051 RET 1 R8
0x8C200B1C, // 0052 GETMET R8 R5 K28
0x7C200200, // 0053 CALL R8 1
0x74220002, // 0054 JMPT R8 #0058
0x50200000, // 0055 LDBOOL R8 0 0
0xA8040001, // 0056 EXBLK 1 1
0x80041000, // 0057 RET 1 R8
0x88200107, // 0058 GETMBR R8 R0 K7
0x8C20111D, // 0059 GETMET R8 R8 K29
0x5C280A00, // 005A MOVE R10 R5
0x7C200400, // 005B CALL R8 2
0x88200B1E, // 005C GETMBR R8 R5 K30
0x5426000F, // 005D LDINT R9 16
0x20201009, // 005E NE R8 R8 R9
0x7822001A, // 005F JMPF R8 #007B
0xB8220000, // 0060 GETNGBL R8 K0
0x8C20111F, // 0061 GETMET R8 R8 K31
0x88280B1E, // 0062 GETMBR R10 R5 K30
0x7C200400, // 0063 CALL R8 2
0x5C241000, // 0064 MOVE R9 R8
0x74260004, // 0065 JMPT R9 #006B
0x60240018, // 0066 GETGBL R9 G24
0x58280020, // 0067 LDCONST R10 K32
0x882C0B1E, // 0068 GETMBR R11 R5 K30
0xA8020132, // 0001 EXBLK 0 #0135
0xB8160000, // 0002 GETNGBL R5 K0
0x8C140B01, // 0003 GETMET R5 R5 K1
0x5C1C0000, // 0004 MOVE R7 R0
0x5C200200, // 0005 MOVE R8 R1
0x5C240400, // 0006 MOVE R9 R2
0x5C280600, // 0007 MOVE R10 R3
0x7C140A00, // 0008 CALL R5 5
0x8C180B02, // 0009 GETMET R6 R5 K2
0x7C180200, // 000A CALL R6 1
0x5C1C0C00, // 000B MOVE R7 R6
0x741E0002, // 000C JMPT R7 #0010
0x501C0000, // 000D LDBOOL R7 0 0
0xA8040001, // 000E EXBLK 1 1
0x80040E00, // 000F RET 1 R7
0x881C0B03, // 0010 GETMBR R7 R5 K3
0x781E000C, // 0011 JMPF R7 #001F
0x881C0104, // 0012 GETMBR R7 R0 K4
0x881C0F05, // 0013 GETMBR R7 R7 K5
0x8C1C0F06, // 0014 GETMET R7 R7 K6
0x88240B07, // 0015 GETMBR R9 R5 K7
0x542A0059, // 0016 LDINT R10 90
0x7C1C0600, // 0017 CALL R7 3
0x88200108, // 0018 GETMBR R8 R0 K8
0x8C201109, // 0019 GETMET R8 R8 K9
0x5C280A00, // 001A MOVE R10 R5
0x7C200400, // 001B CALL R8 2
0xA8040001, // 001C EXBLK 1 1
0x80041000, // 001D RET 1 R8
0x70020111, // 001E JMP #0131
0x881C0B0A, // 001F GETMBR R7 R5 K10
0x1C1C0F0B, // 0020 EQ R7 R7 K11
0x781E007A, // 0021 JMPF R7 #009D
0x881C0B0C, // 0022 GETMBR R7 R5 K12
0x1C1C0F0B, // 0023 EQ R7 R7 K11
0x781E0077, // 0024 JMPF R7 #009D
0x881C0104, // 0025 GETMBR R7 R0 K4
0x881C0F05, // 0026 GETMBR R7 R7 K5
0x8C1C0F06, // 0027 GETMET R7 R7 K6
0x88240B07, // 0028 GETMBR R9 R5 K7
0x542A0059, // 0029 LDINT R10 90
0x7C1C0600, // 002A CALL R7 3
0x780A0000, // 002B JMPF R2 #002D
0x901E1A02, // 002C SETMBR R7 K13 R2
0x780E0000, // 002D JMPF R3 #002F
0x901E1C03, // 002E SETMBR R7 K14 R3
0x901E1E00, // 002F SETMBR R7 K15 R0
0x90162007, // 0030 SETMBR R5 K16 R7
0x88200F11, // 0031 GETMBR R8 R7 K17
0x8C201112, // 0032 GETMET R8 R8 K18
0x88280B13, // 0033 GETMBR R10 R5 K19
0x502C0000, // 0034 LDBOOL R11 0 0
0x7C200600, // 0035 CALL R8 3
0x74220015, // 0036 JMPT R8 #004D
0xB8222800, // 0037 GETNGBL R8 K20
0x8C201115, // 0038 GETMET R8 R8 K21
0x542A0003, // 0039 LDINT R10 4
0x7C200400, // 003A CALL R8 2
0x78220009, // 003B JMPF R8 #0046
0xB8222C00, // 003C GETNGBL R8 K22
0x60240018, // 003D GETGBL R9 G24
0x58280017, // 003E LDCONST R10 K23
0x882C0B13, // 003F GETMBR R11 R5 K19
0x88300F11, // 0040 GETMBR R12 R7 K17
0x8C301918, // 0041 GETMET R12 R12 K24
0x7C300200, // 0042 CALL R12 1
0x7C240600, // 0043 CALL R9 3
0x542A0003, // 0044 LDINT R10 4
0x7C200400, // 0045 CALL R8 2
0x8C200119, // 0046 GETMET R8 R0 K25
0x5C280A00, // 0047 MOVE R10 R5
0x502C0000, // 0048 LDBOOL R11 0 0
0x7C200600, // 0049 CALL R8 3
0x50200000, // 004A LDBOOL R8 0 0
0xA8040001, // 004B EXBLK 1 1
0x80041000, // 004C RET 1 R8
0x8C200B1A, // 004D GETMET R8 R5 K26
0x7C200200, // 004E CALL R8 1
0x74220002, // 004F JMPT R8 #0053
0x50200000, // 0050 LDBOOL R8 0 0
0xA8040001, // 0051 EXBLK 1 1
0x80041000, // 0052 RET 1 R8
0x88200104, // 0053 GETMBR R8 R0 K4
0x8C20111B, // 0054 GETMET R8 R8 K27
0x5C280A00, // 0055 MOVE R10 R5
0x7C200400, // 0056 CALL R8 2
0x88200B1C, // 0057 GETMBR R8 R5 K28
0x5426000F, // 0058 LDINT R9 16
0x20201009, // 0059 NE R8 R8 R9
0x7822001A, // 005A JMPF R8 #0076
0xB8220000, // 005B GETNGBL R8 K0
0x8C20111D, // 005C GETMET R8 R8 K29
0x88280B1C, // 005D GETMBR R10 R5 K28
0x7C200400, // 005E CALL R8 2
0x5C241000, // 005F MOVE R9 R8
0x74260004, // 0060 JMPT R9 #0066
0x60240018, // 0061 GETGBL R9 G24
0x5828001E, // 0062 LDCONST R10 K30
0x882C0B1C, // 0063 GETMBR R11 R5 K28
0x7C240400, // 0064 CALL R9 2
0x5C201200, // 0065 MOVE R8 R9
0xB8262800, // 0066 GETNGBL R9 K20
0x8C241315, // 0067 GETMET R9 R9 K21
0x582C001F, // 0068 LDCONST R11 K31
0x7C240400, // 0069 CALL R9 2
0x5C201200, // 006A MOVE R8 R9
0xB8262E00, // 006B GETNGBL R9 K23
0x8C241318, // 006C GETMET R9 R9 K24
0x582C0021, // 006D LDCONST R11 K33
0x7C240400, // 006E CALL R9 2
0x78260009, // 006F JMPF R9 #007A
0xB8260400, // 0070 GETNGBL R9 K2
0x60280018, // 0071 GETGBL R10 G24
0x582C0022, // 0072 LDCONST R11 K34
0x88300F0D, // 0073 GETMBR R12 R7 K13
0x5C341000, // 0074 MOVE R13 R8
0x5C380400, // 0075 MOVE R14 R2
0x5C3C0600, // 0076 MOVE R15 R3
0x7C280A00, // 0077 CALL R10 5
0x582C0021, // 0078 LDCONST R11 K33
0x7C240400, // 0079 CALL R9 2
0x70020017, // 007A JMP #0093
0xB8222E00, // 007B GETNGBL R8 K23
0x8C201118, // 007C GETMET R8 R8 K24
0x542A0003, // 007D LDINT R10 4
0x7C200400, // 007E CALL R8 2
0x78220012, // 007F JMPF R8 #0093
0xB8220400, // 0080 GETNGBL R8 K2
0x60240018, // 0081 GETGBL R9 G24
0x58280023, // 0082 LDCONST R10 K35
0x882C0F0D, // 0083 GETMBR R11 R7 K13
0x88300B16, // 0084 GETMBR R12 R5 K22
0x88340B24, // 0085 GETMBR R13 R5 K36
0x78360001, // 0086 JMPF R13 #0089
0x58340025, // 0087 LDCONST R13 K37
0x70020000, // 0088 JMP #008A
0x58340026, // 0089 LDCONST R13 K38
0x88380B27, // 008A GETMBR R14 R5 K39
0x603C0008, // 008B GETGBL R15 G8
0x88400B28, // 008C GETMBR R16 R5 K40
0x7C3C0200, // 008D CALL R15 1
0x5C400400, // 008E MOVE R16 R2
0x5C440600, // 008F MOVE R17 R3
0x7C241000, // 0090 CALL R9 8
0x542A0003, // 0091 LDINT R10 4
0x7C200400, // 0092 CALL R8 2
0x88200129, // 0093 GETMBR R8 R0 K41
0x8C20112A, // 0094 GETMET R8 R8 K42
0x5C280A00, // 0095 MOVE R10 R5
0x7C200400, // 0096 CALL R8 2
0x5C101000, // 0097 MOVE R4 R8
0x5C200800, // 0098 MOVE R8 R4
0x74220003, // 0099 JMPT R8 #009E
0x8C20011B, // 009A GETMET R8 R0 K27
0x5C280A00, // 009B MOVE R10 R5
0x502C0000, // 009C LDBOOL R11 0 0
0x7C200600, // 009D CALL R8 3
0x50200200, // 009E LDBOOL R8 1 0
0xA8040001, // 009F EXBLK 1 1
0x80041000, // 00A0 RET 1 R8
0x700200A2, // 00A1 JMP #0145
0xB81E2E00, // 00A2 GETNGBL R7 K23
0x8C1C0F18, // 00A3 GETMET R7 R7 K24
0x54260003, // 00A4 LDINT R9 4
0x7C1C0400, // 00A5 CALL R7 2
0x781E0007, // 00A6 JMPF R7 #00AF
0xB81E0400, // 00A7 GETNGBL R7 K2
0x60200018, // 00A8 GETGBL R8 G24
0x5824002B, // 00A9 LDCONST R9 K43
0x88280B0D, // 00AA GETMBR R10 R5 K13
0x882C0B16, // 00AB GETMBR R11 R5 K22
0x7C200600, // 00AC CALL R8 3
0x54260003, // 00AD LDINT R9 4
0x78260009, // 006A JMPF R9 #0075
0xB8262C00, // 006B GETNGBL R9 K22
0x60280018, // 006C GETGBL R10 G24
0x582C0020, // 006D LDCONST R11 K32
0x88300F0A, // 006E GETMBR R12 R7 K10
0x5C341000, // 006F MOVE R13 R8
0x5C380400, // 0070 MOVE R14 R2
0x5C3C0600, // 0071 MOVE R15 R3
0x7C280A00, // 0072 CALL R10 5
0x582C001F, // 0073 LDCONST R11 K31
0x7C240400, // 0074 CALL R9 2
0x70020017, // 0075 JMP #008E
0xB8222800, // 0076 GETNGBL R8 K20
0x8C201115, // 0077 GETMET R8 R8 K21
0x542A0003, // 0078 LDINT R10 4
0x7C200400, // 0079 CALL R8 2
0x78220012, // 007A JMPF R8 #008E
0xB8222C00, // 007B GETNGBL R8 K22
0x60240018, // 007C GETGBL R9 G24
0x58280021, // 007D LDCONST R10 K33
0x882C0F0A, // 007E GETMBR R11 R7 K10
0x88300B13, // 007F GETMBR R12 R5 K19
0x88340B22, // 0080 GETMBR R13 R5 K34
0x78360001, // 0081 JMPF R13 #0084
0x58340023, // 0082 LDCONST R13 K35
0x70020000, // 0083 JMP #0085
0x58340024, // 0084 LDCONST R13 K36
0x88380B25, // 0085 GETMBR R14 R5 K37
0x603C0008, // 0086 GETGBL R15 G8
0x88400B26, // 0087 GETMBR R16 R5 K38
0x7C3C0200, // 0088 CALL R15 1
0x5C400400, // 0089 MOVE R16 R2
0x5C440600, // 008A MOVE R17 R3
0x7C241000, // 008B CALL R9 8
0x542A0003, // 008C LDINT R10 4
0x7C200400, // 008D CALL R8 2
0x88200127, // 008E GETMBR R8 R0 K39
0x8C201128, // 008F GETMET R8 R8 K40
0x5C280A00, // 0090 MOVE R10 R5
0x7C200400, // 0091 CALL R8 2
0x5C101000, // 0092 MOVE R4 R8
0x5C200800, // 0093 MOVE R8 R4
0x74220003, // 0094 JMPT R8 #0099
0x8C200119, // 0095 GETMET R8 R0 K25
0x5C280A00, // 0096 MOVE R10 R5
0x502C0000, // 0097 LDBOOL R11 0 0
0x7C200600, // 0098 CALL R8 3
0x50200200, // 0099 LDBOOL R8 1 0
0xA8040001, // 009A EXBLK 1 1
0x80041000, // 009B RET 1 R8
0x70020093, // 009C JMP #0131
0xB81E2800, // 009D GETNGBL R7 K20
0x8C1C0F15, // 009E GETMET R7 R7 K21
0x54260003, // 009F LDINT R9 4
0x7C1C0400, // 00A0 CALL R7 2
0x781E0007, // 00A1 JMPF R7 #00AA
0xB81E2C00, // 00A2 GETNGBL R7 K22
0x60200018, // 00A3 GETGBL R8 G24
0x58240029, // 00A4 LDCONST R9 K41
0x88280B0A, // 00A5 GETMBR R10 R5 K10
0x882C0B13, // 00A6 GETMBR R11 R5 K19
0x7C200600, // 00A7 CALL R8 3
0x54260003, // 00A8 LDINT R9 4
0x7C1C0400, // 00A9 CALL R7 2
0x881C0104, // 00AA GETMBR R7 R0 K4
0x881C0F05, // 00AB GETMBR R7 R7 K5
0x8C1C0F2A, // 00AC GETMET R7 R7 K42
0x88240B0A, // 00AD GETMBR R9 R5 K10
0x7C1C0400, // 00AE CALL R7 2
0x881C0107, // 00AF GETMBR R7 R0 K7
0x881C0F08, // 00B0 GETMBR R7 R7 K8
0x8C1C0F2C, // 00B1 GETMET R7 R7 K44
0x88240B0D, // 00B2 GETMBR R9 R5 K13
0x7C1C0400, // 00B3 CALL R7 2
0x4C200000, // 00B4 LDNIL R8
0x1C200E08, // 00B5 EQ R8 R7 R8
0x78220009, // 00B6 JMPF R8 #00C1
0xB8220400, // 00B7 GETNGBL R8 K2
0x60240008, // 00B8 GETGBL R9 G8
0x88280B0D, // 00B9 GETMBR R10 R5 K13
0x7C240200, // 00BA CALL R9 1
0x00265A09, // 00BB ADD R9 K45 R9
0x58280021, // 00BC LDCONST R10 K33
0x7C200400, // 00BD CALL R8 2
0x50200000, // 00BE LDBOOL R8 0 0
0xA8040001, // 00BF EXBLK 1 1
0x80041000, // 00C0 RET 1 R8
0x780A0000, // 00C1 JMPF R2 #00C3
0x901E2002, // 00C2 SETMBR R7 K16 R2
0x780E0000, // 00C3 JMPF R3 #00C5
0x901E2203, // 00C4 SETMBR R7 K17 R3
0x901E2400, // 00C5 SETMBR R7 K18 R0
0x90162607, // 00C6 SETMBR R5 K19 R7
0x8C200F2E, // 00C7 GETMET R8 R7 K46
0x88280B16, // 00C8 GETMBR R10 R5 K22
0x502C0200, // 00C9 LDBOOL R11 1 0
0x7C200600, // 00CA CALL R8 3
0x74220017, // 00CB JMPT R8 #00E4
0xB8222E00, // 00CC GETNGBL R8 K23
0x8C201118, // 00CD GETMET R8 R8 K24
0x58280021, // 00CE LDCONST R10 K33
0x7C200400, // 00CF CALL R8 2
0x7822000B, // 00D0 JMPF R8 #00DD
0xB8220400, // 00D1 GETNGBL R8 K2
0x60240008, // 00D2 GETGBL R9 G8
0x88280B16, // 00D3 GETMBR R10 R5 K22
0x7C240200, // 00D4 CALL R9 1
0x00265E09, // 00D5 ADD R9 K47 R9
0x00241330, // 00D6 ADD R9 R9 K48
0x60280008, // 00D7 GETGBL R10 G8
0x882C0F31, // 00D8 GETMBR R11 R7 K49
0x7C280200, // 00D9 CALL R10 1
0x0024120A, // 00DA ADD R9 R9 R10
0x58280021, // 00DB LDCONST R10 K33
0x7C200400, // 00DC CALL R8 2
0x8C200132, // 00DD GETMET R8 R0 K50
0x5C280A00, // 00DE MOVE R10 R5
0x502C0000, // 00DF LDBOOL R11 0 0
0x7C200600, // 00E0 CALL R8 3
0x50200000, // 00E1 LDBOOL R8 0 0
0xA8040001, // 00E2 EXBLK 1 1
0x80041000, // 00E3 RET 1 R8
0x8C200B33, // 00E4 GETMET R8 R5 K51
0x7C200200, // 00E5 CALL R8 1
0xB8260000, // 00E6 GETNGBL R9 K0
0x88241301, // 00E7 GETMBR R9 R9 K1
0x8C241302, // 00E8 GETMET R9 R9 K2
0x582C0034, // 00E9 LDCONST R11 K52
0x7C240400, // 00EA CALL R9 2
0x5C241000, // 00EB MOVE R9 R8
0x74260002, // 00EC JMPT R9 #00F0
0x50240000, // 00ED LDBOOL R9 0 0
0xA8040001, // 00EE EXBLK 1 1
0x80041200, // 00EF RET 1 R9
0x8C240B1C, // 00F0 GETMET R9 R5 K28
0x7C240200, // 00F1 CALL R9 1
0xB8262E00, // 00F2 GETNGBL R9 K23
0x8C241318, // 00F3 GETMET R9 R9 K24
0x542E0003, // 00F4 LDINT R11 4
0x7C240400, // 00F5 CALL R9 2
0x78260012, // 00F6 JMPF R9 #010A
0xB8260400, // 00F7 GETNGBL R9 K2
0x60280008, // 00F8 GETGBL R10 G8
0x882C0B36, // 00F9 GETMBR R11 R5 K54
0x7C280200, // 00FA CALL R10 1
0x002A6A0A, // 00FB ADD R10 K53 R10
0x00281537, // 00FC ADD R10 R10 K55
0x602C0008, // 00FD GETGBL R11 G8
0x88300B1E, // 00FE GETMBR R12 R5 K30
0x7C2C0200, // 00FF CALL R11 1
0x0028140B, // 0100 ADD R10 R10 R11
0x00281538, // 0101 ADD R10 R10 K56
0x602C0008, // 0102 GETGBL R11 G8
0x88300B27, // 0103 GETMBR R12 R5 K39
0x5436FFFE, // 0104 LDINT R13 65535
0x2C30180D, // 0105 AND R12 R12 R13
0x7C2C0200, // 0106 CALL R11 1
0x0028140B, // 0107 ADD R10 R10 R11
0x542E0003, // 0108 LDINT R11 4
0x7C240400, // 0109 CALL R9 2
0x88240107, // 010A GETMBR R9 R0 K7
0x8C24131D, // 010B GETMET R9 R9 K29
0x5C2C0A00, // 010C MOVE R11 R5
0x7C240400, // 010D CALL R9 2
0x88240B36, // 010E GETMBR R9 R5 K54
0x1C28130E, // 010F EQ R10 R9 K14
0x782A000F, // 0110 JMPF R10 #0121
0x88280B1E, // 0111 GETMBR R10 R5 K30
0x542E000F, // 0112 LDINT R11 16
0x1C28140B, // 0113 EQ R10 R10 R11
0x782A0009, // 0114 JMPF R10 #011F
0x88280139, // 0115 GETMBR R10 R0 K57
0x8C28153A, // 0116 GETMET R10 R10 K58
0x5C300A00, // 0117 MOVE R12 R5
0x7C280400, // 0118 CALL R10 2
0x5C101400, // 0119 MOVE R4 R10
0x78120003, // 011A JMPF R4 #011F
0x88280139, // 011B GETMBR R10 R0 K57
0x8C28153B, // 011C GETMET R10 R10 K59
0x5C300000, // 011D MOVE R12 R0
0x7C280400, // 011E CALL R10 2
0x50100200, // 011F LDBOOL R4 1 0
0x70020023, // 0120 JMP #0145
0x1C28133C, // 0121 EQ R10 R9 K60
0x782A001A, // 0122 JMPF R10 #013E
0xB82A0000, // 0123 GETNGBL R10 K0
0x88281501, // 0124 GETMBR R10 R10 K1
0x8C281502, // 0125 GETMET R10 R10 K2
0x5830003D, // 0126 LDCONST R12 K61
0x7C280400, // 0127 CALL R10 2
0x88280139, // 0128 GETMBR R10 R0 K57
0x8C28152A, // 0129 GETMET R10 R10 K42
0x5C300A00, // 012A MOVE R12 R5
0x7C280400, // 012B CALL R10 2
0x5C101400, // 012C MOVE R4 R10
0xB82A0000, // 012D GETNGBL R10 K0
0x88281501, // 012E GETMBR R10 R10 K1
0x8C281502, // 012F GETMET R10 R10 K2
0x5830003E, // 0130 LDCONST R12 K62
0x7C280400, // 0131 CALL R10 2
0x78120004, // 0132 JMPF R4 #0138
0x88280139, // 0133 GETMBR R10 R0 K57
0x8C28153B, // 0134 GETMET R10 R10 K59
0x5C300000, // 0135 MOVE R12 R0
0x7C280400, // 0136 CALL R10 2
0x70020003, // 0137 JMP #013C
0x8C280132, // 0138 GETMET R10 R0 K50
0x5C300A00, // 0139 MOVE R12 R5
0x50340200, // 013A LDBOOL R13 1 0
0x7C280600, // 013B CALL R10 3
0x50100200, // 013C LDBOOL R4 1 0
0x70020006, // 013D JMP #0145
0xB82A0400, // 013E GETNGBL R10 K2
0x602C0008, // 013F GETGBL R11 G8
0x5C301200, // 0140 MOVE R12 R9
0x7C2C0200, // 0141 CALL R11 1
0x002E7E0B, // 0142 ADD R11 K63 R11
0x58300021, // 0143 LDCONST R12 K33
0x7C280400, // 0144 CALL R10 2
0xA8040001, // 0145 EXBLK 1 1
0x80040800, // 0146 RET 1 R4
0xA8040001, // 0147 EXBLK 1 1
0x70020017, // 0148 JMP #0161
0xAC140002, // 0149 CATCH R5 0 2
0x70020014, // 014A JMP #0160
0xB81E0400, // 014B GETNGBL R7 K2
0x60200008, // 014C GETGBL R8 G8
0x5C240A00, // 014D MOVE R9 R5
0x7C200200, // 014E CALL R8 1
0x00228008, // 014F ADD R8 K64 R8
0x00201141, // 0150 ADD R8 R8 K65
0x60240008, // 0151 GETGBL R9 G8
0x5C280C00, // 0152 MOVE R10 R6
0x7C240200, // 0153 CALL R9 1
0x00201009, // 0154 ADD R8 R8 R9
0x58240042, // 0155 LDCONST R9 K66
0x7C1C0400, // 0156 CALL R7 2
0xB81E2E00, // 0157 GETNGBL R7 K23
0x881C0F43, // 0158 GETMBR R7 R7 K67
0x781E0002, // 0159 JMPF R7 #015D
0xA41E8800, // 015A IMPORT R7 K68
0x8C200F45, // 015B GETMET R8 R7 K69
0x7C200200, // 015C CALL R8 1
0x501C0000, // 015D LDBOOL R7 0 0
0x80040E00, // 015E RET 1 R7
0x70020000, // 015F JMP #0161
0xB0080000, // 0160 RAISE 2 R0 R0
0x80000000, // 0161 RET 0
0x4C200000, // 00AF LDNIL R8
0x1C200E08, // 00B0 EQ R8 R7 R8
0x78220009, // 00B1 JMPF R8 #00BC
0xB8222C00, // 00B2 GETNGBL R8 K22
0x60240008, // 00B3 GETGBL R9 G8
0x88280B0A, // 00B4 GETMBR R10 R5 K10
0x7C240200, // 00B5 CALL R9 1
0x00265609, // 00B6 ADD R9 K43 R9
0x5828001F, // 00B7 LDCONST R10 K31
0x7C200400, // 00B8 CALL R8 2
0x50200000, // 00B9 LDBOOL R8 0 0
0xA8040001, // 00BA EXBLK 1 1
0x80041000, // 00BB RET 1 R8
0x780A0000, // 00BC JMPF R2 #00BE
0x901E1A02, // 00BD SETMBR R7 K13 R2
0x780E0000, // 00BE JMPF R3 #00C0
0x901E1C03, // 00BF SETMBR R7 K14 R3
0x901E1E00, // 00C0 SETMBR R7 K15 R0
0x90162007, // 00C1 SETMBR R5 K16 R7
0x8C200F2C, // 00C2 GETMET R8 R7 K44
0x88280B13, // 00C3 GETMBR R10 R5 K19
0x502C0200, // 00C4 LDBOOL R11 1 0
0x7C200600, // 00C5 CALL R8 3
0x74220017, // 00C6 JMPT R8 #00DF
0xB8222800, // 00C7 GETNGBL R8 K20
0x8C201115, // 00C8 GETMET R8 R8 K21
0x5828001F, // 00C9 LDCONST R10 K31
0x7C200400, // 00CA CALL R8 2
0x7822000B, // 00CB JMPF R8 #00D8
0xB8222C00, // 00CC GETNGBL R8 K22
0x60240008, // 00CD GETGBL R9 G8
0x88280B13, // 00CE GETMBR R10 R5 K19
0x7C240200, // 00CF CALL R9 1
0x00265A09, // 00D0 ADD R9 K45 R9
0x0024132E, // 00D1 ADD R9 R9 K46
0x60280008, // 00D2 GETGBL R10 G8
0x882C0F2F, // 00D3 GETMBR R11 R7 K47
0x7C280200, // 00D4 CALL R10 1
0x0024120A, // 00D5 ADD R9 R9 R10
0x5828001F, // 00D6 LDCONST R10 K31
0x7C200400, // 00D7 CALL R8 2
0x8C200130, // 00D8 GETMET R8 R0 K48
0x5C280A00, // 00D9 MOVE R10 R5
0x502C0000, // 00DA LDBOOL R11 0 0
0x7C200600, // 00DB CALL R8 3
0x50200000, // 00DC LDBOOL R8 0 0
0xA8040001, // 00DD EXBLK 1 1
0x80041000, // 00DE RET 1 R8
0x8C200B31, // 00DF GETMET R8 R5 K49
0x7C200200, // 00E0 CALL R8 1
0x5C241000, // 00E1 MOVE R9 R8
0x74260002, // 00E2 JMPT R9 #00E6
0x50240000, // 00E3 LDBOOL R9 0 0
0xA8040001, // 00E4 EXBLK 1 1
0x80041200, // 00E5 RET 1 R9
0x8C240B1A, // 00E6 GETMET R9 R5 K26
0x7C240200, // 00E7 CALL R9 1
0xB8262800, // 00E8 GETNGBL R9 K20
0x8C241315, // 00E9 GETMET R9 R9 K21
0x542E0003, // 00EA LDINT R11 4
0x7C240400, // 00EB CALL R9 2
0x78260012, // 00EC JMPF R9 #0100
0xB8262C00, // 00ED GETNGBL R9 K22
0x60280008, // 00EE GETGBL R10 G8
0x882C0B33, // 00EF GETMBR R11 R5 K51
0x7C280200, // 00F0 CALL R10 1
0x002A640A, // 00F1 ADD R10 K50 R10
0x00281534, // 00F2 ADD R10 R10 K52
0x602C0008, // 00F3 GETGBL R11 G8
0x88300B1C, // 00F4 GETMBR R12 R5 K28
0x7C2C0200, // 00F5 CALL R11 1
0x0028140B, // 00F6 ADD R10 R10 R11
0x00281535, // 00F7 ADD R10 R10 K53
0x602C0008, // 00F8 GETGBL R11 G8
0x88300B25, // 00F9 GETMBR R12 R5 K37
0x5436FFFE, // 00FA LDINT R13 65535
0x2C30180D, // 00FB AND R12 R12 R13
0x7C2C0200, // 00FC CALL R11 1
0x0028140B, // 00FD ADD R10 R10 R11
0x542E0003, // 00FE LDINT R11 4
0x7C240400, // 00FF CALL R9 2
0x88240104, // 0100 GETMBR R9 R0 K4
0x8C24131B, // 0101 GETMET R9 R9 K27
0x5C2C0A00, // 0102 MOVE R11 R5
0x7C240400, // 0103 CALL R9 2
0x88240B33, // 0104 GETMBR R9 R5 K51
0x1C28130B, // 0105 EQ R10 R9 K11
0x782A000F, // 0106 JMPF R10 #0117
0x88280B1C, // 0107 GETMBR R10 R5 K28
0x542E000F, // 0108 LDINT R11 16
0x1C28140B, // 0109 EQ R10 R10 R11
0x782A0009, // 010A JMPF R10 #0115
0x88280136, // 010B GETMBR R10 R0 K54
0x8C281537, // 010C GETMET R10 R10 K55
0x5C300A00, // 010D MOVE R12 R5
0x7C280400, // 010E CALL R10 2
0x5C101400, // 010F MOVE R4 R10
0x78120003, // 0110 JMPF R4 #0115
0x88280136, // 0111 GETMBR R10 R0 K54
0x8C281538, // 0112 GETMET R10 R10 K56
0x5C300000, // 0113 MOVE R12 R0
0x7C280400, // 0114 CALL R10 2
0x50100200, // 0115 LDBOOL R4 1 0
0x70020019, // 0116 JMP #0131
0x1C281339, // 0117 EQ R10 R9 K57
0x782A0010, // 0118 JMPF R10 #012A
0x88280136, // 0119 GETMBR R10 R0 K54
0x8C281528, // 011A GETMET R10 R10 K40
0x5C300A00, // 011B MOVE R12 R5
0x7C280400, // 011C CALL R10 2
0x5C101400, // 011D MOVE R4 R10
0x78120004, // 011E JMPF R4 #0124
0x88280136, // 011F GETMBR R10 R0 K54
0x8C281538, // 0120 GETMET R10 R10 K56
0x5C300000, // 0121 MOVE R12 R0
0x7C280400, // 0122 CALL R10 2
0x70020003, // 0123 JMP #0128
0x8C280130, // 0124 GETMET R10 R0 K48
0x5C300A00, // 0125 MOVE R12 R5
0x50340200, // 0126 LDBOOL R13 1 0
0x7C280600, // 0127 CALL R10 3
0x50100200, // 0128 LDBOOL R4 1 0
0x70020006, // 0129 JMP #0131
0xB82A2C00, // 012A GETNGBL R10 K22
0x602C0008, // 012B GETGBL R11 G8
0x5C301200, // 012C MOVE R12 R9
0x7C2C0200, // 012D CALL R11 1
0x002E740B, // 012E ADD R11 K58 R11
0x5830001F, // 012F LDCONST R12 K31
0x7C280400, // 0130 CALL R10 2
0xA8040001, // 0131 EXBLK 1 1
0x80040800, // 0132 RET 1 R4
0xA8040001, // 0133 EXBLK 1 1
0x70020017, // 0134 JMP #014D
0xAC140002, // 0135 CATCH R5 0 2
0x70020014, // 0136 JMP #014C
0xB81E2C00, // 0137 GETNGBL R7 K22
0x60200008, // 0138 GETGBL R8 G8
0x5C240A00, // 0139 MOVE R9 R5
0x7C200200, // 013A CALL R8 1
0x00227608, // 013B ADD R8 K59 R8
0x0020113C, // 013C ADD R8 R8 K60
0x60240008, // 013D GETGBL R9 G8
0x5C280C00, // 013E MOVE R10 R6
0x7C240200, // 013F CALL R9 1
0x00201009, // 0140 ADD R8 R8 R9
0x5824003D, // 0141 LDCONST R9 K61
0x7C1C0400, // 0142 CALL R7 2
0xB81E2800, // 0143 GETNGBL R7 K20
0x881C0F3E, // 0144 GETMBR R7 R7 K62
0x781E0002, // 0145 JMPF R7 #0149
0xA41E7E00, // 0146 IMPORT R7 K63
0x8C200F40, // 0147 GETMET R8 R7 K64
0x7C200200, // 0148 CALL R8 1
0x501C0000, // 0149 LDBOOL R7 0 0
0x80040E00, // 014A RET 1 R7
0x70020000, // 014B JMP #014D
0xB0080000, // 014C RAISE 2 R0 R0
0x80000000, // 014D RET 0
})
)
);
@ -596,27 +571,18 @@ be_local_closure(class_Matter_MessageHandler_send_response_frame, /* name */
0, /* has sup protos */
&be_class_Matter_MessageHandler,
1, /* has constants */
( &(const bvalue[ 6]) { /* constants */
/* K0 */ be_nested_str_weak(matter),
/* K1 */ be_nested_str_weak(profiler),
/* K2 */ be_nested_str_weak(log),
/* K3 */ be_nested_str_weak(send_response_frame),
/* K4 */ be_nested_str_weak(device),
/* K5 */ be_nested_str_weak(msg_send),
( &(const bvalue[ 2]) { /* constants */
/* K0 */ be_nested_str_weak(device),
/* K1 */ be_nested_str_weak(msg_send),
}),
be_str_weak(send_response_frame),
&be_const_str_solidified,
( &(const binstruction[10]) { /* code */
0xB80A0000, // 0000 GETNGBL R2 K0
0x88080501, // 0001 GETMBR R2 R2 K1
0x8C080502, // 0002 GETMET R2 R2 K2
0x58100003, // 0003 LDCONST R4 K3
0x7C080400, // 0004 CALL R2 2
0x88080104, // 0005 GETMBR R2 R0 K4
0x8C080505, // 0006 GETMET R2 R2 K5
0x5C100200, // 0007 MOVE R4 R1
0x7C080400, // 0008 CALL R2 2
0x80000000, // 0009 RET 0
( &(const binstruction[ 5]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x8C080501, // 0001 GETMET R2 R2 K1
0x5C100200, // 0002 MOVE R4 R1
0x7C080400, // 0003 CALL R2 2
0x80000000, // 0004 RET 0
})
)
);

View File

@ -100,7 +100,7 @@ be_local_closure(class_Matter_Plugin_Root_read_attribute, /* name */
/* K76 */ be_nested_str_weak(commissioning_admin_fabric),
/* K77 */ be_nested_str_weak(set_or_nil),
/* K78 */ be_nested_str_weak(Tasmota),
/* K79 */ be_nested_str_weak(vendorid),
/* K79 */ be_nested_str_weak(VENDOR_ID),
/* K80 */ be_nested_str_weak(DeviceName),
/* K81 */ be_nested_str_weak(FriendlyName),
/* K82 */ be_nested_str_weak(FriendlyName1),

View File

@ -730,7 +730,7 @@ be_local_closure(class_Matter_UDPServer_loop, /* name */
0, /* has sup protos */
&be_class_Matter_UDPServer,
1, /* has constants */
( &(const bvalue[20]) { /* constants */
( &(const bvalue[19]) { /* constants */
/* K0 */ be_nested_str_weak(matter),
/* K1 */ be_nested_str_weak(profiler),
/* K2 */ be_const_int(0),
@ -746,15 +746,14 @@ be_local_closure(class_Matter_UDPServer_loop, /* name */
/* K12 */ be_nested_str_weak(log),
/* K13 */ be_nested_str_weak(MTR_X3A_X20UDP_X20received_X20from_X20_X5B_X25s_X5D_X3A_X25i),
/* K14 */ be_nested_str_weak(dispatch_cb),
/* K15 */ be_nested_str_weak(udp_loop_dispatch),
/* K16 */ be_nested_str_weak(dump),
/* K17 */ be_const_int(2),
/* K18 */ be_nested_str_weak(MAX_PACKETS_READ),
/* K19 */ be_nested_str_weak(_resend_packets),
/* K15 */ be_nested_str_weak(dump),
/* K16 */ be_const_int(2),
/* K17 */ be_nested_str_weak(MAX_PACKETS_READ),
/* K18 */ be_nested_str_weak(_resend_packets),
}),
be_str_weak(loop),
&be_const_str_solidified,
( &(const binstruction[62]) { /* code */
( &(const binstruction[59]) { /* code */
0xB8060000, // 0000 GETNGBL R1 K0
0x88040301, // 0001 GETMBR R1 R1 K1
0x58080002, // 0002 LDCONST R2 K2
@ -769,7 +768,7 @@ be_local_closure(class_Matter_UDPServer_loop, /* name */
0x7C0C0400, // 000B CALL R3 2
0x4C100000, // 000C LDNIL R4
0x20100604, // 000D NE R4 R3 R4
0x7812002B, // 000E JMPF R4 #003B
0x78120028, // 000E JMPF R4 #0038
0x8C100306, // 000F GETMET R4 R1 K6
0x7C100200, // 0010 CALL R4 1
0x90020A03, // 0011 SETMBR R0 K5 R3
@ -792,31 +791,28 @@ be_local_closure(class_Matter_UDPServer_loop, /* name */
0x54220003, // 0022 LDINT R8 4
0x7C180400, // 0023 CALL R6 2
0x8818010E, // 0024 GETMBR R6 R0 K14
0x781A0007, // 0025 JMPF R6 #002E
0x8C18030C, // 0026 GETMET R6 R1 K12
0x5820000F, // 0027 LDCONST R8 K15
0x7C180400, // 0028 CALL R6 2
0x8C18010E, // 0029 GETMET R6 R0 K14
0x5C200600, // 002A MOVE R8 R3
0x5C240800, // 002B MOVE R9 R4
0x5C280A00, // 002C MOVE R10 R5
0x7C180800, // 002D CALL R6 4
0x8C180310, // 002E GETMET R6 R1 K16
0x58200011, // 002F LDCONST R8 K17
0x7C180400, // 0030 CALL R6 2
0x88180112, // 0031 GETMBR R6 R0 K18
0x14180406, // 0032 LT R6 R2 R6
0x781A0004, // 0033 JMPF R6 #0039
0x88180103, // 0034 GETMBR R6 R0 K3
0x8C180D04, // 0035 GETMET R6 R6 K4
0x7C180200, // 0036 CALL R6 1
0x5C0C0C00, // 0037 MOVE R3 R6
0x70020000, // 0038 JMP #003A
0x4C0C0000, // 0039 LDNIL R3
0x7001FFD0, // 003A JMP #000C
0x8C100113, // 003B GETMET R4 R0 K19
0x7C100200, // 003C CALL R4 1
0x80000000, // 003D RET 0
0x781A0004, // 0025 JMPF R6 #002B
0x8C18010E, // 0026 GETMET R6 R0 K14
0x5C200600, // 0027 MOVE R8 R3
0x5C240800, // 0028 MOVE R9 R4
0x5C280A00, // 0029 MOVE R10 R5
0x7C180800, // 002A CALL R6 4
0x8C18030F, // 002B GETMET R6 R1 K15
0x58200010, // 002C LDCONST R8 K16
0x7C180400, // 002D CALL R6 2
0x88180111, // 002E GETMBR R6 R0 K17
0x14180406, // 002F LT R6 R2 R6
0x781A0004, // 0030 JMPF R6 #0036
0x88180103, // 0031 GETMBR R6 R0 K3
0x8C180D04, // 0032 GETMET R6 R6 K4
0x7C180200, // 0033 CALL R6 1
0x5C0C0C00, // 0034 MOVE R3 R6
0x70020000, // 0035 JMP #0037
0x4C0C0000, // 0036 LDNIL R3
0x7001FFD3, // 0037 JMP #000C
0x8C100112, // 0038 GETMET R4 R0 K18
0x7C100200, // 0039 CALL R4 1
0x80000000, // 003A RET 0
})
)
);