Matter implement counter_snd persistance (#18259)

This commit is contained in:
s-hadinger 2023-03-25 20:37:19 +01:00 committed by GitHub
parent ebe308acfc
commit a04c771386
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 1904 additions and 1721 deletions

View File

@ -69,6 +69,12 @@ static void mc_deinit(bvm *vm, matter_counter_t *c) {
}
BE_FUNC_CTYPE_DECLARE(mc_deinit, "", "@.")
// do a unisgned int32 comparison
bbool mc_is_greater(uint32_t a, uint32_t b) {
return a > b;
}
BE_FUNC_CTYPE_DECLARE(mc_is_greater, "b", "ii")
static void mc_reset(matter_counter_t *c, int32_t val) {
c->counter = val;
c->window.reset();
@ -185,6 +191,8 @@ class be_class_Matter_Counter (scope: global, name: Matter_Counter, strings: wea
val, ctype_func(mc_val)
next, ctype_func(mc_next)
validate, ctype_func(mc_validate)
is_greater, static_ctype_func(mc_is_greater) // compare two numbers as unsigned 32 bits
}
@const_object_info_end */

View File

@ -275,6 +275,7 @@ class Matter_Device
def trigger_read_sensors()
import json
var rs_json = tasmota.read_sensors()
if rs_json == nil return end
var rs = json.load(rs_json)
if rs != nil
@ -286,7 +287,7 @@ class Matter_Device
end
else
tasmota.log("MTR: unable to parse read_sensors: "+rs_json, 3)
tasmota.log("MTR: unable to parse read_sensors: "+str(rs_json), 3)
end
end

View File

@ -244,7 +244,7 @@ class Matter_Frame
end
resp.session = self.session # also copy the session object
# message counter
resp.message_counter = self.session.counter_snd.next()
resp.message_counter = self.session.counter_snd_next()
resp.local_session_id = self.session.initiator_session_id
resp.x_flag_i = (self.x_flag_i ? 0 : 1) # invert the initiator flag
@ -284,7 +284,7 @@ class Matter_Frame
# message counter
# if self.session && self.session.initiator_session_id != 0
if self.local_session_id != 0 && self.session && self.session.initiator_session_id != 0
resp.message_counter = self.session.counter_snd.next()
resp.message_counter = self.session.counter_snd_next()
resp.local_session_id = self.session.initiator_session_id
else
resp.message_counter = self.session._counter_insecure_snd.next()
@ -327,7 +327,7 @@ class Matter_Frame
resp.session = session # also copy the session object
# message counter
if session && session.initiator_session_id != 0
resp.message_counter = session.counter_snd.next()
resp.message_counter = session.counter_snd_next()
resp.local_session_id = session.initiator_session_id
else
resp.message_counter = session._counter_insecure_snd.next()

View File

@ -96,8 +96,8 @@ class Matter_MessageHandler
frame.session = session # keep a pointer of the session in the message
# check if it's a duplicate
if !session.counter_rcv.validate(frame.message_counter, true)
tasmota.log("MTR: rejected duplicate encrypted message = " + str(frame.message_counter) + " counter=" + str(session.counter_rcv.val()), 3)
if !session.counter_rcv_validate(frame.message_counter, true)
tasmota.log("MTR: rejected duplicate encrypted message = " + str(frame.message_counter) + " counter=" + str(session.counter_rcv), 3)
return false
end

View File

@ -228,6 +228,7 @@ matter.Fabric = Matter_Fabric
class Matter_Session : Matter_Expirable
static var _PASE = 1 # PASE authentication in progress
static var _CASE = 2 # CASE authentication in progress
static var _COUNTER_SND_INCR = 1024 # counter increased when persisting
var _store # reference back to session store
# mode for Session. Can be PASE=1, CASE=2, Established=10 none=0
var mode
@ -244,7 +245,9 @@ class Matter_Session : Matter_Expirable
var __future_local_session_id
# counters
var counter_rcv # counter for incoming messages
var counter_snd # counter for outgoing messages
var counter_snd # persisted last highest known counter_snd (it is in advance or equal to the actual last used counter_snd)
var _counter_rcv_impl # implementation of counter_rcv by matter.Counter()
var _counter_snd_impl # implementation of counter_snd by matter.Counter()
var _exchange_id # exchange id for locally initiated transaction, non-persistent
# keep track of last known IP/Port of the fabric
var _ip # IP of the last received packet
@ -280,8 +283,13 @@ class Matter_Session : Matter_Expirable
self.mode = 0
self.local_session_id = local_session_id
self.initiator_session_id = initiator_session_id
self.counter_rcv = matter.Counter()
self.counter_snd = matter.Counter()
# self.counter_rcv = matter.Counter()
# self.counter_snd = matter.Counter()
self._counter_snd_impl = matter.Counter()
self._counter_rcv_impl = matter.Counter()
self.counter_rcv = 0 # avoid nil values
self.counter_snd = self._counter_snd_impl.next() + self._COUNTER_SND_INCR
# print(">>>> INIT", "counter_rcv=", self.counter_rcv, "counter_snd=", self.counter_snd)
self._counter_insecure_rcv = matter.Counter()
self._counter_insecure_snd = matter.Counter()
self._breadcrumb = 0
@ -291,6 +299,49 @@ class Matter_Session : Matter_Expirable
self.update()
end
#############################################################
# Management of security counters
#############################################################
# Provide the next counter value, and update the last know persisted if needed
#
def counter_snd_next()
var next = self._counter_snd_impl.next()
# print(">>> NEXT counter_snd=", self.counter_snd, "_impl=", self._counter_snd_impl.val())
if matter.Counter.is_greater(next, self.counter_snd)
if self.does_persist()
# the persisted counter is behind the actual counter
self.counter_snd = next + self._COUNTER_SND_INCR
self.save()
else
self.counter_snd = next # if no persistance, just keep track
end
end
return next
end
# #############################################################
# # Before savind
# def persist_pre()
# end
#############################################################
# When hydrating from persistance, update counters
def hydrate_post()
# reset counter_snd to highest known.
# We advance it only in case it is actually used
# This avoids updaing counters on dead sessions
self._counter_snd_impl.reset(self.counter_snd)
self._counter_rcv_impl.reset(self.counter_rcv)
self.counter_snd = self._counter_snd_impl.val()
self.counter_rcv = self._counter_rcv_impl.val()
end
#############################################################
# Validate received counter
def counter_rcv_validate(v, t)
var ret = self._counter_rcv_impl.validate(v, t)
if ret self.counter_rcv = self._counter_rcv_impl.val() end # update the validated counter
return ret
end
#############################################################
# Update the timestamp or any other information
def update()
@ -334,8 +385,10 @@ class Matter_Session : Matter_Expirable
# close the PASE session, it will be re-opened with a CASE session
self.local_session_id = self.__future_local_session_id
self.initiator_session_id = self.__future_initiator_session_id
self.counter_rcv.reset()
self.counter_snd.reset()
self._counter_rcv_impl.reset()
self._counter_snd_impl.reset()
self.counter_rcv = 0
self.counter_snd = self._counter_snd_impl.next()
self.i2rkey = nil
self._i2r_privacy = nil
self.r2ikey = nil
@ -470,9 +523,7 @@ class Matter_Session : Matter_Expirable
var v = introspect.get(self, k)
if v == nil continue end
if k == "counter_rcv" v = v.val()
elif k == "counter_snd" v = v.next() + 256 # take a margin to avoid reusing the same counter
elif isinstance(v, bytes) v = "$$" + v.tob64() # bytes
if isinstance(v, bytes) v = "$$" + v.tob64() # bytes
elif type(v) == 'instance' continue # skip any other instance
end
@ -495,21 +546,17 @@ class Matter_Session : Matter_Expirable
for k:values.keys()
var v = values[k]
if k == "counter_rcv" self.counter_rcv.reset(int(v))
elif k == "counter_snd" self.counter_snd.reset(int(v))
else
# standard values
if type(v) == 'string'
if string.find(v, "0x") == 0 # treat as bytes
introspect.set(self, k, bytes().fromhex(v[2..]))
elif string.find(v, "$$") == 0 # treat as bytes
introspect.set(self, k, bytes().fromb64(v[2..]))
else
introspect.set(self, k, v)
end
# standard values
if type(v) == 'string'
if string.find(v, "0x") == 0 # treat as bytes
introspect.set(self, k, bytes().fromhex(v[2..]))
elif string.find(v, "$$") == 0 # treat as bytes
introspect.set(self, k, bytes().fromb64(v[2..]))
else
introspect.set(self, k, v)
end
else
introspect.set(self, k, v)
end
end
self.hydrate_post()

View File

@ -2961,37 +2961,44 @@ be_local_closure(Matter_Device_trigger_read_sensors, /* name */
}),
be_str_weak(trigger_read_sensors),
&be_const_str_solidified,
( &(const binstruction[30]) { /* code */
( &(const binstruction[37]) { /* code */
0xA4060000, // 0000 IMPORT R1 K0
0xB80A0200, // 0001 GETNGBL R2 K1
0x8C080502, // 0002 GETMET R2 R2 K2
0x7C080200, // 0003 CALL R2 1
0x8C0C0303, // 0004 GETMET R3 R1 K3
0x5C140400, // 0005 MOVE R5 R2
0x7C0C0400, // 0006 CALL R3 2
0x4C100000, // 0007 LDNIL R4
0x20100604, // 0008 NE R4 R3 R4
0x7812000D, // 0009 JMPF R4 #0018
0x58100004, // 000A LDCONST R4 K4
0x6014000C, // 000B GETGBL R5 G12
0x88180105, // 000C GETMBR R6 R0 K5
0x7C140200, // 000D CALL R5 1
0x14140805, // 000E LT R5 R4 R5
0x78160006, // 000F JMPF R5 #0017
0x88140105, // 0010 GETMBR R5 R0 K5
0x94140A04, // 0011 GETIDX R5 R5 R4
0x8C140B06, // 0012 GETMET R5 R5 K6
0x5C1C0600, // 0013 MOVE R7 R3
0x7C140400, // 0014 CALL R5 2
0x00100907, // 0015 ADD R4 R4 K7
0x7001FFF3, // 0016 JMP #000B
0x70020004, // 0017 JMP #001D
0xB8120200, // 0018 GETNGBL R4 K1
0x8C100908, // 0019 GETMET R4 R4 K8
0x001A1202, // 001A ADD R6 K9 R2
0x581C000A, // 001B LDCONST R7 K10
0x7C100600, // 001C CALL R4 3
0x80000000, // 001D RET 0
0x4C0C0000, // 0004 LDNIL R3
0x1C0C0403, // 0005 EQ R3 R2 R3
0x780E0000, // 0006 JMPF R3 #0008
0x80000600, // 0007 RET 0
0x8C0C0303, // 0008 GETMET R3 R1 K3
0x5C140400, // 0009 MOVE R5 R2
0x7C0C0400, // 000A CALL R3 2
0x4C100000, // 000B LDNIL R4
0x20100604, // 000C NE R4 R3 R4
0x7812000D, // 000D JMPF R4 #001C
0x58100004, // 000E LDCONST R4 K4
0x6014000C, // 000F GETGBL R5 G12
0x88180105, // 0010 GETMBR R6 R0 K5
0x7C140200, // 0011 CALL R5 1
0x14140805, // 0012 LT R5 R4 R5
0x78160006, // 0013 JMPF R5 #001B
0x88140105, // 0014 GETMBR R5 R0 K5
0x94140A04, // 0015 GETIDX R5 R5 R4
0x8C140B06, // 0016 GETMET R5 R5 K6
0x5C1C0600, // 0017 MOVE R7 R3
0x7C140400, // 0018 CALL R5 2
0x00100907, // 0019 ADD R4 R4 K7
0x7001FFF3, // 001A JMP #000F
0x70020007, // 001B JMP #0024
0xB8120200, // 001C GETNGBL R4 K1
0x8C100908, // 001D GETMET R4 R4 K8
0x60180008, // 001E GETGBL R6 G8
0x5C1C0400, // 001F MOVE R7 R2
0x7C180200, // 0020 CALL R6 1
0x001A1206, // 0021 ADD R6 K9 R6
0x581C000A, // 0022 LDCONST R7 K10
0x7C100600, // 0023 CALL R4 3
0x80000000, // 0024 RET 0
})
)
);

View File

@ -446,7 +446,7 @@ be_local_closure(Matter_Frame_build_standalone_ack, /* name */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[30]) { /* constants */
( &(const bvalue[29]) { /* constants */
/* K0 */ be_nested_str_weak(string),
/* K1 */ be_nested_str_weak(message_handler),
/* K2 */ be_nested_str_weak(remote_ip),
@ -459,28 +459,27 @@ be_local_closure(Matter_Frame_build_standalone_ack, /* name */
/* K9 */ be_const_int(0),
/* K10 */ be_nested_str_weak(session),
/* K11 */ be_nested_str_weak(message_counter),
/* K12 */ be_nested_str_weak(counter_snd),
/* K13 */ be_nested_str_weak(next),
/* K14 */ be_nested_str_weak(local_session_id),
/* K15 */ be_nested_str_weak(initiator_session_id),
/* K16 */ be_nested_str_weak(x_flag_i),
/* K17 */ be_nested_str_weak(opcode),
/* K18 */ be_nested_str_weak(exchange_id),
/* K19 */ be_nested_str_weak(protocol_id),
/* K20 */ be_nested_str_weak(x_flag_a),
/* K21 */ be_nested_str_weak(ack_message_counter),
/* K22 */ be_nested_str_weak(x_flag_r),
/* K23 */ be_nested_str_weak(tasmota),
/* K24 */ be_nested_str_weak(log),
/* K25 */ be_nested_str_weak(format),
/* K26 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X25s),
/* K27 */ be_nested_str_weak(matter),
/* K28 */ be_nested_str_weak(get_opcode_name),
/* K29 */ be_const_int(3),
/* K12 */ be_nested_str_weak(counter_snd_next),
/* K13 */ be_nested_str_weak(local_session_id),
/* K14 */ be_nested_str_weak(initiator_session_id),
/* K15 */ be_nested_str_weak(x_flag_i),
/* K16 */ be_nested_str_weak(opcode),
/* K17 */ be_nested_str_weak(exchange_id),
/* K18 */ be_nested_str_weak(protocol_id),
/* K19 */ be_nested_str_weak(x_flag_a),
/* K20 */ be_nested_str_weak(ack_message_counter),
/* K21 */ be_nested_str_weak(x_flag_r),
/* K22 */ be_nested_str_weak(tasmota),
/* K23 */ be_nested_str_weak(log),
/* K24 */ be_nested_str_weak(format),
/* K25 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X25s),
/* K26 */ be_nested_str_weak(matter),
/* K27 */ be_nested_str_weak(get_opcode_name),
/* K28 */ be_const_int(3),
}),
be_str_weak(build_standalone_ack),
&be_const_str_solidified,
( &(const binstruction[54]) { /* code */
( &(const binstruction[53]) { /* code */
0xA4060000, // 0000 IMPORT R1 K0
0x60080006, // 0001 GETGBL R2 G6
0x5C0C0000, // 0002 MOVE R3 R0
@ -501,40 +500,39 @@ be_local_closure(Matter_Frame_build_standalone_ack, /* name */
0x880C010A, // 0011 GETMBR R3 R0 K10
0x900A1403, // 0012 SETMBR R2 K10 R3
0x880C010A, // 0013 GETMBR R3 R0 K10
0x880C070C, // 0014 GETMBR R3 R3 K12
0x8C0C070D, // 0015 GETMET R3 R3 K13
0x7C0C0200, // 0016 CALL R3 1
0x900A1603, // 0017 SETMBR R2 K11 R3
0x880C010A, // 0018 GETMBR R3 R0 K10
0x880C070F, // 0019 GETMBR R3 R3 K15
0x900A1C03, // 001A SETMBR R2 K14 R3
0x880C0110, // 001B GETMBR R3 R0 K16
0x780E0001, // 001C JMPF R3 #001F
0x580C0009, // 001D LDCONST R3 K9
0x70020000, // 001E JMP #0020
0x580C0006, // 001F LDCONST R3 K6
0x900A2003, // 0020 SETMBR R2 K16 R3
0x540E000F, // 0021 LDINT R3 16
0x900A2203, // 0022 SETMBR R2 K17 R3
0x880C0112, // 0023 GETMBR R3 R0 K18
0x900A2403, // 0024 SETMBR R2 K18 R3
0x900A2709, // 0025 SETMBR R2 K19 K9
0x900A2906, // 0026 SETMBR R2 K20 K6
0x880C010B, // 0027 GETMBR R3 R0 K11
0x900A2A03, // 0028 SETMBR R2 K21 R3
0x900A2D06, // 0029 SETMBR R2 K22 K6
0xB80E2E00, // 002A GETNGBL R3 K23
0x8C0C0718, // 002B GETMET R3 R3 K24
0x8C140319, // 002C GETMET R5 R1 K25
0x581C001A, // 002D LDCONST R7 K26
0xB8223600, // 002E GETNGBL R8 K27
0x8C20111C, // 002F GETMET R8 R8 K28
0x88280511, // 0030 GETMBR R10 R2 K17
0x7C200400, // 0031 CALL R8 2
0x7C140600, // 0032 CALL R5 3
0x5818001D, // 0033 LDCONST R6 K29
0x7C0C0600, // 0034 CALL R3 3
0x80040400, // 0035 RET 1 R2
0x8C0C070C, // 0014 GETMET R3 R3 K12
0x7C0C0200, // 0015 CALL R3 1
0x900A1603, // 0016 SETMBR R2 K11 R3
0x880C010A, // 0017 GETMBR R3 R0 K10
0x880C070E, // 0018 GETMBR R3 R3 K14
0x900A1A03, // 0019 SETMBR R2 K13 R3
0x880C010F, // 001A GETMBR R3 R0 K15
0x780E0001, // 001B JMPF R3 #001E
0x580C0009, // 001C LDCONST R3 K9
0x70020000, // 001D JMP #001F
0x580C0006, // 001E LDCONST R3 K6
0x900A1E03, // 001F SETMBR R2 K15 R3
0x540E000F, // 0020 LDINT R3 16
0x900A2003, // 0021 SETMBR R2 K16 R3
0x880C0111, // 0022 GETMBR R3 R0 K17
0x900A2203, // 0023 SETMBR R2 K17 R3
0x900A2509, // 0024 SETMBR R2 K18 K9
0x900A2706, // 0025 SETMBR R2 K19 K6
0x880C010B, // 0026 GETMBR R3 R0 K11
0x900A2803, // 0027 SETMBR R2 K20 R3
0x900A2B06, // 0028 SETMBR R2 K21 K6
0xB80E2C00, // 0029 GETNGBL R3 K22
0x8C0C0717, // 002A GETMET R3 R3 K23
0x8C140318, // 002B GETMET R5 R1 K24
0x581C0019, // 002C LDCONST R7 K25
0xB8223400, // 002D GETNGBL R8 K26
0x8C20111B, // 002E GETMET R8 R8 K27
0x88280510, // 002F GETMBR R10 R2 K16
0x7C200400, // 0030 CALL R8 2
0x7C140600, // 0031 CALL R5 3
0x5818001C, // 0032 LDCONST R6 K28
0x7C0C0600, // 0033 CALL R3 3
0x80040400, // 0034 RET 1 R2
})
)
);
@ -569,9 +567,9 @@ be_local_closure(Matter_Frame_build_response, /* name */
/* K11 */ be_nested_str_weak(local_session_id),
/* K12 */ be_nested_str_weak(initiator_session_id),
/* K13 */ be_nested_str_weak(message_counter),
/* K14 */ be_nested_str_weak(counter_snd),
/* K15 */ be_nested_str_weak(next),
/* K16 */ be_nested_str_weak(_counter_insecure_snd),
/* K14 */ be_nested_str_weak(counter_snd_next),
/* K15 */ be_nested_str_weak(_counter_insecure_snd),
/* K16 */ be_nested_str_weak(next),
/* K17 */ be_nested_str_weak(x_flag_i),
/* K18 */ be_nested_str_weak(opcode),
/* K19 */ be_nested_str_weak(exchange_id),
@ -590,7 +588,7 @@ be_local_closure(Matter_Frame_build_response, /* name */
}),
be_str_weak(build_response),
&be_const_str_solidified,
( &(const binstruction[91]) { /* code */
( &(const binstruction[90]) { /* code */
0xA4120000, // 0000 IMPORT R4 K0
0x4C140000, // 0001 LDNIL R5
0x1C140605, // 0002 EQ R5 R3 R5
@ -616,72 +614,71 @@ be_local_closure(Matter_Frame_build_response, /* name */
0x900E1405, // 0016 SETMBR R3 K10 R5
0x8814010B, // 0017 GETMBR R5 R0 K11
0x20140B09, // 0018 NE R5 R5 K9
0x7816000E, // 0019 JMPF R5 #0029
0x7816000D, // 0019 JMPF R5 #0028
0x8814010A, // 001A GETMBR R5 R0 K10
0x7816000C, // 001B JMPF R5 #0029
0x7816000B, // 001B JMPF R5 #0028
0x8814010A, // 001C GETMBR R5 R0 K10
0x88140B0C, // 001D GETMBR R5 R5 K12
0x20140B09, // 001E NE R5 R5 K9
0x78160008, // 001F JMPF R5 #0029
0x78160007, // 001F JMPF R5 #0028
0x8814010A, // 0020 GETMBR R5 R0 K10
0x88140B0E, // 0021 GETMBR R5 R5 K14
0x8C140B0F, // 0022 GETMET R5 R5 K15
0x7C140200, // 0023 CALL R5 1
0x900E1A05, // 0024 SETMBR R3 K13 R5
0x8814010A, // 0025 GETMBR R5 R0 K10
0x88140B0C, // 0026 GETMBR R5 R5 K12
0x900E1605, // 0027 SETMBR R3 K11 R5
0x70020005, // 0028 JMP #002F
0x8814010A, // 0029 GETMBR R5 R0 K10
0x88140B10, // 002A GETMBR R5 R5 K16
0x8C140B0F, // 002B GETMET R5 R5 K15
0x7C140200, // 002C CALL R5 1
0x900E1A05, // 002D SETMBR R3 K13 R5
0x900E1709, // 002E SETMBR R3 K11 K9
0x88140111, // 002F GETMBR R5 R0 K17
0x78160001, // 0030 JMPF R5 #0033
0x58140009, // 0031 LDCONST R5 K9
0x70020000, // 0032 JMP #0034
0x58140006, // 0033 LDCONST R5 K6
0x900E2205, // 0034 SETMBR R3 K17 R5
0x900E2401, // 0035 SETMBR R3 K18 R1
0x88140113, // 0036 GETMBR R5 R0 K19
0x900E2605, // 0037 SETMBR R3 K19 R5
0x88140114, // 0038 GETMBR R5 R0 K20
0x900E2805, // 0039 SETMBR R3 K20 R5
0x88140115, // 003A GETMBR R5 R0 K21
0x78160002, // 003B JMPF R5 #003F
0x900E2D06, // 003C SETMBR R3 K22 K6
0x8814010D, // 003D GETMBR R5 R0 K13
0x900E2E05, // 003E SETMBR R3 K23 R5
0x780A0001, // 003F JMPF R2 #0042
0x58140006, // 0040 LDCONST R5 K6
0x70020000, // 0041 JMP #0043
0x58140009, // 0042 LDCONST R5 K9
0x900E2A05, // 0043 SETMBR R3 K21 R5
0x8814070B, // 0044 GETMBR R5 R3 K11
0x1C140B09, // 0045 EQ R5 R5 K9
0x78160012, // 0046 JMPF R5 #005A
0xB8163000, // 0047 GETNGBL R5 K24
0x8C140B19, // 0048 GETMET R5 R5 K25
0x881C0712, // 0049 GETMBR R7 R3 K18
0x7C140400, // 004A CALL R5 2
0x5C180A00, // 004B MOVE R6 R5
0x741A0004, // 004C JMPT R6 #0052
0x8C18091A, // 004D GETMET R6 R4 K26
0x5820001B, // 004E LDCONST R8 K27
0x88240712, // 004F GETMBR R9 R3 K18
0x7C180600, // 0050 CALL R6 3
0x5C140C00, // 0051 MOVE R5 R6
0xB81A3800, // 0052 GETNGBL R6 K28
0x8C180D1D, // 0053 GETMET R6 R6 K29
0x8C20091A, // 0054 GETMET R8 R4 K26
0x5828001E, // 0055 LDCONST R10 K30
0x5C2C0A00, // 0056 MOVE R11 R5
0x7C200600, // 0057 CALL R8 3
0x5824001F, // 0058 LDCONST R9 K31
0x7C180600, // 0059 CALL R6 3
0x80040600, // 005A RET 1 R3
0x8C140B0E, // 0021 GETMET R5 R5 K14
0x7C140200, // 0022 CALL R5 1
0x900E1A05, // 0023 SETMBR R3 K13 R5
0x8814010A, // 0024 GETMBR R5 R0 K10
0x88140B0C, // 0025 GETMBR R5 R5 K12
0x900E1605, // 0026 SETMBR R3 K11 R5
0x70020005, // 0027 JMP #002E
0x8814010A, // 0028 GETMBR R5 R0 K10
0x88140B0F, // 0029 GETMBR R5 R5 K15
0x8C140B10, // 002A GETMET R5 R5 K16
0x7C140200, // 002B CALL R5 1
0x900E1A05, // 002C SETMBR R3 K13 R5
0x900E1709, // 002D SETMBR R3 K11 K9
0x88140111, // 002E GETMBR R5 R0 K17
0x78160001, // 002F JMPF R5 #0032
0x58140009, // 0030 LDCONST R5 K9
0x70020000, // 0031 JMP #0033
0x58140006, // 0032 LDCONST R5 K6
0x900E2205, // 0033 SETMBR R3 K17 R5
0x900E2401, // 0034 SETMBR R3 K18 R1
0x88140113, // 0035 GETMBR R5 R0 K19
0x900E2605, // 0036 SETMBR R3 K19 R5
0x88140114, // 0037 GETMBR R5 R0 K20
0x900E2805, // 0038 SETMBR R3 K20 R5
0x88140115, // 0039 GETMBR R5 R0 K21
0x78160002, // 003A JMPF R5 #003E
0x900E2D06, // 003B SETMBR R3 K22 K6
0x8814010D, // 003C GETMBR R5 R0 K13
0x900E2E05, // 003D SETMBR R3 K23 R5
0x780A0001, // 003E JMPF R2 #0041
0x58140006, // 003F LDCONST R5 K6
0x70020000, // 0040 JMP #0042
0x58140009, // 0041 LDCONST R5 K9
0x900E2A05, // 0042 SETMBR R3 K21 R5
0x8814070B, // 0043 GETMBR R5 R3 K11
0x1C140B09, // 0044 EQ R5 R5 K9
0x78160012, // 0045 JMPF R5 #0059
0xB8163000, // 0046 GETNGBL R5 K24
0x8C140B19, // 0047 GETMET R5 R5 K25
0x881C0712, // 0048 GETMBR R7 R3 K18
0x7C140400, // 0049 CALL R5 2
0x5C180A00, // 004A MOVE R6 R5
0x741A0004, // 004B JMPT R6 #0051
0x8C18091A, // 004C GETMET R6 R4 K26
0x5820001B, // 004D LDCONST R8 K27
0x88240712, // 004E GETMBR R9 R3 K18
0x7C180600, // 004F CALL R6 3
0x5C140C00, // 0050 MOVE R5 R6
0xB81A3800, // 0051 GETNGBL R6 K28
0x8C180D1D, // 0052 GETMET R6 R6 K29
0x8C20091A, // 0053 GETMET R8 R4 K26
0x5828001E, // 0054 LDCONST R10 K30
0x5C2C0A00, // 0055 MOVE R11 R5
0x7C200600, // 0056 CALL R8 3
0x5824001F, // 0057 LDCONST R9 K31
0x7C180600, // 0058 CALL R6 3
0x80040600, // 0059 RET 1 R3
})
)
);
@ -715,10 +712,10 @@ be_local_closure(Matter_Frame_initiate_response, /* name */
/* K10 */ be_nested_str_weak(session),
/* K11 */ be_nested_str_weak(initiator_session_id),
/* K12 */ be_nested_str_weak(message_counter),
/* K13 */ be_nested_str_weak(counter_snd),
/* K14 */ be_nested_str_weak(next),
/* K15 */ be_nested_str_weak(local_session_id),
/* K16 */ be_nested_str_weak(_counter_insecure_snd),
/* K13 */ be_nested_str_weak(counter_snd_next),
/* K14 */ be_nested_str_weak(local_session_id),
/* K15 */ be_nested_str_weak(_counter_insecure_snd),
/* K16 */ be_nested_str_weak(next),
/* K17 */ be_nested_str_weak(x_flag_i),
/* K18 */ be_const_int(1),
/* K19 */ be_nested_str_weak(opcode),
@ -729,7 +726,7 @@ be_local_closure(Matter_Frame_initiate_response, /* name */
}),
be_str_weak(initiate_response),
&be_const_str_solidified,
( &(const binstruction[48]) { /* code */
( &(const binstruction[47]) { /* code */
0x58140000, // 0000 LDCONST R5 K0
0xA41A0200, // 0001 IMPORT R6 K1
0x4C1C0000, // 0002 LDNIL R7
@ -746,38 +743,37 @@ be_local_closure(Matter_Frame_initiate_response, /* name */
0x90120C07, // 000D SETMBR R4 K6 R7
0x90121109, // 000E SETMBR R4 K8 K9
0x90121401, // 000F SETMBR R4 K10 R1
0x78060009, // 0010 JMPF R1 #001B
0x78060008, // 0010 JMPF R1 #001A
0x881C030B, // 0011 GETMBR R7 R1 K11
0x201C0F09, // 0012 NE R7 R7 K9
0x781E0006, // 0013 JMPF R7 #001B
0x881C030D, // 0014 GETMBR R7 R1 K13
0x8C1C0F0E, // 0015 GETMET R7 R7 K14
0x7C1C0200, // 0016 CALL R7 1
0x90121807, // 0017 SETMBR R4 K12 R7
0x881C030B, // 0018 GETMBR R7 R1 K11
0x90121E07, // 0019 SETMBR R4 K15 R7
0x70020004, // 001A JMP #0020
0x881C0310, // 001B GETMBR R7 R1 K16
0x8C1C0F0E, // 001C GETMET R7 R7 K14
0x7C1C0200, // 001D CALL R7 1
0x90121807, // 001E SETMBR R4 K12 R7
0x90121F09, // 001F SETMBR R4 K15 K9
0x90122312, // 0020 SETMBR R4 K17 K18
0x90122602, // 0021 SETMBR R4 K19 R2
0x881C0314, // 0022 GETMBR R7 R1 K20
0x001C0F12, // 0023 ADD R7 R7 K18
0x90062807, // 0024 SETMBR R1 K20 R7
0x881C0314, // 0025 GETMBR R7 R1 K20
0x5422FFFF, // 0026 LDINT R8 65536
0x301C0E08, // 0027 OR R7 R7 R8
0x90122A07, // 0028 SETMBR R4 K21 R7
0x90122D12, // 0029 SETMBR R4 K22 K18
0x780E0001, // 002A JMPF R3 #002D
0x581C0012, // 002B LDCONST R7 K18
0x70020000, // 002C JMP #002E
0x581C0009, // 002D LDCONST R7 K9
0x90122E07, // 002E SETMBR R4 K23 R7
0x80040800, // 002F RET 1 R4
0x781E0005, // 0013 JMPF R7 #001A
0x8C1C030D, // 0014 GETMET R7 R1 K13
0x7C1C0200, // 0015 CALL R7 1
0x90121807, // 0016 SETMBR R4 K12 R7
0x881C030B, // 0017 GETMBR R7 R1 K11
0x90121C07, // 0018 SETMBR R4 K14 R7
0x70020004, // 0019 JMP #001F
0x881C030F, // 001A GETMBR R7 R1 K15
0x8C1C0F10, // 001B GETMET R7 R7 K16
0x7C1C0200, // 001C CALL R7 1
0x90121807, // 001D SETMBR R4 K12 R7
0x90121D09, // 001E SETMBR R4 K14 K9
0x90122312, // 001F SETMBR R4 K17 K18
0x90122602, // 0020 SETMBR R4 K19 R2
0x881C0314, // 0021 GETMBR R7 R1 K20
0x001C0F12, // 0022 ADD R7 R7 K18
0x90062807, // 0023 SETMBR R1 K20 R7
0x881C0314, // 0024 GETMBR R7 R1 K20
0x5422FFFF, // 0025 LDINT R8 65536
0x301C0E08, // 0026 OR R7 R7 R8
0x90122A07, // 0027 SETMBR R4 K21 R7
0x90122D12, // 0028 SETMBR R4 K22 K18
0x780E0001, // 0029 JMPF R3 #002C
0x581C0012, // 002A LDCONST R7 K18
0x70020000, // 002B JMP #002D
0x581C0009, // 002C LDCONST R7 K9
0x90122E07, // 002D SETMBR R4 K23 R7
0x80040800, // 002E RET 1 R4
})
)
);

View File

@ -19,7 +19,7 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[72]) { /* constants */
( &(const bvalue[73]) { /* constants */
/* K0 */ be_nested_str_weak(string),
/* K1 */ be_nested_str_weak(tasmota),
/* K2 */ be_nested_str_weak(log),
@ -63,42 +63,43 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */
/* K40 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D),
/* K41 */ be_nested_str_weak(MTR_X3A_X20frame_X3D),
/* K42 */ be_nested_str_weak(inspect),
/* K43 */ be_nested_str_weak(counter_rcv),
/* K43 */ be_nested_str_weak(counter_rcv_validate),
/* K44 */ be_nested_str_weak(MTR_X3A_X20rejected_X20duplicate_X20encrypted_X20message_X20_X3D_X20),
/* K45 */ be_nested_str_weak(_X20counter_X3D),
/* K46 */ be_nested_str_weak(decrypt),
/* K47 */ be_nested_str_weak(raw),
/* K48 */ be_nested_str_weak(payload_idx),
/* K49 */ be_const_int(1),
/* K50 */ be_nested_str_weak(MTR_X3A_X20idx_X3D_X25i_X20clear_X3D_X25s),
/* K51 */ be_nested_str_weak(MTR_X3A_X20decrypted_X20message_X3A_X20protocol_id_X3A),
/* K52 */ be_nested_str_weak(protocol_id),
/* K53 */ be_nested_str_weak(_X20opcode_X3D),
/* K54 */ be_nested_str_weak(_X20exchange_id_X3D),
/* K55 */ be_nested_str_weak(exchange_id),
/* K56 */ be_nested_str_weak(MTR_X3A_X20PROTOCOL_ID_SECURE_CHANNEL_X20),
/* K57 */ be_nested_str_weak(im),
/* K58 */ be_nested_str_weak(process_incoming_ack),
/* K59 */ be_nested_str_weak(send_enqueued),
/* K60 */ be_nested_str_weak(x_flag_r),
/* K61 */ be_nested_str_weak(build_standalone_ack),
/* K62 */ be_nested_str_weak(encode_frame),
/* K63 */ be_nested_str_weak(encrypt),
/* K64 */ be_nested_str_weak(send_response),
/* K65 */ be_nested_str_weak(remote_ip),
/* K66 */ be_nested_str_weak(remote_port),
/* K67 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A),
/* K68 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20),
/* K69 */ be_nested_str_weak(_X3B),
/* K70 */ be_nested_str_weak(debug),
/* K71 */ be_nested_str_weak(traceback),
/* K46 */ be_nested_str_weak(counter_rcv),
/* K47 */ be_nested_str_weak(decrypt),
/* K48 */ be_nested_str_weak(raw),
/* K49 */ be_nested_str_weak(payload_idx),
/* K50 */ be_const_int(1),
/* K51 */ be_nested_str_weak(MTR_X3A_X20idx_X3D_X25i_X20clear_X3D_X25s),
/* K52 */ be_nested_str_weak(MTR_X3A_X20decrypted_X20message_X3A_X20protocol_id_X3A),
/* K53 */ be_nested_str_weak(protocol_id),
/* K54 */ be_nested_str_weak(_X20opcode_X3D),
/* K55 */ be_nested_str_weak(_X20exchange_id_X3D),
/* K56 */ be_nested_str_weak(exchange_id),
/* K57 */ be_nested_str_weak(MTR_X3A_X20PROTOCOL_ID_SECURE_CHANNEL_X20),
/* K58 */ be_nested_str_weak(im),
/* K59 */ be_nested_str_weak(process_incoming_ack),
/* K60 */ be_nested_str_weak(send_enqueued),
/* K61 */ be_nested_str_weak(x_flag_r),
/* K62 */ be_nested_str_weak(build_standalone_ack),
/* K63 */ be_nested_str_weak(encode_frame),
/* K64 */ be_nested_str_weak(encrypt),
/* K65 */ be_nested_str_weak(send_response),
/* K66 */ be_nested_str_weak(remote_ip),
/* K67 */ be_nested_str_weak(remote_port),
/* K68 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A),
/* K69 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20),
/* K70 */ be_nested_str_weak(_X3B),
/* K71 */ be_nested_str_weak(debug),
/* K72 */ be_nested_str_weak(traceback),
}),
be_str_weak(msg_received),
&be_const_str_solidified,
( &(const binstruction[328]) { /* code */
( &(const binstruction[325]) { /* code */
0xA4120000, // 0000 IMPORT R4 K0
0x50140000, // 0001 LDBOOL R5 0 0
0xA802012E, // 0002 EXBLK 0 #0132
0xA802012B, // 0002 EXBLK 0 #012F
0xB81A0200, // 0003 GETNGBL R6 K1
0x8C180D02, // 0004 GETMET R6 R6 K2
0x8C200304, // 0005 GETMET R8 R1 K4
@ -213,7 +214,7 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */
0x50240200, // 0072 LDBOOL R9 1 0
0xA8040001, // 0073 EXBLK 1 1
0x80041200, // 0074 RET 1 R9
0x700200B7, // 0075 JMP #012E
0x700200B4, // 0075 JMP #012B
0xB8220200, // 0076 GETNGBL R8 K1
0x8C201102, // 0077 GETMET R8 R8 K2
0x8C280919, // 0078 GETMET R10 R4 K25
@ -257,173 +258,170 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */
0x90222603, // 009E SETMBR R8 K19 R3
0x90222800, // 009F SETMBR R8 K20 R0
0x901A2A08, // 00A0 SETMBR R6 K21 R8
0x8824112B, // 00A1 GETMBR R9 R8 K43
0x8C241317, // 00A2 GETMET R9 R9 K23
0x882C0D18, // 00A3 GETMBR R11 R6 K24
0x50300200, // 00A4 LDBOOL R12 1 0
0x7C240600, // 00A5 CALL R9 3
0x74260011, // 00A6 JMPT R9 #00B9
0xB8260200, // 00A7 GETNGBL R9 K1
0x8C241302, // 00A8 GETMET R9 R9 K2
0x602C0008, // 00A9 GETGBL R11 G8
0x88300D18, // 00AA GETMBR R12 R6 K24
0x7C2C0200, // 00AB CALL R11 1
0x002E580B, // 00AC ADD R11 K44 R11
0x002C172D, // 00AD ADD R11 R11 K45
0x60300008, // 00AE GETGBL R12 G8
0x8834112B, // 00AF GETMBR R13 R8 K43
0x8C341B1B, // 00B0 GETMET R13 R13 K27
0x7C340200, // 00B1 CALL R13 1
0x7C300200, // 00B2 CALL R12 1
0x002C160C, // 00B3 ADD R11 R11 R12
0x58300011, // 00B4 LDCONST R12 K17
0x7C240600, // 00B5 CALL R9 3
0x50240000, // 00B6 LDBOOL R9 0 0
0xA8040001, // 00B7 EXBLK 1 1
0x80041200, // 00B8 RET 1 R9
0x8C240D2E, // 00B9 GETMET R9 R6 K46
0x7C240200, // 00BA CALL R9 1
0x5C281200, // 00BB MOVE R10 R9
0x742A0002, // 00BC JMPT R10 #00C0
0x50280000, // 00BD LDBOOL R10 0 0
0xA8040001, // 00BE EXBLK 1 1
0x80041400, // 00BF RET 1 R10
0x88280D30, // 00C0 GETMBR R10 R6 K48
0x04281531, // 00C1 SUB R10 R10 K49
0x402A120A, // 00C2 CONNECT R10 K9 R10
0x882C0D2F, // 00C3 GETMBR R11 R6 K47
0x9428160A, // 00C4 GETIDX R10 R11 R10
0x901A5E0A, // 00C5 SETMBR R6 K47 R10
0x88280D2F, // 00C6 GETMBR R10 R6 K47
0x40281409, // 00C7 CONNECT R10 R10 R9
0xB82A0200, // 00C8 GETNGBL R10 K1
0x8C281502, // 00C9 GETMET R10 R10 K2
0x8C300919, // 00CA GETMET R12 R4 K25
0x58380032, // 00CB LDCONST R14 K50
0x883C0D30, // 00CC GETMBR R15 R6 K48
0x88400D2F, // 00CD GETMBR R16 R6 K47
0x8C402104, // 00CE GETMET R16 R16 K4
0x7C400200, // 00CF CALL R16 1
0x7C300800, // 00D0 CALL R12 4
0x54360003, // 00D1 LDINT R13 4
0x7C280600, // 00D2 CALL R10 3
0x8C280D1C, // 00D3 GETMET R10 R6 K28
0x7C280200, // 00D4 CALL R10 1
0xB82A0200, // 00D5 GETNGBL R10 K1
0x8C281502, // 00D6 GETMET R10 R10 K2
0x60300008, // 00D7 GETGBL R12 G8
0x88340D34, // 00D8 GETMBR R13 R6 K52
0x7C300200, // 00D9 CALL R12 1
0x0032660C, // 00DA ADD R12 K51 R12
0x00301935, // 00DB ADD R12 R12 K53
0x60340008, // 00DC GETGBL R13 G8
0x88380D1F, // 00DD GETMBR R14 R6 K31
0x7C340200, // 00DE CALL R13 1
0x0030180D, // 00DF ADD R12 R12 R13
0x00301936, // 00E0 ADD R12 R12 K54
0x60340008, // 00E1 GETGBL R13 G8
0x88380D37, // 00E2 GETMBR R14 R6 K55
0x543EFFFE, // 00E3 LDINT R15 65535
0x2C381C0F, // 00E4 AND R14 R14 R15
0x7C340200, // 00E5 CALL R13 1
0x0030180D, // 00E6 ADD R12 R12 R13
0x58340011, // 00E7 LDCONST R13 K17
0x7C280600, // 00E8 CALL R10 3
0x8828010B, // 00E9 GETMBR R10 R0 K11
0x8C28151D, // 00EA GETMET R10 R10 K29
0x88300D1E, // 00EB GETMBR R12 R6 K30
0x7C280400, // 00EC CALL R10 2
0x88280D34, // 00ED GETMBR R10 R6 K52
0x1C2C1509, // 00EE EQ R11 R10 K9
0x782E0018, // 00EF JMPF R11 #0109
0xB82E0200, // 00F0 GETNGBL R11 K1
0x8C2C1702, // 00F1 GETMET R11 R11 K2
0xB8360A00, // 00F2 GETNGBL R13 K5
0x8C341B2A, // 00F3 GETMET R13 R13 K42
0x5C3C0C00, // 00F4 MOVE R15 R6
0x7C340400, // 00F5 CALL R13 2
0x0036700D, // 00F6 ADD R13 K56 R13
0x58380011, // 00F7 LDCONST R14 K17
0x7C2C0600, // 00F8 CALL R11 3
0x882C0D1F, // 00F9 GETMBR R11 R6 K31
0x5432000F, // 00FA LDINT R12 16
0x1C2C160C, // 00FB EQ R11 R11 R12
0x782E0009, // 00FC JMPF R11 #0107
0x882C0139, // 00FD GETMBR R11 R0 K57
0x8C2C173A, // 00FE GETMET R11 R11 K58
0x5C340C00, // 00FF MOVE R13 R6
0x7C2C0400, // 0100 CALL R11 2
0x5C141600, // 0101 MOVE R5 R11
0x78160003, // 0102 JMPF R5 #0107
0x882C0139, // 0103 GETMBR R11 R0 K57
0x8C2C173B, // 0104 GETMET R11 R11 K59
0x5C340000, // 0105 MOVE R13 R0
0x7C2C0400, // 0106 CALL R11 2
0x50140200, // 0107 LDBOOL R5 1 0
0x70020024, // 0108 JMP #012E
0x1C2C1531, // 0109 EQ R11 R10 K49
0x782E001A, // 010A JMPF R11 #0126
0x882C0139, // 010B GETMBR R11 R0 K57
0x8C2C1725, // 010C GETMET R11 R11 K37
0x5C340C00, // 010D MOVE R13 R6
0x7C2C0400, // 010E CALL R11 2
0x5C141600, // 010F MOVE R5 R11
0x78160004, // 0110 JMPF R5 #0116
0x882C0139, // 0111 GETMBR R11 R0 K57
0x8C2C173B, // 0112 GETMET R11 R11 K59
0x5C340000, // 0113 MOVE R13 R0
0x7C2C0400, // 0114 CALL R11 2
0x7002000D, // 0115 JMP #0124
0x882C0D3C, // 0116 GETMBR R11 R6 K60
0x782E000B, // 0117 JMPF R11 #0124
0x8C2C0D3D, // 0118 GETMET R11 R6 K61
0x7C2C0200, // 0119 CALL R11 1
0x8C30173E, // 011A GETMET R12 R11 K62
0x7C300200, // 011B CALL R12 1
0x8C30173F, // 011C GETMET R12 R11 K63
0x7C300200, // 011D CALL R12 1
0x8C300140, // 011E GETMET R12 R0 K64
0x8838172F, // 011F GETMBR R14 R11 K47
0x883C1741, // 0120 GETMBR R15 R11 K65
0x88401742, // 0121 GETMBR R16 R11 K66
0x88441718, // 0122 GETMBR R17 R11 K24
0x7C300A00, // 0123 CALL R12 5
0x50140200, // 0124 LDBOOL R5 1 0
0x70020007, // 0125 JMP #012E
0xB82E0200, // 0126 GETNGBL R11 K1
0x8C2C1702, // 0127 GETMET R11 R11 K2
0x60340008, // 0128 GETGBL R13 G8
0x5C381400, // 0129 MOVE R14 R10
0x7C340200, // 012A CALL R13 1
0x0036860D, // 012B ADD R13 K67 R13
0x58380011, // 012C LDCONST R14 K17
0x7C2C0600, // 012D CALL R11 3
0xA8040001, // 012E EXBLK 1 1
0x80040A00, // 012F RET 1 R5
0xA8040001, // 0130 EXBLK 1 1
0x70020014, // 0131 JMP #0147
0xAC180002, // 0132 CATCH R6 0 2
0x70020011, // 0133 JMP #0146
0xB8220200, // 0134 GETNGBL R8 K1
0x8C201102, // 0135 GETMET R8 R8 K2
0x60280008, // 0136 GETGBL R10 G8
0x5C2C0C00, // 0137 MOVE R11 R6
0x7C280200, // 0138 CALL R10 1
0x002A880A, // 0139 ADD R10 K68 R10
0x00281545, // 013A ADD R10 R10 K69
0x602C0008, // 013B GETGBL R11 G8
0x5C300E00, // 013C MOVE R12 R7
0x7C2C0200, // 013D CALL R11 1
0x0028140B, // 013E ADD R10 R10 R11
0x7C200400, // 013F CALL R8 2
0xA4228C00, // 0140 IMPORT R8 K70
0x8C241147, // 0141 GETMET R9 R8 K71
0x7C240200, // 0142 CALL R9 1
0x50240000, // 0143 LDBOOL R9 0 0
0x80041200, // 0144 RET 1 R9
0x70020000, // 0145 JMP #0147
0xB0080000, // 0146 RAISE 2 R0 R0
0x80000000, // 0147 RET 0
0x8C24112B, // 00A1 GETMET R9 R8 K43
0x882C0D18, // 00A2 GETMBR R11 R6 K24
0x50300200, // 00A3 LDBOOL R12 1 0
0x7C240600, // 00A4 CALL R9 3
0x7426000F, // 00A5 JMPT R9 #00B6
0xB8260200, // 00A6 GETNGBL R9 K1
0x8C241302, // 00A7 GETMET R9 R9 K2
0x602C0008, // 00A8 GETGBL R11 G8
0x88300D18, // 00A9 GETMBR R12 R6 K24
0x7C2C0200, // 00AA CALL R11 1
0x002E580B, // 00AB ADD R11 K44 R11
0x002C172D, // 00AC ADD R11 R11 K45
0x60300008, // 00AD GETGBL R12 G8
0x8834112E, // 00AE GETMBR R13 R8 K46
0x7C300200, // 00AF CALL R12 1
0x002C160C, // 00B0 ADD R11 R11 R12
0x58300011, // 00B1 LDCONST R12 K17
0x7C240600, // 00B2 CALL R9 3
0x50240000, // 00B3 LDBOOL R9 0 0
0xA8040001, // 00B4 EXBLK 1 1
0x80041200, // 00B5 RET 1 R9
0x8C240D2F, // 00B6 GETMET R9 R6 K47
0x7C240200, // 00B7 CALL R9 1
0x5C281200, // 00B8 MOVE R10 R9
0x742A0002, // 00B9 JMPT R10 #00BD
0x50280000, // 00BA LDBOOL R10 0 0
0xA8040001, // 00BB EXBLK 1 1
0x80041400, // 00BC RET 1 R10
0x88280D31, // 00BD GETMBR R10 R6 K49
0x04281532, // 00BE SUB R10 R10 K50
0x402A120A, // 00BF CONNECT R10 K9 R10
0x882C0D30, // 00C0 GETMBR R11 R6 K48
0x9428160A, // 00C1 GETIDX R10 R11 R10
0x901A600A, // 00C2 SETMBR R6 K48 R10
0x88280D30, // 00C3 GETMBR R10 R6 K48
0x40281409, // 00C4 CONNECT R10 R10 R9
0xB82A0200, // 00C5 GETNGBL R10 K1
0x8C281502, // 00C6 GETMET R10 R10 K2
0x8C300919, // 00C7 GETMET R12 R4 K25
0x58380033, // 00C8 LDCONST R14 K51
0x883C0D31, // 00C9 GETMBR R15 R6 K49
0x88400D30, // 00CA GETMBR R16 R6 K48
0x8C402104, // 00CB GETMET R16 R16 K4
0x7C400200, // 00CC CALL R16 1
0x7C300800, // 00CD CALL R12 4
0x54360003, // 00CE LDINT R13 4
0x7C280600, // 00CF CALL R10 3
0x8C280D1C, // 00D0 GETMET R10 R6 K28
0x7C280200, // 00D1 CALL R10 1
0xB82A0200, // 00D2 GETNGBL R10 K1
0x8C281502, // 00D3 GETMET R10 R10 K2
0x60300008, // 00D4 GETGBL R12 G8
0x88340D35, // 00D5 GETMBR R13 R6 K53
0x7C300200, // 00D6 CALL R12 1
0x0032680C, // 00D7 ADD R12 K52 R12
0x00301936, // 00D8 ADD R12 R12 K54
0x60340008, // 00D9 GETGBL R13 G8
0x88380D1F, // 00DA GETMBR R14 R6 K31
0x7C340200, // 00DB CALL R13 1
0x0030180D, // 00DC ADD R12 R12 R13
0x00301937, // 00DD ADD R12 R12 K55
0x60340008, // 00DE GETGBL R13 G8
0x88380D38, // 00DF GETMBR R14 R6 K56
0x543EFFFE, // 00E0 LDINT R15 65535
0x2C381C0F, // 00E1 AND R14 R14 R15
0x7C340200, // 00E2 CALL R13 1
0x0030180D, // 00E3 ADD R12 R12 R13
0x58340011, // 00E4 LDCONST R13 K17
0x7C280600, // 00E5 CALL R10 3
0x8828010B, // 00E6 GETMBR R10 R0 K11
0x8C28151D, // 00E7 GETMET R10 R10 K29
0x88300D1E, // 00E8 GETMBR R12 R6 K30
0x7C280400, // 00E9 CALL R10 2
0x88280D35, // 00EA GETMBR R10 R6 K53
0x1C2C1509, // 00EB EQ R11 R10 K9
0x782E0018, // 00EC JMPF R11 #0106
0xB82E0200, // 00ED GETNGBL R11 K1
0x8C2C1702, // 00EE GETMET R11 R11 K2
0xB8360A00, // 00EF GETNGBL R13 K5
0x8C341B2A, // 00F0 GETMET R13 R13 K42
0x5C3C0C00, // 00F1 MOVE R15 R6
0x7C340400, // 00F2 CALL R13 2
0x0036720D, // 00F3 ADD R13 K57 R13
0x58380011, // 00F4 LDCONST R14 K17
0x7C2C0600, // 00F5 CALL R11 3
0x882C0D1F, // 00F6 GETMBR R11 R6 K31
0x5432000F, // 00F7 LDINT R12 16
0x1C2C160C, // 00F8 EQ R11 R11 R12
0x782E0009, // 00F9 JMPF R11 #0104
0x882C013A, // 00FA GETMBR R11 R0 K58
0x8C2C173B, // 00FB GETMET R11 R11 K59
0x5C340C00, // 00FC MOVE R13 R6
0x7C2C0400, // 00FD CALL R11 2
0x5C141600, // 00FE MOVE R5 R11
0x78160003, // 00FF JMPF R5 #0104
0x882C013A, // 0100 GETMBR R11 R0 K58
0x8C2C173C, // 0101 GETMET R11 R11 K60
0x5C340000, // 0102 MOVE R13 R0
0x7C2C0400, // 0103 CALL R11 2
0x50140200, // 0104 LDBOOL R5 1 0
0x70020024, // 0105 JMP #012B
0x1C2C1532, // 0106 EQ R11 R10 K50
0x782E001A, // 0107 JMPF R11 #0123
0x882C013A, // 0108 GETMBR R11 R0 K58
0x8C2C1725, // 0109 GETMET R11 R11 K37
0x5C340C00, // 010A MOVE R13 R6
0x7C2C0400, // 010B CALL R11 2
0x5C141600, // 010C MOVE R5 R11
0x78160004, // 010D JMPF R5 #0113
0x882C013A, // 010E GETMBR R11 R0 K58
0x8C2C173C, // 010F GETMET R11 R11 K60
0x5C340000, // 0110 MOVE R13 R0
0x7C2C0400, // 0111 CALL R11 2
0x7002000D, // 0112 JMP #0121
0x882C0D3D, // 0113 GETMBR R11 R6 K61
0x782E000B, // 0114 JMPF R11 #0121
0x8C2C0D3E, // 0115 GETMET R11 R6 K62
0x7C2C0200, // 0116 CALL R11 1
0x8C30173F, // 0117 GETMET R12 R11 K63
0x7C300200, // 0118 CALL R12 1
0x8C301740, // 0119 GETMET R12 R11 K64
0x7C300200, // 011A CALL R12 1
0x8C300141, // 011B GETMET R12 R0 K65
0x88381730, // 011C GETMBR R14 R11 K48
0x883C1742, // 011D GETMBR R15 R11 K66
0x88401743, // 011E GETMBR R16 R11 K67
0x88441718, // 011F GETMBR R17 R11 K24
0x7C300A00, // 0120 CALL R12 5
0x50140200, // 0121 LDBOOL R5 1 0
0x70020007, // 0122 JMP #012B
0xB82E0200, // 0123 GETNGBL R11 K1
0x8C2C1702, // 0124 GETMET R11 R11 K2
0x60340008, // 0125 GETGBL R13 G8
0x5C381400, // 0126 MOVE R14 R10
0x7C340200, // 0127 CALL R13 1
0x0036880D, // 0128 ADD R13 K68 R13
0x58380011, // 0129 LDCONST R14 K17
0x7C2C0600, // 012A CALL R11 3
0xA8040001, // 012B EXBLK 1 1
0x80040A00, // 012C RET 1 R5
0xA8040001, // 012D EXBLK 1 1
0x70020014, // 012E JMP #0144
0xAC180002, // 012F CATCH R6 0 2
0x70020011, // 0130 JMP #0143
0xB8220200, // 0131 GETNGBL R8 K1
0x8C201102, // 0132 GETMET R8 R8 K2
0x60280008, // 0133 GETGBL R10 G8
0x5C2C0C00, // 0134 MOVE R11 R6
0x7C280200, // 0135 CALL R10 1
0x002A8A0A, // 0136 ADD R10 K69 R10
0x00281546, // 0137 ADD R10 R10 K70
0x602C0008, // 0138 GETGBL R11 G8
0x5C300E00, // 0139 MOVE R12 R7
0x7C2C0200, // 013A CALL R11 1
0x0028140B, // 013B ADD R10 R10 R11
0x7C200400, // 013C CALL R8 2
0xA4228E00, // 013D IMPORT R8 K71
0x8C241148, // 013E GETMET R9 R8 K72
0x7C240200, // 013F CALL R9 1
0x50240000, // 0140 LDBOOL R9 0 0
0x80041200, // 0141 RET 1 R9
0x70020000, // 0142 JMP #0144
0xB0080000, // 0143 RAISE 2 R0 R0
0x80000000, // 0144 RET 0
})
)
);