Re: [mh] MH & HA - Integration? Migration?

Dave Neudoerffer <[email protected]> Mon, 25 Mar 2024 15:10:08 -0400
Newsgroups gmane.comp.misc.misterhouse.user
Message-ID <CAOFx8LP4j7qk2jkktvHRDvEB1z7=YKYEFUF6jmMRVNMacPLWpg@mail.gmail.com>
--000000000000a2fe8f061480ecfa
Content-Type: multipart/alternative; boundary="000000000000a2fe8d061480ecf8"

--000000000000a2fe8d061480ecf8
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Attached is the HA_Item.pm module.  Documentation is at the top of the file
(such as it is).  Probably drop it in your local code directory for now.
If you want to add items with a .mht file, the included
read_table_snippet.txt can be added to read_table_A.pl or your own read
table file.

I will work on cleanup and more documentation.  I will try to get a pull
request together in the next few days.  In the meantime, if anyone has
fixes or suggestions, please fire my way.

Dave



On Mon, Mar 25, 2024 at 12:16=E2=80=AFPM <[email protected]> =
wrote:

> I've been playing with HA and MH for a while, too. I have about 6 Z-wave
> switches that replaced Insteon switches, and are attached to HA now. I
> also have about 25 Insteon switches attached to MH. MH and HA update
> each other through MQTT (provided by Mosquitto). I don't think any of my
> customization code cared whether a device was still in MH or got moved
> to HA - it still controls the device by name (e.g. "$Porch_Light"), and
> still runs the same.
>
> I have about 12K lines of code in MH. Someday I may migrate it all over
> to HA, but my initial goal is similar to what others have said: migrate
> all the hardware to HA and keep the existing logic in MH. New logic will
> probably go in HA.
>
>                   -Brian M
>
> On 3/25/24 06:45, H Plato wrote:
> > Hello,
> >
> >    Is anyone using Home Assistant (HA)? I=E2=80=99ve recently picked up=
 a new
> new devices, and it is impressive the amount of device support available =
in
> HA. I=E2=80=99d rather spend my time setting up automations than developi=
ng device
> modules. So I=E2=80=99m thinking about running them in parallel, as my MH=
 instance
> has lots of logic that I don=E2=80=99t know how to replicate in HA, as we=
ll as
> speech for home events, watering moisture calculations, etc=E2=80=A6 HA w=
ould be a
> contained VM that would hold the devices and maybe the user interface. I
> mainly use the floorplan IA7 interface, and I haven=E2=80=99t seen that i=
n HA yet.
> >
> >    Both MH and HA use MQTT, so that could be a communication option, or
> using web calls. I also have some older tech that still works fine (weede=
r
> and W800), which I=E2=80=99ll have to figure out. My hardware is also old=
, so I=E2=80=99m
> seeing this as an opportunity to architect a bit more of a better solutio=
n,
> by virtualizing everything.
> >
> >    Anyone gone down any of these paths?
> >
> > ________________________________________________________
> > To unsubscribe from this list, go to:
> https://lists.sourceforge.net/lists/listinfo/misterhouse-users
> >
>
>
>
> ________________________________________________________
> To unsubscribe from this list, go to:
> https://lists.sourceforge.net/lists/listinfo/misterhouse-users
>
>

--000000000000a2fe8d061480ecf8
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Attached is the HA_Item.pm module.=C2=A0 Documentation is =
at the top of the file (such as it is).=C2=A0 Probably drop it in your loca=
l code directory for now.=C2=A0 If you want to add items with a .mht file, =
the included read_table_snippet.txt can be added to read_table_A.pl or your=
 own read table file.<div><br></div><div>I will work on cleanup and more do=
cumentation.=C2=A0 I will try to get a pull request together in the next fe=
w days.=C2=A0 In the meantime, if anyone has fixes or suggestions, please f=
ire my way.</div><div><br></div><div>Dave</div><div><br></div><div><br></di=
v></div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr=
">On Mon, Mar 25, 2024 at 12:16=E2=80=AFPM &lt;<a href=3D"mailto:misterhous=
[email protected]">[email protected]</a>&gt; wrote:<br></=
div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bor=
der-left:1px solid rgb(204,204,204);padding-left:1ex">I&#39;ve been playing=
 with HA and MH for a while, too. I have about 6 Z-wave <br>
switches that replaced Insteon switches, and are attached to HA now. I <br>
also have about 25 Insteon switches attached to MH. MH and HA update <br>
each other through MQTT (provided by Mosquitto). I don&#39;t think any of m=
y <br>
customization code cared whether a device was still in MH or got moved <br>
to HA - it still controls the device by name (e.g. &quot;$Porch_Light&quot;=
), and <br>
still runs the same.<br>
<br>
I have about 12K lines of code in MH. Someday I may migrate it all over <br=
>
to HA, but my initial goal is similar to what others have said: migrate <br=
>
all the hardware to HA and keep the existing logic in MH. New logic will <b=
r>
probably go in HA.<br>
<br>
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0 -Brian M<br>
<br>
On 3/25/24 06:45, H Plato wrote:<br>
&gt; Hello,<br>
&gt;<br>
&gt;=C2=A0 =C2=A0 Is anyone using Home Assistant (HA)? I=E2=80=99ve recentl=
y picked up a new new devices, and it is impressive the amount of device su=
pport available in HA. I=E2=80=99d rather spend my time setting up automati=
ons than developing device modules. So I=E2=80=99m thinking about running t=
hem in parallel, as my MH instance has lots of logic that I don=E2=80=99t k=
now how to replicate in HA, as well as speech for home events, watering moi=
sture calculations, etc=E2=80=A6 HA would be a contained VM that would hold=
 the devices and maybe the user interface. I mainly use the floorplan IA7 i=
nterface, and I haven=E2=80=99t seen that in HA yet.<br>
&gt;<br>
&gt;=C2=A0 =C2=A0 Both MH and HA use MQTT, so that could be a communication=
 option, or using web calls. I also have some older tech that still works f=
ine (weeder and W800), which I=E2=80=99ll have to figure out. My hardware i=
s also old, so I=E2=80=99m seeing this as an opportunity to architect a bit=
 more of a better solution, by virtualizing everything.<br>
&gt;<br>
&gt;=C2=A0 =C2=A0 Anyone gone down any of these paths?<br>
&gt;<br>
&gt; ________________________________________________________<br>
&gt; To unsubscribe from this list, go to: <a href=3D"https://lists.sourcef=
orge.net/lists/listinfo/misterhouse-users" rel=3D"noreferrer" target=3D"_bl=
ank">https://lists.sourceforge.net/lists/listinfo/misterhouse-users</a><br>
&gt;<br>
<br>
<br>
<br>
________________________________________________________<br>
To unsubscribe from this list, go to: <a href=3D"https://lists.sourceforge.=
net/lists/listinfo/misterhouse-users" rel=3D"noreferrer" target=3D"_blank">=
https://lists.sourceforge.net/lists/listinfo/misterhouse-users</a><br>
<br>
</blockquote></div>

--000000000000a2fe8d061480ecf8--
--000000000000a2fe8f061480ecfa
Content-Type: text/plain; charset="US-ASCII"; name="read_table_snippet.txt"
Content-Disposition: attachment; filename="read_table_snippet.txt"
Content-Transfer-Encoding: base64
Content-ID: <f_lu7bg5wc1>
X-Attachment-Id: f_lu7bg5wc1

ICAgIH0gZWxzaWYoICR0eXBlIGVxICJIQV9TRVJWRVIiICkgew0KCW15ICgkb2JqZWN0X25hbWUs
ICRhZGRyZXNzLCAka2VlcGFsaXZlLCAkYXBpX2tleSkgPSBAaXRlbV9pbmZvOw0KCXJlcXVpcmUg
SEFfSXRlbTsNCgkkY29kZSAuPSAiXCQke29iamVjdF9uYW1lfSA9IG5ldyBIQV9TZXJ2ZXIoICck
b2JqZWN0X25hbWUnLCAnJGFkZHJlc3MnLCAnJGtlZXBhbGl2ZScsICckYXBpX2tleScgKTtcbiI7
DQogICAgfSBlbHNpZiggJHR5cGUgZXEgIkhBX0lURU0iICkgew0KCW15ICgkb2JqZWN0X25hbWUs
ICRkb21haW4sICRlbnRpdHksICRoYV9zZXJ2ZXIpID0gQGl0ZW1faW5mbzsNCglyZXF1aXJlIEhB
X0l0ZW07DQoJJGNvZGUgLj0gIlwkJHtvYmplY3RfbmFtZX0gPSBuZXcgSEFfSXRlbSggJyRkb21h
aW4nLCAnJGVudGl0eScsIFwkJGhhX3NlcnZlciApO1xuIjsNCg==
--000000000000a2fe8f061480ecfa
Content-Type: application/octet-stream; name="HA_Item.pm"
Content-Disposition: attachment; filename="HA_Item.pm"
Content-Transfer-Encoding: base64
Content-ID: <f_lu7bg5w00>
X-Attachment-Id: f_lu7bg5w00

IyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQo9YmVnaW4gY29tbWVudA0KICAgIEBAQEBAQEBA
QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA
QEBAQEBAQEBAQEBAQEBADQoNCiAgICA9aGVhZDEgQjxIQV9TZXJ2ZXI+DQogICAgPWhlYWQxIEI8
SEFfSXRlbT4NCg0KICAgIERhdmUgTmV1ZG9lcmZmZXIgPGRhdmVAbmV1ZG9lcmZmZXIuY29tPg0K
DQogICAgPWhlYWQyIFNZTk9QU0lTDQoNCiAgICBBIEhvbWVBc3Npc3RhbnQgKEhBKSBJdGVtcyBt
b2R1bGUgZm9yIE1pc3RlcmhvdXNlLg0KICAgIFVzZXMgSEEgd2ViIHNvY2tldCBpbnRlcmZhY2Uu
DQoNCg0KICAgID1oZWFkMiBERVNDUklQVElPTg0KDQogICAgTWlzdGVyaG91c2UgaXRlbXMgY2xh
c3MgZm9yIGNvbnRyb2wgb2YgSG9tZUFzc2lzdGFudCBFbnRpdGllcw0KDQogICAgUHJvY2Vzc2Vz
IHRoZSBIb21lQXNzaXN0YW50IGVudGl0eSBzdGF0ZXMgcmVzcG9uc2Ugb24gc3RhcnR1cC4NCg0K
ICAgIEhBIHdlYiBzb2NrZXQgZG9jOiAgaHR0cHM6Ly9kZXZlbG9wZXJzLmhvbWUtYXNzaXN0YW50
LmlvL2RvY3MvYXBpL3dlYnNvY2tldC8NCg0KRmlsZToNCiAgICBIQV9JdGVtLnBtDQoNCkRlc2Ny
aXB0aW9uOg0KICAgIFRoaXMgaXMgYSBtaXN0ZXJob3VzZSBzdHlsZSBpdGVtcyBpbnRlcmZhY2Ug
Zm9yIEhvbWVBc3Npc3RhbnQgZW50aXRpZXMNCg0KICAgIEF1dGhvcihzKToNCiAgICBEYXZlIE5l
dWRvZXJmZmVyIDxkYXZlQG5ldWRvZXJmZmVyLmNvbT4NCg0KICAgIEhBIEl0ZW1zIChIQV9JdGVt
LnBtKQ0KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICBUaGVyZSBhcmUgc2V2
ZXJhbCBIQSBlbnRpdHkgdHlwZXMgaW1wbGVtZW50ZWQgaW4gdGhpcyBtb2R1bGUgKHNlZSBiZWxv
dykuDQoNCiAgICBFYWNoIE1IIGl0ZW0gY2FuIGhhbmRsZSBib3RoIGNvbW1hbmRzIGFuZCBzdGF0
ZSBtZXNzYWdlcyB0by9mcm9tIE1RVFQgZGV2aWNlcy4NCg0KICAgIFRoZXJlIGFyZSB0d28gY2xh
c3NlcyBpbXBsZW1lbnRlZCBpbiBIQV9JdGVtLnBtOg0KDQogICAgSEFfU2VydmVyOg0KICAgICAg
ICAgLSB0aGlzIGNsYXNzIGNvbm5lY3RzIHRvIGFuZCBtYW5hZ2VzIHRoZSBjb25uZWN0aW9uIHRv
IEhvbWVBc3Npc3RhbnQgc2VydmVyDQoJIC0gaXQgdXNlcyBhIFNvY2tldF9JdGVtIHRvIG1hbmFn
ZSB0aGUgdGNwL2lwIGNvbm5lY3Rpb24NCgkgLSBpdCB1c2VzIHBlcmwgbW9kdWxlIFByb3RvY29s
OjpXZWJTb2NrZXQ6OkNsaWVudCB0byBtYW5hZ2UgdGhlIHdlYnNvY2tldA0KCSAtIGlmIHRoZSBz
b2NrZXQgZHJvcHMsIHJlY29ubmVjdHMgd2lsbCBiZSBhdHRlbXB0ZWQgZXZlcnkgMTBzIHVudGls
IGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bA0KCSAtIHNlbmRzIGEgcGluZyByZXF1ZXN0IGV2ZXJ5IDxr
ZWVwX2FsaXZlX3RpbWVyPiBzZWNvbmRzIC0tIGRlZmF1bHQgMTBzDQoJIC0gdGhpcyBvYmplY3Qg
cmVxdWlyZXMgYSBIb21lQXNzaXN0YW50IExvbmcgTGl2ZWQgQWNjZXNzIFRva2VuDQoJICAgIC0g
YXF1aXJlIGluIEhvbWVBc3Npc3RhbnQgVUkNCgkgICAgLSBnbyB0byB5b3VyIHByb2ZpbGUgdW5k
ZXIgeW91ciB1c2VyIG5hbWUgbG93ZXIgbGVmdCBjb3JuZXINCgkgICAgLSBjcmVhdGUgdG9rZW4N
CgkgICAgLSAqKiogTWFrZSBzdXJlIHlvdSBjb3B5IHRoZSB3aG9sZSB0aGluZw0KCSAtIHNlbmRz
IGVudGl0eSBzdGF0ZSByZXF1ZXN0IG9uIHN0YXJ0dXAgYW5kIHByb2Nlc3NlcyBzdGF0ZXMgZm9y
IGFsbCBkZXZpY2VzDQoNCiAgICBIQV9JdGVtDQoJLSBpbXBsZW1lbnRzIGFuIE1IIGl0ZW0gdGhh
dCBpcyB0aWVkIHRvIGEgSEEgZW50aXR5IG9uIHRoZSBzcGVjaWZpZWQgSEEgU2VydmVyDQoJLSBz
dGF0ZSBjaGFuZ2VzIGZyb20gSEEgYXJlIG1vbml0b3JlZCBhbmQgcmVmbGVjdGVkIGluIHRoZSBt
aCBpdGVtIHN0YXRlDQoJLSB3aGVuIHRoZSBNSCBpdGVtIGlzIHNldCBsb2NhbGx5LCBhIHN0YXRl
IGNoYW5nZSBpcyBzZW50IHRvIEhBDQoJICAgIC0gc3RhdGUgaXMgbm90IHJlZmxlY3RlZCBsb2Nh
bGx5IHVudGlsIHRoZSBzdGF0ZSBjaGFuZ2UgaXMgcmVjZWl2ZWQgYmFjayBmcm9tIEhBDQoJLSBz
ZXZlcmFsIEhBIEVudGl0eSB0eXBlcyBhcmUgc3VwcG9ydGVkOg0KCSAgICAtIGxpZ2h0OiAgY3Vy
cmVudGx5IG9ubHkgYnJpZ2h0bmVzcyBhdHRyaWJ1dGUgaW1wbGVtZW50ZWQsIG5vIGNvbG91cg0K
CSAgICAtIHN3aXRjaDogb24vb2ZmIHN3aXRjaA0KCSAgICAtIHNlbnNvciwgYmluYXJ5X3NlbnNv
cjoNCgkgICAgICAgIC0gY2FuIGdyb3VwIG11bHRpcGxlIHNlbnNvcnMgaW50byBhIHNpbmdsZSBN
SCBpdGVtIC0tIHBvcHVsYXRlcyAkaXRlbS0+e2F0dHJ9IGhhc2gNCgkJLSB1c2Ugb25lIG9yIG1v
cmUgcGF0dGVybnMgdG8gbWF0Y2ggSEEgZW50aXR5IG5hbWVzLCBzZXBhcmF0ZWQgYnkgfA0KCQkt
IGN1cnJlbnRseSBvbmx5IHBhdHRlcm4gc3VwcG9ydGVkIGlzIGVudGl0eV9wcmVmaXhfKiAodGV4
dCB3aXRoIGEgJyonIGF0IHRoZSBlbmQpDQoJICAgIC0gY2xpbWF0ZToNCgkgICAgICAgIC0gcG9w
dWxhdGVzICR0aGVybW9zdGF0LT57YXR0cn0gd2l0aCB0aGVybW9zdGF0IGF0dHJpYnV0ZXMgbGlr
ZSBzZXRwb2ludHMsIHRlbXBlcmF0dXJlcywgbW9kZSwgcHJlc2V0cyBldGMuDQoJCS0gY2FuIHNw
ZWNpZnkgdGhlIEhBIHNlcnZpY2UgZm9yIG1vZGlmaWNhdGlvbnMNCgkJICAgIGVnLiAgJHRoZXJt
b3N0YXQtPnNldCgic2V0X3RlbXBlcmF0dXJlOjcyIikNCgkJICAgIGVnICAgJHRoZXJtb3N0YXQt
PnNldCgic2V0X2h2YWNfbW9kZTpoZWF0IikNCg0KICAgIA0KDQogICAgRGlzY292ZXJ5Og0KICAg
IC0tLS0tLS0tLS0NCg0KICAgIFRoZSBIQV9TZXJ2ZXIgb2JqZWN0IHdpbGwgc2VuZCBvdXQgYW4g
SEEgZW50aXR5IHN0YXRlIHF1ZXJ5IG9uIGNvbm5lY3Rpb24uDQogICAgVGhlIHJlc3BvbnNlIGlz
IHByb2Nlc3NlZCBmb3IgYWxsIGVudGl0aWVzIHRoYXQgaGF2ZSBoYWQgYSBsb2NhbCBNSCBpdGVt
IGRlZmluZWQuDQoNCiAgICBUaGVyZSBpcyBhIHN0YXRpYyBmdW5jdGlvbiBkZWZpbmVkIHRoYXQg
d2lsbCBwcmludF9sb2cgYWxsIHVuaGFuZGxlZCBIQSBlbnRpdGllczoNCiAgICAgICAgSEFfU2Vy
dmVyOjpsaXN0X3VuaGFuZGxlZF9lbnRpdGllcygpDQoNCg0KDQpMaWNlbnNlOg0KICAgIFRoaXMg
ZnJlZSBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBwdWJs
aWMgbGljZW5zZS4NCg0KVXNhZ2U6DQoNCiAgICBjb25maWcgcGFybXM6DQogICAgICAgIGhvbWVh
c3Npc3RhbnRfYWRkcmVzcz0NCglob21lYXNzaXN0YW50X2FwaV9rZXk9DQoNCg0KICAgIC5taHQg
ZmlsZToNCg0KCSMgSEFfU0VSVkVSLAlvYmogbmFtZSwJYWRkcmVzcywJa2VlcGFsaXZlLCAJYXBp
X2tleSAgIA0KCUhBX1NFUlZFUiwJaGFfaG91c2UsCTEwLjMuMS4yMDo4MTIzLCAxMCwJCVhYWFhY
WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhY
WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhY
WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhY
WFhYWFhYWA0KDQoJI0hBX0lURU0sCW9iamVjdF9uYW1lLAkJZG9tYWluLAkJaGFfZW50aXR5LAkJ
aGFfc2VydmVyLCAgc3lzdGVtbGlzdCwJICAgIGZyaWVuZGx5X25hbWUNCglIQV9JVEVNLAlzaGVk
X2NvdW50ZXJfcG90cywJbGlnaHQsCQlzaGVkX2NvdW50ZXJfcG90cywJaGFfaG91c2UNCglIQV9J
VEVNLAl3YXRlciwJCQlzd2l0Y2gsCQlob3VzZV93YXRlcl9zb2NrZXQsCWhhX2hvdXNlDQoJSEFf
SVRFTSwJdGhlcm1vc3RhdCwJCWNsaW1hdGUsCWZhbWlseV9yb29tX3RoZXJtb3N0YXQsCWhhX2hv
dXNlDQoJSEFfSVRFTSwJZWNvd2l0dF93ZWF0aGVyLAlzZW5zb3IsCQlocDI1NTFidV9wcm9fdjFf
N182Xyp8ZWNvd2l0dF9jb3R0YWdlX3dlYXRoZXJfKiwgaGFfaG91c2UNCg0KDQoNCiAgICBhbmQg
bWlzdGVyaG91c2UgdXNlciBjb2RlOg0KDQogICAgICAgIHJlcXVpcmUgSEFfSXRlbTsNCg0KCSRo
YV9ob3VzZSA9IG5ldyBIQV9TZXJ2ZXIoICdoYV9ob3VzZScsICcxMC4yLjEuMjA6ODEyMycsICcx
MCcsICd4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4
eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4
eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4
eHh4eHh4eHh4eHh4eHh4eHgnICk7DQoJJGhhX2hvdXNlID0gbmV3IEhBX1NlcnZlciggJ2hhX2hv
dXNlJyApOyAgIyBhZGRyZXNzIGFuZCBhcGlfa2V5IGZyb20gLmluaSBmaWxlDQoNCgkkd2F0ZXIg
PSBuZXcgSEFfSXRlbSggJ3N3aXRjaCcsICdob3VzZV93YXRlcl9zb2NrZXQnLCAkaGFfaG91c2Ug
KTsNCg0KICAgICAgICAjDQoJaWYoIHN0YXRlX2NoYW5nZWQgJHdhdGVyICkgew0KCSAgICAmcHJp
bnRfbG9nKCAiQm9vdHJvb20gbGlnaHQgc2V0ICIgLiAkYm9vdHJvb21fc3dpdGNoLT5zdGF0ZV9j
aGFuZ2VkKCkgKTsNCgl9DQoNCgkjDQoJaWYoIG5ld19taW51dGUoMTApICkgew0KCSAgICAjIHRo
aXMgd2lsbCB0b2dnbGUgdGhlIGxpZ2h0IGJ5IHNlbmRpbmcgYSBIQSBtZXNzYWdlDQoJICAgICRz
aGVkX2NvdW50ZXJfbGlnaHRzLT5zZXQoICd0b2dnbGUnICk7DQoJfQ0KDQoJIyB0aGlzIHdpbGwg
cHJpbnRfbG9nIGFsbCBIQSB0b3BpY3MgdGhhdCBoYXZlIG5vdCBiZWVuIGhhbmRsZWQgYnkgYSBs
b2NhbCBNSCBIQV9JdGVtDQoJJGhhX2hvdXNlLT5saXN0X3VuaGFuZGxlZF90b3BpY3MoKTsNCg0K
DQpOb3RlczoNCiAgICBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA
QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCg0KICAgIFJlZmVyZW5j
ZXM6DQogICAgICAgIGh0dHBzOi8vZGV2ZWxvcGVycy5ob21lLWFzc2lzdGFudC5pby9kb2NzL2Fw
aS9yZXN0DQoJaHR0cHM6Ly9kZXZlbG9wZXJzLmhvbWUtYXNzaXN0YW50LmlvL2RvY3MvYXBpL3dl
YnNvY2tldA0KDQogICAgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA
QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQoNCiAgICA9aGVhZDIg
QjxOb3Rlczo+DQoNCiAgICBUaGlzIHByb2Nlc3NpbmcgcmVjZWl2ZXMgYWxsIGV2ZW50cyBmcm9t
IEhvbWVBc3Npc3RhbnQuICBJdCBpcyBmYWlybHkgZWZmaWNpZW50DQogICAgYXQgd2VlZGluZyBv
dXQgdGhlIG5vbmUgcmVsZXZhbnQgZXZlbnRzLiAgSSBoYXZlIG5vdCBzZWVuIGFueSBuZXR3b3Jr
IGxvYWQgY2F1c2VkDQogICAgYnkgdm9sdW1lLiAgSXQgaXMgbGlrZWx5IG1vc3QgZWZmaWNpZW50
IHRvIGhhdmUgTUggYW5kIEhBIHJ1bm5pbmcgb24gdGhlIHNhbWUgbWFjaGluZS4NCg0KICAgID1o
ZWFkMiBJTkhFUklUUw0KDQogICAgQjxOT05FPg0KDQogICAgPWhlYWQyIE1FVEhPRFMNCg0KICAg
ID1vdmVyDQoNCiAgICA9aXRlbSBCPFVuRG9jPg0KDQogICAgPWl0ZW0gQjxUb0RvPg0KDQogICAg
VGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUgZG9uZS4NCiAgICAt
IHRoZSBwYXR0ZXJuIG5lZWRzIHRvIGJlIG1hZGUgdG8gYmUgYSByZWdleHANCiAgICAtIG1heSBu
ZWVkIGEgdGltZW91dCBpZiBoYXZlbid0IHJlY2VpdmVkIGEgcG9uZyBpbiBhIGNlcnRhaW4gdGlt
ZSBhbmQgZm9yY2UgcmVjb25uZWN0DQogICAgLSBzdXBwb3J0IG1vcmUgSEEgZW50aXR5IGRvbWFp
bnMNCg0KDQo9Y3V0DQoNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpwYWNrYWdlIEhBX1NlcnZl
cjsNCg0KdXNlIHdhcm5pbmdzOw0KIyB1c2Ugc3RyaWN0Ow0KDQpASEFfU2VydmVyOjpJU0EgPSAo
J0dlbmVyaWNfSXRlbScpOw0KDQp1c2UgUHJvdG9jb2w6OldlYlNvY2tldDo6Q2xpZW50Ow0KDQp1
c2UgSlNPTiBxdyggZGVjb2RlX2pzb24gZW5jb2RlX2pzb24gKTsgICANCnVzZSBFbmNvZGUgcXco
ZGVjb2RlIGVuY29kZSk7DQoNCnVzZSBEYXRhOjpEdW1wZXI7DQoNCm15ICVIQV9TZXJ2ZXJfTGlz
dDsNCg0Kc3ViIGxvZyB7DQogICAgbXkgKCRzZWxmLCAkc3RyLCAkcHJlZml4KSA9IEBfOw0KICAg
IG15ICRtYXhsZW5ndGggPSAzMDA7DQoNCiAgICAkcHJlZml4ID0gJHByZWZpeCB8fCAnSEFTVlI6
ICc7DQogICAgJHN0ciA9ICRzdHIgfHwgJyc7DQogICAgd2hpbGUoIGxlbmd0aCggJHN0ciApID4g
JG1heGxlbmd0aCApIHsNCglteSAkbCA9IDA7DQoJbXkgJGk7DQoJZm9yKCAkaT0wOyAkaTxsZW5n
dGgoJHN0cikgJiYgJGw8JG1heGxlbmd0aDsgKyskaSwrKyRsICkgew0KCSAgICBpZiggc3Vic3Ry
KCAkc3RyLCAkaSwgMSApIGVxICJcbiIgKSB7DQoJCSRsID0gMDsNCgkgICAgfQ0KCX0NCglwcmlu
dCAkcHJlZml4IC4gc3Vic3RyKCRzdHIsMCwkaSkgLiAiXG4iOw0KCSZtYWluOjpwcmludF9sb2co
ICRwcmVmaXggLiBzdWJzdHIoJHN0ciwwLCRpKSApOw0KCSRzdHIgPSBzdWJzdHIoICRzdHIsICRp
ICk7DQoJJHByZWZpeCA9ICcuLi4uICAnOw0KICAgIH0NCiAgICBpZiggJHN0ciApIHsNCglwcmlu
dCAkcHJlZml4IC4gJHN0ciAuICJcbiI7DQoJJm1haW46OnByaW50X2xvZyggJHByZWZpeCAuICRz
dHIgKTsNCiAgICB9DQp9DQoNCnN1YiBkZWJ1ZyB7DQogICAgbXkoICRzZWxmLCAkbGV2ZWwsICRz
dHIgKSA9IEBfOw0KICAgIGlmKCAkbWFpbjo6RGVidWd7aGFzdnJ9ID49ICRsZXZlbCApIHsNCgkk
bGV2ZWwgPSAnRCcgaWYgJGxldmVsID09IDA7DQoJJHNlbGYtPmxvZyggJHN0ciwgIkhBU1ZSIEQk
bGV2ZWw6ICIgKTsNCiAgICB9DQp9DQoNCnN1YiBlcnJvciB7DQogICAgbXkgKCRzZWxmLCAkc3Ry
LCAkbGV2ZWwgKSA9IEBfOw0KICAgICZIQV9TZXJ2ZXI6OmxvZyggJHNlbGYsICRzdHIsICJIQVNW
UiBFUlJPUjogIiApOw0KfQ0KDQpzdWIgZHVtcCB7DQogICAgbXkoICRzZWxmLCAkb2JqICkgPSBA
XzsNCiAgICAkb2JqID0gJG9iaiB8fCAkc2VsZjsNCiAgICBteSAkZHVtcGVyID0gRGF0YTo6RHVt
cGVyLT5uZXcoIFskb2JqXSApOw0KICAgICRkdW1wZXItPk1heGRlcHRoKCAyICk7DQogICAgcmV0
dXJuICRkdW1wZXItPkR1bXAoKTsNCn0NCg0KDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpz
dWIgbmV3IHsNCiAgICBteSAoICRjbGFzcywgJG5hbWUsICRhZGRyZXNzLCAka2VlcF9hbGl2ZV90
aW1lciwgJGFwaV9rZXkgKSA9IEBfOw0KICAgIG15ICRzZWxmOw0KDQogICAgcHJpbnQgImNyZWF0
aW5nIEhBIFNlcnZlciAkbmFtZSBvbiAkYWRkcmVzc1xuIjsNCg0KICAgIGlmKCAhZGVmaW5lZCAk
bWFpbjo6RGVidWd7aGFzdnJ9ICkgew0KCSRtYWluOjpEZWJ1Z3toYXN2cn0gPSAwOw0KCSMgJG1h
aW46OkRlYnVne2hhc3ZyfSA9IDI7DQogICAgfQ0KDQogICAgJGFkZHJlc3MJCT0gJGFkZHJlc3Mg
IHx8ICQ6OmNvbmZpZ19wYXJtc3tob21lYXNzaXN0YW50X2FkZHJlc3N9CXx8ICdsb2NhbGhvc3Q6
ODEyMyc7DQogICAgJGFwaV9rZXkJCT0gJGFwaV9rZXkgIHx8ICQ6OmNvbmZpZ19wYXJtc3tob21l
YXNzaXN0YW50X2FwaV9rZXl9Ow0KICAgICRrZWVwX2FsaXZlX3RpbWVyCT0gJGtlZXBfYWxpdmVf
dGltZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJzEwJzsNCiAgICAk
a2VlcF9hbGl2ZV90aW1lciArPSAwOw0KDQogICAgJHNlbGYgPSB7fTsNCg0KICAgIGJsZXNzICRz
ZWxmLCAkY2xhc3M7DQoNCiAgICAkJHNlbGZ7c3RhdGV9CQk9ICdvZmYnOw0KICAgICQkc2VsZntz
YWlkfQkJPSAnJzsNCiAgICAkJHNlbGZ7c3RhdGVfbm93fQkJPSAnb2ZmJzsNCg0KICAgICRzZWxm
LT57aXBfYWRkcmVzc30JCT0gJGFkZHJlc3M7DQogICAgJHNlbGYtPntrZWVwX2FsaXZlX3RpbWVy
fQk9ICRrZWVwX2FsaXZlX3RpbWVyOw0KICAgICRzZWxmLT57cmVjb25uZWN0X3RpbWVyfQk9IDEw
Ow0KICAgICRzZWxmLT57bmV4dF9pZH0JCT0gMjA7DQogICAgJHNlbGYtPntzdWJzY3JpYmVfaWR9
CT0gMDsNCiAgICAkc2VsZi0+e2FwaV9rZXl9CQk9ICRhcGlfa2V5Ow0KDQogICAgJHNlbGYtPntu
ZXh0X3Bpbmd9CQk9IDA7DQogICAgJHNlbGYtPntnb3RfcGluZ19yZXNwb25zZX0JPSAxOw0KICAg
ICRzZWxmLT57cGluZ19taXNzZWRfY291bnR9CT0gMDsNCg0KICAgICRzZWxmLT57cmVjb25fdGlt
ZXJ9CT0gOjpUaW1lcjo6bmV3KCk7DQoNCiAgICAkc2VsZi0+e25hbWV9ID0gJG5hbWU7DQoNCg0K
ICAgICRzZWxmLT5sb2coIkNyZWF0aW5nICRuYW1lIG9uICQkc2VsZntpcF9hZGRyZXNzfSIpOw0K
DQoNCiAgICAkSEFfU2VydmVyX0xpc3R7JHNlbGYtPntuYW1lfX0gPSAkc2VsZjsNCg0KICAgICY6
Ok1haW5Mb29wX3ByZV9hZGRfaG9vayggXCZIQV9TZXJ2ZXI6OmNoZWNrX2Zvcl9kYXRhLCAxICk7
DQoNCiAgICAkc2VsZi0+Y29ubmVjdCgpOw0KICAgIHJldHVybiAkc2VsZjsNCn0NCg0KDQpzdWIg
Y29ubmVjdCB7DQogICAgbXkgKCRzZWxmKSA9IEBfOw0KDQogICAgJHNlbGYtPntzb2NrZXRfaXRl
bX0gPSBuZXcgU29ja2V0X0l0ZW0oIHVuZGVmLCB1bmRlZiwgJHNlbGYtPntpcF9hZGRyZXNzfSwg
JHNlbGYtPntuYW1lfSwgJ3RjcCcsICdyYXcnICk7DQoNCiAgICBpZiggISRzZWxmLT57c29ja2V0
X2l0ZW19LT5zdGFydCgpICkgew0KCSRzZWxmLT5sb2coICJVbmFibGUgdG8gY29ubmVjdCBzb2Nr
ZXQgdG8gJHNlbGYtPntpcF9hZGRyZXNzfSAuLi4gdHJ5aW5nIGFnYWluIGluICRzZWxmLT57cmVj
b25uZWN0X3RpbWVyfXMiICk7DQogICAgICAgIGlmICgkc2VsZi0+e3JlY29uX3RpbWVyfS0+aW5h
Y3RpdmUpIHsNCgkgICAgJHNlbGYtPntyZWNvbl90aW1lcn0tPnNldCgkc2VsZi0+e3JlY29ubmVj
dF90aW1lcn0sIHN1YiB7ICZIQV9TZXJ2ZXI6OmNvbm5lY3QoICRzZWxmICkgfSk7DQoJfQ0KCXJl
dHVybjsNCiAgICB9IGVsc2Ugew0KCSRzZWxmLT5sb2coICJDb25uZWN0ZWQgdG8gSG9tZUFzc2lz
dGFudCBzZXJ2ZXIgYXQgJHNlbGYtPntpcF9hZGRyZXNzfSIgKTsNCiAgICB9DQoNCiAgICBteSAk
d3NfY2xpZW50ID0gUHJvdG9jb2w6OldlYlNvY2tldDo6Q2xpZW50LT5uZXcodXJsID0+ICd3czov
LycgLiAkc2VsZi0+e2lwX2FkZHJlc3N9IC4gJy9hcGkvd2Vic29ja2V0JyApOw0KICAgIA0KICAg
ICR3c19jbGllbnQtPntoYV9zZXJ2ZXJ9ID0gJHNlbGY7DQogICAgJHNlbGYtPnt3c19jbGllbnR9
ID0gJHdzX2NsaWVudDsNCg0KICAgICR3c19jbGllbnQtPm9uKA0KCXdyaXRlID0+IHN1YiB7DQoJ
ICAgIG15ICgkY2xpZW50LCRidWYpID0gQF87DQoJICAgIG15ICRzZWxmID0gJGNsaWVudC0+e2hh
X3NlcnZlcn07DQogICAgIA0KCSAgICBpZiggJHNlbGYtPntzb2NrZXRfaXRlbX0gKSB7DQoJCSRz
ZWxmLT57c29ja2V0X2l0ZW19LT5zZXQoICRidWYgKTsNCgkgICAgfQ0KCX0NCiAgICApOw0KICAg
ICR3c19jbGllbnQtPm9uKA0KCXJlYWQgPT4gc3ViIHsNCgkgICAgbXkgKCRjbGllbnQsJGJ1Zikg
PSBAXzsNCgkgICAgbXkgJHNlbGYgPSAkY2xpZW50LT57aGFfc2VydmVyfTsNCiAgICAgDQoJICAg
ICRzZWxmLT5oYV9wcm9jZXNzX3JlYWQoICRidWYgKTsNCgl9DQogICAgKTsNCiAgICAkd3NfY2xp
ZW50LT5vbigNCgllcnJvciA9PiBzdWIgew0KCSAgICBteSAoJGNsaWVudCwkYnVmKSA9IEBfOw0K
CSAgICBteSAkc2VsZiA9ICRjbGllbnQtPntoYV9zZXJ2ZXJ9Ow0KICAgICANCgkgICAgJHNlbGYt
PmVycm9yKCAiaGFfc2VydmVyIHJlY2VpdmVkIGVycm9yOiAkYnVmIiApOw0KCX0NCiAgICApOw0K
ICAgICR3c19jbGllbnQtPntmcmFtZV9idWZmZXJ9LT57bWF4X3BheWxvYWRfc2l6ZX0gPSAyMDAw
MDA7DQoNCiAgICAkc2VsZi0+e3dzX2NsaWVudH0tPmNvbm5lY3QoKTsNCn0NCg0Kc3ViIGNoZWNr
X2Zvcl9kYXRhIHsNCiAgICBteSAkaGFfZGF0YTsNCg0KICAgIGZvcmVhY2ggbXkgJGhhX3NlcnZl
ciAoIHZhbHVlcyAlSEFfU2VydmVyX0xpc3QgKSB7DQoJaWYoICRoYV9zZXJ2ZXItPntzb2NrZXRf
aXRlbX0gKSB7DQoJICAgIGlmKCAkaGFfc2VydmVyLT57c29ja2V0X2l0ZW19LT5hY3RpdmVfbm93
KCkgKSB7DQoJCSRoYV9zZXJ2ZXItPmRlYnVnKCAxLCAiSG9tZWFzc2lzdGFudCBzZXJ2ZXIgc3Rh
cnRlZCIgKTsNCgkgICAgfQ0KCSAgICBpZiggJGhhX3NlcnZlci0+e3NvY2tldF9pdGVtfS0+aW5h
Y3RpdmVfbm93KCkgKSB7DQoJCSRoYV9zZXJ2ZXItPmRlYnVnKCAxLCAiSG9tZWFzc2lzdGFudCBz
ZXJ2ZXIgY2xvc2UiICk7DQoJCSRoYV9zZXJ2ZXItPmRpc2Nvbm5lY3QoKTsNCgkJJGhhX3NlcnZl
ci0+Y29ubmVjdCgpOw0KCQluZXh0Ow0KCSAgICB9DQoJfQ0KCQ0KCSMgUGFyc2VzIGluY29taW5n
IGRhdGEgYW5kIG9uIGV2ZXJ5IGZyYW1lIGNhbGxzIG9uX3JlYWQNCglpZiggJGhhX3NlcnZlci0+
e3NvY2tldF9pdGVtfSAgYW5kICAkaGFfZGF0YSA9ICRoYV9zZXJ2ZXItPntzb2NrZXRfaXRlbX0t
PnNhaWQoKSApIHsNCgkgICAgIyBwcmludCAiUmVjZWl2ZWQgZGF0YSBmcm9tIGhvbWUgYXNzaXN0
YW50OlxuICAgICAkaGFfZGF0YVxuIjsNCgkgICAgJGhhX3NlcnZlci0+e3dzX2NsaWVudH0tPnJl
YWQoICRoYV9kYXRhICk7DQoJfQ0KCSANCglpZiggJjo6bmV3X3NlY29uZCgkaGFfc2VydmVyLT57
a2VlcF9hbGl2ZV90aW1lfSkgYW5kICAkaGFfc2VydmVyLT57d3NfY2xpZW50fSApIHsNCgkgICAg
JGhhX3NlcnZlci0+e3dzX2NsaWVudH0tPndyaXRlKCAneyJpZCI6JyAuICsrJGhhX3NlcnZlci0+
e25leHRfaWR9IC4gJywgInR5cGUiOiJwaW5nIn0nICk7DQoJfQ0KICAgIH0NCn0NCg0Kc3ViIGhh
X3Byb2Nlc3Nfd3JpdGUgew0KICAgIG15ICgkc2VsZiwgJGRhdGEpID0gQF87DQoNCiAgICBpZigg
cmVmICRkYXRhICkgew0KCSRkYXRhID0gZW5jb2RlX2pzb24oICRkYXRhICk7DQogICAgfQ0KICAg
IGlmKCAhJHNlbGYtPntzb2NrZXRfaXRlbX0tPmFjdGl2ZSgpICkgew0KICAgICAgICByZXR1cm47
DQogICAgfQ0KICAgICRzZWxmLT5kZWJ1ZyggMSwgInNlbmRpbmcgZGF0YSB0byBoYTogJGRhdGEi
ICk7DQogICAgJHNlbGYtPnt3c19jbGllbnR9LT53cml0ZSggJGRhdGEgKTsNCn0NCg0Kc3ViIGhh
X3Byb2Nlc3NfcmVhZCB7DQogICAgbXkgKCRzZWxmLCAkZGF0YSkgPSBAXzsNCiAgICBteSAkZGF0
YV9vYmo7DQogICAgbXkgJGpzb25fdGV4dDsNCg0KICAgICMgcHJpbnQgImhhX3NlcnZlciByZWNl
aXZlZDogXG4gICAgIjsNCiAgICAjIHByaW50ICRkYXRhIC4gIlxuIjsNCg0KICAgICRqc29uX3Rl
eHQgPSBlbmNvZGUoICJVVEYtOCIsICRkYXRhICk7DQogICAgZXZhbCB7JGRhdGFfb2JqID0gSlNP
Ti0+bmV3LT51dGY4LT5kZWNvZGUoICRqc29uX3RleHQgKX07DQogICAgaWYoICRAICkgew0KCSRz
ZWxmLT5lcnJvciggInBhcnNpbmcganNvbiBmcm9tIGhvbWVhc3Npc3RhbnQ6ICRAICBbJGpzb25f
dGV4dF0iICk7DQoJcHJpbnQgIkVycm9yIHBhcnNpbmcganNvbiBmcm9tIGhvbWVhc3Npc3RhbnQ6
ICRAXG4iOw0KCXByaW50ICIgICBbJGpzb25fdGV4dF1cbiI7DQoJcmV0dXJuOw0KICAgIH0NCiAg
ICBpZiggISRkYXRhX29iaiApIHsNCgkkc2VsZi0+ZXJyb3IoICJVbmFibGUgdG8gZGVjb2RlIGpz
b246ICRkYXRhIiApOw0KCXJldHVybjsNCiAgICB9DQogICAgaWYoICRkYXRhX29iai0+e3R5cGV9
IGVxICdwb25nJyApIHsNCgkkc2VsZi0+ZGVidWcoIDEsICJSZWNlaXZlZCBwb25nIGZyb20gSEEi
ICk7DQoJcmV0dXJuOw0KICAgIH0gZWxzaWYoICRkYXRhX29iai0+e3R5cGV9IGVxICdldmVudCcg
ICYmICAkZGF0YV9vYmotPntpZH0gPT0gJHNlbGYtPntzdWJzY3JpYmVfaWR9ICkgew0KCSRzZWxm
LT5wYXJzZV9kYXRhX3RvX29iaiggJGRhdGFfb2JqLT57ZXZlbnR9LT57ZGF0YX0tPntuZXdfc3Rh
dGV9LCAiaGFzdnIiICk7DQogICAgICAgIHJldHVybjsNCiAgICB9IGVsc2lmKCAkZGF0YV9vYmot
Pnt0eXBlfSBlcSAnYXV0aF9yZXF1aXJlZCcgKSB7DQoJbXkgJGF1dGhfbWVzc2FnZSA9ICJ7IFwi
dHlwZVwiOiBcImF1dGhcIiwgXCJhY2Nlc3NfdG9rZW5cIjogXCIkJHNlbGZ7YXBpX2tleX1cIiB9
IjsNCgkkc2VsZi0+aGFfcHJvY2Vzc193cml0ZSggJGF1dGhfbWVzc2FnZSApOw0KCXJldHVybjsN
CiAgICB9IGVsc2lmKCAkZGF0YV9vYmotPnt0eXBlfSBlcSAnYXV0aF9vaycgKSB7DQoJbXkgJHN1
YnNjcmliZTsNCgkkc2VsZi0+bG9nKCAiQXV0aGVudGljYXRlZCB0byBIb21lQXNzaXN0YW50IHNl
cnZlciIgKTsNCgkkc2VsZi0+e3N1YnNjcmliZV9pZH0gPSArKyRzZWxmLT57bmV4dF9pZH07DQoJ
JHN1YnNjcmliZS0+e2lkfSA9ICRzZWxmLT57c3Vic2NyaWJlX2lkfTsNCgkkc3Vic2NyaWJlLT57
dHlwZX0gPSAnc3Vic2NyaWJlX2V2ZW50cyc7DQoJJHN1YnNjcmliZS0+e2V2ZW50X3R5cGV9ID0g
J3N0YXRlX2NoYW5nZWQnOw0KICAgICAgICAkc2VsZi0+aGFfcHJvY2Vzc193cml0ZSggJHN1YnNj
cmliZSApOw0KCW15ICRnZXRzdGF0ZXM7DQoJJHNlbGYtPntnZXRzdGF0ZXNfaWR9ID0gKyskc2Vs
Zi0+e25leHRfaWR9Ow0KCSRnZXRzdGF0ZXMtPntpZH0gPSAkc2VsZi0+e2dldHN0YXRlc19pZH07
DQoJJGdldHN0YXRlcy0+e3R5cGV9ID0gJ2dldF9zdGF0ZXMnOw0KICAgICAgICAkc2VsZi0+aGFf
cHJvY2Vzc193cml0ZSggJGdldHN0YXRlcyApOw0KCXJldHVybjsNCiAgICB9IGVsc2lmKCAkZGF0
YV9vYmotPnt0eXBlfSBlcSAnYXV0aF9pbnZhbGlkJyApIHsNCgkkc2VsZi0+ZXJyb3IoICJBdXRo
ZW50aWNhdGlvbiBpbnZhbGlkOiAiIC4gJHNlbGYtPmR1bXAoJGRhdGFfb2JqKSApOw0KICAgIH0g
ZWxzaWYoICRkYXRhX29iai0+e3R5cGV9IGVxICdyZXN1bHQnICkgew0KCWlmKCAkZGF0YV9vYmot
PntzdWNjZXNzfSApIHsNCgkgICAgJHNlbGYtPmRlYnVnKCAxLCAiUmVjZWl2ZWQgc3VjY2VzcyBv
biByZXF1ZXN0ICRkYXRhX29iai0+e2lkfSIgKTsNCgkgICAgaWYoICRkYXRhX29iai0+e2lkfSA9
PSAkc2VsZi0+e2dldHN0YXRlc19pZH0gKSB7DQoJCSRzZWxmLT5wcm9jZXNzX2VudGl0eV9zdGF0
ZXMoICRkYXRhX29iaiApOw0KCSAgICB9DQoJICAgIHJldHVybjsNCgl9IGVsc2Ugew0KCSAgICAk
c2VsZi0+ZXJyb3IoICJSZWNlaXZlZCBGQUlMVVJFIG9uIHJlcXVlc3QgJGRhdGFfb2JqLT57aWR9
OiAiIC4gJHNlbGYtPmR1bXAoICRkYXRhX29iaiApICk7DQoJfQ0KICAgIH0NCn0NCg0KPWl0ZW0g
QzxwYXJzZV9kYXRhX3RvX29iaigpPg0KICAgIFRha2UgdGhlIGRhdGEgYW5kIHBhcnNlIGl0IHRv
IHRoZSBNSCBvYmooKQ0KDQo9Y3V0DQoNCnN1YiBwYXJzZV9kYXRhX3RvX29iaiB7DQogICAgbXkg
KCAkc2VsZiwgJGNtZCwgJHBfc2V0YnkgKSA9IEBfOw0KICAgIG15ICRoYW5kbGVkID0gMDsNCg0K
ICAgICRzZWxmLT5kZWJ1ZyggMiwgIk1zZyBvYmplY3Q6ICIgLiAkc2VsZi0+ZHVtcCggJGNtZCAp
ICk7DQoNCiAgICBteSAoJGNtZF9kb21haW4sJGNtZF9lbnRpdHkpID0gc3BsaXQoICdcLicsICRj
bWQtPntlbnRpdHlfaWR9ICk7DQogICAgZm9yIG15ICRvYmogKCBAeyAkc2VsZi0+e29iamVjdHN9
IH0gKSB7DQoJaWYoICRvYmotPntlbnRpdHlfcHJlZml4ZXN9ICkgew0KCSAgICBmb3IgbXkgJHBy
ZWZpeCAoQHskb2JqLT57ZW50aXR5X3ByZWZpeGVzfX0pIHsNCgkJaWYoICRwcmVmaXggZXEgc3Vi
c3RyKCRjbWRfZW50aXR5LDAsbGVuZ3RoKCRwcmVmaXgpKSApIHsNCgkJICAgIG15ICRhdHRyX25h
bWUgPSBzdWJzdHIoJGNtZF9lbnRpdHksbGVuZ3RoKCRwcmVmaXgpKTsNCgkJICAgICRvYmotPnth
dHRyfS0+eyRhdHRyX25hbWV9ID0gJGNtZC0+e3N0YXRlfTsNCgkJICAgICRzZWxmLT5kZWJ1Zygg
MSwgImhhbmRsZWQgZXZlbnQgZm9yICRvYmotPntvYmplY3RfbmFtZX0gLS0gYXR0ciAkYXR0cl9u
YW1lIHNldCB0byAkY21kLT57c3RhdGV9IiApOw0KCQkgICAgIyAkb2JqLT5zZXQoICd0b2dnbGUn
LCB1bmRlZiApOw0KCQkgICAgaWYoICRwX3NldGJ5IGVxICJoYXN2cl9pbml0IiApIHsNCgkJCSRv
YmotPntoYV9pbml0fSA9IDE7DQoJCSAgICB9DQoJCSAgICAkaGFuZGxlZCA9IDE7DQoJCX0NCgkg
ICAgfQ0KCX0gZWxzaWYoICRjbWQtPntlbnRpdHlfaWR9IGVxICRvYmotPntlbnRpdHlfaWR9ICkg
ew0KCSAgICAkc2VsZi0+ZGVidWcoIDEsICJoYW5kbGVkIGV2ZW50IGZvciAkb2JqLT57b2JqZWN0
X25hbWV9IHNldCB0byAkY21kLT57c3RhdGV9IiApOw0KCSAgICAkb2JqLT5zZXQoICRjbWQsICRw
X3NldGJ5ICk7DQoJICAgIGlmKCAkcF9zZXRieSBlcSAiaGFzdnJfaW5pdCIgKSB7DQoJCSRvYmot
PntoYV9pbml0fSA9IDE7DQoJICAgIH0NCgkgICAgJGhhbmRsZWQgPSAxOw0KCX0NCiAgICB9DQog
ICAgaWYoICEkaGFuZGxlZCApIHsNCgkkc2VsZi0+ZGVidWcoIDEsICJ1bmhhbmRsZWQgZXZlbnQg
JGNtZC0+e2VudGl0eV9pZH0gKCRjbWQtPntzdGF0ZX0pIiApOw0KICAgIH0NCiAgICByZXR1cm4g
JGhhbmRsZWQ7DQp9DQoNCj1pdGVtIEM8cHJvY2Vzc19lbnRpdHlfc3RhdGVzKCk+DQogICAgUHJv
Y2VzcyBhbGwgZW50aXR5IHN0YXRlcyByZXNwb25zZSANCg0KPWN1dA0KDQpzdWIgcHJvY2Vzc19l
bnRpdHlfc3RhdGVzIHsNCiAgICBteSAoICRzZWxmLCAkY21kICkgPSBAXzsNCg0KICAgICMgcHJp
bnQgIkVudGl0eSBzdGF0ZXMgcmVzcG9uc2U6IFxuIiAuICRzZWxmLT5kdW1wKCAkY21kICk7DQog
ICAgZm9yZWFjaCBteSAkc3RhdGVfb2JqIChAeyRjbWQtPntyZXN1bHR9fSkgew0KCWlmKCAhJHNl
bGYtPnBhcnNlX2RhdGFfdG9fb2JqKCAkc3RhdGVfb2JqLCAiaGFzdnJfaW5pdCIgKSApIHsNCgkg
ICAgcHVzaCBAeyAkJHNlbGZ7dW5oYW5kbGVkX2VudGl0aWVzfSB9LCAkc3RhdGVfb2JqLT57ZW50
aXR5X2lkfTsNCgl9DQogICAgfQ0KICAgICMgY2hlY2sgdGhhdCBhbGwgaGFfaXRlbSBvYmplY3Rz
IGhhZCBhbiBpbml0aWFsIHN0YXRlDQogICAgZm9yIG15ICRvYmogKCBAeyAkc2VsZi0+e29iamVj
dHN9IH0gKSB7DQoJaWYoICEkb2JqLT57aGFfaW5pdH0gKSB7DQoJICAgICRzZWxmLT5sb2coICJu
byBIb21lQXNzaXN0YW50IGluaXRpYWwgc3RhdGUgZm9yIEhBX0l0ZW0gb2JqZWN0ICRvYmotPntv
YmplY3RfbmFtZX0gZW50aXR5X2lkOiRvYmotPntlbnRpdHlfaWR9IiApOw0KCX0NCiAgICB9DQp9
DQoNCnN1YiBsaXN0X3VuaGFuZGxlZF9lbnRpdGllcyB7DQogICAgZm9yZWFjaCBteSAkaGFfc2Vy
dmVyICggdmFsdWVzICVIQV9TZXJ2ZXJfTGlzdCApIHsNCglmb3IgbXkgJGVudGl0eV9pZCAoIEB7
ICRoYV9zZXJ2ZXItPnt1bmhhbmRsZWRfZW50aXRpZXN9IH0gKSB7DQoJICAgICRoYV9zZXJ2ZXIt
PmxvZyggInVuaGFuZGxlZCBIb21lQXNzaXN0YW50IGVudGl0eTogJGhhX3NlcnZlci0+e25hbWV9
OiR7ZW50aXR5X2lkfSIgKTsNCgl9DQogICAgfQ0KfQ0KDQpzdWIgZGlzY29ubmVjdCB7DQogICAg
bXkgKCRzZWxmKSA9IEBfOw0KDQogICAgaWYoICRzZWxmLT57d3NfY2xpZW50fSApIHsNCgkkc2Vs
Zi0+e3dzX2NsaWVudH0tPmRpc2Nvbm5lY3QoKTsNCglkZWxldGUgJHNlbGYtPnt3c19jbGllbnR9
Ow0KICAgIH0NCiAgICBpZiggJHNlbGYtPntzb2NrZXRfaXRlbX0gICYmICAkc2VsZi0+e3NvY2tl
dF9pdGVtfS0+YWN0aXZlKCkgKSB7DQoJJHNlbGYtPntzb2NrZXRfaXRlbX0tPnN0b3AoKTsNCiAg
ICB9DQp9DQogDQo9aXRlbSBDPChhZGQpPg0KPWN1dA0KDQpzdWIgYWRkIHsNCiAgICBteSAoICRz
ZWxmLCBAcF9vYmplY3RzICkgPSBAXzsNCg0KICAgIG15IEBsX29iamVjdHM7DQoNCiAgICBmb3Ig
bXkgJGxfb2JqZWN0IChAcF9vYmplY3RzKSB7DQogICAgICAgIGlmICggJGxfb2JqZWN0LT5pc2Eo
J0dyb3VwX0l0ZW0nKSApIHsNCiAgICAgICAgICAgIEBsX29iamVjdHMgPSAkJGxfb2JqZWN0e21l
bWJlcnN9Ow0KICAgICAgICAgICAgZm9yIG15ICRvYmogKEBsX29iamVjdHMpIHsNCiAgICAgICAg
ICAgICAgICAkc2VsZi0+YWRkKCRvYmopOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAg
ICAgIGVsc2Ugew0KICAgICAgICAgICAgJHNlbGYtPmFkZF9pdGVtKCRsX29iamVjdCk7DQogICAg
ICAgIH0NCiAgICB9DQp9DQoNCj1pdGVtIEM8KGFkZF9pdGVtKT4NCj1jdXQNCg0Kc3ViIGFkZF9p
dGVtIHsNCiAgICBteSAoICRzZWxmLCAkcF9vYmplY3QgKSA9IEBfOw0KDQogICAgcHVzaCBAeyAk
JHNlbGZ7b2JqZWN0c30gfSwgJHBfb2JqZWN0Ow0KDQogICAgcmV0dXJuICRwX29iamVjdDsNCn0N
Cg0KPWl0ZW0gQzwocmVtb3ZlX2FsbF9pdGVtcyk+DQo9Y3V0DQoNCnN1YiByZW1vdmVfYWxsX2l0
ZW1zIHsNCiAgICBteSAoJHNlbGYpID0gQF87DQoNCiAgICAkc2VsZi0+bG9nKCJyZW1vdmVfYWxs
X2l0ZW1zKCkiKTsNCiAgICBkZWxldGUgJHNlbGYtPntvYmplY3RzfTsNCn0NCg0KPWl0ZW0gQzwo
YWRkX2l0ZW1faWZfbm90X3ByZXNlbnQpPg0KPWN1dA0KDQpzdWIgYWRkX2l0ZW1faWZfbm90X3By
ZXNlbnQgew0KICAgIG15ICggJHNlbGYsICRwX29iamVjdCApID0gQF87DQoNCiAgICBpZiAoIHJl
ZiAkJHNlbGZ7b2JqZWN0c30gKSB7DQogICAgICAgIGZvcmVhY2ggKCBAeyAkJHNlbGZ7b2JqZWN0
c30gfSApIHsNCiAgICAgICAgICAgIGlmICggJF8gZXEgJHBfb2JqZWN0ICkgew0KICAgICAgICAg
ICAgICAgIHJldHVybiAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgICRz
ZWxmLT5hZGRfaXRlbSgkcF9vYmplY3QpOw0KICAgIHJldHVybiAxOw0KfQ0KDQo9aXRlbSBDPChy
ZW1vdmVfaXRlbSk+DQo9Y3V0DQoNCnN1YiByZW1vdmVfaXRlbSB7DQogICAgbXkgKCAkc2VsZiwg
JHBfb2JqZWN0ICkgPSBAXzsNCg0KICAgIGlmICggcmVmICQkc2VsZntvYmplY3RzfSApIHsNCiAg
ICAgICAgZm9yICggbXkgJGkgPSAwOyAkaSA8IHNjYWxhciggQHsgJCRzZWxme29iamVjdHN9IH0g
KTsgJGkrKyApIHsNCiAgICAgICAgICAgIGlmICggJCRzZWxme29iamVjdHN9LT5bJGldIGVxICRw
X29iamVjdCApIHsNCiAgICAgICAgICAgICAgICBzcGxpY2UgQHsgJCRzZWxme29iamVjdHN9IH0s
ICRpLCAxOw0KICAgICAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICAgICAgfQ0KICAgICAg
ICB9DQogICAgfQ0KICAgIHJldHVybiAwOw0KfQ0KIyAtLS0tLS0tLS0tLS0tRW5kIG9mIEhBX1Nl
cnZlci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0K
DQpwYWNrYWdlIEhBX0l0ZW07DQoNCnVzZSB3YXJuaW5nczsNCg0KQEhBX0l0ZW06OklTQSA9ICgn
R2VuZXJpY19JdGVtJyk7DQoNCnVzZSBKU09OIHF3KCBkZWNvZGVfanNvbiBlbmNvZGVfanNvbiAp
OyAgIA0KDQp1c2UgRGF0YTo6RHVtcGVyOw0KDQpzdWIgbmV3IHsNCiAgICBteSAoJGNsYXNzLCAk
ZG9tYWluLCAkZW50aXR5LCAkaGFfc2VydmVyICkgPSBAXzsNCiAgICBteSAkc2VsZiA9IG5ldyBH
ZW5lcmljX0l0ZW0oKTsNCiAgICBibGVzcyAkc2VsZiwgJGNsYXNzOw0KDQogICAgaWYoICEkaGFf
c2VydmVyICkgew0KCSRzZWxmLT5lcnJvciggIk5vIGhvbWVhc3Npc3RhbnQgc2VydmVyIHNldCIg
KTsNCglyZXR1cm47DQogICAgfQ0KICAgICRzZWxmLT57aGFfc2VydmVyfSA9ICRoYV9zZXJ2ZXI7
DQogICAgJHNlbGYtPmRlYnVnKCAxLCAiTmV3IEhBX0l0ZW0gKCAkY2xhc3MsICRkb21haW4sICRl
bnRpdHkgKSIgKTsNCiAgICBpZiggJGRvbWFpbiBlcSAnc3dpdGNoJyApIHsNCgkkc2VsZi0+c2V0
X3N0YXRlcyggIm9mZiIsICJvbiIgKTsNCiAgICB9IGVsc2lmKCAkZG9tYWluIGVxICdsaWdodCcg
KSB7DQoJJHNlbGYtPnNldF9zdGF0ZXMoICJvZmYiLCAiMjAlIiwgIjQwJSIsICI1MCUiLCAiNjAl
IiwgIjgwJSIsICJvbiIgKTsNCiAgICB9IGVsc2lmKCAkZG9tYWluIGVxICdjbGltYXRlJyApIHsN
Cgkkc2VsZi0+e2F0dHJ9ID0ge307DQogICAgfSBlbHNpZiggJGRvbWFpbiBlcSAnc2Vuc29yJyAg
fHwgICRkb21haW4gZXEgJ2JpbmFyeV9zZW5zb3InICkgew0KCSRzZWxmLT57YXR0cn0gPSB7fTsN
CiAgICB9IGVsc2Ugew0KCSRzZWxmLT5lcnJvciggIkludmFsaWQgdHlwZSBmb3IgSEFfSXRlbSAt
LSAnJGRvbWFpbiciICk7DQoJcmV0dXJuOw0KICAgIH0NCiAgICAkc2VsZi0+e2RvbWFpbn0gPSAk
ZG9tYWluOw0KICAgIG15IEBwcmVmaXhlcyA9IHNwbGl0KCAnXHwnLCAkZW50aXR5ICk7DQogICAg
aWYoICQjcHJlZml4ZXMgIHx8ICBzdWJzdHIoICRlbnRpdHksIGxlbmd0aCgkZW50aXR5KS0xLCAx
ICkgZXEgJyonICkgew0KCWlmKCAkI3ByZWZpeGVzID09IDAgKSB7DQoJICAgIEBwcmVmaXhlcyA9
ICgkZW50aXR5KTsNCgl9DQoJZm9yIG15ICRwcmVmaXggKEBwcmVmaXhlcykgew0KCSAgICBpZigg
c3Vic3RyKCAkcHJlZml4LCBsZW5ndGgoJHByZWZpeCktMSwgMSApIGVxICcqJyApIHsNCgkJJHBy
ZWZpeCA9IHN1YnN0ciggJHByZWZpeCwgMCwgbGVuZ3RoKCRwcmVmaXgpLTEgKTsNCgkgICAgfQ0K
CSAgICBwdXNoIEB7JHNlbGYtPntlbnRpdHlfcHJlZml4ZXN9fSwgJHByZWZpeDsNCgl9DQoJJHNl
bGYtPmRlYnVnKCAxLCAiJHtkb21haW59LiR7ZW50aXR5fSBwcmVmaXhlczogIiAuIGpvaW4oICd8
JywgQHskc2VsZi0+e2VudGl0eV9wcmVmaXhlc319KSApOw0KICAgIH0NCg0KICAgICRzZWxmLT57
ZW50aXR5fSA9ICRlbnRpdHk7DQogICAgJHNlbGYtPntlbnRpdHlfaWR9ID0gIiR7ZG9tYWlufS4k
e2VudGl0eX0iOw0KDQogICAgJHNlbGYtPntoYV9zZXJ2ZXJ9LT5hZGQoICRzZWxmICk7DQoNCiAg
ICByZXR1cm4gJHNlbGY7DQp9DQoNCnN1YiBsb2cgew0KICAgIG15KCAkc2VsZiwgJHN0ciApID0g
QF87DQogICAgJHNlbGYtPntoYV9zZXJ2ZXJ9LT5sb2coICRzdHIgKTsNCn0NCg0Kc3ViIGVycm9y
IHsNCiAgICBteSggJHNlbGYsICRzdHIgKSA9IEBfOw0KICAgICRzZWxmLT57aGFfc2VydmVyfS0+
ZXJyb3IoICRzdHIgKTsNCn0NCg0Kc3ViIGRlYnVnIHsNCiAgICBteSggJHNlbGYsICRsZXZlbCwg
JHN0ciApID0gQF87DQogICAgaWYoICRzZWxmLT5kZWJ1Z2xldmVsKCAkbGV2ZWwsICdoYXN2cicg
KSApIHsNCgkkc2VsZi0+e2hhX3NlcnZlcn0tPmxvZyggJHN0ciwgIkhBU1ZSIEQkbGV2ZWw6ICIg
KTsNCiAgICB9DQp9DQoNCnN1YiBkdW1wIHsNCiAgICBteSggJHNlbGYsICRvYmogKSA9IEBfOw0K
ICAgICRvYmogPSAkb2JqIHx8ICRzZWxmOw0KICAgIG15ICRkdW1wZXIgPSBEYXRhOjpEdW1wZXIt
Pm5ldyggWyRvYmpdICk7DQogICAgJGR1bXBlci0+TWF4ZGVwdGgoIDIgKTsNCiAgICByZXR1cm4g
JGR1bXBlci0+RHVtcCgpOw0KfQ0KDQpzdWIgc2V0X29iamVjdF9kZWJ1ZyB7DQogICAgbXkoICRz
ZWxmLCAkbGV2ZWwgKSA9IEBfOw0KICAgIG15ICRvYmpuYW1lID0gbGMgJHNlbGYtPmdldF9vYmpl
Y3RfbmFtZSgpOw0KICAgICRsZXZlbCA9IDEgaWYgIWRlZmluZWQgJGxldmVsOw0KICAgICRtYWlu
OjpEZWJ1Z3skb2JqbmFtZX0gPSAkbGV2ZWw7DQp9DQoNCnN1YiBzZXQgew0KICAgIG15ICggJHNl
bGYsICRzZXR2YWwsICRwX3NldGJ5LCAkcF9yZXNwb25zZSApID0gQF87DQoNCiAgICAkc2VsZi0+
ZGVidWcoIDEsICIkc2VsZi0+e29iamVjdF9uYW1lfSBzZXQgYnkgJHBfc2V0YnkgdG86ICIuICRz
ZWxmLT5kdW1wKCRzZXR2YWwpICk7DQogICAgaWYoICRwX3NldGJ5ID1+IC9oYXN2ciovICkgew0K
CSMgVGhpcyBpcyBob21lIGFzc2lzdGFudCBzZW5kaW5nIGEgc3RhdGUgY2hhbmdlIHZpYSB3ZWJz
b2NrZXQNCgkjIFRoaXMgc3RhdGUgY2hhbmdlIG1heSBvciBtYXkgbm90IGhhdmUgYmVlbiBpbml0
aWF0ZWQgYnkgdXMNCgkjIFRoaXMgaXMgc2VudCBhcyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRo
ZSBqc29uIG5ld19zdGF0ZQ0KCW15ICRuZXdfc3RhdGUgPSAkc2V0dmFsOw0KCWlmKCAkc2VsZi0+
e2RvbWFpbn0gZXEgJ3N3aXRjaCcgKSB7DQoJICAgICRzZWxmLT5TVVBFUjo6c2V0KCAkbmV3X3N0
YXRlLT57c3RhdGV9LCAkcF9zZXRieSwgJHBfcmVzcG9uc2UgKTsNCgl9IGVsc2lmKCAkc2VsZi0+
e2RvbWFpbn0gZXEgJ2xpZ2h0JyApIHsNCgkgICAgbXkgJGxldmVsID0gJG5ld19zdGF0ZS0+e3N0
YXRlfTsNCgkgICAgaWYoICRuZXdfc3RhdGUtPntzdGF0ZX0gZXEgJ29uJyApew0KCQlpZiggJG5l
d19zdGF0ZS0+e2F0dHJpYnV0ZXN9LT57YnJpZ2h0bmVzc30gKSB7DQoJCSAgICAkbGV2ZWwgPSAk
bmV3X3N0YXRlLT57YXR0cmlidXRlc30tPnticmlnaHRuZXNzfSAqIDEwMCAvIDI1NTsNCgkJfQ0K
CSAgICB9DQoJICAgICRzZWxmLT5TVVBFUjo6c2V0KCAkbGV2ZWwsICRwX3NldGJ5LCAkcF9yZXNw
b25zZSApOw0KCX0gZWxzaWYoICRzZWxmLT57ZG9tYWlufSBlcSAnc2Vuc29yJyAgfHwgICRzZWxm
LT57ZG9tYWlufSBlcSAnYmluYXJ5X3NlbnNvcicgKSB7DQoJICAgICRzZWxmLT5TVVBFUjo6c2V0
KCAkbmV3X3N0YXRlLT57c3RhdGV9LCAkcF9zZXRieSwgJHBfcmVzcG9uc2UgKTsNCgl9IGVsc2lm
KCAkc2VsZi0+e2RvbWFpbn0gZXEgJ2NsaW1hdGUnICkgew0KCSAgICBmb3JlYWNoIG15ICRhdHRy
bmFtZSAoa2V5cyAleyRuZXdfc3RhdGUtPnthdHRyaWJ1dGVzfX0gKSB7DQoJCSRzZWxmLT57YXR0
cn0tPnskYXR0cm5hbWV9ID0gJG5ld19zdGF0ZS0+e2F0dHJpYnV0ZXN9LT57JGF0dHJuYW1lfTsN
CgkgICAgfQ0KCSAgICAkc2VsZi0+ZGVidWcoIDEsICJjbGltYXRlIGF0dHJpYnV0ZXMgc2V0OiAi
IC4gJHNlbGYtPmR1bXAoJHNlbGYtPnthdHRyfSkgKTsNCgkgICAgJHNlbGYtPlNVUEVSOjpzZXQo
ICRuZXdfc3RhdGUtPntzdGF0ZX0sICRwX3NldGJ5LCAkcF9yZXNwb25zZSApOw0KCX0NCiAgICB9
IGVsc2Ugew0KCW15ICRjbWQ7DQoJIyBJdGVtIGhhcyBiZWVuIHNldCBsb2NhbGx5IC0tIHVzZSBI
QSBXZWJTb2NrZXQgdG8gY2hhbmdlIHN0YXRlDQoJaWYoICRzZWxmLT57ZG9tYWlufSBlcSAnbGln
aHQnICB8fCAgJHNlbGYtPntkb21haW59IGVxICdzd2l0Y2gnICkgew0KCSAgICAkY21kID0gJHNl
bGYtPmhhX3Jlc3Rfc2V0X2xpZ2h0KCAkc2V0dmFsICk7DQoJfSBlbHNpZiggJHNlbGYtPntkb21h
aW59IGVxICdjbGltYXRlJyApIHsNCgkgICAgJGNtZCA9ICRzZWxmLT5oYV9yZXN0X3NldF90aGVy
bSggJHNldHZhbCApOw0KCX0NCiAgICANCglpZiggISRjbWQgKSB7DQoJICAgICRzZWxmLT5lcnJv
ciggImludmFsaWQgZG9tYWluIHR5cGUgaW4gc2V0IG1ldGhvZCAoJHNlbGYtPntkb21haW59IiAp
Ow0KCX0gZWxzZSB7DQoJICAgICRzZWxmLT57aGFfc2VydmVyfS0+aGFfcHJvY2Vzc193cml0ZSgg
JGNtZCApOw0KCX0NCiAgICB9DQp9DQoNCg0Kc3ViIGhhX3Jlc3Rfc2V0X2xpZ2h0IHsNCiAgICBt
eSAoJHNlbGYsICRtb2RlKSA9IEBfOw0KICAgIG15ICRoYV9kYXRhID0ge307DQogICAgbXkgJGhh
X3Jlc3RfY21kOw0KICAgIG15ICRoYV9kYXRhX3RleHQ7DQogICAgbXkgJGNtZDsNCg0KICAgICRo
YV9kYXRhLT57aWR9ID0gKyskc2VsZi0+e2hhX3NlcnZlcn0tPntuZXh0X2lkfTsNCiAgICAkaGFf
ZGF0YS0+e3R5cGV9ID0gJ2NhbGxfc2VydmljZSc7DQogICAgJGhhX2RhdGEtPntkb21haW59ID0g
JHNlbGYtPntkb21haW59Ow0KICAgICRoYV9kYXRhLT57dGFyZ2V0fSA9IHt9Ow0KICAgICRoYV9k
YXRhLT57dGFyZ2V0fS0+e2VudGl0eV9pZH0gPSAkc2VsZi0+e2VudGl0eV9pZH07DQogICAgbXkg
KCRudW12YWwpID0gJG1vZGUgPX4gL14oWzEtOV0/WzAtOV0/WzAtOV0pJT8kLzsNCiAgICBpZigg
JG51bXZhbCApIHsNCgkkaGFfZGF0YS0+e3NlcnZpY2V9ID0gJ3R1cm5fb24nOw0KCSRoYV9kYXRh
LT57c2VydmljZV9kYXRhfSA9IHt9Ow0KCSRoYV9kYXRhLT57c2VydmljZV9kYXRhfS0+e2JyaWdo
dG5lc3NfcGN0fSA9ICRudW12YWw7DQogICAgfSBlbHNpZiggJG1vZGUgZXEgJ29uJyApIHsNCgkk
aGFfZGF0YS0+e3NlcnZpY2V9ID0gJ3R1cm5fb24nOw0KICAgIH0gZWxzaWYoICRtb2RlIGVxICd0
b2dnbGUnICkgew0KCSRoYV9kYXRhLT57c2VydmljZX0gPSAndG9nZ2xlJzsNCiAgICB9IGVsc2Ug
ew0KCSRoYV9kYXRhLT57c2VydmljZX0gPSAndHVybl9vZmYnOw0KICAgIH0NCiAgICByZXR1cm4o
ICRoYV9kYXRhICk7DQp9DQoNCnN1YiBoYV9yZXN0X3NldF90aGVybSB7DQogICAgbXkgKCRzZWxm
LCAkc2V0dmFsKSA9IEBfOw0KICAgIG15ICRoYV9kYXRhID0ge307DQogICAgbXkgJGNtZDsNCg0K
ICAgICMgdmFsaWQgc2VydmljZXMgYXJlOiAgdGVtcGVyYXR1cmUsIGZhbl9tb2RlLCBodmFjX21v
ZGUsIGF1eF9oZWF0DQogICAgbXkgKCRzZXJ2aWNlLCR2YWx1ZSkgPSBzcGxpdCggJzonLCAkc2V0
dmFsICk7DQogICAgaWYoICFkZWZpbmVkICRzZXJ2aWNlIHx8ICFkZWZpbmVkICR2YWx1ZSApIHsN
Cgkkc2VydmljZSA9ICRzZXR2YWw7DQogICAgfQ0KICAgIG15ICgkc2VydmljZV9uYW1lKSA9ICRz
ZXJ2aWNlID1+IC9zZXRfKC4qKS87DQogICAgaWYoICRzZXJ2aWNlID1+IC9zZXRfLiovICAmJiAg
IWRlZmluZWQgJHZhbHVlICkgew0KCSRzZWxmLT5lcnJvciggIkludmFsaWQgc2V0IHZhbHVlIGZv
ciBvYmplY3QgJHNlbGYtPntvYmplY3RfbmFtZX0gLS0gZm9ybSA8c2VydmljZT46PHZhbHVlPiIg
KTsNCglyZXR1cm47DQogICAgfQ0KICAgICRoYV9kYXRhLT57aWR9ID0gKyskc2VsZi0+e2hhX3Nl
cnZlcn0tPntuZXh0X2lkfTsNCiAgICAkaGFfZGF0YS0+e3R5cGV9ID0gJ2NhbGxfc2VydmljZSc7
DQogICAgJGhhX2RhdGEtPntkb21haW59ID0gJHNlbGYtPntkb21haW59Ow0KICAgICRoYV9kYXRh
LT57dGFyZ2V0fSA9IHt9Ow0KICAgICRoYV9kYXRhLT57dGFyZ2V0fS0+e2VudGl0eV9pZH0gPSAk
c2VsZi0+e2VudGl0eV9pZH07DQogICAgJGhhX2RhdGEtPntzZXJ2aWNlX2RhdGF9ID0ge307DQog
ICAgJGhhX2RhdGEtPntzZXJ2aWNlfSA9ICIke3NlcnZpY2V9IjsNCiAgICBpZiggZGVmaW5lZCAk
dmFsdWUgKSB7DQoJJGhhX2RhdGEtPntzZXJ2aWNlX2RhdGF9LT57JHNlcnZpY2VfbmFtZX0gPSAk
dmFsdWU7DQogICAgfQ0KICAgIHJldHVybiAkaGFfZGF0YTsNCn0NCg0KIyAtWyBGaW5pIC0gSEFf
SXRlbSBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tDQoNCjE7DQo=
--000000000000a2fe8f061480ecfa
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


--000000000000a2fe8f061480ecfa
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

________________________________________________________
To unsubscribe from this list, go to: https://lists.sourceforge.net/lists/listinfo/misterhouse-users


--000000000000a2fe8f061480ecfa--