Re: [mh] Alexa woes (again)

Wayne Gatlin <[email protected]> Mon, 13 May 2024 16:47:58 -0500
Newsgroups gmane.comp.misc.misterhouse.user
Message-ID <CA+E=przqGyP-XrTLTYQdkojM3SbJ5aPpN1oC7cRGpoVsrrQ6zQ@mail.gmail.com>
--0000000000006e74fa06185cd716
Content-Type: multipart/alternative; boundary="0000000000006e74f106185cd714"

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

Last week I logged everything out of my Amazon account without thinking
about it also logging all my Alexa devices out too. This ended up costing
me 3 days of pain because my Alexas started having the same issues everyone
else has been talking about in addition to my gen1 device not properly
connecting back at all.

The new code is attached if you want to check it out, I will do a code push
once I get my git back in order.

Anyway, I spent a bunch of time figuring out what a proper response should
look like and exactly what Amazon was looking for.
1. Generate a proper unique ID based on the device name. Requires
Data::UUID.
2. Remove any color properties. We don't do anything with color anyway,
just state and brightness.
3. Return min 1 for brightness, it doesn't seem to like seeing a 0 even
though the docs say 0-255. This caused discovery issues and caused the
Alexa app to show devices as unreachable.
4. Execute user defined subs with additional params so it can return the
correct value to Alexa. If you don't return the the correct
brightness/state back to Alexa it will complain that the device is not
working properly, this is an issue with my code that changes the heat and
cool value at the same time.
5. Update state response to match the discovery response.

Of course it ignores the SSDP discovery and only uses port 80, so you have
to run MH on port 80 or use something to proxy port 80 to the MH port. I
use socat because it's simple, but you will need to set it up as a service
so it will restart after boot.

apt install socat
socat TCP-LISTEN:80,fork TCP:127.0.0.1:8080&

This is my mh.private.ini config, this makes it send all devices (up to
160) in a single response because it doesn't seem to do multiple anymore.
It also forces everything to be on port 80 regardless of what port MH is
using.
alexa_enable=3D1
alexaEnableChunked=3D1
alexaObjectsPerGet=3D160
alexaHttpPort=3D80
alexaHttpPortCount=3D0


Lastly I had to update the thermostat change code in user code so it will
always return what Alexa thinks it should be as well as increase heat and
cool up or down by how much you asked it to change by. For this I ask
"Alexa, set thermostat up by 1" and the sub changes heat and cool up by 1.

$temperatureState =3D new Generic_Item; #noloop

sub temperature {
        my ($type, $state, $statesrc, $plevel, $levelsrc) =3D @_;
        &main::print_log("[temperature] Debug: Got: type:$type,
state:$state, statesrc:$statesrc, prevlevel:$plevel,
prevlevelsrc:$levelsrc");
        # $type is state or set
        # $state is the number, on, off, etc

        # we are changing heat and cool so just return a number, we just
need the diff.
        # we have to keep up with the number because alexa wants to see
that its what it
        # changed it to.
        my $laststate =3D (state $temperatureState);
        if ($type eq 'state') {
                if ($plevel =3D~ /\d+/ and ($plevel le 75) and ($plevel ge
25) and ($levelsrc eq 'ALEXA')) {
                        $temperatureState->set($plevel) unless ( (state
$temperatureState) eq $plevel); #Use the value from the get which is what
alexa thinks it is.
                        &main::print_log("[temperature] Debug: Stored
state: $plevel");
                } elsif ( !($laststate =3D~ /\d+/ and $laststate ge 25 and
$laststate le 75) ) {
                        $temperatureState->set(50); #Set Defaultif needed
                        &main::print_log("[temperature] Debug: Stored
state: 50 (default)");
                }
                &main::print_log("[temperature] Debug: Returning:". (state
$temperatureState) );
                return (state $temperatureState);
        }


        return '' unless ($state =3D~ /\d+/); Make sure we have a number
        return '' if ( ($state > $laststate) and (($laststate - $state) >
15) ); # Dont allow changes over 15
        return '' if ( ($state < $laststate) and (($state - $laststate) >
15) ); # Dont allow changes over 15
        $state =3D ($state - $laststate); # subtract the amount we return
above to get the actual amount to change.
        my $coolsp =3D ((state $thermo_setpoint_c) + $state);
        my $heatsp =3D ((state $thermo_setpoint_h) + $state);
        &main::print_log("[temperature] Debug: current_cool:".(state
$thermo_setpoint_c).", new_cool:$coolsp, current_heat:".(state
$thermo_setpoint_h).", new_heat:$heatsp, updateamount: $state, laststate:
$laststate, storedstate:". ($laststate + $state) );
        # The Insteon thermostat has an issue when setting both heat and
cool at the same time, so the timer is a work around.
        $alexa_temp_timer =3D new Timer;
        $thermostat->cool_setpoint($coolsp);
        set $alexa_temp_timer '7', sub {
$thermostat->heat_setpoint($heatsp) };
        $temperatureState->set($laststate + $state); #Save the value
}

On Wed, Feb 7, 2024 at 7:32=E2=80=AFPM Wayne Gatlin <[email protected]> wro=
te:

> If you aren't seeing any debug messages then it's probably an issue with
> multicast on the machine or permissions with port 80 which need elevated
> access. Make sure you see it listening on port 80 with net stat.
>
> If ssdp was working you would be seeing messages from all kinds of things
> on your network on the same subnet in addition to Alexa
>
> -Wayne
>
> On Wed, Dec 13, 2023, 12:35=E2=80=AFPM Paul Onley via misterhouse-users <
> [email protected]> wrote:
>
>> I have had similar experiences with alexa and what has worked for me is
>> to shut down all alexa devices. Use the phone app to delete all home
>> automation devices. Do a factory reset on one alexa device and use it to
>> "Discover new devices". It's a pain but has worked for me in the past. B=
e
>> aware that if this fixes it for you that you may have to repeat the proc=
ess
>> EACH TIME you want to add a new device so I recommend making sure you ha=
ve
>> all your devices defined the way you want them in the .mht file before
>> doing this.
>>
>> my current settings are the same as your but I have debug remarked and d=
o
>> not have the alexaHttpPortCount =3D 0 setting.
>>
>>
>>
>> On 12/12/23 15:14, Giles Godart-Brown wrote:
>>
>> All
>> I've just received my new Raspberry Pi5 and thought I would do a straigh=
t
>> install from scratch of the latest Master release.
>> All is well, apart from Alexa which wont discover any of my MH devices.
>> I've tried removing them all in the app and rebooting alexas but still n=
o
>> good.
>> The relevant part of my ini file is
>> <snip>
>> alexa_enable           =3D 1
>> alexaEnableChunked     =3D 1
>> alexaHttpIp            =3D 192.168.100.57
>> alexaHttpPortCount =3D 0
>> alexaHttpPort =3D 80
>> debug=3Dalexa:5
>> alexaForceLongFormat=3D1
>> </snip>
>> I haven't changed my items.mht file from the version that worked on my
>> old Pi4
>> Oddly I don't seem to be getting any alexa log messages during discovery=
,
>> just a couple during initialise viz;
>> <snip>
>> 12/12/2023 20:59:02 Alexa open_port: p=3D50000 pn=3DalexaSsdpNotificatio=
n
>> s=3DSocket_Item=3DHASH(0x5555705140a8)
>>
>> 12/12/2023 20:59:02 Alexa open_port: p=3D pn=3DalexaSsdpListen
>> s=3DSocket_Item=3DHASH(0x5555705143d8)
>> </snip>
>> Anyone got any ideas?
>> THX
>> Giles
>>
>>
>> ________________________________________________________
>> To unsubscribe from this list, go to: https://lists.sourceforge.net/list=
s/listinfo/misterhouse-users
>>
>>
>> ________________________________________________________
>> To unsubscribe from this list, go to:
>> https://lists.sourceforge.net/lists/listinfo/misterhouse-users
>>
>>

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

<div dir=3D"ltr"><div><div><div><div><div><div>Last week I logged everythin=
g out of my Amazon account without thinking about it also logging all my Al=
exa devices out too. This ended up costing me 3 days of pain because my Ale=
xas started having the same issues everyone else has been talking about in =
addition to my gen1 device not properly connecting back at all. <br><br></d=
iv><div>The new code is attached if you want to check it out, I will do a c=
ode push once I get my git back in order. <br></div><div><br></div>Anyway, =
I spent a bunch of time figuring out what a proper response should look lik=
e and exactly what Amazon was looking for. <br></div>1. Generate a proper u=
nique ID based on the device name. Requires Data::UUID. <br></div>2. Remove=
 any color properties. We don&#39;t do anything with color anyway, just sta=
te and brightness. <br></div>3. Return min 1 for brightness, it doesn&#39;t=
 seem to like seeing a 0 even though the docs say 0-255. This caused discov=
ery issues and caused the Alexa app to show devices as unreachable. <br></d=
iv>4. Execute user defined subs with additional params so it can return the=
 correct value to Alexa. If you don&#39;t return the the correct brightness=
/state back to Alexa it will complain that the device is not working proper=
ly, this is an issue with my code that changes the heat and cool value at t=
he same time. <br></div>5. Update state response to match the discovery res=
ponse. <br><div><div><div><div><div><div><br></div><div>Of course it ignore=
s the SSDP discovery and only uses port 80, so you have to run MH on port 8=
0 or use something to proxy port 80 to the MH port. I use socat because it&=
#39;s simple, but you will need to set it up as a service so it will restar=
t after boot. <br><br>apt install socat<br>socat TCP-LISTEN:80,fork TCP:127=
.0.0.1:8080&amp;<br><br>This is my mh.private.ini config, this makes it sen=
d all devices (up to 160) in a single response because it doesn&#39;t seem =
to do multiple anymore. It also forces everything to be on port 80 regardle=
ss of what port MH is using. <br>alexa_enable=3D1<br>alexaEnableChunked=3D1=
<br>alexaObjectsPerGet=3D160<br>alexaHttpPort=3D80<br>alexaHttpPortCount=3D=
0<br><br><br></div><div>Lastly I had to update the thermostat change code i=
n user code so it will always return what Alexa thinks it should be as well=
 as increase heat and cool up or down by how much you asked it to change by=
. For this I ask &quot;Alexa, set thermostat up by 1&quot; and the sub chan=
ges heat and cool up by 1.<br></div><div><br>$temperatureState =3D new Gene=
ric_Item; #noloop<br><br>sub temperature {<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 m=
y ($type, $state, $statesrc, $plevel, $levelsrc) =3D @_;<br>=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 &amp;main::print_log(&quot;[temperature] Debug: Got: type:$ty=
pe, state:$state, statesrc:$statesrc, prevlevel:$plevel, prevlevelsrc:$leve=
lsrc&quot;);<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 # $type is state or set<br>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 # $state is the number, on, off, etc<br><br>=C2=A0=
 =C2=A0 =C2=A0 =C2=A0 # we are changing heat and cool so just return a numb=
er, we just need the diff.<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 # we have to keep=
 up with the number because alexa wants to see that its what it<br>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 # changed it to.<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 my $la=
ststate =3D (state $temperatureState);<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ($=
type eq &#39;state&#39;) {<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 if ($plevel =3D~ /\d+/ and ($plevel le 75) and ($plevel ge 25) a=
nd ($levelsrc eq &#39;ALEXA&#39;)) {<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 $temperatureState-&gt;set(=
$plevel) unless ( (state $temperatureState) eq $plevel); #Use the value fro=
m the get which is what alexa thinks it is.<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 &amp;main::print_lo=
g(&quot;[temperature] Debug: Stored state: $plevel&quot;);<br>=C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } elsif ( !($laststate =3D~ /\d+=
/ and $laststate ge 25 and $laststate le 75) ) {<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 $temperature=
State-&gt;set(50); #Set Defaultif needed<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 &amp;main::print_log(&=
quot;[temperature] Debug: Stored state: 50 (default)&quot;);<br>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &amp;main::print_log(&quot;[temperature] De=
bug: Returning:&quot;. (state $temperatureState) );<br>=C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return (state $temperatureState);<br>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br><br><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 return=
 &#39;&#39; unless ($state =3D~ /\d+/); Make sure we have a number<br>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 return &#39;&#39; if ( ($state &gt; $laststate) an=
d (($laststate - $state) &gt; 15) ); # Dont allow changes over 15<br>=C2=A0=
 =C2=A0 =C2=A0 =C2=A0 return &#39;&#39; if ( ($state &lt; $laststate) and (=
($state - $laststate) &gt; 15) ); # Dont allow changes over 15<br>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 $state =3D ($state - $laststate); # subtract the amoun=
t we return above to get the actual amount to change.<br>=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 my $coolsp =3D ((state $thermo_setpoint_c) + $state);<br>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 my $heatsp =3D ((state $thermo_setpoint_h) + $state);<=
br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 &amp;main::print_log(&quot;[temperature] Deb=
ug: current_cool:&quot;.(state $thermo_setpoint_c).&quot;, new_cool:$coolsp=
, current_heat:&quot;.(state $thermo_setpoint_h).&quot;, new_heat:$heatsp, =
updateamount: $state, laststate: $laststate, storedstate:&quot;. ($laststat=
e + $state) );<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 # The Insteon thermostat has =
an issue when setting both heat and cool at the same time, so the timer is =
a work around.<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 $alexa_temp_timer =3D new Tim=
er;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 $thermostat-&gt;cool_setpoint($coolsp);<=
br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 set $alexa_temp_timer &#39;7&#39;, sub { $th=
ermostat-&gt;heat_setpoint($heatsp) };<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 $temp=
eratureState-&gt;set($laststate + $state); #Save the value<br>}<br></div></=
div></div></div></div></div></div><br><div class=3D"gmail_quote"><div dir=
=3D"ltr" class=3D"gmail_attr">On Wed, Feb 7, 2024 at 7:32=E2=80=AFPM Wayne =
Gatlin &lt;<a href=3D"mailto:[email protected]">[email protected]</a>&gt; w=
rote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0p=
x 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=
=3D"auto"><div>If you aren&#39;t seeing any debug messages then it&#39;s pr=
obably an issue with multicast on the machine or permissions with port 80 w=
hich need elevated access. Make sure you see it listening on port 80 with n=
et stat.</div><div dir=3D"auto"><br></div><div dir=3D"auto">If ssdp was wor=
king you would be seeing messages from all kinds of things on your network =
on the same subnet in addition to Alexa=C2=A0</div><div dir=3D"auto"><br></=
div><div dir=3D"auto">-Wayne<br><br><div class=3D"gmail_quote" dir=3D"auto"=
><div dir=3D"ltr" class=3D"gmail_attr">On Wed, Dec 13, 2023, 12:35=E2=80=AF=
PM Paul Onley via misterhouse-users &lt;<a href=3D"mailto:misterhouse-users=
@lists.sourceforge.net" target=3D"_blank">[email protected]=
ge.net</a>&gt; wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"m=
argin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left=
:1ex"><u></u>

 =20
   =20
 =20
  <div>
    <div>I have had similar experiences with
      alexa and what has worked for me is to shut down all alexa
      devices. Use the phone app to delete all home automation devices.
      Do a factory reset on one alexa device and use it to &quot;Discover n=
ew
      devices&quot;. It&#39;s a pain but has worked for me in the past. Be =
aware
      that if this fixes it for you that you may have to repeat the
      process EACH TIME you want to add a new device so I recommend
      making sure you have all your devices defined the way you want
      them in the .mht file before doing this.<br>
    </div>
    <div><br>
    </div>
    <div>my current settings are the same as
      your but I have debug remarked and do not have the <font size=3D"4" f=
ace=3D"Calibri"> alexaHttpPortCount =3D 0 setting.</font><br>
      <span style=3D"font-family:monospace"><br>
      </span></div>
    <div><br>
    </div>
    <div><br>
    </div>
    <div>On 12/12/23 15:14, Giles Godart-Brown
      wrote:<br>
    </div>
    <blockquote type=3D"cite">
     =20
      <font size=3D"4" face=3D"Calibri">All<br>
        I&#39;ve just received my new Raspberry Pi5 and thought I would do =
a
        straight install from scratch of the latest Master release.<br>
        All is well, apart from Alexa which wont discover any of my MH
        devices.<br>
        I&#39;ve tried removing them all in the app and rebooting alexas bu=
t
        still no good.<br>
        The relevant part of my ini file is <br>
        &lt;snip&gt;<br>
        alexa_enable=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0 =3D 1<br>
        alexaEnableChunked=C2=A0=C2=A0=C2=A0=C2=A0 =3D 1<br>
        alexaHttpIp=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0 =3D 192.168.100.57<br>
        alexaHttpPortCount =3D 0<br>
        alexaHttpPort =3D 80<br>
        debug=3Dalexa:5<br>
        alexaForceLongFormat=3D1<br>
        &lt;/snip&gt;<br>
        I haven&#39;t changed my items.mht file from the version that worke=
d
        on my old Pi4<br>
        Oddly I don&#39;t seem to be getting any alexa log messages during
        discovery, just a couple during initialise viz;<br>
        &lt;snip&gt;<br>
        12/12/2023 20:59:02 Alexa open_port: p=3D50000
        pn=3DalexaSsdpNotification s=3DSocket_Item=3DHASH(0x5555705140a8)<b=
r>
        <br>
        12/12/2023 20:59:02 Alexa open_port: p=3D pn=3DalexaSsdpListen
        s=3DSocket_Item=3DHASH(0x5555705143d8)<br>
        &lt;/snip&gt;<br>
        Anyone got any ideas?<br>
        THX<br>
        Giles<br>
      </font> <br>
      <fieldset></fieldset>
      <br>
      <fieldset></fieldset>
      <pre>________________________________________________________
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>

</pre>
    </blockquote>
    <p><br>
    </p>
  </div>

________________________________________________________<br>
To unsubscribe from this list, go to: <a href=3D"https://lists.sourceforge.=
net/lists/listinfo/misterhouse-users" rel=3D"noreferrer noreferrer" target=
=3D"_blank">https://lists.sourceforge.net/lists/listinfo/misterhouse-users<=
/a><br>
<br>
</blockquote></div></div></div>
</blockquote></div>

--0000000000006e74f106185cd714--
--0000000000006e74fa06185cd716
Content-Type: application/octet-stream; name="AlexaBridge.pm"
Content-Disposition: attachment; filename="AlexaBridge.pm"
Content-Transfer-Encoding: base64
Content-ID: <f_lw5go2t20>
X-Attachment-Id: f_lw5go2t20

Cj1oZWFkMSBCPEFsZXhhQnJpZGdlPgoKPWhlYWQyIERFU0NSSVBUSU9OCgpNb2R1bGUgZW11bGF0
ZXMgdGhlIEhVRSB0byBhbGxvdyBmb3IgZGlyZWN0IGNvbm5lY3Rpdml0eSBmcm9tIHRoZSBBbWF6
b24gRWNobywgR29vZ2xlIEhvbWUsIGFuZCBhbnkgb3RoZXIgZGV2aWNlcyB0aGF0IHN1cHBvcnQg
dGhlIEhVRSBicmlkZ2UuIApWZXJzaW9uIDIuMCAKCj1oZWFkMiBSZWxlYXNlIE5vdGVzCgpWZXJz
aW9uIDIuMCAoMTAtMjYtMTkpOgpBZGRlZCB0aGUgYWJpbGl0eSB0byByZXNwb25kIHdpdGggYSBz
dGF0ZSBhbmQgbGV2ZWwgYXQgdGhlIHNhbWUgdGltZSAoZnJvbSBhIHN1YikgaWYgbmVlZGVkLiBT
ZWUgRXhhbXBsZSBiZWxvdy4KCkZpeGVkIHRoZSByZXNwb25zZSB0byBhIGdldCB3aGVuIHlvdSB1
c2UgdGhlIGN1c3RvbSBtYXBwZWQgc3RhdGVzIHdpdGggYSBzdWIuIEJlZm9yZSB0aGUgZml4LCBp
ZiB0aGUgc3ViIHJlc3BvbmRlZCB3aXRoIHRoZSBjdXN0b20gc3RhdGUgaXQgd291bGQgbm90IGJl
IG1hcHBlZCBiYWNrIHRvIHRoZSBvbiBvciBvZmYgYmVmb3JlIGl0IHdhcyBzZW50IHRvIGFsZXhh
LgoKVGhlIHN0YXRlIHNlbnQgZnJvbSBhbGV4YSAoaW4gYSBnZXQgcmVxdWVzdCBhZnRlciBhbGV4
YSBzZW5kcyBhIHNldCByZXF1ZXN0KSBpcyB1c2VkIGFzIHRoZSBnZXQgcmVzcG9uc2UgaWYgaXQg
aXMgbm90IHJldHVybmVkIGZyb20gYSBjb25maWd1cmVkIHN1Yi4gVGhpcyBpcyBzbyB0aGUgZ2V0
IHN0YXRlIHJlcXVlc3QgZnJvbSBhbGV4YSBhbHdheXMgbWF0Y2hlcyB3aGF0IHNoZSBzZXQgaXQg
dG8gc28gc2hlIHdvbid0IHRocm93IHRoZSBtYWxmdW5jdGlvbiBlcnJvci4KCkkgdXNlIHRoZSBz
dGF0ZSBzZW50IGZyb20gYWxleGEgZm9yIHRoZSBnZXQgcmVxdWVzdCB0byBhbiBNSCB2b2ljZSBj
b21tYW5kIHRvIGF2b2lkIHRoZSBtYWxmdW5jdGlvbiBlcnJvci4gV2UgZG9uJ3QgZG8gYW55IHN0
YXRlIGNoZWNrcyBvbiBhbiBNSCB2b2ljZSBjb21tYW5kLgoKV2Ugbm93IHJlc3BvbmQgd2l0aCB0
aGUgZnVsbCBsaWdodCBkZWZpbml0aW9uIGR1cmluZyBhIGRpc2NvdmVyeSBiZWNhdXNlIHRoZSBu
ZXcgRWNobyB2ZXJzaW9uIGRvZXNuJ3QgbGlrZSB0aGUgc2hvcnQgZGVmaW5pdGlvbi4gVGhpcyBp
cyBvayBub3cgYmVjYXVzZSB0aGUgRWNobyBub3cgdXNlcyBnemlwIGNvbXByZXNzaW9uIHNvIGl0
IGRvZXMgbm90IGxpbWl0IHRoZSBhbW91bnQgb2Ygc3VwcG9ydGVkIGRldmljZXMKCj1oZWFkMiBD
T05GSUdVUkFUSU9OCgoKVGhlIEFsZXhhQnJpZGdlX0l0ZW0gb2JqZWN0IGhvbGRzIHRoZSBjb25m
aWd1cmVkIE1pc3RlcmhvdXNlIG9iamVjdHMgdGhhdCBhcmUgcHJlc2VudGVkIHRvIHRoZSBBbWF6
b24gRWNobyBvciBHb29nbGUgSG9tZS4KU2VlIDxBbGV4YUJyaWRnZV9JdGVtPgoKPWhlYWQyIG1o
LnByaXZhdGUuaW5pIENvbmZpZ3VyYXRpb24KCk5vdGU6IApZb3UgbXVzdCB1c2UgcG9ydCA4MCBm
b3IgR29vZ2xlIEhvbWUsIGl0IGlzIGxvY2tlZCBkb3duIHRvIHBvcnQgODAuClRoZSB1c2VyIHJ1
bm5pbmcgTUggbXVzdCBiZSByb290IHRvIHJ1biBvbiBwb3J0IDgwIG9yIHlvdSBoYXZlIHRvIGdp
dmUgdGhlIE1IIHVzZXIgcmlnaHRzIHRvIHVzZSB0aGUgcG9ydC4KCkZvciBHb29nbGUgSG9tZSBh
bmQgYSByZXZlcnNlIHByb3h5IChBcGFjaGUvSUlTL2V0Yyk6CgogYWxleGFfZW5hYmxlID0gMQog
YWxleGFIdHRwUG9ydENvdW50ID0gMCAgICMgZGlzYWJsZXMgYWxsIHByb3h5IHBvcnRzCiBhbGV4
YUh0dHBQb3J0ID0gODAgICAgICAgIyB0ZWxscyB0aGUgbW9kdWxlIHRvIHNlbmQgcG9ydCA4MCBp
biB0aGUgU1NEUCByZXNwb25zZSBhbmQgbG9vayBmb3IgcG9ydCA4MCBpbiB0aGUgSFRUUCBob3N0
IGhlYWRlcgogYWxleGFPYmplY3RzUGVyR2V0ID0gMzAwICMgR29vZ2xlIEhvbWUgY2FuIGhhbmRs
ZSB1cyByZXR1cm5pbmcgYWxsIG9iamVjdHMgaW4gYSBzaW5nbGUgcmVzcG9uc2UKCkZvciBHb29n
bGUgSG9tZSB1c2luZyB0aGUgYnVpbHRpbiBwcm94eSBwb3J0OgpUaGlzIG1ldGhvZCBzaG91bGQg
bm90IGJlIHVzZWQuCgogYWxleGFfZW5hYmxlID0gMQogYWxleGFIdHRwUG9ydENvdW50ID0gMSAg
ICMgT3BlbiAxIHByb3h5IHBvcnQgb24gcG9ydCA4MCAoV2UgZGVmYXVsdCB0byBwb3J0IDgwIHNv
IG5vIG5lZWQgdG8gZGVmaW5lIGl0KQogYWxleGFOb0RlZmF1bHRIdHRwID0gMSAgICMgRGlzYWJs
ZSByZXNwb25kaW5nIG9uIHRoZSBkZWZhdWx0IE1IIHdlYiBwb3J0IGJlY2F1c2UgR29vZ2xlIEhv
bWUgd2lsbCBub3QgdXNlIGl0IGFueSB3YXkuCiBhbGV4YU9iamVjdHNQZXJHZXQgPSAzMDAgIyBH
b29nbGUgSG9tZSBjYW4gaGFuZGxlIHVzIHJldHVybmluZyBhbGwgb2JqZWN0cyBpbiBhIHNpbmds
ZSByZXNwb25zZQoKCk5vdGU6IApPbiBzb21lIG5ld2VyIEVjaG8gdmVyc2lvbnMsIHlvdSBtdXN0
IHVzZSBwb3J0IDgwLgoKRm9yIEVjaG8gKENodW5rZWQgbWV0aG9kKToKCiBhbGV4YV9lbmFibGUg
PSAxCiBhbGV4YUVuYWJsZUNodW5rZWQgPSAxCgoKRm9yIEVjaG8gKE11bHRpLXBvcnQgbWV0aG9k
KToKVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLgoKIGFsZXhhX2VuYWJsZSA9IDEKIGFs
ZXhhSHR0cFBvcnRDb3VudCA9IDEgICMgT3BlbiAxIHByb3h5IHBvcnQgZm9yIGEgdG90YWwgb2Yg
MiBwb3J0cyBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgTUggd2ViIHBvcnQuIFdlIG9ubHkgc3VwcG9y
dCAxIGZvciBub3cgdW5sZXNzIEkgc2VlIGEgbmVlZCBmb3IgbW9yZS4KIGFsZXhhSHR0cFBvcnQ9
ODA4NSAgICAgICAgICAgICAjIFRoZSBwcm94eSBwb3J0IHdpbGwgYmUgb24gcG9ydCA4MDg1LCB0
aGlzIHBvcnQgc2hvdWxkIGJlIGhpZ2hlciB0aGFuIHRoZSBNSCB3ZWIgcG9ydCBzbyBpdCBpcyB1
c2VkIGZpcnN0LgoKCiMgQWxsIG9wdGlvbnMKCiBhbGV4YV9lbmFibGUgICAgICAgIyBFbmFibGUg
dGhlIG1vZHVsZQogYWxleGFFbmFibGVDaHVua2VkICAjIEVuYWJsZSBjaHVua2VkIHJldHVybiBt
ZXRob2QgKEZvciB0aGUgRWNobykKIGFsZXhhSHR0cFBvcnRDb3VudCAgIyBBbW91bnQgb2YgcHJv
eHkgcG9ydHMgdG8gb3BlbgogYWxleGFOb0RlZmF1bHRIdHRwICAjIERpc2FibGUgcmVzcG9uZGlu
ZyBvbiB0aGUgZGVmYXVsdCBNSCB3ZWIgcG9ydAogYWxleGFPYmplY3RzUGVyR2V0ICAjIEFtb3Vu
dCBvZiBNSCBvYmplY3RzIHdlIHJldHVybiBwZXIgR0VUIGZyb20gdGhlIEVjaG8vR0gKIGFsZXhh
SHR0cFBvcnQgICAgICAjIEZpcnN0IHByb3h5IHBvcnQgbnVtYmVyCiBhbGV4YU1hYyAgICAgICAg
ICAgICAgICMgVGhpcyBpcyB1c2VkIGluIHRoZSBTU0RQIHJlc3BvbnNlLCBXZSBkaXNjb3ZlciBp
dCBzbyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlZmluZWQgdW5sZXNzIHNvbWV0aGluZyBnb2Vz
IHdyb25nCiBhbGV4YUh0dHBJcCAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgSVAgb2YgdGhlIGxv
Y2FsIE1IIHNlcnZlciwgV2UgZGlzY292ZXIgaXQgc28gaXQgZG9lcyBub3QgbmVlZCB0byBiZSBk
ZWZpbmVkIHVubGVzcyBzb21ldGhpbmcgZ29lcyB3cm9uZwoKPWhlYWQyIERlZmluaW5nIHRoZSBQ
cmltYXJ5IE9iamVjdAoKVGhlIG9iamVjdCBjYW4gYmUgZGVmaW5lZCBpbiB0aGUgdXNlciBjb2Rl
IG9yIGluIGEgLm1odCBmaWxlLgoKSW4gbWh0OgoKIEFMRVhBX0JSSURHRSwgQWxleGEKCgpPciBp
biB1c2VyIGNvZGU6CgogJEFsZXhhID0gbmV3IEFsZXhhQnJpZGdlKCk7ICAjIHBhcmVudCBvYmpl
Y3QKCgo9aGVhZDIgTk9URVMKClRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIHRoZSBjb25maWd1
cmF0aW9uIGlzIG1hcHBpbmcgdGhlIG9iamVjdHMvY29kZSB5b3Ugd2FudCB0byBwcmVzZW50IHRv
IHRoZSBtb2R1bGUgKEVjaG8vR29vZ2xlIEhvbWUvRXRjLikuClRoaXMgYWxsb3dzIHRoZSB1c2Vy
IHRvIG1hcCBwcmV0dHkgbXVjaCBhbnl0aGluZyBpbiBNSCB0byBhIEVjaG8vR0ggY29tbWFuZC4K
ICAKIEFMRVhBQlJJREdFX0FERCwgPGFjdHVhbCBvYmplY3QgbmFtZT4sIDxuYW1lIHlvdSB3YW50
IEVjaG8vR0ggdG8gc2VlPiwgPHN1YiB1c2VkIHRvIGNoYW5nZSB0aGUgb2JqZWN0IHN0YXRlPiwg
CiA8U3RhdGUgbWFwcGVkIHRvIEVjaG8vR0ggT04gY29tbWFuZD4sIDxTdGF0ZSBtYXBwZWQgdG8g
RWNoby9HSCBPRkYgY29tbWFuZD4sIDxzdWIgdXNlZCB0byBnZXQgdGhlIG9iamVjdCBzdGF0ZT4K
CjxhY3R1YWwgb2JqZWN0IG5hbWU+IC0gVGhpcyBpcyB0aGUgb25seSByZXF1aXJlZCBwYXJhbWV0
ZXIuIElmIHlvdSBhcmUKZ29vZCB3aXRoIHRoZSBkZWZhdWx0cywgeW91IGNhbiBhZGQgYW4gb2Jq
ZWN0IGxpa2U6CiMgSW4gTUhUCgogQUxFWEFCUklER0VfQURELCBBbGV4YUl0ZW1zLCBsaWdodDEg
CgojIG9yIGluIHVzZXIgY29kZQoKICRBbGV4YUl0ZW1zLT5hZGQoJyRsaWdodDEnKTsgICAgICAg
ICAKCjxuYW1lIHlvdSB3YW50IEVjaG8vR0ggdG8gc2VlPiAtIFRoaXMgZGVmYXVsdHMgdG8gdXNp
bmcgdGhlIDxhY3R1YWwKb2JqZWN0IG5hbWU+IHdpdGhvdXQgdGhlICQuIElmIHdhbnQgdG8gY2hh
bmdlIHRoZSBuYW1lIHlvdSBzYXkgdG8gdGhlCkVjaG8vR0ggdG8gY29udHJvbCB0aGUgb2JqZWN0
LCB5b3UgY2FuIGRlZmluZSBpdCBoZXJlLiBZb3UgY2FuIGFsc28gbWFrZQphbGlhc2VzIGZvciBv
YmplY3RzIHNvIGl0J3MgZWFzaWVyIHRvIHJlbWVtYmVyLgoKPHN1YiB1c2VkIHRvIGNoYW5nZSB0
aGUgb2JqZWN0IHN0YXRlPiAtIFRoaXMgZGVmYXVsdHMgdG8gJ3NldCcgd2hpY2gKd29ya3MgZm9y
IG1vc3Qgb2JqZWN0cy4gWW91IGNhbiBhbHNvIHB1dCBhIGNvZGUgcmVmZXJlbmNlIG9yCidydW5f
dm9pY2VfY21kJy4KCjxTdGF0ZSBtYXBwZWQgdG8gRWNoby9HSCBvbiBjb21tYW5kPiAtIElmIHlv
dSB3YW50IHRvIHNldCBhbiBvYmplY3QgdG8Kc29tZXRoaW5nIG90aGVyIHRoYW4gJ29uJyB3aGVu
IHlvdSBzYXkgJ29uJyB0byB0aGUgRWNoby9HSCwgeW91IGNhbiBkZWZpbmUKaXQgaGVyZS4gRGVm
YXVsdHMgdG8gJ29uJy4KCjxTdGF0ZSBtYXBwZWQgdG8gRWNoby9HSCBPRkYgY29tbWFuZD4gLSBJ
ZiB5b3Ugd2FudCB0byBzZXQgYW4gb2JqZWN0IHRvCnNvbWV0aGluZyBvdGhlciB0aGFuICdvZmYn
IHdoZW4geW91IHNheSAnb2ZmJyB0byB0aGUgRWNoby9HSCwgeW91IGNhbgpkZWZpbmUgaXQgaGVy
ZS4gRGVmYXVsdHMgdG8gJ29mZicuCgo8c3ViIHVzZWQgdG8gZ2V0IHRoZSBvYmplY3Qgc3RhdGU+
IC0gSWYgeW91ciBvYmplY3QgdXNlcyBhIGN1c3RvbSBzdWIgdG8KZ2V0IHRoZSBzdGF0ZSwgZGVm
aW5lIGl0IGhlcmUuIERlZmF1bHRzIHRvICdzdGF0ZScgd2hpY2ggd29ya3MgZm9yIG1vc3QKb2Jq
ZWN0cy4KCgpUaGUgZGltICUgaXMgdGhlIGFjdHVhbCBudW1iZXIgeW91IHNheSB0byBBbGV4YSwg
c28gaWYgeW91IHNheSAiQWxleGEsU2V0CkxpZ2h0IDEgdG8gNzUgJSIgdGhlbiB0aGUgZGltICUg
dmFsdWUgd2lsbCBiZSA3NS4KCgpUaGUgbW9kdWxlIHN1cHBvcnRzIDMwMCBkZXZpY2VzIHdoaWNo
IGlzIHRoZSBtYXggc3VwcG9ydGVkIGJ5IHRoZSBFY2hvIAoKCgo9aGVhZDIgQ29tcGxldGUgRXhh
bXBsZXMKCgpNSFQgZXhhbXBsZXM6CiAKIEFMRVhBX0JSSURHRSwgQWxleGEKIEFMRVhBQlJJREdF
X0lURU0sIEFsZXhhSXRlbXMsIEFsZXhhCiBBTEVYQUJSSURHRV9BREQsIEFsZXhhSXRlbXMsIGxp
Z2h0MSBsaWdodDEsIHNldCwgb24sIG9mZiwgc3RhdGUgICMgdGhlc2UgYXJlIHRoZSBkZWZhdWx0
cwogQUxFWEFCUklER0VfQURELCBBbGV4YUl0ZW1zLCBsaWdodDEgICAjIHNhbWUgYXMgdGhlIGxp
bmUgYWJvdmUKIEFMRVhBQlJJREdFX0FERCwgQWxleGFJdGVtcywgbGlnaHQzLCBUZXN0X0xpZ2h0
XzMgICAjIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgbmFtZSB5b3Ugc2F5CiBBTEVYQUJSSURH
RV9BREQsIEFsZXhhSXRlbXMsIHRlc3RzdWIsIFRlc3RfU3ViLCBcJnRlc3RzdWIKIyAiISIgd2ls
bCBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3Rpb24gKCBvbi9vZmYvPGxldmVsIG51bWJlcj4gKSwg
c28gaWYgeW91IHNheSAidHVybiBvbiB0ZXN0IHZvaWNlIiB0aGVuIHRoZSBtb2R1bGUgd2lsbCBy
dW4gcnVuX3ZvaWNlX2NtZCgidGVzdCB2b2ljZSBvbiIpCiBBTEVYQUJSSURHRV9BREQsIEFsZXhh
SXRlbXMsIHRlc3Rfdm9pY2VfISwgVGVzdF9Wb2ljZSwgcnVuX3ZvaWNlX2NtZAoKClVzZXIgY29k
ZSBleGFtcGxlczoKCiAkQWxleGEgPSBuZXcgQWxleGFCcmlkZ2UoKTsgICMgcGFyZW50IG9iamVj
dAogJEFsZXhhSXRlbXMgPSBuZXcgQWxleGFCcmlkZ2VfSXRlbSgkQWxleGEpOyAgIyBjaGlsZCBv
YmplY3QKCiAkQWxleGFJdGVtcy0+YWRkKCckbGlnaHQxJywnbGlnaHQxJywnc2V0Jywnb24nLCdv
ZmYnLCdzdGF0ZScpOyAgIyBUaGlzIGlzIHRoZSBzYW1lIGFzICRBbGV4YUl0ZW1zLT5hZGQoJyRs
aWdodDEnKQoKCiAKVG8gY2hhbmdlIHRoZSBuYW1lIG9mIGFuIG9iamVjdCB0byBhIG1vcmUgbmF0
dXJhbCBuYW1lIHRoYXQgeW91IHdvdWxkIHNheSB0byB0aGUgRWNoby9HSDoKCiAkQWxleGFJdGVt
cy0+YWRkKCckR2FyYWdlSGFsbF9saWdodF9mcm9udCcsJ0dhcmFnZV9IYWxsX2xpZ2h0Jyk7CgoK
VG8gbWFwIGEgdm9pY2UgY29tbWFuZCwgIyBpcyByZXBsYWNlZCBieSB0aGUgRWNoby9HSCBjb21t
YW5kIChvbi9vZmYvZGltJSkuCk15IGFjdHVhbCB2b2ljZSBjb21tYW5kIGluIE1IIGlzICJzZXQg
bmlnaHQgbW9kZSBvbiIsIHNvIEkgY29uZmlndXJlIGl0IGxpa2U6CgogJEFsZXhhSXRlbXMtPmFk
ZCgnc2V0IG5pZ2h0IG1vZGUgIScsJ05pZ2h0TW9kZScsJ3J1bl92b2ljZV9jbWQnKTsgICAKCiBJ
ZiBJIHNheSAiQWxleGEsIFR1cm4gb24gTmlnaHQgTW9kZSIsICBydW5fdm9pY2VfY21kKCJzZXQg
bmlnaHQgbW9kZSBvbiIpIGlzIHJ1biBpbiBNSC4KCgpUbyBjb25maWd1cmUgYSB1c2VyIGNvZGUg
c3ViOgpUaGUgYWN0dWFsIG5hbWUgKGFyZ3VtZW50IDEpIGNhbiBiZSBhbnl0aGluZy4KQSBjb2Rl
IHJlZiBtdXN0IGJlIHVzZWQuCldoZW4gdGhlIHN1YiBpcyBydW4gMiBhcmd1bWVudHMgYXJlIHBh
c3NlZCB0byBpdDogQXJndW1lbnQgMSBpcyAoc3RhdGUgb3Igc2V0KSBBcmd1bWVudCAyIGlzOiAo
b24vb2ZmLzxkaW0gJSBpbnRlcmdlcj4pLgoKIyBNaHQgZmlsZQoKIEFMRVhBQlJJREdFX0FERCwg
QWxleGFJdGVtcywgdGVzdHN1YiwgVGVzdF9TdWIsICZ0ZXN0c3ViCgojIFVzZXIgQ29kZQoKICRB
bGV4YUl0ZW1zLT5hZGQoJ3Rlc3RzdWInLCdUZXN0X1N1YicsXCZ0ZXN0c3ViKTsgICMgc2F5ICJB
bGV4YSwgVHVybiBvbiBUZXN0IFN1YiIsICAmdGVzdHN1Yignc2V0Jywnb24nKSBpcyBydW4gaW4g
TUguCgoKIyBJIGhhdmUgYW4gSW5zdGVvbiB0aGVybW9zdGF0LCB0aGUgSW5zdGVvbiBvYmplY3Qg
bmFtZSBpcyAkdGhlcm1vc3RhdCBhbmQgSSBjb25maWd1cmVkIGl0IGxpa2U6CgogQUxFWEFCUklE
R0VfQURELCBBbGV4YUl0ZW1zLCB0aGVybW9zdGF0LCBIZWF0LCBoZWF0X3NldHBvaW50LCBvbiwg
b2ZmLCBnZXRfaGVhdF9zcAoKIyBzYXkgIkFsZXhhLCBTZXQgSGVhdCB0byA3MyIsICAkdGhlcm1v
c3RhdC0+aGVhdF9zZXRwb2ludCgiNzMiKSBpcyBydW4gaW4gTUguCgogQUxFWEFCUklER0VfQURE
LCBBbGV4YUl0ZW1zLCB0aGVybW9zdGF0LCBDb29sLCBjb29sX3NldHBvaW50LCBvbiwgb2ZmLCBn
ZXRfY29vbF9zcAoKIApJbiBvcmRlciB0byBiZSBhYmxlIHRvIHNheSB0aGluZ3MgbGlrZSAiQWxl
eGEsIHNldCB0aGVybW9zdGF0IHVwIGJ5IDIiLCBhIHN1YiBtdXN0IGJlIGNyZWF0ZWQgaW4gdXNl
ciBjb2RlCldoZW4gdGhlIGFib3ZlIGlzIHNhaWQgdG8gdGhlIEVjaG8sIGl0IGZpcnN0IGdldHMg
dGhlIGN1cnJlbnQgc3RhdGUsIHRoZW4gc3VidHJhY3RzIG9yIGFkZHMgdGhlIGFtb3VudCB0aGF0
IHdhcyBzYWlkLiAKCiBzdWIgdGVtcGVyYXR1cmUgewogICBteSAoJHR5cGUsICRzdGF0ZSkgPSBA
XzsKCiAgICMgJHR5cGUgaXMgc3RhdGUgb3Igc2V0CiAgICMgJHN0YXRlIGlzIHRoZSBudW1iZXIs
IG9uLCBvZmYsIGV0YwoKICAgIyB3ZSBhcmUgY2hhbmdpbmcgaGVhdCBhbmQgY29vbCBzbyBqdXN0
IHJldHVybiBhIHN0YXRpYyBudW1iZXIsIHdlIGp1c3QgbmVlZCB0aGUgZGlmZgogICAjIGJlY2F1
c2UgdGhlIEVjaG8gd2lsbCBhZGQgb3Igc3VidGFjdCB0aGUgYW1vdW50IHRoYXQgd2FzIHNhaWQg
dG8gaXQuCiAgICMgc28gaWYgd2Ugc2F5ICJzZXQgdGhlcm1vc3RhdCB1cCBieSAyIiwgNTIgd2ls
bCBiZSByZXR1cm5lZCBpbiAkc3RhdGUgICAKICAgaWYgKCR0eXBlIGVxICdzdGF0ZScpIHsgcmV0
dXJuIDUwOyB9CgogICByZXR1cm4gJycgdW5sZXNzICgkc3RhdGUgPX4gL1xkKy8pOyBNYWtlIHN1
cmUgd2UgaGF2ZSBhIG51bWJlcgogICByZXR1cm4gJycgaWYgKCRzdGF0ZSA+IDY1KTsgIyBEb250
IGFsbG93IGNoYW5nZXMgb3ZlciAxNQogICByZXR1cm4gJycgaWYgKCRzdGF0ZSA8IDM1KTsgIyBE
b250IGFsbG93IGNoYW5nZXMgb3ZlciAxNQogICBteSAoICRoZWF0c3AsICRjb29sc3AgKTsKICAg
JHN0YXRlID0gKCRzdGF0ZSAtIDUwKTsgIyBzdWJ0cmFjdCB0aGUgYW1vdW50IHdlIHJldHVybiBh
Ym92ZSB0byBnZXQgdGhlIGFjdHVhbCBhbW91bnQgdG8gY2hhbmdlLgogICAkY29vbHNwID0gKChz
dGF0ZSAkdGhlcm1vX3NldHBvaW50X2MpICsgJHN0YXRlKTsKICAgJGhlYXRzcCA9ICgoc3RhdGUg
JHRoZXJtb19zZXRwb2ludF9oKSArICRzdGF0ZSk7CiAgICMgVGhlIEluc3Rlb24gdGhlcm1vc3Rh
dCBoYXMgYW4gaXNzdWUgd2hlbiBzZXR0aW5nIGJvdGggaGVhdCBhbmQgY29vbCBhdCB0aGUgc2Ft
ZSB0aW1lLCBzbyB0aGUgdGltZXIgaXMgYSB3b3JrIGFyb3VuZC4KICAgJGFsZXhhX3RlbXBfdGlt
ZXIgPSBuZXcgVGltZXI7CiAgICR0aGVybW9zdGF0LT5jb29sX3NldHBvaW50KCRjb29sc3ApOwog
ICBzZXQgJGFsZXhhX3RlbXBfdGltZXIgJzcnLCBzdWIgeyAkdGhlcm1vc3RhdC0+aGVhdF9zZXRw
b2ludCgkaGVhdHNwKSB9CiB9CgojIE1hcCBvdXIgbmV3IHRlbXBlcmF0dXJlIHN1YiBpbiB0aGUg
Lm1odCBmaWxlIHNvIHRoZSBFY2hvL0dvb2dsZSBIb21lIGNhbiBkaXNjb3ZlciBpdCAKCiBBTEVY
QUJSSURHRV9BREQsIEFsZXhhSXRlbXMsIHRoZXJtb3N0YXQsIHRoZXJtb3N0YXQsICZ0ZW1wZXJh
dHVyZQoKCiMgVGhpcyBpcyBhIHNpbXBsZSBnZW5lcmljIGV4YW1wbGUgb2YgYSBzdWI6Cgogc3Vi
IGxpZ2h0MSB7CiAgICAgICAgbXkgKCR0eXBlLCAkc3RhdGUpID0gQF87CiAgICAgICAgI1R5cGUg
c3RhdGUgLSBzaG91bGQgcmV0dXJuOgogICAgICAgICMgIC0gb24gb3Igb2ZmCiAgICAgICAgIyAg
LSBvciBhIGN1c3RvbSBzdGF0ZSBtYXBwZWQgdG8gb24gb3Igb2ZmIGluIHRoZSBBbGV4YUJyaWRn
ZV9JdGVtCiAgICAgICAgIyAgLSBvciBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCAobGV2ZWwp
CiAgICAgICAgIyAgLSBvciB0aGUgc3RhdGUgYW5kIGxldmVsIG51bWJlciBjb21tYSBzZXBhcmF0
ZWQuIG9uL29mZi9jdXN0b20gc3RhdGUsbGV2ZWwuIElFOiBvbiw3NQogICAgICAgICMKICAgICAg
ICAjVHlwZSBzZXQgLSB0aGlzIGlzIHdoZW4gYWxleGEgaXMgYXNrZWQgdG8gdHVybiB0aGlzIGRl
dmljZSBvbi9vZmYgc28gdGhlIHN0YXRlIHNob3VsZCBiZSBzZXQgdG8gJHN0YXRlIG9yIHlvdXIg
YWN0aW9uIHNob3VsZCBiZSBydW4uCgogICAgICAgIGlmICgkdHlwZSBlcSAnc3RhdGUnKSB7CiAg
ICAgICAgICAgICAgICBpZiAoICRsaWdodDEtPmNhbignaXNfZGltbWFibGUnKSAgJiYgICRsaWdo
dDEtPmlzX2RpbW1hYmxlICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHN0YXRl
ICRsaWdodDEpLicsJy4kbGlnaHQxLT5sZXZlbDsgIyBFeGFtcGxlIHJldHVybmluZyBzdGF0ZSBh
bmQgbGV2ZWwuIE5PVEU6IEVuc3VyZSBzdGF0ZSBpcyBOT1QgbnVtZXJpYwogICAgICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gJGxpZ2h0MS0+bGV2ZWw7ICMgRXhhbXBsZSByZXR1cm5pbmcgbGV2
ZWwgb25seS4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gKHN0YXRlICRsaWdodDEpOyAjIEV4YW1wbGUgcmV0dXJu
aW5nIHN0YXRlIG9ubHkuIElmIGEgbnVtZXJpYyB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgaXMgY29u
c2lkZXJlZCB0aGUgbGV2ZWwgYW5kIHRoZSBzdGF0ZSBpcyBjb25zaWRlcmVkIG9uLgogICAgICAg
ICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoJHR5cGUgZXEgJ3NldCcpIHsKICAg
ICAgICAgICAgICAgICRsaWdodDEtPnNldCgkc3RhdGUpOwogICAgICAgIH0KIH0KCkkgaGF2ZSBh
IHNjcmlwdCB0aGF0IEkgdXNlIHRvIGNvbnRyb2wgbXkgQVYgZXF1aXBtZW50IGFuZCBJIGNhbiBy
dW4gaXQgdmlhCnNzaCwgc28gSSBtYWRlIGEgdm9pY2UgY29tbWFuZCBpbiBNSDoKCiAkdl9zZXRf
dHZfbW9kZSA9IG5ldyBWb2ljZV9DbWQoInNldCB0diBtb2RlIFtvbixvZmYsaGJvLG5ldGZsaXgs
cm9rdSxkaXJlY3R0dix4Ym1jLHdpaV0iKTsKICRwX3NldF90dl9tb2RlID0gbmV3IFByb2Nlc3Nf
SXRlbTsKIGlmIChteSAkc3RhdGUgPSBzYWlkICR2X3NldF90dl9tb2RlKSB7CiAgICAgICAgIHNl
dCAkcF9zZXRfdHZfbW9kZSAiL3Vzci9iaW4vc3NoIHdheW5lXEAxOTIuMTY4LjEuMTAgXCJzdWRv
IC91c3IvbG9jYWwvSG9tZUFWQ29udHJvbC9iaW4vaW5wdXRfY2hhbmdlICRzdGF0ZVwiIjsKICAg
ICAgICAgc3RhcnQgJHBfc2V0X3R2X21vZGU7CiB9CgpJIGFkZGVkIHRoZSBmb2xsb3dpbmcgdG8g
bXkgLm1odCBmaWxlOgoKIEFMRVhBQlJJREdFX0FERCwgQWxleGFJdGVtcywgc2V0X3R2X21vZGVf
ISwgRGlyZWN0VHYsIHJ1bl92b2ljZV9jbWQsIGRpcmVjdHR2LCBkaXJlY3R0dgogQUxFWEFCUklE
R0VfQURELCBBbGV4YUl0ZW1zLCBzZXRfdHZfbW9kZV8hLCBSb2t1LCBydW5fdm9pY2VfY21kLCBy
b2t1LCByb2t1CiBBTEVYQUJSSURHRV9BREQsIEFsZXhhSXRlbXMsIHNldF90dl9tb2RlXyEsIHhi
bWMsIHJ1bl92b2ljZV9jbWQsIHhibWMsIHhibWMKIEFMRVhBQlJJREdFX0FERCwgQWxleGFJdGVt
cywgc2V0X3R2X21vZGVfISwgd2lpLCBydW5fdm9pY2VfY21kLCB3aWksIHdpaQogQUxFWEFCUklE
R0VfQURELCBBbGV4YUl0ZW1zLCBzZXRfdHZfbW9kZV8hLCBIYm8sIHJ1bl92b2ljZV9jbWQsIGhi
bywgaGJvCiBBTEVYQUJSSURHRV9BREQsIEFsZXhhSXRlbXMsIHNldF90dl9tb2RlXyEsIE5ldGZs
aXgsIHJ1bl92b2ljZV9jbWQsIG5ldGZsaXgsIG5ldGZsaXgKCgoKPWhlYWQyIElOSEVSSVRTCgpM
PEdlbmVyaWNfSXRlbT4KCkhUVFA6OkRhdGUKSU86OkNvbXByZXNzOjpHemlwClRpbWU6OkhpUmVz
Ck5ldDo6QWRkcmVzczo6RXRoZXJuZXQKU3RvcmFibGUKSU86OlNvY2tldDo6SU5FVAoKPW92ZXIK
Cj1jdXQKCnBhY2thZ2UgQWxleGFCcmlkZ2U7CgpAQWxleGFCcmlkZ2U6OklTQSA9ICgnR2VuZXJp
Y19JdGVtJyk7Cgp1c2UgSU86OlNvY2tldDo6SU5FVDsKCm15ICggJExPQ0FMX0lQLCAkTE9DQUxf
TUFDICkgPSAmRGlzY292ZXJBZGR5IHVubGVzcyAoICggZGVmaW5lZCggJDo6Y29uZmlnX3Bhcm1z
eydhbGV4YU1hYyd9ICkgKSAmJiAoIGRlZmluZWQoICQ6OmNvbmZpZ19wYXJtc3snYWxleGFIdHRw
SXAnfSApICkgKTsKJExPQ0FMX0lQICA9ICQ6OmNvbmZpZ19wYXJtc3snYWxleGFIdHRwSXAnfSBp
ZiBkZWZpbmVkKCAkOjpjb25maWdfcGFybXN7J2FsZXhhSHR0cElwJ30gKTsKJExPQ0FMX01BQyA9
ICQ6OmNvbmZpZ19wYXJtc3snYWxleGFNYWMnfSAgICBpZiBkZWZpbmVkKCAkOjpjb25maWdfcGFy
bXN7J2FsZXhhTWFjJ30gKTsKCm15ICRBbGV4YUdsb2JhbDsKCnN1YiBzdGFydHVwIHsKICAgIHVu
bGVzcyAoICQ6OmNvbmZpZ19wYXJtc3snYWxleGFfZW5hYmxlJ30gKSB7IHJldHVybiB9CiAgICAm
b3Blbl9wb3J0KCk7CiAgICAmOjpNYWluTG9vcF9wcmVfYWRkX2hvb2soIFwmQWxleGFCcmlkZ2U6
OmNoZWNrX2Zvcl9kYXRhLCAxICk7Cn0KCnN1YiBvcGVuX3BvcnQgewoKICAgIG15ICRTU0RQX1BP
UlQgPSAnMTkwMCc7CiAgICBteSAkQWxleGFIdHRwUG9ydENvdW50ID0gJDo6Y29uZmlnX3Bhcm1z
eydhbGV4YUh0dHBQb3J0Q291bnQnfSB8fCAnMCc7CiAgICBpZiAoJEFsZXhhSHR0cFBvcnRDb3Vu
dCkgewogICAgICAgICRBbGV4YUh0dHBQb3J0Q291bnQgPSAoICRBbGV4YUh0dHBQb3J0Q291bnQg
LSAxICk7CiAgICAgICAgZm9yIG15ICRjb3VudCAoIDAgLi4gJEFsZXhhSHR0cFBvcnRDb3VudCAp
IHsKICAgICAgICAgICAgbXkgJEFsZXhhSHR0cFBvcnQgPSAkOjpjb25maWdfcGFybXN7J2FsZXhh
SHR0cFBvcnQnfSB8fCAnODAnOwogICAgICAgICAgICAkQWxleGFIdHRwUG9ydCA9ICggJEFsZXhh
SHR0cFBvcnQgKyAkY291bnQgKTsKICAgICAgICAgICAgbXkgJEFsZXhhSHR0cE5hbWUgPSAnYWxl
eGFTZXJ2ZXInIC4gJGNvdW50OwogICAgICAgICAgICAmaHR0cF9wb3J0cyggJEFsZXhhSHR0cE5h
bWUsICRBbGV4YUh0dHBQb3J0ICk7CiAgICAgICAgICAgICRBbGV4YUdsb2JhbC0+e2h0dHBfc29j
a2V0c30tPnskQWxleGFIdHRwTmFtZX0gPSBuZXcgU29ja2V0X0l0ZW0oIHVuZGVmLCB1bmRlZiwg
JEFsZXhhSHR0cE5hbWUgKTsKICAgICAgICAgICAgJEFsZXhhR2xvYmFsLT57aHR0cF9zb2NrZXRz
fS0+eyRBbGV4YUh0dHBOYW1lfS0+e3BvcnR9ID0gJEFsZXhhSHR0cFBvcnQ7CiAgICAgICAgICAg
ICZtYWluOjpwcmludF9sb2coIkFsZXhhIG9wZW5fcG9ydDogcD0kQWxleGFIdHRwUG9ydCBwbj0k
QWxleGFIdHRwTmFtZSBzPSRBbGV4YUh0dHBOYW1lXG4iKSBpZiAkbWFpbjo6RGVidWd7YWxleGF9
OwogICAgICAgIH0KCiAgICAgICAgJEFsZXhhR2xvYmFsLT57aHR0cF9zZW5kZXJ9LT57J2FsZXhh
X2h0dHBfc2VuZGVyJ30gPQogICAgICAgICAgbmV3IFNvY2tldF9JdGVtKCAnYWxleGFfaHR0cF9z
ZW5kZXInLCB1bmRlZiwgJDo6Y29uZmlnX3Bhcm1zeydodHRwX3NlcnZlcid9IC4gJzonIC4gJDo6
Y29uZmlnX3Bhcm1zeydodHRwX3BvcnQnfSwgJ2FsZXhhX2h0dHBfc2VuZGVyJywgJ3RjcCcsICdy
YXcnICk7CiAgICB9CgogICAgbXkgJG5vdGlmaWNhdGlvblBvcnQgPSAkOjpjb25maWdfcGFybXN7
J2FsZXhhX25vdGlmaWNhdGlvbl9wb3J0J30gfHwgJzUwMDAwJzsKCiAgICBteSAkc3NkcE5vdGlm
aWNhdGlvbk5hbWUgPSAnYWxleGFTc2RwTm90aWZpY2F0aW9uJzsKICAgICRzc2RwTm90aWZpY2F0
aW9uU29ja2V0ID0gbmV3IElPOjpTb2NrZXQ6OklORVQtPm5ldygKICAgICAgICBQcm90byAgICAg
PT4gJ3VkcCcsCiAgICAgICAgTG9jYWxQb3J0ID0+ICRub3RpZmljYXRpb25Qb3J0CiAgICApIHx8
ICZtYWluOjpwcmludF9sb2coIlxuRXJyb3I6ICBDb3VsZCBub3Qgc3RhcnQgYSB1ZHAgYWxleGEg
bXVsdGljYXN0IG5vdGlmaWNhdGlvbiBzZW5kZXIgb24gJG5vdGlmaWNhdGlvblBvcnQ6ICRAXG5c
biIpICYmIHJldHVybjsKCiAgICBzZXRzb2Nrb3B0KCAkc3NkcE5vdGlmaWNhdGlvblNvY2tldCwg
Z2V0cHJvdG9ieW5hbWUoJ2lwJykgfHwgMCwgX2NvbnN0YW50KCdJUF9NVUxUSUNBU1RfVFRMJyks
IHBhY2sgJ0knLCA0ICk7CiAgICAkOjpTb2NrZXRfUG9ydHN7JHNzZHBOb3RpZmljYXRpb25OYW1l
fXtwcm90b2NvbH0gPSAndWRwJzsKICAgICQ6OlNvY2tldF9Qb3J0c3skc3NkcE5vdGlmaWNhdGlv
bk5hbWV9e2RhdGF0eXBlfSA9ICdyYXcnOwogICAgJDo6U29ja2V0X1BvcnRzeyRzc2RwTm90aWZp
Y2F0aW9uTmFtZX17cG9ydH0gICAgID0gJG5vdGlmaWNhdGlvblBvcnQ7CiAgICAkOjpTb2NrZXRf
UG9ydHN7JHNzZHBOb3RpZmljYXRpb25OYW1lfXtzb2NrfSAgICAgPSAkc3NkcE5vdGlmaWNhdGlv
blNvY2tldDsKICAgICQ6OlNvY2tldF9Qb3J0c3skc3NkcE5vdGlmaWNhdGlvbk5hbWV9e3NvY2th
fSAgICA9ICRzc2RwTm90aWZpY2F0aW9uU29ja2V0OyAgICAjIFVEUCBwb3J0cyBhcmUgYWx3YXlz
ICJhY3RpdmUiCiAgICAkQWxleGFHbG9iYWwtPnsnc3NkcF9zZW5kJ30gPSBuZXcgU29ja2V0X0l0
ZW0oIHVuZGVmLCB1bmRlZiwgJHNzZHBOb3RpZmljYXRpb25OYW1lICk7CgogICAgcHJpbnRmICIg
LSBjcmVhdGluZyAlLTE1cyBvbiAlM3MgJTVzICVzXG4iLCAkc3NkcE5vdGlmaWNhdGlvbk5hbWUs
ICd1ZHAnLCAkbm90aWZpY2F0aW9uUG9ydDsKICAgICZtYWluOjpwcmludF9sb2coICJBbGV4YSBv
cGVuX3BvcnQ6IHA9JG5vdGlmaWNhdGlvblBvcnQgcG49JHNzZHBOb3RpZmljYXRpb25OYW1lIHM9
IiAuICRBbGV4YUdsb2JhbC0+eydzc2RwX3NlbmQnfSAuICJcbiIgKSBpZiAkbWFpbjo6RGVidWd7
YWxleGF9OwoKICAgIG15ICRzc2RwTGlzdGVuTmFtZSAgID0gJ2FsZXhhU3NkcExpc3Rlbic7CiAg
ICBteSAkc3NkcExpc3RlblNvY2tldCA9IG5ldyBJTzo6U29ja2V0OjpJTkVULT5uZXcoCiAgICAg
ICAgTG9jYWxQb3J0ID0+ICRTU0RQX1BPUlQsCiAgICAgICAgUHJvdG8gICAgID0+ICd1ZHAnLAog
ICAgICAgIFJldXNlICAgICA9PiAxCiAgICApIHx8ICZtYWluOjpwcmludF9sb2coICJcbkVycm9y
OiAgQ291bGQgbm90IHN0YXJ0IGEgdWRwIGFsZXhhIG11bHRpY2FzdCBsaXN0ZW4gc2VydmVyIG9u
ICIgLiAkU1NEUF9QT1JUIC4gJEAgLiAiXG5cbiIgKSAmJiByZXR1cm47CgogICAgX21jYXN0X2Fk
ZCggJHNzZHBMaXN0ZW5Tb2NrZXQsICcyMzkuMjU1LjI1NS4yNTAnICk7CiAgICBzZXRzb2Nrb3B0
KCAkc3NkcExpc3RlblNvY2tldCwgZ2V0cHJvdG9ieW5hbWUoJ2lwJykgfHwgMCwgX2NvbnN0YW50
KCdJUF9NVUxUSUNBU1RfVFRMJyksIHBhY2sgJ0knLCA0ICk7CgogICAgJDo6U29ja2V0X1BvcnRz
eyRzc2RwTGlzdGVuTmFtZX17cHJvdG9jb2x9ID0gJ3VkcCc7CiAgICAkOjpTb2NrZXRfUG9ydHN7
JHNzZHBMaXN0ZW5OYW1lfXtkYXRhdHlwZX0gPSAncmF3JzsKICAgICQ6OlNvY2tldF9Qb3J0c3sk
c3NkcExpc3Rlbk5hbWV9e3BvcnR9ICAgICA9ICRTU0RQX1BPUlQ7CiAgICAkOjpTb2NrZXRfUG9y
dHN7JHNzZHBMaXN0ZW5OYW1lfXtzb2NrfSAgICAgPSAkc3NkcExpc3RlblNvY2tldDsKICAgICQ6
OlNvY2tldF9Qb3J0c3skc3NkcExpc3Rlbk5hbWV9e3NvY2thfSAgICA9ICRzc2RwTGlzdGVuU29j
a2V0OyAgICAjIFVEUCBwb3J0cyBhcmUgYWx3YXlzICJhY3RpdmUiCiAgICAkQWxleGFHbG9iYWwt
Pnsnc3NkcF9saXN0ZW4nfSA9IG5ldyBTb2NrZXRfSXRlbSggdW5kZWYsIHVuZGVmLCAkc3NkcExp
c3Rlbk5hbWUgKTsKCiAgICBwcmludGYgIiAtIGNyZWF0aW5nICUtMTVzIG9uICUzcyAlNXMgJXNc
biIsICRzc2RwTGlzdGVuTmFtZSwgJ3VkcCcsICRTU0RQX1BPUlQ7CiAgICAmbWFpbjo6cHJpbnRf
bG9nKCAiQWxleGEgb3Blbl9wb3J0OiBwPSRzc2RwUG9ydCBwbj0kc3NkcExpc3Rlbk5hbWUgcz0i
IC4gJEFsZXhhR2xvYmFsLT57J3NzZHBfbGlzdGVuJ30gLiAiXG4iICkgaWYgJG1haW46OkRlYnVn
e2FsZXhhfTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIGh0dHBfcG9ydHMgewogICAgbXkgKCAkQWxl
eGFIdHRwTmFtZSwgJEFsZXhhSHR0cFBvcnQgKSA9IEBfOwogICAgbXkgJEFsZXhhSHR0cFNvY2tl
dCA9IG5ldyBJTzo6U29ja2V0OjpJTkVULT5uZXcoCiAgICAgICAgUHJvdG8gICAgID0+ICd0Y3An
LAogICAgICAgIExvY2FsUG9ydCA9PiAkQWxleGFIdHRwUG9ydCwKICAgICAgICBSZXVzZSAgICAg
PT4gMSwKICAgICAgICBMaXN0ZW4gICAgPT4gMTAKICAgICkgfHwgJm1haW46OnByaW50X2xvZygi
XG5FcnJvcjogIENvdWxkIG5vdCBzdGFydCBhIHRjcCAkQWxleGFIdHRwTmFtZSBvbiAkQWxleGFI
dHRwUG9ydDogJEBcblxuIikgJiYgcmV0dXJuOwoKICAgICQ6OlNvY2tldF9Qb3J0c3skQWxleGFI
dHRwTmFtZX17cHJvdG9jb2x9ID0gJ3RjcCc7CiAgICAkOjpTb2NrZXRfUG9ydHN7JEFsZXhhSHR0
cE5hbWV9e2RhdGF0eXBlfSA9ICdyYXcnOwogICAgJDo6U29ja2V0X1BvcnRzeyRBbGV4YUh0dHBO
YW1lfXtwb3J0fSAgICAgPSAkQWxleGFIdHRwUG9ydDsKICAgICQ6OlNvY2tldF9Qb3J0c3skQWxl
eGFIdHRwTmFtZX17c29ja30gICAgID0gJEFsZXhhSHR0cFNvY2tldDsKICAgICQ6OlNvY2tldF9Q
b3J0c3skQWxleGFIdHRwTmFtZX17c29ja2F9ICAgID0gJEFsZXhhSHR0cFNvY2tldDsKICAgIHBy
aW50ZiAiIC0gY3JlYXRpbmcgJS0xNXMgb24gJTNzICU1cyAlc1xuIiwgJEFsZXhhSHR0cE5hbWUs
ICd0Y3AnLCAkQWxleGFIdHRwUG9ydDsKfQoKc3ViIF9jb25zdGFudCB7CiAgICBteSAkbmFtZSAg
PSBzaGlmdDsKICAgIG15ICVuYW1lcyA9ICgKICAgICAgICBJUF9NVUxUSUNBU1RfVFRMICA9PiAw
LAogICAgICAgIElQX0FERF9NRU1CRVJTSElQID0+IDEsCiAgICAgICAgSVBfTVVMVElDQVNUX0xP
T1AgPT4gMCwKICAgICk7CgogICAgbXkgJWNvbnN0YW50cyA9ICgKICAgICAgICBNU1dpbjMyID0+
IFsgMTAsIDEyIF0sCiAgICAgICAgY3lnd2luICA9PiBbIDMsICA1IF0sCiAgICAgICAgZGFyd2lu
ICA9PiBbIDEwLCAxMiBdLAogICAgICAgIGxpbnV4ICAgPT4gWyAzMywgMzUgXSwKICAgICAgICBk
ZWZhdWx0ID0+IFsgMzMsIDM1IF0sCiAgICApOwoKICAgIG15ICRpbmRleCA9ICRuYW1lc3skbmFt
ZX07CiAgICBteSAkcmVmID0gJGNvbnN0YW50c3skXk99IHx8ICRjb25zdGFudHN7ZGVmYXVsdH07
CiAgICByZXR1cm4gJHJlZi0+WyRpbmRleF07Cn0KCnN1YiBfbWNhc3RfYWRkIHsKICAgIG15ICgg
JHNvY2ssICRhZGRyICkgPSBAXzsKICAgIG15ICRpcF9tcmVxOwogICAgIGlmIChkZWZpbmVkICQ6
OmNvbmZpZ19wYXJtc3snYWxleGFIdHRwSXAnfSkgewogICAgICAgJGlwX21yZXEgPSBpbmV0X2F0
b24oJDo6Y29uZmlnX3Bhcm1zeydhbGV4YUh0dHBJcCd9KTsKICAgICAgfSBlbHNlIHsKICAgICAg
ICAkaXBfbXJlcSA9IGluZXRfYXRvbignMC4wLjAuMCcpOwogICAgICB9CiAgICAgJGlwX21yZXEg
PSBpbmV0X2F0b24oICRhZGRyICkgLiAkaXBfbXJlcTsKCiAgICBzZXRzb2Nrb3B0KAogICAgICAg
ICRzb2NrLAogICAgICAgIGdldHByb3RvYnluYW1lKCdpcCcpIHx8IDAsCiAgICAgICAgX2NvbnN0
YW50KCdJUF9BRERfTUVNQkVSU0hJUCcpLAogICAgICAgICRpcF9tcmVxCiAgICApIHx8IHdhcm4g
IlVuYWJsZSB0byBhZGQgSUdNUCBtZW1iZXJzaGlwOiAkIVxuIjsKfQoKc3ViIGNoZWNrX2Zvcl9k
YXRhIHsKICAgIG15ICRhbGV4YV9odHRwX3NlbmRlciA9ICRBbGV4YUdsb2JhbC0+e2h0dHBfc2Vu
ZGVyfS0+eydhbGV4YV9odHRwX3NlbmRlcid9OwogICAgbXkgJGFsZXhhX3NzZHBfbGlzdGVuID0g
JEFsZXhhR2xvYmFsLT57c3NkcF9saXN0ZW59OwoKICAgICNmb3JlYWNoIG15ICRBbGV4YUh0dHBO
YW1lICgga2V5cyAleyRBbGV4YUdsb2JhbC0+e2h0dHBfc29ja2V0c319ICkgewogICAgbXkgJEFs
ZXhhSHR0cE5hbWUgPSAnYWxleGFTZXJ2ZXIwJzsKICAgIG15ICRhbGV4YV9saXN0ZW4gID0gJEFs
ZXhhR2xvYmFsLT57aHR0cF9zb2NrZXRzfXskQWxleGFIdHRwTmFtZX07CgogICAgaWYgKCAkYWxl
eGFfbGlzdGVuICYmICggbXkgJGFsZXhhX2RhdGEgPSBzYWlkICRhbGV4YV9saXN0ZW4gKSApIHsK
ICAgICAgICBteSAkY2xpZW50X2lwX2FkZHJlc3MgPSAkYWxleGFfbGlzdGVuLT5wZWVyOwogICAg
ICAgICZtYWluOjpwcmludF9sb2coIltBbGV4YV0gRGVidWc6IFBlZXI6ICRjbGllbnRfaXBfYWRk
cmVzcyBTZW50IERhdGEiKSAgICAgICAgICAgICBpZiAkbWFpbjo6RGVidWd7J2FsZXhhJ30gPj0g
MjsKICAgICAgICAmbWFpbjo6cHJpbnRfbG9nKCJbQWxleGFdIERlYnVnOiBQZWVyOiAkY2xpZW50
X2lwX2FkZHJlc3MgRGF0YSBJTiAtICRhbGV4YV9kYXRhIikgaWYgJG1haW46OkRlYnVneydhbGV4
YSd9ID49IDU7CiAgICAgICAgJGNsaWVudF9pcF9hZGRyZXNzID1+IHMvOi4qLy87CiAgICAgICAg
bXkgJGNsaWVudF9wb3J0ID0gJGFsZXhhX2xpc3Rlbi0+cGVlcjsKICAgICAgICAkY2xpZW50X3Bv
cnQgPX4gcy8uKlw6Ly87CiAgICAgICAgJEFsZXhhR2xvYmFsLT57aHR0cF9jbGllbnR9LT57JGNs
aWVudF9pcF9hZGRyZXNzfS0+eyRjbGllbnRfcG9ydH0tPnt0aW1lfSA9IHRpbWU7CgogICAgICAg
ICNwdXNoIChAeyAkQWxleGFHbG9iYWwtPntodHRwX2NsaWVudF9xdWV1ZX0gfSwgJGNsaWVudF9p
cF9hZGRyZXNzLiI6Ii4kY2xpZW50X3BvcnQpOyAjIFB1dCB0aGUgcmVxdWVzdCBpbiBxdWV1ZSBz
byB0aGUgcmVzcG9uc2UgaXMgc2VudCBpbiBvcmRlcgogICAgICAgICRhbGV4YV9odHRwX3NlbmRl
ci0+c3RhcnQgdW5sZXNzICRhbGV4YV9odHRwX3NlbmRlci0+YWN0aXZlOwogICAgICAgICRhbGV4
YV9odHRwX3NlbmRlci0+c2V0KCRhbGV4YV9kYXRhKTsgICAgIyBTZW5kIGRhdGEgZnJvbSBjbGll
bnQgb24gb3VyIHByb3h5IHBvcnQgdG8gTUggaHR0cCBzZXJ2ZXIKCiAgICB9CiAgICAmX3NlbmRI
dHRwRGF0YSggJGFsZXhhX2xpc3RlbiwgJGFsZXhhX2h0dHBfc2VuZGVyICk7CiAgICAmY2xvc2Vf
c3R1Y2tfc29ja2V0cyggJGFsZXhhX2xpc3RlbiwgJEFsZXhhSHR0cE5hbWUgKQogICAgICBpZiAo
JGFsZXhhX2xpc3Rlbik7ICAgICAgICAgICAgICAgICAgICAgICAgI1RoaXMgY2xvc2VzIHRoZSBv
bGRlc3QgY29ubmVjdGlvbiBmcm9tIGEgc291cmNlIElQIGlmIGEgc2Vjb25kIG9uZSBpcyBtYWRl
LiBGaXggZm9yIEdIIHN0dWNrIGNvbm5lY3Rpb25zCgogICAgIyB9CgogICAgbXkgJGFsZXhhX3Nz
ZHBfbGlzdGVuID0gJEFsZXhhR2xvYmFsLT57c3NkcF9saXN0ZW59OwogICAgaWYgKCAkYWxleGFf
c3NkcF9saXN0ZW4gJiYgKCBteSAkc3NkcF9kYXRhID0gc2FpZCAkYWxleGFfc3NkcF9saXN0ZW4p
ICkgewogICAgICAgIG15ICRwZWVyID0gJDo6U29ja2V0X1BvcnRzeydhbGV4YVNzZHBMaXN0ZW4n
fXtmcm9tX2lwcG9ydH07CiAgICAgICAgJl9yZWNlaXZlU1NEUEV2ZW50KCAkc3NkcF9kYXRhLCAk
cGVlciApOwogICAgfQp9CgpzdWIgX3NlbmRIdHRwRGF0YSB7CiAgICBteSAoICRhbGV4YV9saXN0
ZW4sICRhbGV4YV9odHRwX3NlbmRlciApID0gQF87CiAgICBpZiAoICRhbGV4YV9odHRwX3NlbmRl
ciAmJiAoIG15ICRhbGV4YV9zZW5kZXJfZGF0YSA9IHNhaWQgJGFsZXhhX2h0dHBfc2VuZGVyICkg
KSB7CiAgICAgICAgbXkgJGNsaWVudF9pcF9hZGRyZXNzID0gJGFsZXhhX2xpc3Rlbi0+cGVlcjsK
ICAgICAgICAmbWFpbjo6cHJpbnRfbG9nKCJbQWxleGFdIERlYnVnOiBQZWVyOiAkY2xpZW50X2lw
X2FkZHJlc3MgRGF0YSBPVVQgLSAkYWxleGFfc2VuZGVyX2RhdGEiKSBpZiAkbWFpbjo6RGVidWd7
J2FsZXhhJ30gPj0gNTsKICAgICAgICAkY2xpZW50X2lwX2FkZHJlc3MgPX4gcy86LiovLzsKICAg
ICAgICBteSAkY2xpZW50X3BvcnQgPSAkYWxleGFfbGlzdGVuLT5wZWVyOwogICAgICAgICRjbGll
bnRfcG9ydCA9fiBzLy4qXDovLzsKICAgICAgICBkZWxldGUgJEFsZXhhR2xvYmFsLT57aHR0cF9j
bGllbnR9LT57JGNsaWVudF9pcF9hZGRyZXNzfS0+eyRjbGllbnRfcG9ydH0gaWYgJEFsZXhhR2xv
YmFsLT57aHR0cF9jbGllbnR9LT57JGNsaWVudF9pcF9hZGRyZXNzfS0+eyRjbGllbnRfcG9ydH07
CiAgICAgICAgJGFsZXhhX2xpc3Rlbi0+c2V0KCRhbGV4YV9zZW5kZXJfZGF0YSk7ICAgICMgU2Vu
ZCBkYXRhIGZyb20gdGhlIE1IIGh0dHAgc2VydmVyIHRvIHRoZSBjbGllbnQgb24gdGhlIHByb3h5
IHBvcnQKICAgIH0KfQoKc3ViIF9zZW5kSHR0cERhdGFfdGVzdCB7CiAgICBteSAoICRhbGV4YV9s
aXN0ZW4sICRhbGV4YV9odHRwX3NlbmRlciwgJEFsZXhhSHR0cE5hbWUgKSA9IEBfOwogICAgaWYg
KCAkYWxleGFfaHR0cF9zZW5kZXIgJiYgKCBteSAkYWxleGFfc2VuZGVyX2RhdGEgPSBzYWlkICRh
bGV4YV9odHRwX3NlbmRlciApICkgewogICAgICAgIG15ICRjdXJyZW50X2NsaWVudF9pcCA9IEB7
ICRBbGV4YUdsb2JhbC0+e2h0dHBfY2xpZW50X3F1ZXVlfSB9WzBdOwogICAgICAgICRjdXJyZW50
X2NsaWVudF9pcCA9fiBzLzouKi8vOwogICAgICAgIG15ICRjdXJyZW50X2NsaWVudF9wb3J0ID0g
QHsgJEFsZXhhR2xvYmFsLT57aHR0cF9jbGllbnRfcXVldWV9IH1bMF07CiAgICAgICAgJGN1cnJl
bnRfY2xpZW50X3BvcnQgPX4gcy8uKlw6Ly87CiAgICAgICAgZm9yIG15ICRwdHIgKCBAeyAkOjpT
b2NrZXRfUG9ydHN7JEFsZXhhSHR0cE5hbWV9e2NsaWVudHN9IH0gKSB7CiAgICAgICAgICAgIG15
ICggJHNvY2thLCAkY2xpZW50X2lwX2FkZHJlc3MsICRjbGllbnRfcG9ydCwgJGRhdGEgKSA9IEB7
JHB0cn07CiAgICAgICAgICAgIGlmICggKCAkY2xpZW50X2lwX2FkZHJlc3MgZXEgJGN1cnJlbnRf
Y2xpZW50X2lwICkgJiYgKCAkY2xpZW50X3BvcnQgZXEgJGN1cnJlbnRfY2xpZW50X3BvcnQgKSAp
IHsKICAgICAgICAgICAgICAgICZtYWluOjpwcmludF9sb2coIltBbGV4YV0gRGVidWc6IFBlZXI6
ICRjbGllbnRfaXBfYWRkcmVzczokY2xpZW50X3BvcnQgRGF0YSBPVVQgLSAkYWxleGFfc2VuZGVy
X2RhdGEiKSBpZiAkbWFpbjo6RGVidWd7J2FsZXhhJ30gPj0gNTsKICAgICAgICAgICAgICAgIGRl
bGV0ZSAkQWxleGFHbG9iYWwtPntodHRwX2NsaWVudH0tPnskY2xpZW50X2lwX2FkZHJlc3N9LT57
JGNsaWVudF9wb3J0fSBpZiAkQWxleGFHbG9iYWwtPntodHRwX2NsaWVudH0tPnskY2xpZW50X2lw
X2FkZHJlc3N9LT57JGNsaWVudF9wb3J0fTsKICAgICAgICAgICAgICAgIHByaW50ICRzb2NrYSAk
YWxleGFfc2VuZGVyX2RhdGE7CiAgICAgICAgICAgICAgICBzcGxpY2UoIEB7ICRBbGV4YUdsb2Jh
bC0+e2h0dHBfY2xpZW50X3F1ZXVlfSB9LCAwLCAxICk7ICAgICMgRGVsZXRlIHNlcnZlZCBxdWV1
ZSBpdGVtIChmaXJzdCBpdGVtIGluIHRoZSBhcnJheSkKICAgICAgICAgICAgfQogICAgICAgIH0K
ICAgIH0KCn0KCnN1YiBfcmVjZWl2ZVNTRFBFdmVudCB7CiAgICBteSAoICRidWYsICRwZWVyICkg
PSBAXzsKCiAgICBpZiAoICRidWYgIX4gL1wwMTU/XDAxMlwwMTU/XDAxMi8gKSB7CiAgICAgICAg
cmV0dXJuOwogICAgfQoKICAgICRidWYgPX4gcy9eKD86XDAxNT9cMDEyKSsvLzsgICAgIyBpZ25v
cmUgbGVhZGluZyBibGFuayBsaW5lcwogICAgaWYgKCAhKCAkYnVmID1+IHMvXihcUyspWyBcdF0r
KFxTKykoPzpbIFx0XSsoSFRUUFwvXGQrXC5cZCspKT9bXlwwMTJdKlwwMTIvLyApICkgewoKICAg
ICAgICAjIEJhZCBoZWFkZXIKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJG1ldGhvZCA9
ICQxOwogICAgaWYgKCAkbWV0aG9kIG5lICdNLVNFQVJDSCcgKSB7CgogICAgICAgICMgV2Ugb25s
eSBjYXJlIGFib3V0IHNlYXJjaGVzCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICR0YXJn
ZXQ7CiAgICAkYnVmID1+IHMvU1Q6IC9TVDovZzsKICAgICZtYWluOjpwcmludF9sb2coIltBbGV4
YV0gRGVidWc6IFNTRFAgSU4gLSAkYnVmIFxuIikgaWYgJG1haW46OkRlYnVneydhbGV4YSd9ID49
IDM7CiAgICBpZiAgICAoICRidWYgPX4gL1NUOnVybjpCZWxraW46ZGV2aWNlOlwqXCouKi8gKSAg
ICAgICAgICAgICAgeyAmX3NlbmRTZWFyY2hSZXNwb25zZSgkcGVlcikgfQogICAgZWxzaWYgKCAk
YnVmID1+IC9TVDp1cm46c2NoZW1hcy11cG5wLW9yZzpkZXZpY2U6YmFzaWM6MS4qLyApIHsgJl9z
ZW5kU2VhcmNoUmVzcG9uc2UoJHBlZXIpIH0KICAgIGVsc2lmICggJGJ1ZiA9fiAvU1Q6c3NkcDph
bGwuKi8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICZfc2VuZFNlYXJjaFJlc3BvbnNl
KCAkcGVlciwgJ2FsbCcgKSB9CgogICAgI2Vsc2lmICggJGJ1ZiA9fiAvU1Q6c3NkcDphbGwuKi8g
KSB7ICZfc2VuZFNlYXJjaFJlc3BvbnNlKCRwZWVyLCdhbGwnKSB9Cn0KCnN1YiBfc2VuZFNlYXJj
aFJlc3BvbnNlIHsKICAgIG15ICggJHBlZXIsICR0eXBlICkgPSBAXzsKICAgIG15ICRjb3VudCAg
ICAgICAgICAgPSAwOwogICAgbXkgJHNlbGZuYW1lICAgICAgICA9ICggJm1haW46Omxpc3Rfb2Jq
ZWN0c19ieV90eXBlKCdBbGV4YUJyaWRnZScpIClbMF07CiAgICBteSAkc2VsZiAgICAgICAgICAg
ID0gOjpnZXRfb2JqZWN0X2J5X25hbWUoJHNlbGZuYW1lKTsKICAgIG15ICRhbGV4YV9zc2RwX3Nl
bmQgPSAkQWxleGFHbG9iYWwtPnsnc3NkcF9zZW5kJ307CiAgICBteSAkbWFjICAgICAgICAgICAg
ID0gJExPQ0FMX01BQzsKCiAgICBmb3JlYWNoIG15ICRwb3J0ICggKCBzb3J0IGtleXMgJXsgJHNl
bGYtPntjaGlsZH0tPnsncG9ydHMnfSB9ICkgKSB7CgogICAgICAgICNuZXh0IHVubGVzcyAoICRz
ZWxmLT57Y2hpbGR9LT57JHBvcnR9ICk7CiAgICAgICAgbXkgJHNvY2tldCA9IGhhbmRsZSAkYWxl
eGFfc3NkcF9zZW5kOwogICAgICAgIG15ICRvdXRwdXQ7CiAgICAgICAgaWYgKCAkdHlwZSBlcSAn
YWxsJyApIHsKICAgICAgICAgICAgJG91dHB1dCA9ICJIVFRQLzEuMSAyMDAgT0tcclxuIjsKICAg
ICAgICAgICAgJG91dHB1dCAuPSAnSE9TVDogMjM5LjI1NS4yNTUuMjUwOjE5MDAnIC4gIlxyXG4i
OwogICAgICAgICAgICAkb3V0cHV0IC49ICdDQUNIRS1DT05UUk9MOiBtYXgtYWdlPTEwMCcgLiAi
XHJcbiI7CiAgICAgICAgICAgICRvdXRwdXQgLj0gJ0VYVDogJyAuICJcclxuIjsKICAgICAgICAg
ICAgJG91dHB1dCAuPSAnTE9DQVRJT046IGh0dHA6Ly8nIC4gJExPQ0FMX0lQIC4gJzonIC4gJHBv
cnQgLiAnL2Rlc2NyaXB0aW9uLnhtbCcgLiAiXHJcbiI7CiAgICAgICAgICAgICRvdXRwdXQgLj0g
J1NFUlZFUjogTGludXgvMy4xNC4wIFVQblAvMS4wIElwQnJpZGdlLzEuMTUuMCcgLiAiXHJcbiI7
CiAgICAgICAgICAgICRvdXRwdXQgLj0gJ2h1ZS1icmlkZ2VpZDogQjgyN0VCRkZGRScgLiB1Yygg
KCBzdWJzdHIgJG1hYywgLTYgKSApIC4gIlxyXG4iOwogICAgICAgICAgICAkb3V0cHV0IC49ICdT
VDogdXBucDpyb290ZGV2aWNlJyAuICJcclxuIjsKICAgICAgICAgICAgJG91dHB1dCAuPSAnVVNO
OiB1dWlkOicgLiAkbWFjIC4gJzo6dXBucDpyb290ZGV2aWNlJyAuICJcclxuIjsKICAgICAgICAg
ICAgJG91dHB1dCAuPSAiXHJcbiI7CiAgICAgICAgICAgICZtYWluOjpwcmludF9sb2coIltBbGV4
YV0gRGVidWc6IFNTRFAgT1VUIC0gJG91dHB1dCBcbiIpIGlmICRtYWluOjpEZWJ1Z3snYWxleGEn
fSA+PSAzOwogICAgICAgICAgICBzZW5kKCAkc29ja2V0LCAkb3V0cHV0LCAwLCAkcGVlciApOwoK
ICAgICAgICAgICAgJG91dHB1dCA9ICJIVFRQLzEuMSAyMDAgT0tcclxuIjsKICAgICAgICAgICAg
JG91dHB1dCAuPSAnSE9TVDogMjM5LjI1NS4yNTUuMjUwOjE5MDAnIC4gIlxyXG4iOwogICAgICAg
ICAgICAkb3V0cHV0IC49ICdDQUNIRS1DT05UUk9MOiBtYXgtYWdlPTEwMCcgLiAiXHJcbiI7CiAg
ICAgICAgICAgICRvdXRwdXQgLj0gJ0VYVDogJyAuICJcclxuIjsKICAgICAgICAgICAgJG91dHB1
dCAuPSAnTE9DQVRJT046IGh0dHA6Ly8nIC4gJExPQ0FMX0lQIC4gJzonIC4gJHBvcnQgLiAnL2Rl
c2NyaXB0aW9uLnhtbCcgLiAiXHJcbiI7CiAgICAgICAgICAgICRvdXRwdXQgLj0gJ1NFUlZFUjog
TGludXgvMy4xNC4wIFVQblAvMS4wIElwQnJpZGdlLzEuMTUuMCcgLiAiXHJcbiI7CiAgICAgICAg
ICAgICRvdXRwdXQgLj0gJ2h1ZS1icmlkZ2VpZDogQjgyN0VCRkZGRScgLiB1YyggKCBzdWJzdHIg
JG1hYywgLTYgKSApIC4gIlxyXG4iOwogICAgICAgICAgICAkb3V0cHV0IC49ICdTVDogdXVpZDoy
ZjQwMmY4MC1kYTUwLTExZTEtOWIyMy0nIC4gbGMoJG1hYykgLiAiXHJcbiI7CiAgICAgICAgICAg
ICRvdXRwdXQgLj0gJ1VTTjogdXVpZDoyZjQwMmY4MC1kYTUwLTExZTEtOWIyMy0wMDFlMDYnIC4g
JG1hYyAuICJcclxuIjsKICAgICAgICAgICAgJG91dHB1dCAuPSAiXHJcbiI7CiAgICAgICAgICAg
ICZtYWluOjpwcmludF9sb2coIltBbGV4YV0gRGVidWc6IFNTRFAgT1VUIC0gJG91dHB1dCBcbiIp
IGlmICRtYWluOjpEZWJ1Z3snYWxleGEnfSA+PSAzOwogICAgICAgICAgICBzZW5kKCAkc29ja2V0
LCAkb3V0cHV0LCAwLCAkcGVlciApOwogICAgICAgIH0KCiAgICAgICAgJG91dHB1dCA9ICJIVFRQ
LzEuMSAyMDAgT0tcclxuIjsKICAgICAgICAkb3V0cHV0IC49ICdIT1NUOiAyMzkuMjU1LjI1NS4y
NTA6MTkwMCcgLiAiXHJcbiI7CiAgICAgICAgJG91dHB1dCAuPSAnQ0FDSEUtQ09OVFJPTDogbWF4
LWFnZT0xMDAnIC4gIlxyXG4iOwogICAgICAgICRvdXRwdXQgLj0gJ0VYVDogJyAuICJcclxuIjsK
ICAgICAgICAkb3V0cHV0IC49ICdMT0NBVElPTjogaHR0cDovLycgLiAkTE9DQUxfSVAgLiAnOicg
LiAkcG9ydCAuICcvZGVzY3JpcHRpb24ueG1sJyAuICJcclxuIjsKICAgICAgICAkb3V0cHV0IC49
ICdTRVJWRVI6IExpbnV4LzMuMTQuMCBVUG5QLzEuMCBJcEJyaWRnZS8xLjE1LjAnIC4gIlxyXG4i
OwogICAgICAgICRvdXRwdXQgLj0gJ2h1ZS1icmlkZ2VpZDogQjgyN0VCRkZGRScgLiB1YyggKCBz
dWJzdHIgJG1hYywgLTYgKSApIC4gIlxyXG4iOwogICAgICAgICRvdXRwdXQgLj0gJ1NUOiB1cm46
c2NoZW1hcy11cG5wLW9yZzpkZXZpY2U6YmFzaWM6MScgLiAiXHJcbiI7CiAgICAgICAgJG91dHB1
dCAuPSAnVVNOOiB1dWlkOjJmNDAyZjgwLWRhNTAtMTFlMS05YjIzLScgLiBsYygkbWFjKSAuICJc
clxuIjsKICAgICAgICAkb3V0cHV0IC49ICJcclxuIjsKICAgICAgICAmbWFpbjo6cHJpbnRfbG9n
KCJbQWxleGFdIERlYnVnOiBTU0RQIE9VVCAtICRvdXRwdXQgXG4iKSBpZiAkbWFpbjo6RGVidWd7
J2FsZXhhJ30gPj0gMzsKICAgICAgICBzZW5kKCAkc29ja2V0LCAkb3V0cHV0LCAwLCAkcGVlciAp
OwoKICAgICAgICAkY291bnQrKzsKICAgIH0KfQoKc3ViIGNsb3NlX3N0dWNrX3NvY2tldHNfb2xk
IHsKICAgIG15ICggJGFsZXhhX2xpc3RlbiwgJEFsZXhhSHR0cE5hbWUgKSA9IEBfOwogICAgcmV0
dXJuIHVubGVzcyAkYWxleGFfbGlzdGVuOwogICAgbXkgJGN1cnJlbnRfY2xpZW50X2lwID0gJGFs
ZXhhX2xpc3Rlbi0+cGVlcjsKICAgICRjdXJyZW50X2NsaWVudF9pcCA9fiBzLzouKi8vOwogICAg
bXkgJGN1cnJlbnRfY2xpZW50X3BvcnQgPSAkYWxleGFfbGlzdGVuLT5wZWVyOwogICAgJGN1cnJl
bnRfY2xpZW50X3BvcnQgPX4gcy8uKlw6Ly87CiAgICBpZiAoICggc2NhbGFyIEB7ICQ6OlNvY2tl
dF9Qb3J0c3skQWxleGFIdHRwTmFtZX17Y2xpZW50c30gfSApID4gMSApIHsKICAgICAgICBmb3Ig
bXkgJHB0ciAoIEB7ICQ6OlNvY2tldF9Qb3J0c3skQWxleGFIdHRwTmFtZX17Y2xpZW50c30gfSAp
IHsKICAgICAgICAgICAgbXkgKCAkc29ja2EsICRjbGllbnRfaXBfYWRkcmVzcywgJGNsaWVudF9w
b3J0LCAkZGF0YSApID0gQHskcHRyfTsKICAgICAgICAgICAgbmV4dCBpZiAoICggJGNsaWVudF9p
cF9hZGRyZXNzIGVxICRjdXJyZW50X2NsaWVudF9pcCApICYmICggJGNsaWVudF9wb3J0IGVxICRj
dXJyZW50X2NsaWVudF9wb3J0ICkgKTsKICAgICAgICAgICAgaWYgKCAkY2xpZW50X2lwX2FkZHJl
c3MgZXEgJGN1cnJlbnRfY2xpZW50X2lwICkgewogICAgICAgICAgICAgICAgJEFsZXhhR2xvYmFs
LT57aHR0cF9jbGllbnR9LT57JGNsaWVudF9pcF9hZGRyZXNzfS0+eyRjbGllbnRfcG9ydH0tPnt0
aW1lfSA9IHRpbWUKICAgICAgICAgICAgICAgICAgdW5sZXNzICRBbGV4YUdsb2JhbC0+e2h0dHBf
Y2xpZW50fS0+eyRjbGllbnRfaXBfYWRkcmVzc30tPnskY2xpZW50X3BvcnR9LT57dGltZX07CiAg
ICAgICAgICAgICAgICBpZiAoICggdGltZSAtICRBbGV4YUdsb2JhbC0+e2h0dHBfY2xpZW50fS0+
eyRjbGllbnRfaXBfYWRkcmVzc30tPnskY2xpZW50X3BvcnR9LT57dGltZX0gKSBnZSA2MCApIHsK
ICAgICAgICAgICAgICAgICAgICBjbG9zZSAkc29ja2EgaWYgJHNvY2thOwogICAgICAgICAgICAg
ICAgICAgIGRlbGV0ZSAkQWxleGFHbG9iYWwtPntodHRwX2NsaWVudH0tPnskY2xpZW50X2lwX2Fk
ZHJlc3N9OwogICAgICAgICAgICAgICAgICAgICZtYWluOjpwcmludF9sb2coICJbQWxleGFdIERl
YnVnOiBDbGllbnQgY291bnQ6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAuICggc2NhbGFy
IEB7ICQ6OlNvY2tldF9Qb3J0c3skQWxleGFIdHRwTmFtZX17Y2xpZW50c30gfSApCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgLiAiIGNsb3NpbmcgJGNsaWVudF9pcF9hZGRyZXNzIDogJGNsaWVu
dF9wb3J0IiApCiAgICAgICAgICAgICAgICAgICAgICBpZiAkbWFpbjo6RGVidWd7J2FsZXhhJ30g
Pj0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9Cn0K
CnN1YiBjbG9zZV9zdHVja19zb2NrZXRzIHsKICAgIG15ICggJGFsZXhhX2xpc3RlbiwgJEFsZXhh
SHR0cE5hbWUgKSA9IEBfOwogICAgcmV0dXJuIHVubGVzcyAkYWxleGFfbGlzdGVuOwogICAgbXkg
JGN1cnJlbnRfY2xpZW50X2lwID0gJGFsZXhhX2xpc3Rlbi0+cGVlcjsKICAgICRjdXJyZW50X2Ns
aWVudF9pcCA9fiBzLzouKi8vOwogICAgbXkgJGN1cnJlbnRfY2xpZW50X3BvcnQgPSAkYWxleGFf
bGlzdGVuLT5wZWVyOwogICAgJGN1cnJlbnRfY2xpZW50X3BvcnQgPX4gcy8uKlw6Ly87CiAgICBm
b3IgbXkgJHB0ciAoIEB7ICQ6OlNvY2tldF9Qb3J0c3skQWxleGFIdHRwTmFtZX17Y2xpZW50c30g
fSApIHsKICAgICAgICBteSAoICRzb2NrYSwgJGNsaWVudF9pcF9hZGRyZXNzLCAkY2xpZW50X3Bv
cnQsICRkYXRhICkgPSBAeyRwdHJ9OwogICAgICAgIG5leHQgaWYgKCAoICRjbGllbnRfaXBfYWRk
cmVzcyBlcSAkY3VycmVudF9jbGllbnRfaXAgKSAmJiAoICRjbGllbnRfcG9ydCBlcSAkY3VycmVu
dF9jbGllbnRfcG9ydCApICk7CiAgICAgICAgbmV4dCB1bmxlc3MgJEFsZXhhR2xvYmFsLT57aHR0
cF9jbGllbnR9LT57JGNsaWVudF9pcF9hZGRyZXNzfS0+eyRjbGllbnRfcG9ydH0tPnt0aW1lfTsK
ICAgICAgICBteSAkdGltZWRpZmYgPSAoIHRpbWUgLSAkQWxleGFHbG9iYWwtPntodHRwX2NsaWVu
dH0tPnskY2xpZW50X2lwX2FkZHJlc3N9LT57JGNsaWVudF9wb3J0fS0+e3RpbWV9ICk7CiAgICAg
ICAgaWYgKCAkdGltZWRpZmYgPj0gMjAgKSB7CiAgICAgICAgICAgICRvdXRwdXQgPSAiSFRUUC8x
LjEgNDA0IE5vdCBGb3VuZFxyXG5TZXJ2ZXI6IE1pc3RlckhvdXNlXHJcbkNhY2hlLUNvbnRyb2w6
IG5vLWNhY2hlXHJcbkNvbnRlbnQtTGVuZ3RoOiAyXHJcbkRhdGU6ICIgLiB0aW1lMnN0cih0aW1l
KSAuICJcclxuXHJcbi4uIjsKICAgICAgICAgICAgcHJpbnQgJHNvY2thICRvdXRwdXQ7CiAgICAg
ICAgICAgIGRlbGV0ZSAkQWxleGFHbG9iYWwtPntodHRwX2NsaWVudH0tPnskY2xpZW50X2lwX2Fk
ZHJlc3N9LT57JGNsaWVudF9wb3J0fTsKICAgICAgICAgICAgJm1haW46OnByaW50X2xvZygiW0Fs
ZXhhXSBEZWJ1ZzogU2VuZGluZyA0MDQgdG8gJGNsaWVudF9pcF9hZGRyZXNzOiRjbGllbnRfcG9y
dCBzb2NrZXQgaGFzIGJlZW4gb3BlbiBmb3IgJHRpbWVkaWZmIHdpdGggbm8gcmVzcG9uc2UiKSBp
ZiAkbWFpbjo6RGVidWd7J2FsZXhhJ30gPj0gMjsKICAgICAgICB9CiAgICB9Cgp9CgpzdWIgcHJv
Y2Vzc19odHRwIHsKCiAgICB1bmxlc3MgKCAkOjpjb25maWdfcGFybXN7J2FsZXhhX2VuYWJsZSd9
ICkgeyByZXR1cm4gMCB9CiAgICBteSAoICR1cmksICRyZXF1ZXN0X3R5cGUsICRib2R5LCAkc29j
a2V0LCAlSHR0cCApID0gQF87CgogICAgdW5sZXNzICggKCAkdXJpID1+IC9eXC9hcGkvICkgfHwg
KCAkdXJpID1+IC9eXC9kZXNjcmlwdGlvbi54bWwkLyApICkgeyByZXR1cm4gMCB9ICAgICMgQWRk
ZWQgZm9yIHBlcmZvcm1hbmNlCgogICAgbXkgJHNlbGZuYW1lID0gKCAmbWFpbjo6bGlzdF9vYmpl
Y3RzX2J5X3R5cGUoJ0FsZXhhQnJpZGdlJykgKVswXTsKICAgIG15ICRzZWxmICAgICA9IDo6Z2V0
X29iamVjdF9ieV9uYW1lKCRzZWxmbmFtZSk7CiAgICB1bmxlc3MgKCRzZWxmKSB7ICZtYWluOjpw
cmludF9sb2coIltBbGV4YV0gRXJyb3I6IE5vIEFsZXhhQnJpZGdlIHBhcmVudCBvYmplY3QgZm91
bmQiKTsgcmV0dXJuIDAgfQoKICAgIHVzZSBIVFRQOjpEYXRlIHF3KHRpbWUyc3RyKTsKICAgIHVz
ZSBJTzo6Q29tcHJlc3M6Okd6aXAgcXcoZ3ppcCk7CgogICAgI2dldCB0aGUgcG9ydCBmcm9tIHRo
ZSBob3N0IGhlYWRlcgogICAgbXkgQHVyaXMgPSBzcGxpdCggL1wvLywgJHVyaSApOwogICAgbXkg
JGhvc3QgPSAkSHR0cHsnSG9zdCd9OwogICAgbXkgJHBvcnQ7CiAgICBpZiAoICRob3N0ID1+IC8o
LiopOihcZCspLyApIHsKICAgICAgICAkaG9zdCA9ICQxOwogICAgICAgICRwb3J0ID0gJDI7CiAg
ICB9CiAgICBlbHNpZiAoICRob3N0ID1+IC8oXGQrKS8gKSB7CiAgICAgICAgJGhvc3QgPSAkMTsK
ICAgICAgICAkcG9ydCA9ICc4MCc7CiAgICB9CiAgICBlbHNpZiAoICRob3N0ID1+IC8oXHcrKS8g
KSB7CiAgICAgICAgJGhvc3QgPSAkMTsKICAgICAgICAkcG9ydCA9ICc4MCc7CiAgICB9CgogICAg
bXkgJHhtbG1lc3NhZ2UgPSBxcVs8P3htbCB2ZXJzaW9uPSIxLjAiPz4KPHJvb3QgeG1sbnM9InVy
bjpzY2hlbWFzLXVwbnAtb3JnOmRldmljZS0xLTAiPgo8c3BlY1ZlcnNpb24+CjxtYWpvcj4xPC9t
YWpvcj4KPG1pbm9yPjA8L21pbm9yPgo8L3NwZWNWZXJzaW9uPgo8VVJMQmFzZT5odHRwOi8vJExP
Q0FMX0lQOiRwb3J0LzwvVVJMQmFzZT4KPGRldmljZT4KPGRldmljZVR5cGU+dXJuOnNjaGVtYXMt
dXBucC1vcmc6ZGV2aWNlOmJhc2ljOjE8L2RldmljZVR5cGU+CjxmcmllbmRseU5hbWU+QW1hem9u
LUVjaG8tTUgtQnJpZGdlICgkTE9DQUxfSVApPC9mcmllbmRseU5hbWU+CjxtYW51ZmFjdHVyZXI+
Um95YWwgUGhpbGlwcyBFbGVjdHJvbmljczwvbWFudWZhY3R1cmVyPgo8bWFudWZhY3R1cmVyVVJM
Pmh0dHA6Ly9taXN0ZXJob3VzZS5zb3VyY2Vmb3JnZS5uZXQvPC9tYW51ZmFjdHVyZXJVUkw+Cjxt
b2RlbERlc2NyaXB0aW9uPkh1ZSBFbXVsYXRvciBmb3IgQW1hem9uIEVjaG8gYnJpZGdlPC9tb2Rl
bERlc2NyaXB0aW9uPgo8bW9kZWxOYW1lPlBoaWxpcHMgaHVlIGJyaWRnZSAyMDEyPC9tb2RlbE5h
bWU+Cjxtb2RlbE51bWJlcj45MjkwMDAyMjY1MDM8L21vZGVsTnVtYmVyPgo8bW9kZWxVUkw+aHR0
cHM6Ly9naXRodWIuY29tL2hvbGxpZS9taXN0ZXJob3VzZTwvbW9kZWxVUkw+CjxzZXJpYWxOdW1i
ZXI+YW1hem9uLW1oLWJyaWRnZTA8L3NlcmlhbE51bWJlcj4KPFVETj51dWlkOmFtYXpvbi1taC1i
cmlkZ2UwPC9VRE4+CjxzZXJ2aWNlTGlzdD4KPHNlcnZpY2U+CjxzZXJ2aWNlVHlwZT4obnVsbCk8
L3NlcnZpY2VUeXBlPgo8c2VydmljZUlkPihudWxsKTwvc2VydmljZUlkPgo8Y29udHJvbFVSTD4o
bnVsbCk8L2NvbnRyb2xVUkw+CjxldmVudFN1YlVSTD4obnVsbCk8L2V2ZW50U3ViVVJMPgo8U0NQ
RFVSTD4obnVsbCk8L1NDUERVUkw+Cjwvc2VydmljZT4KPC9zZXJ2aWNlTGlzdD4KPHByZXNlbnRh
dGlvblVSTD5pbmRleC5odG1sPC9wcmVzZW50YXRpb25VUkw+CjxpY29uTGlzdD4KPGljb24+Cjxt
aW1ldHlwZT5pbWFnZS9wbmc8L21pbWV0eXBlPgo8aGVpZ2h0PjQ4PC9oZWlnaHQ+Cjx3aWR0aD40
ODwvd2lkdGg+CjxkZXB0aD4yNDwvZGVwdGg+Cjx1cmw+aHVlX2xvZ29fMC5wbmc8L3VybD4KPC9p
Y29uPgo8aWNvbj4KPG1pbWV0eXBlPmltYWdlL3BuZzwvbWltZXR5cGU+CjxoZWlnaHQ+MTIwPC9o
ZWlnaHQ+Cjx3aWR0aD4xMjA8L3dpZHRoPgo8ZGVwdGg+MjQ8L2RlcHRoPgo8dXJsPmh1ZV9sb2dv
XzMucG5nPC91cmw+CjwvaWNvbj4KPC9pY29uTGlzdD4KPC9kZXZpY2U+Cjwvcm9vdD5dOwoKICAg
IG15ICggJEFsZXhhT2JqZWN0cywgJEFsZXhhT2JqQ2h1bmsgKTsKICAgIGlmICggJDo6Y29uZmln
X3Bhcm1zeydhbGV4YUVuYWJsZUNodW5rZWQnfSApIHsKICAgICAgICAkQWxleGFPYmplY3RzID0g
JHNlbGYtPntjaGlsZH0tPntmdWxsbGlzdH07CiAgICB9CiAgICBlbHNpZiAoICRzZWxmLT57Y2hp
bGR9LT57JHBvcnR9ICkgewoKICAgICAgICAjIHVzZSBEYXRhOjpEdW1wZXI7CiAgICAgICAgJEFs
ZXhhT2JqZWN0cyAgPSAkc2VsZi0+e2NoaWxkfS0+eyRwb3J0fTsKICAgICAgICAkQWxleGFPYmpD
aHVuayA9ICRzZWxmLT57Y2hpbGR9LT57JHBvcnR9OwoKICAgICAgICAjJm1haW46OnByaW50X2xv
ZyggRGF0YTo6RHVtcGVyLT5EdW1wZXIoJEFsZXhhT2JqZWN0cykgKTsKICAgIH0KICAgIGVsc2Ug
ewogICAgICAgICZtYWluOjpwcmludF9sb2coIltBbGV4YV0gRXJyb3I6IE5vIE1hdGNoaW5nIG9i
amVjdCBmb3IgcG9ydCAoICRwb3J0ICkiKTsKICAgICAgICAkb3V0cHV0ID0gIkhUVFAvMS4xIDQw
NCBOb3QgRm91bmRcclxuU2VydmVyOiBNaXN0ZXJIb3VzZVxyXG5DYWNoZS1Db250cm9sOiBuby1j
YWNoZVxyXG5Db250ZW50LUxlbmd0aDogMlxyXG5EYXRlOiAiIC4gdGltZTJzdHIodGltZSkgLiAi
XHJcblxyXG4uLiI7CiAgICAgICAgcmV0dXJuICRvdXRwdXQ7CiAgICB9CgogICAgJm1haW46OnBy
aW50X2xvZygiW0FsZXhhXSBEZWJ1ZzogUG9ydDogKCAkcG9ydCApIFVSSTogKCAkdXJpICkgQm9k
eTogKCAkYm9keSApIFR5cGU6ICggJHJlcXVlc3RfdHlwZSApIFxuIikgaWYgJG1haW46OkRlYnVn
eydhbGV4YSd9OwoKICAgIGlmICggKCAkdXJpID1+IC9eXC9kZXNjcmlwdGlvbi54bWwkLyApICYm
ICggbGMoJHJlcXVlc3RfdHlwZSkgZXEgImdldCIgKSApIHsKICAgICAgICBteSAkb3V0cHV0ID0g
IkhUVFAvMS4xIDIwMCBPS1xyXG4iOwogICAgICAgICRvdXRwdXQgLj0gIlNlcnZlcjogTWlzdGVy
SG91c2VcclxuIjsKICAgICAgICAkb3V0cHV0IC49ICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1Pcmln
aW46IConIC4gIlxyXG4iOwogICAgICAgICRvdXRwdXQgLj0gJ0FjY2Vzcy1Db250cm9sLUFsbG93
LU1ldGhvZHM6IFBPU1QsIEdFVCwgT1BUSU9OUywgREVMRVRFLCBQVVQnIC4gIlxyXG4iOwogICAg
ICAgICRvdXRwdXQgLj0gJ0FjY2Vzcy1Db250cm9sLU1heC1BZ2U6IDM2MDAnIC4gIlxyXG4iOwog
ICAgICAgICRvdXRwdXQgLj0gJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnM6IE9yaWdpbiwg
WC1SZXF1ZXN0ZWQtV2l0aCwgQ29udGVudC1UeXBlLCBBY2NlcHQnIC4gIlxyXG4iOwogICAgICAg
ICRvdXRwdXQgLj0gJ1gtQXBwbGljYXRpb24tQ29udGV4dDogYXBwbGljYXRpb24nIC4gIlxyXG4i
OwogICAgICAgICRvdXRwdXQgLj0gJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veG1sO2NoYXJz
ZXQ9VVRGLTgnIC4gIlxyXG4iOwogICAgICAgICRvdXRwdXQgLj0gIkNvbnRlbnQtTGVuZ3RoOiAi
IC4gKCBsZW5ndGggJHhtbG1lc3NhZ2UgKSAuICJcclxuIjsKICAgICAgICAkb3V0cHV0IC49ICJE
YXRlOiAiIC4gdGltZTJzdHIodGltZSkgLiAiXHJcbiI7CiAgICAgICAgJG91dHB1dCAuPSAiXHJc
biI7CiAgICAgICAgJG91dHB1dCAuPSAkeG1sbWVzc2FnZTsKICAgICAgICAmbWFpbjo6cHJpbnRf
bG9nKCJbQWxleGFdIERlYnVnOiBNSCBSZXNwb25zZSAkeG1sbWVzc2FnZSBcbiIpIGlmICRtYWlu
OjpEZWJ1Z3snYWxleGEnfSA+PSAyOwogICAgICAgIHJldHVybiAkb3V0cHV0OwogICAgfQogICAg
ZWxzaWYgKCAoICR1cmkgPX4gL15cL2FwaS8gKSAmJiAoIGxjKCRyZXF1ZXN0X3R5cGUpIGVxICJw
b3N0IiApICkgewogICAgICAgIG15ICRjb250ZW50ID0gcXFbXFt7InN1Y2Nlc3MiOnsidXNlcm5h
bWUiOiJsaWdodHMifX1cXV07CiAgICAgICAgbXkgJG91dHB1dCAgPSAiSFRUUC8xLjEgMjAwIE9L
XHJcbiI7CiAgICAgICAgJG91dHB1dCAuPSAiU2VydmVyOiBNaXN0ZXJIb3VzZVxyXG4iOwogICAg
ICAgICRvdXRwdXQgLj0gJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKicgLiAiXHJcbiI7
CiAgICAgICAgJG91dHB1dCAuPSAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kczogUE9TVCwg
R0VULCBPUFRJT05TLCBERUxFVEUsIFBVVCcgLiAiXHJcbiI7CiAgICAgICAgJG91dHB1dCAuPSAn
QWNjZXNzLUNvbnRyb2wtTWF4LUFnZTogMzYwMCcgLiAiXHJcbiI7CiAgICAgICAgJG91dHB1dCAu
PSAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyczogT3JpZ2luLCBYLVJlcXVlc3RlZC1XaXRo
LCBDb250ZW50LVR5cGUsIEFjY2VwdCcgLiAiXHJcbiI7CiAgICAgICAgJG91dHB1dCAuPSAnWC1B
cHBsaWNhdGlvbi1Db250ZXh0OiBhcHBsaWNhdGlvbicgLiAiXHJcbiI7CiAgICAgICAgJG91dHB1
dCAuPSAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnIC4gIlxy
XG4iOwogICAgICAgICRvdXRwdXQgLj0gIkNvbnRlbnQtTGVuZ3RoOiAiIC4gKCBsZW5ndGggJGNv
bnRlbnQgKSAuICJcclxuIjsKICAgICAgICAkb3V0cHV0IC49ICJEYXRlOiAiIC4gdGltZTJzdHIo
dGltZSkgLiAiXHJcbiI7CiAgICAgICAgJG91dHB1dCAuPSAiXHJcbiI7CiAgICAgICAgJG91dHB1
dCAuPSAkY29udGVudDsKICAgICAgICAmbWFpbjo6cHJpbnRfbG9nKCJbQWxleGFdIERlYnVnOiBN
SCBSZXNwb25zZSAkb3V0cHV0IFxuIikgaWYgJG1haW46OkRlYnVneydhbGV4YSd9ID49IDI7CiAg
ICAgICAgcmV0dXJuICRvdXRwdXQ7CiAgICB9CiAgICBlbHNpZiAoICggJHVyaSA9fiAvXlwvYXBp
XC8uKlwvbGlnaHRzXC8oLiopXC9zdGF0ZSQvICkgJiYgKCBsYygkcmVxdWVzdF90eXBlKSBlcSAi
cHV0IiApICkgewogICAgICAgIG15ICRvdXRwdXQ7CiAgICAgICAgbXkgJGRldmljZUlEID0gJDE7
CiAgICAgICAgbXkgJHN0YXRlICAgID0gdW5kZWY7CiAgICAgICAgbXkgJGJvZHlvYmogPSBldmFs
IHsgSlNPTjo6ZGVjb2RlX2pzb24oJGJvZHkpIH07CiAgICAgICAgIyZtYWluOjpwcmludF9sb2co
IltBbGV4YV0gRGVidWc6IE1IIEdvdCBib2R5OiAiLiAkYm9keS4iXG4iKSBpZiAkbWFpbjo6RGVi
dWd7J2FsZXhhJ307CiAgICAgICAgbXkgJGNvbnRlbnRvYmo7CiAgICAgICAgbXkgJGxvZ2NtZDsK
ICAgICAgICBpZiAgICAoIGV4aXN0cyAkYm9keW9iai0+e29ufSApIHsgJHN0YXRlID0gJGJvZHlv
YmotPntvbn0gPyAnb24nIDogJ29mZic7ICRsb2djbWQgPSAnb24nOyB9CiAgICAgICAgZWxzaWYg
KCBleGlzdHMgJGJvZHlvYmotPntvZmZ9ICkgIHsgJHN0YXRlID0gJGJvZHlvYmotPntvZmZ9ID8g
J29mZicgOiAnb24nOyAkbG9nY21kID0gJ29mZic7IH0KICAgICAgICBpZiAgICAoIGV4aXN0cyAk
Ym9keW9iai0+e2JyaX0gKSAgIHsgJHN0YXRlID0gJGJvZHlvYmotPnticml9OyAkbG9nY21kID0g
J2JyaSc7IH0KICAgICAgICBmb3JlYWNoIG15ICRjbWQgKCBrZXlzICV7ICRib2R5b2JqIH0gKSB7
CiAgICAgICAgICAgIG15ICRyZXNwb2JqLT57InN1Y2Nlc3MifS0+eyIvbGlnaHRzLyRkZXZpY2VJ
RC9zdGF0ZS8kY21kIn0gPSAkYm9keW9iai0+eyIkY21kIn07CiAgICAgICAgICAgIHB1c2ggKEB7
JGNvbnRlbnRvYmp9LCAkcmVzcG9iaik7CiAgICAgICAgfQogICAgICAgIG15ICRjb250ZW50ID0g
ZXZhbCB7IEpTT046OmVuY29kZV9qc29uKCRjb250ZW50b2JqKSB9OwogICAgICAgICZtYWluOjpw
cmludF9sb2coIltBbGV4YV0gRGVidWc6IE1IIEdvdCByZXF1ZXN0ICggJGxvZ2NtZCAtICIuJGJv
ZHlvYmotPnsiJGxvZ2NtZCJ9LiIgKSB0byBTZXQgZGV2aWNlICggJGRldmljZUlEICkgdG8gKCAk
c3RhdGUgKVxuIikgaWYgJG1haW46OkRlYnVneydhbGV4YSd9OwoKICAgICAgICBpZiAoICggJEFs
ZXhhT2JqZWN0cy0+eyd1dWlkJ30tPnskZGV2aWNlSUR9ICkgJiYgKCBkZWZpbmVkKCRzdGF0ZSkg
KSApIHsKICAgICAgICAgICAgJmdldF9zZXRfc3RhdGUoICRzZWxmLCAkQWxleGFPYmplY3RzLCAk
ZGV2aWNlSUQsICdzZXQnLCAkc3RhdGUgKTsKCiAgICAgICAgICAgICRvdXRwdXQgPSAiSFRUUC8x
LjEgMjAwIE9LXHJcbiI7CiAgICAgICAgICAgICRvdXRwdXQgLj0gIlNlcnZlcjogTWlzdGVySG91
c2VcclxuIjsKICAgICAgICAgICAgJG91dHB1dCAuPSAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3Jp
Z2luOiAqJyAuICJcclxuIjsKICAgICAgICAgICAgJG91dHB1dCAuPSAnQWNjZXNzLUNvbnRyb2wt
QWxsb3ctTWV0aG9kczogUE9TVCwgR0VULCBPUFRJT05TLCBERUxFVEUsIFBVVCcgLiAiXHJcbiI7
CiAgICAgICAgICAgICRvdXRwdXQgLj0gJ0FjY2Vzcy1Db250cm9sLU1heC1BZ2U6IDM2MDAnIC4g
IlxyXG4iOwogICAgICAgICAgICAkb3V0cHV0IC49ICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFk
ZXJzOiBPcmlnaW4sIFgtUmVxdWVzdGVkLVdpdGgsIENvbnRlbnQtVHlwZSwgQWNjZXB0JyAuICJc
clxuIjsKICAgICAgICAgICAgJG91dHB1dCAuPSAnWC1BcHBsaWNhdGlvbi1Db250ZXh0OiBhcHBs
aWNhdGlvbicgLiAiXHJcbiI7CiAgICAgICAgICAgICRvdXRwdXQgLj0gJ0NvbnRlbnQtVHlwZTog
YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyAuICJcclxuIjsKICAgICAgICAgICAgJG91
dHB1dCAuPSAiQ29udGVudC1MZW5ndGg6ICIgLiAoIGxlbmd0aCAkY29udGVudCApIC4gIlxyXG4i
OwogICAgICAgICAgICAkb3V0cHV0IC49ICJEYXRlOiAiIC4gdGltZTJzdHIodGltZSkgLiAiXHJc
biI7CiAgICAgICAgICAgICRvdXRwdXQgLj0gIlxyXG4iOwogICAgICAgICAgICAkb3V0cHV0IC49
ICRjb250ZW50OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJG91dHB1dCA9
ICJIVFRQLzEuMSA0MDQgTm90IEZvdW5kXHJcblNlcnZlcjogTWlzdGVySG91c2VcclxuQ2FjaGUt
Q29udHJvbDogbm8tY2FjaGVcclxuQ29udGVudC1MZW5ndGg6IDJcclxuRGF0ZTogIiAuIHRpbWUy
c3RyKHRpbWUpIC4gIlxyXG5cclxuLi4iOwogICAgICAgICAgICAmbWFpbjo6cHJpbnRfbG9nKCJb
QWxleGFdIEVycm9yOiBObyBNYXRjaGluZyBvYmplY3QgZm9yIFVVSUQgKCAkZGV2aWNlSUQgKSIp
IHVubGVzcyAoICRBbGV4YU9iamVjdHMtPnsndXVpZCd9LT57JGRldmljZUlEfSApOwogICAgICAg
ICAgICAmbWFpbjo6cHJpbnRfbG9nKCJbQWxleGFdIEVycm9yOiBNaXNzaW5nIFN0YXRlIGZyb20g
UFVUIGZvciBvYmplY3Qgd2l0aCBVVUlEICggJGRldmljZUlEICkiKSB1bmxlc3MgKCBkZWZpbmVk
KCRzdGF0ZSkgKTsKICAgICAgICAgICAgJm1haW46OnByaW50X2xvZygiW0FsZXhhXSBEZWJ1Zzog
TUggUmVzcG9uc2UgJG91dHB1dCBcbiIpIGlmICRtYWluOjpEZWJ1Z3snYWxleGEnfTsKICAgICAg
ICAgICAgcmV0dXJuICRvdXRwdXQ7CiAgICAgICAgfQogICAgICAgICZtYWluOjpwcmludF9sb2co
IltBbGV4YV0gRGVidWc6IE1IIFJlc3BvbnNlICRvdXRwdXQgXG4iKSBpZiAkbWFpbjo6RGVidWd7
J2FsZXhhJ30gPj0gMjsKICAgICAgICByZXR1cm4gJG91dHB1dDsKCiAgICAgICAgI3ByaW50ICRz
b2NrZXQgJG91dHB1dDsgIyBwcmludCBkaXJlY3QgdG8gdGhlIHNvY2tldCBzbyBpdCBkb2VzIG5v
dCBjbG9zZS4KICAgICAgICAjJm1haW46Omh0dHBfcHJvY2Vzc19yZXF1ZXN0KCRzb2NrZXQpOyAj
IHdlIGtub3cgdGhlcmUgd2lsbCBiZSBhbm90aGVyIHJlcXVlc3Qgc28gZ2V0IGl0IGluIHRoZSBz
YW1lIHRjcCBzZXNzaW9uLgogICAgICAgICNyZXR1cm4gJyAnOwogICAgfSBlbHNpZiAoICggJHVy
aSA9fiAvXlwvYXBpXC8uKi8gKSAmJiAoIGxjKCRyZXF1ZXN0X3R5cGUpIGVxICJnZXQiICkgKSB7
CiAgICAgICAgbXkgJGNvdW50ID0gMDsKICAgICAgICBteSAkY29udGVudDsKICAgICAgICBteSAk
bmFtZTsKICAgICAgICBteSAkc3RhdGVwMTsKICAgICAgICBteSAkc3RhdGVwMjsKICAgICAgICBt
eSAkc3RhdGVwMzsKICAgICAgICBteSAkc3RhdGVwNDsKICAgICAgICBteSAkZGVsbTsKICAgICAg
ICBteSAkb3V0cHV0OwogICAgICAgIG15ICRlbmQgPSAnJzsKCiAgICAgICAgaWYgKCBkZWZpbmVk
ICR1cmlzWzRdICkgewogICAgICAgICAgICBpZiAoICggJHVyaXNbM10gZXEgJ2xpZ2h0cycgKSAm
JiAoICRBbGV4YU9iamVjdHMtPnsndXVpZCd9LT57ICR1cmlzWzRdIH0gKSApIHsKICAgICAgICAg
ICAgICAgICR1dWlkID0gJHVyaXNbNF07CiAgICAgICAgICAgICAgICAkbmFtZSA9ICRBbGV4YU9i
amVjdHMtPnsndXVpZCd9LT57JHV1aWR9LT57J25hbWUnfTsKICAgICAgICAgICAgICAgICRib2R5
ID1+IHMvOiAvOi9nOwogICAgICAgICAgICAgICAgJG5hbWUgPX4gcy9fLyAvZzsKICAgICAgICAg
ICAgICAgIG15ICRzdGF0ZW9iaiA9IGV2YWwgeyBKU09OOjpkZWNvZGVfanNvbigneycuJmdldF9z
ZXRfc3RhdGUoICRzZWxmLCAkQWxleGFPYmplY3RzLCAkdXVpZCwgJ2dldCcsICRib2R5ICkuJ30n
KSB9OwogICAgICAgICAgICAgICAgbXkgJGxpZ2h0b2JqLT57c3RhdGV9LT57b259ID0gJHN0YXRl
b2JqLT57b259OwogICAgICAgICAgICAgICAgJGxpZ2h0b2JqLT57c3RhdGV9LT57YnJpfSA9ICRz
dGF0ZW9iai0+e2JyaX0gfHwgMTsKICAgICAgICAgICAgICAgICRsaWdodG9iai0+e3N0YXRlfS0+
e2FsZXJ0fSA9ICJub25lIjsKICAgICAgICAgICAgICAgICRsaWdodG9iai0+e3N0YXRlfS0+e21v
ZGV9ID0gImhvbWVhdXRvbWF0aW9uIjsKICAgICAgICAgICAgICAgICRsaWdodG9iai0+e3N0YXRl
fS0+e3JlYWNoYWJsZX0gPSBcMTsKICAgICAgICAgICAgICAgICRsaWdodG9iai0+e25hbWV9ID0g
JG5hbWU7CiAgICAgICAgICAgICAgICAkbGlnaHRvYmotPnt0eXBlfSA9ICJEaW1tYWJsZSBsaWdo
dCI7CiAgICAgICAgICAgICAgICAkbGlnaHRvYmotPnttb2RlbGlkfSA9ICJMV0IwMTQiOwogICAg
ICAgICAgICAgICAgJGxpZ2h0b2JqLT57bWFudWZhY3R1cmVybmFtZX0gPSAiUGhpbGlwcyI7CiAg
ICAgICAgICAgICAgICAkbGlnaHRvYmotPntwcm9kdWN0bmFtZX0gPSAiSHVlIHdoaXRlIGxhbXAi
OwogICAgICAgICAgICAgICAgJGxpZ2h0b2JqLT57dW5pcXVlaWR9ID0gJnVuaXF1ZWlkKCRuYW1l
LCR1dWlkKTsKICAgICAgICAgICAgICAgICRsaWdodG9iai0+e3N3dmVyc2lvbn0gPSAiMS4yMy4w
X3IyMDE1NiI7CiAgICAgICAgICAgICAgICAkbGlnaHRvYmotPntzd2NvbmZpZ2lkfSA9ICIzMjFE
NzlFQSI7CiAgICAgICAgICAgICAgICAkbGlnaHRvYmotPntwcm9kdWN0aWR9ID0gIlBoaWxpcHMt
TFdCMDE0LTEtQTE5REx2NCI7CiAgICAgICAgICAgICAgICAkbGlnaHRvYmotPntzd3VwZGF0ZX0t
PntzdGF0ZX0gPSAicmVhZHl0b2luc3RhbGwiOwogICAgICAgICAgICAgICAgJGxpZ2h0b2JqLT57
c3d1cGRhdGV9LT57bGFzdGluc3RhbGx9ID0gdW5kZWY7CiAgICAgICAgICAgICAgICAkbGlnaHRv
YmotPntjb25maWd9LT57YXJjaGV0eXBlfSA9ICJjbGFzc2ljYnVsYiI7CiAgICAgICAgICAgICAg
ICAkbGlnaHRvYmotPntjb25maWd9LT57ZnVuY3Rpb259ID0gImZ1bmN0aW9uIjsKICAgICAgICAg
ICAgICAgICRsaWdodG9iai0+e2NvbmZpZ30tPntkaXJlY3Rpb259ID0gIm9tbmlkaXJlY3Rpb25h
bCI7CiAgICAgICAgICAgICAgICAkbGlnaHRvYmotPntjYXBhYmlsaXRpZXN9LT57Y2VydGlmaWVk
fSA9IFwxOwogICAgICAgICAgICAgICAgJGxpZ2h0b2JqLT57Y2FwYWJpbGl0aWVzfS0+e2NvbnRy
b2x9LT57bWluZGltbGV2ZWx9ID0gNTAwMDsKICAgICAgICAgICAgICAgICRsaWdodG9iai0+e2Nh
cGFiaWxpdGllc30tPntjb250cm9sfS0+e21heGx1bWVufSA9IDg0MDsKICAgICAgICAgICAgICAg
ICRsaWdodG9iai0+e2NhcGFiaWxpdGllc30tPntzdHJlYW1pbmd9LT57cmVuZGVyZXJ9ID0gXDA7
CiAgICAgICAgICAgICAgICAkbGlnaHRvYmotPntjYXBhYmlsaXRpZXN9LT57c3RyZWFtaW5nfS0+
e3Byb3h5fSA9IFwwOwogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBldmFsIHsgSlNPTi0+bmV3
LT51dGY4LT5jYW5vbmljYWwtPmVuY29kZSgkbGlnaHRvYmopIH07CiAgICAgICAgICAgICAgICAj
bWFpbjo6cHJpbnRfbG9nKCJbQWxleGFdIERlYnVnOiBNSCByZXR1cm4gY29udGVudDogIi4gJGNv
bnRlbnQuIlxuIikgaWYgJG1haW46OkRlYnVneydhbGV4YSd9OwogICAgICAgICAgICAgICAgJGNv
dW50ICAgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJHVyaXNbM10gZXEg
J2xpZ2h0cycgKSB7CiAgICAgICAgICAgICAgICAmbWFpbjo6cHJpbnRfbG9nKCJbQWxleGFdIEVy
cm9yOiBObyBNYXRjaGluZyBvYmplY3QgZm9yIFVVSUQgKCAkdXJpc1s0XSApIik7CiAgICAgICAg
ICAgICAgICAkb3V0cHV0ID0gIkhUVFAvMS4xIDQwNCBOb3QgRm91bmRcclxuU2VydmVyOiBNaXN0
ZXJIb3VzZVxyXG5DYWNoZS1Db250cm9sOiBuby1jYWNoZVxyXG5Db250ZW50LUxlbmd0aDogMlxy
XG5EYXRlOiAiIC4gdGltZTJzdHIodGltZSkgLiAiXHJcblxyXG4uLiI7CiAgICAgICAgICAgICAg
ICAmbWFpbjo6cHJpbnRfbG9nKCJbQWxleGFdIERlYnVnOiBNSCBSZXNwb25zZSAkb3V0cHV0IFxu
IikgaWYgJG1haW46OkRlYnVneydhbGV4YSd9OwogICAgICAgICAgICAgICAgcmV0dXJuICRvdXRw
dXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAoICR1cmlzWzNdIGVxICdncm91
cHMnICkgJiYgKCAkQWxleGFPYmplY3RzLT57J2dyb3Vwcyd9LT57ICR1cmlzWzRdIH0gKSApIHsK
ICAgICAgICAgICAgICAgICRuYW1lID0gJEFsZXhhT2JqZWN0cy0+eydncm91cHMnfS0+eyAkdXJp
c1s0XSB9LT57J25hbWUnfTsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gcXFbeyJhY3Rpb24i
OiB7Im9uIjogdHJ1ZSwiaHVlIjogMCwiZWZmZWN0IjogIm5vbmUiLCJicmkiOiAxMDAsInNhdCI6
IDEwMCwiY3QiOiA1MDAsInh5IjogXFswLjUsIDAuNVxdfSwibGlnaHRzIjogXFsiMSIsIjIiXF0s
InN0YXRlIjp7ImFueV9vbiI6dHJ1ZSwiYWxsX29uIjp0cnVlfSJ0eXBlIjoiUm9vbSIsImNsYXNz
IjoiT3RoZXIiLCJuYW1lIjoiJG5hbWUifV07CiAgICAgICAgICAgICAgICAkY291bnQgPSAxOwog
ICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggZGVmaW5lZCAkdXJpc1szXSAp
IHsKICAgICAgICAgICAgaWYgKCAkdXJpc1szXSBlcSAnbGlnaHRzJyApIHsKICAgICAgICAgICAg
ICAgICRBbGV4YU9iakNodW5rID0gJHNlbGYtPl9HZXRDaHVuayggJHVyaXNbM10gKSBpZiAoICQ6
OmNvbmZpZ19wYXJtc3snYWxleGFFbmFibGVDaHVua2VkJ30gKTsKICAgICAgICAgICAgICAgIG15
ICRsaWdodG9iajsKICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJHV1aWQgKCBrZXlzICV7ICRB
bGV4YU9iakNodW5rLT57J3V1aWQnfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRuYW1lID0g
JEFsZXhhT2JqQ2h1bmstPnsndXVpZCd9LT57JHV1aWR9LT57J25hbWUnfTsKICAgICAgICAgICAg
ICAgICAgICAkbmFtZSA9fiBzL18vIC9nOwogICAgICAgICAgICAgICAgICAgIG5leHQgdW5sZXNz
ICRuYW1lOwogICAgICAgICAgICAgICAgICAgIG15ICRzdGF0ZW9iaiA9IGV2YWwgeyBKU09OOjpk
ZWNvZGVfanNvbigneycuJmdldF9zZXRfc3RhdGUoICRzZWxmLCAkQWxleGFPYmplY3RzLCAkdXVp
ZCwgJ2dldCcgKS4nfScpIH07CiAgICAgICAgICAgICAgICAgICAgJGxpZ2h0b2JqLT57JHV1aWR9
LT57c3RhdGV9LT57b259ID0gJHN0YXRlb2JqLT57b259OwogICAgICAgICAgICAgICAgICAgICRs
aWdodG9iai0+eyR1dWlkfS0+e3N0YXRlfS0+e2JyaX0gPSAkc3RhdGVvYmotPnticml9IHx8IDE7
CiAgICAgICAgICAgICAgICAgICAgJGxpZ2h0b2JqLT57JHV1aWR9LT57c3RhdGV9LT57YWxlcnR9
ID0gIm5vbmUiOwogICAgICAgICAgICAgICAgICAgICRsaWdodG9iai0+eyR1dWlkfS0+e3N0YXRl
fS0+e21vZGV9ID0gImhvbWVhdXRvbWF0aW9uIjsKICAgICAgICAgICAgICAgICAgICAkbGlnaHRv
YmotPnskdXVpZH0tPntzdGF0ZX0tPntyZWFjaGFibGV9ID0gXDE7CiAgICAgICAgICAgICAgICAg
ICAgJGxpZ2h0b2JqLT57JHV1aWR9LT57bmFtZX0gPSAkbmFtZTsKICAgICAgICAgICAgICAgICAg
ICAkbGlnaHRvYmotPnskdXVpZH0tPnt0eXBlfSA9ICJEaW1tYWJsZSBsaWdodCI7CiAgICAgICAg
ICAgICAgICAgICAgJGxpZ2h0b2JqLT57JHV1aWR9LT57bW9kZWxpZH0gPSAiTFdCMDE0IjsKICAg
ICAgICAgICAgICAgICAgICAkbGlnaHRvYmotPnskdXVpZH0tPnttYW51ZmFjdHVyZXJuYW1lfSA9
ICJQaGlsaXBzIjsKICAgICAgICAgICAgICAgICAgICAkbGlnaHRvYmotPnskdXVpZH0tPntwcm9k
dWN0bmFtZX0gPSAiSHVlIHdoaXRlIGxhbXAiOwogICAgICAgICAgICAgICAgICAgICRsaWdodG9i
ai0+eyR1dWlkfS0+e3VuaXF1ZWlkfSA9ICZ1bmlxdWVpZCgkbmFtZSwkdXVpZCk7CiAgICAgICAg
ICAgICAgICAgICAgJGxpZ2h0b2JqLT57JHV1aWR9LT57c3d2ZXJzaW9ufSA9ICIxLjIzLjBfcjIw
MTU2IjsKICAgICAgICAgICAgICAgICAgICAkbGlnaHRvYmotPnskdXVpZH0tPntzd2NvbmZpZ2lk
fSA9ICIzMjFENzlFQSI7CiAgICAgICAgICAgICAgICAgICAgJGxpZ2h0b2JqLT57JHV1aWR9LT57
cHJvZHVjdGlkfSA9ICJQaGlsaXBzLUxXQjAxNC0xLUExOURMdjQiOwogICAgICAgICAgICAgICAg
ICAgICRsaWdodG9iai0+eyR1dWlkfS0+e3N3dXBkYXRlfS0+e3N0YXRlfSA9ICJyZWFkeXRvaW5z
dGFsbCI7CiAgICAgICAgICAgICAgICAgICAgJGxpZ2h0b2JqLT57JHV1aWR9LT57c3d1cGRhdGV9
LT57bGFzdGluc3RhbGx9ID0gdW5kZWY7CiAgICAgICAgICAgICAgICAgICAgJGxpZ2h0b2JqLT57
JHV1aWR9LT57Y29uZmlnfS0+e2FyY2hldHlwZX0gPSAiY2xhc3NpY2J1bGIiOwogICAgICAgICAg
ICAgICAgICAgICRsaWdodG9iai0+eyR1dWlkfS0+e2NvbmZpZ30tPntmdW5jdGlvbn0gPSAiZnVu
Y3Rpb24iOwogICAgICAgICAgICAgICAgICAgICRsaWdodG9iai0+eyR1dWlkfS0+e2NvbmZpZ30t
PntkaXJlY3Rpb259ID0gIm9tbmlkaXJlY3Rpb25hbCI7CiAgICAgICAgICAgICAgICAgICAgJGxp
Z2h0b2JqLT57JHV1aWR9LT57Y2FwYWJpbGl0aWVzfS0+e2NlcnRpZmllZH0gPSBcMTsKICAgICAg
ICAgICAgICAgICAgICAkbGlnaHRvYmotPnskdXVpZH0tPntjYXBhYmlsaXRpZXN9LT57Y29udHJv
bH0tPnttaW5kaW1sZXZlbH0gPSA1MDAwOwogICAgICAgICAgICAgICAgICAgICRsaWdodG9iai0+
eyR1dWlkfS0+e2NhcGFiaWxpdGllc30tPntjb250cm9sfS0+e21heGx1bWVufSA9IDg0MDsKICAg
ICAgICAgICAgICAgICAgICAkbGlnaHRvYmotPnskdXVpZH0tPntjYXBhYmlsaXRpZXN9LT57c3Ry
ZWFtaW5nfS0+e3JlbmRlcmVyfSA9IFwwOwogICAgICAgICAgICAgICAgICAgICRsaWdodG9iai0+
eyR1dWlkfS0+e2NhcGFiaWxpdGllc30tPntzdHJlYW1pbmd9LT57cHJveHl9ID0gXDA7CiAgICAg
ICAgICAgICAgICAgICAgJGNvdW50Kys7CiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAg
ICAgJGNvbnRlbnQgPSBldmFsIHsgSlNPTi0+bmV3LT51dGY4LT5jYW5vbmljYWwtPmVuY29kZSgk
bGlnaHRvYmopIH0gaWYgJGNvdW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgg
JHVyaXNbM10gZXEgJ2dyb3VwcycgKSB7CiAgICAgICAgICAgICAgICAkc3RhdGVwMSAgICAgICA9
IHFxW3siXTsKICAgICAgICAgICAgICAgICRzdGF0ZXAyICAgICAgID0gcXFbIjoiXTsKICAgICAg
ICAgICAgICAgICRlbmQgICAgICAgICAgID0gcXFbIn1dOwogICAgICAgICAgICAgICAgJGRlbG0g
ICAgICAgICAgPSBxcVsiLCJdOwogICAgICAgICAgICAgICAgJEFsZXhhT2JqQ2h1bmsgPSAkc2Vs
Zi0+X0dldENodW5rKCAkdXJpc1szXSApIGlmICggJDo6Y29uZmlnX3Bhcm1zeydhbGV4YUVuYWJs
ZUNodW5rZWQnfSApOwogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkaWQgKCBrZXlzICV7ICRB
bGV4YU9iakNodW5rLT57J2dyb3Vwcyd9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJG5hbWUg
PSAkQWxleGFPYmpDaHVuay0+eydncm91cHMnfS0+eyRpZH0tPnsnbmFtZSd9OwogICAgICAgICAg
ICAgICAgICAgIG5leHQgdW5sZXNzICRuYW1lOwogICAgICAgICAgICAgICAgICAgICRzdGF0ZXAx
ID0KICAgICAgICAgICAgICAgICAgICAgIHFxW3siJGlkIjogeyJuYW1lIjogIiRuYW1lIiwibGln
aHRzIjogXFsiMSIsIjIiXF0sInR5cGUiOiAiTGlnaHRHcm91cCIsImFjdGlvbiI6IHsib24iOiB0
cnVlLCJicmkiOiAyNTQsImh1ZSI6IDEwMDAwLCJzYXQiOiAyNTQsImVmZmVjdCI6ICJub25lIiwi
eHkiOiBcWzAuNSwwLjVcXSwiY3QiOiAyNTAsImFsZXJ0IjogInNlbGVjdCIsImNvbG9ybW9kZSI6
ICJjdCJ9fV07CiAgICAgICAgICAgICAgICAgICAgJGRlbGltID0gcXFbLF07CiAgICAgICAgICAg
ICAgICAgICAgJHN0YXRlcDIgPQogICAgICAgICAgICAgICAgICAgICAgcXFbIiRpZCI6IHsibmFt
ZSI6ICIkbmFtZSIsImxpZ2h0cyI6IFxbIjMiLCI0IlxdLCJ0eXBlIjogIkxpZ2h0R3JvdXAiLCJh
Y3Rpb24iOiB7Im9uIjogdHJ1ZSwiYnJpIjogMTUzLCJodWUiOiA0MzQ1LCJzYXQiOiAyNTQsImVm
ZmVjdCI6ICJub25lIiwieHkiOiBcWzAuNSwwLjVcXSwiY3QiOiAyNTAsImFsZXJ0IjogInNlbGVj
dCIsImNvbG9ybW9kZSI6ICJjdCJ9fV07CiAgICAgICAgICAgICAgICAgICAgJGVuZCA9IHFxW31d
OwogICAgICAgICAgICAgICAgICAgIGlmICAgKCAkY291bnQgPj0gMSApIHsgJGNvbnRlbnQgPSAk
Y29udGVudCAuICRkZWxpbSAuICRzdGF0ZXAyIH0KICAgICAgICAgICAgICAgICAgICBlbHNlICAg
ICAgICAgICAgICAgICB7ICRjb250ZW50ID0gJHN0YXRlcDEgfQogICAgICAgICAgICAgICAgICAg
ICRjb3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAg
ICAgIGVsc2lmICggZGVmaW5lZCAkdXJpc1syXSApIHsKICAgICAgICAgICAgJEFsZXhhT2JqQ2h1
bmsgPSAkc2VsZi0+X0dldENodW5rKCdhbGwnKSBpZiAoICQ6OmNvbmZpZ19wYXJtc3snYWxleGFF
bmFibGVDaHVua2VkJ30gKTsKICAgICAgICAgICAgZm9yZWFjaCBteSAkdXVpZCAoIGtleXMgJXsg
JEFsZXhhT2JqQ2h1bmstPnsndXVpZCd9IH0gKSB7CiAgICAgICAgICAgICAgICAkbmFtZSA9ICRB
bGV4YU9iakNodW5rLT57J3V1aWQnfS0+eyR1dWlkfS0+eyduYW1lJ307CiAgICAgICAgICAgICAg
ICBuZXh0IHVubGVzcyAkbmFtZTsKICAgICAgICAgICAgICAgIG15ICRzdGF0ZSA9ICZnZXRfc2V0
X3N0YXRlKCAkc2VsZiwgJEFsZXhhT2JqZWN0cywgJHV1aWQsICdnZXQnICk7CiAgICAgICAgICAg
ICAgICAkc3RhdGVwMSA9IHFxW3sibGlnaHRzIjp7Il07CiAgICAgICAgICAgICAgICAkc3RhdGVw
MiA9IHFxWyI6eyJzdGF0ZSI6eyRzdGF0ZSwicmVhY2hhYmxlIjp0cnVlfSwidHlwZSI6IkV4dGVu
ZGVkIGNvbG9yIGxpZ2h0IiwibmFtZSI6Il07ICAgICMgZGlzCiAgICAgICAgICAgICAgICAkc3Rh
dGVwMyA9IHFxWyIsIm1vZGVsaWQiOiJMV0IwMTQiLCJtYW51ZmFjdHVyZXJuYW1lIjoiUGhpbGlw
cyIsInN3dmVyc2lvbiI6IjY1MDAzMTQ4In1dOyAgICAgICMKICAgICAgICAgICAgICAgICRlbmQg
ICAgID0gcXFbfX1dOwogICAgICAgICAgICAgICAgJGRlbG0gICAgPSBxcVssIl07CiAgICAgICAg
ICAgICAgICAkbmFtZSAgID1+IHMvXy8gL2c7CiAgICAgICAgICAgICAgICBpZiAgICggJGNvdW50
ID49IDEgKSB7ICRjb250ZW50ID0gJGNvbnRlbnQgLiAkZGVsbSAuICR1dWlkIC4gJHN0YXRlcDIg
LiAkbmFtZSAuICRzdGF0ZXAzIH0KICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAg
IHsgJGNvbnRlbnQgPSAkc3RhdGVwMSAuICR1dWlkIC4gJHN0YXRlcDIgLiAkbmFtZSAuICRzdGF0
ZXAzIH0KICAgICAgICAgICAgICAgICRjb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoK
ICAgICAgICBpZiAoICRjb3VudCA8PSAwICkgeyAKICAgICAgICAgICAgJGVuZCA9ICcnOwogICAg
ICAgICAgICAkY29udGVudCA9ICd7fSc7IAogICAgICAgIH0KCiAgICAgICAgJGNvbnRlbnQgICAg
ICA9ICRjb250ZW50IC4gJGVuZDsKICAgICAgICAkZGVidWdjb250ZW50ID0gJGNvbnRlbnQgaWYg
JG1haW46OkRlYnVneydhbGV4YSd9ID49IDI7CiAgICAgICAgJGNvbnRlbnQgICAgICA9ICZfR3pp
cCggJGNvbnRlbnQsICRIdHRweydBY2NlcHQtRW5jb2RpbmcnfSApOwogICAgICAgICRvdXRwdXQg
ICAgICAgPSAiSFRUUC8xLjEgMjAwIE9LXHJcbiI7CiAgICAgICAgJG91dHB1dCAuPSAiU2VydmVy
OiBNaXN0ZXJIb3VzZVxyXG4iOwogICAgICAgICRvdXRwdXQgLj0gJ0FjY2Vzcy1Db250cm9sLUFs
bG93LU9yaWdpbjogKicgLiAiXHJcbiI7CiAgICAgICAgJG91dHB1dCAuPSAnQWNjZXNzLUNvbnRy
b2wtQWxsb3ctTWV0aG9kczogUE9TVCwgR0VULCBPUFRJT05TLCBERUxFVEUsIFBVVCcgLiAiXHJc
biI7CiAgICAgICAgJG91dHB1dCAuPSAnQWNjZXNzLUNvbnRyb2wtTWF4LUFnZTogMzYwMCcgLiAi
XHJcbiI7CiAgICAgICAgJG91dHB1dCAuPSAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyczog
T3JpZ2luLCBYLVJlcXVlc3RlZC1XaXRoLCBDb250ZW50LVR5cGUsIEFjY2VwdCcgLiAiXHJcbiI7
CiAgICAgICAgJG91dHB1dCAuPSAnWC1BcHBsaWNhdGlvbi1Db250ZXh0OiBhcHBsaWNhdGlvbicg
LiAiXHJcbiI7CiAgICAgICAgJG91dHB1dCAuPSAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9q
c29uO2NoYXJzZXQ9VVRGLTgnIC4gIlxyXG4iOwogICAgICAgICRvdXRwdXQgLj0gIkNvbnRlbnQt
RW5jb2Rpbmc6IGd6aXBcclxuIiBpZiAoICRIdHRweydBY2NlcHQtRW5jb2RpbmcnfSA9fiBtL2d6
aXAvICk7CiAgICAgICAgJG91dHB1dCAuPSAiQ29udGVudC1MZW5ndGg6ICIgLiAoIGxlbmd0aCAk
Y29udGVudCApIC4gIlxyXG4iOwogICAgICAgICRvdXRwdXQgLj0gIkRhdGU6ICIgLiB0aW1lMnN0
cih0aW1lKSAuICJcclxuIjsKICAgICAgICAkb3V0cHV0IC49ICJcclxuIjsKICAgICAgICAkZGVi
dWdjb250ZW50ID0gJG91dHB1dCAuICRkZWJ1Z2NvbnRlbnQgaWYgJG1haW46OkRlYnVneydhbGV4
YSd9ID49IDI7CiAgICAgICAgJG91dHB1dCAuPSAkY29udGVudDsKICAgICAgICAmbWFpbjo6cHJp
bnRfbG9nKCJbQWxleGFdIERlYnVnOiBNSCBSZXNwb25zZSAkZGVidWdjb250ZW50IFxuIikgaWYg
JG1haW46OkRlYnVneydhbGV4YSd9ID49IDI7CiAgICAgICAgcmV0dXJuICRvdXRwdXQ7CiAgICB9
CiAgICBlbHNlIHsgcmV0dXJuIDAgfQp9CgpzdWIgX0d6aXAgewogICAgbXkgKCAkY29udGVudF9y
YXcsICRFbmNvZGluZyApID0gQF87CiAgICBteSAkY29udGVudDsKICAgIGlmICggJEVuY29kaW5n
ID1+IG0vZ3ppcC8gJiYgKCAoIGxlbmd0aCAkY29udGVudF9yYXcgKSA+PSAxICkgKSB7CiAgICAg
ICAgZ3ppcCBcJGNvbnRlbnRfcmF3ID0+IFwkY29udGVudDsKICAgIH0KICAgIGVsc2UgeyAkY29u
dGVudCA9ICRjb250ZW50X3JhdzsgfQogICAgcmV0dXJuICRjb250ZW50Owp9CgpzdWIgX0dldENo
dW5rIHsKICAgIG15ICggJHNlbGYsICR1cmkgKSA9IEBfOwoKICAgICN1c2UgVGltZTo6SGlSZXMg
cXcoY2xvY2tfZ2V0dGltZSk7CiAgICB1c2UgVGltZTo6SGlSZXMgcXcodGltZSk7CgogICAgI215
ICRyZWFsdGltZSA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUpOwogICAgbXkgJHJlYWx0
aW1lID0gdGltZTsKCiAgICAjJHNlbGYtPnsnY29ubid9LT57JHVyaX0tPnt0aW1lfSA9IGNsb2Nr
X2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUpIHVubGVzcyAkc2VsZi0+eydjb25uJ30tPnskdXJpfS0+
e3RpbWV9OwogICAgJHNlbGYtPnsnY29ubid9LT57JHVyaX0tPnt0aW1lfSAgPSB0aW1lIHVubGVz
cyAoIGV4aXN0cyAkc2VsZi0+eydjb25uJ30tPnskdXJpfS0+e3RpbWV9ICk7CiAgICAkc2VsZi0+
eydjb25uJ30tPnskdXJpfS0+e2NvdW50fSA9IDAgICAgdW5sZXNzIGRlZmluZWQoICRzZWxmLT57
J2Nvbm4nfS0+eyR1cml9LT57Y291bnR9ICk7CgojR2V0Q2h1bmsgLSBUaW1lICggMTcxNDc2Nzg0
My45NDI1MyApIFNpemU6ICggMiApIENvdW50OiAoIDAgKSBDb3VudEhhc2g6ICggMSApCgogICAg
aWYgKCAoICRyZWFsdGltZSAtICRzZWxmLT57J2Nvbm4nfS0+eyR1cml9LT57dGltZX0gKSA8PSAz
MCApIHsKICAgICAgICBteSAkc2l6ZSA9ICRzZWxmLT57Y2hpbGR9LT57Q2hrQ250fTsKICAgICAg
ICBpZiAoICRzZWxmLT57J2Nvbm4nfS0+eyR1cml9LT57Y291bnR9IGVxICRzaXplICkgeyAKICAg
ICAgICAgICAgJENoa0NudCA9ICRzaXplOyAKCQkJJHNlbGYtPnsnY29ubid9LT57JHVyaX0tPntj
b3VudH0gPSAwOwoJCX0gZWxzaWYgKCBkZWZpbmVkKCAkc2VsZi0+eydjb25uJ30tPnskdXJpfS0+
e2NvdW50fSApICkgeyAKCQkJJENoa0NudCA9ICRzZWxmLT57J2Nvbm4nfS0+eyR1cml9LT57Y291
bnR9OyAKCQkJJHNlbGYtPnsnY29ubid9LT57JHVyaX0tPntjb3VudH0rKzsKCQl9CiAgICAgICAg
Jm1haW46OnByaW50X2xvZygiW0FsZXhhXSBEZWJ1ZzogR2V0Q2h1bmsgLSBUaW1lICggJHJlYWx0
aW1lICkgQ2h1bmtTaXplOiAoICRzaXplICkgQ291bnQ6ICggJENoa0NudCApIENvdW50SGFzaDog
KCAkc2VsZi0+eydjb25uJ30tPnskdXJpfS0+e2NvdW50fSApXG4iKSBpZiAkbWFpbjo6RGVidWd7
J2FsZXhhJ307CiAgICB9IGVsc2UgeyAKICAgICAgICB1bmRlZiAkc2VsZi0+eydjb25uJ30tPnsk
dXJpfS0+e3RpbWV9OyAKICAgICAgICB1bmRlZiAkc2VsZi0+eydjb25uJ30tPnskdXJpfS0+e2Nv
dW50fSAKICAgIH0KICAgIG15ICRBbGV4YU9iakNodW5rID0gJHNlbGYtPntjaGlsZH0tPnskQ2hr
Q250fTsKICAgIHJldHVybiAkQWxleGFPYmpDaHVuazsKfQoKc3ViIERpc2NvdmVyQWRkeSB7CiAg
ICBldmFsICJ1c2UgTmV0OjpBZGRyZXNzOjpFdGhlcm5ldCBxdyggOmFsbCApIjsKICAgIGlmICgk
QCkgewogICAgICAgIHByaW50ICJcbiBbQWxleGFdIEVycm9yOiBOZXQ6OkFkZHJlc3M6OkV0aGVy
bmV0IGlzIG5vdCBpbnN0YWxsZWQuLi4gUGxlYXNlIGluc3RhbGwgaXQgb3IgZGVmaW5lIHRoZSBs
b2NhbCBJUCBhbmQgbWFjIGluIGFsZXhhSHR0cElwL2FsZXhhTWFjXG5cbiIKICAgICAgICAgIGlm
ICggJDo6Y29uZmlnX3Bhcm1zeydhbGV4YV9lbmFibGUnfSApOwogICAgICAgIHJldHVybiAoICcx
MjcuMC4wLjEnLCAnOWFhNjQ1Y2M0MGFhJyApOyAgICAjIHJldHVybiBsb2NhbGhvc3QgYXMgd2Ug
ZG9udCBrbm93IHRoZSByZWFsIGFkZHJlc3MKICAgIH0KICAgIG15IEBhID0gZ2V0X2FkZHJlc3Nl
cyhAXyk7CiAgICBmb3JlYWNoIG15ICRhZGFwdGVyIChAYSkgewogICAgICAgIG5leHQgdW5sZXNz
ICggJGFkYXB0ZXItPntpQWN0aXZlfSBlcSAxICk7CiAgICAgICAgbmV4dCBpZiAoICRhZGFwdGVy
LT57c0V0aGVybmV0fSBlcSAnJyApOwogICAgICAgIG5leHQgaWYgKCAkYWRhcHRlci0+e3NJUH0g
PX4gLzEyN1wuMFwuMFwuMS8gKTsKICAgICAgICBteSAkTWFjID0gJGFkYXB0ZXItPntzRXRoZXJu
ZXR9OwogICAgICAgICRNYWMgPX4gcy86Ly9nOwogICAgICAgIHJldHVybiAoICRhZGFwdGVyLT57
c0lQfSwgJE1hYyApOwogICAgfQp9CgpzdWIgdW5pcXVlaWQgewoJbXkgKCAkbmFtZSwgJGxpZ2h0
aW5kZXggKSA9IEBfOwoJI215ICgkbWFjX2hpLCAkbWFjX2xvKSA9IHVucGFjaygibk4iLCBwYWNr
KCdIKicsICc4ODAxMDQwMDNkMDAnKSk7CgkjbXkgJG1hY19oZXggPSBzcHJpbnRmKCIlMDRYJTA4
WCIsICRtYWNfaGksICgkbWFjX2xvICsgJHV1aWQpKTsKCSNteSAkbWFjX3N0ciA9IGpvaW4oJzon
LCAkbWFjX2hleCA9fiAvLi4vc2cpOwoJI3JldHVybiBsYygiMDA6MTc6JG1hY19zdHItMGIiKTsK
CXVzZSBEYXRhOjpVVUlEOwoJbXkgJHVnID0gRGF0YTo6VVVJRC0+bmV3OwoJJG5hbWUgPX4gcy9c
cy8vZzsKCW15ICR1dWlkID0gJHVnLT5jcmVhdGVfZnJvbV9uYW1lX2hleChOYW1lU3BhY2VfRE5T
LCAkbGlnaHRpbmRleC4kbmFtZSk7CgkkdXVpZCA9IChzdWJzdHIgJHV1aWQsIDIsIDE2KTsKCSR1
dWlkID0gam9pbignOicsICR1dWlkID1+IC8uLi9zZyk7CglyZXR1cm4gbGMoIiR1dWlkLTBiIik7
Cn0KCnN1YiBnZXRfc2V0X3N0YXRlIHsKICAgIG15ICggJHNlbGYsICRBbGV4YU9iamVjdHMsICR1
dWlkLCAkYWN0aW9uLCAkc3RhdGUgKSA9IEBfOwogICAgbXkgJG5hbWUgICAgID0gJEFsZXhhT2Jq
ZWN0cy0+eyd1dWlkJ30tPnskdXVpZH0tPnsnbmFtZSd9OwogICAgbXkgJHJlYWxuYW1lID0gJEFs
ZXhhT2JqZWN0cy0+eyd1dWlkJ30tPnskdXVpZH0tPnsncmVhbG5hbWUnfTsKICAgIG15ICRzdWIg
ICAgICA9ICRBbGV4YU9iamVjdHMtPnsndXVpZCd9LT57JHV1aWR9LT57J3N1Yid9OwogICAgbXkg
JHN0YXRlc3ViID0gJEFsZXhhT2JqZWN0cy0+eyd1dWlkJ30tPnskdXVpZH0tPnsnc3RhdGVzdWIn
fTsKICAgICRzdGF0ZSA9ICRBbGV4YU9iamVjdHMtPnsndXVpZCd9LT57JHV1aWR9LT57IGxjKCRz
dGF0ZSkgfSBpZiAkQWxleGFPYmplY3RzLT57J3V1aWQnfS0+eyR1dWlkfS0+eyBsYygkc3RhdGUp
IH07CiAgICBpZiAoICggJHN0YXRlID1+IC9cZCsvICkgYW5kICggJGFjdGlvbiBlcSAnc2V0JyAp
ICkgeyAkc3RhdGUgPSAmcm91bmRvZmYoICRzdGF0ZSAvIDIuNTQgKSB9CiAgICAmbWFpbjo6cHJp
bnRfbG9nKCJbQWxleGFdIERlYnVnOiBnZXRfc2V0X3N0YXRlIChVVUlEOiR1dWlkLCBBY3Rpb246
JGFjdGlvbiwgU3RhdGU6JHN0YXRlKSA6IG5hbWU6ICRuYW1lICByZWFsbmFtZTogJHJlYWxuYW1l
IHN1YjogJHN1YiBzdGF0ZTogJHN0YXRlXG4iKSBpZiAkbWFpbjo6RGVidWd7J2FsZXhhJ307CiAg
ICAKICAgICMgQWxleGEgZXhwZWN0cyB0aGF0IHRoZSBxdWVyaWVkIHN0YXRlIGlzIHdoYXQgc2hl
IHNldCBpdCB0byBvciBzaGUgY29tcGxhaW5zIGFib3V0IGEgbWFsZnVuY3Rpb24uIAogICAgIyBT
aGUgc2VuZHMgdGhlIHN0YXRlIHNoZSB0aGlua3MgdGhlIGRlaXZjZSBpcyBpbiwgaW4gdGhlIGJv
ZHkgb2YgYSBnZXQgc3RhdGUgcmVxdWVzdCBmb3IgYSBwZXJpb2QgYWZ0ZXIgYSBzZXQgcmVxdWVz
dC4gCiAgICAjIEZvciBpbnN0YW5jZXMgbGlrZSBzdWJzIGFuZCB2b2ljZSBjb21tYW5kcyB3aGVy
ZSB3ZSBtYXkgbm90IGdldCBhIHN0YXRlLCB3ZSBqdXN0IHJldHVybiB0aGUgb25lIGFsZXhhIHNl
bnQuICAKICAgIG15ICRwc3RhdGUgPSAnb24nOyAjRGVmYXVsdCBwcmV2IHN0YXRlCiAgICBteSAk
cGxldmVsID0gJzI1NCc7ICNEZWZhdWx0IHByZXYgbGV2ZWwKICAgIG15ICRzdGF0ZXNyYyA9ICdE
RUZBVUxUJzsKICAgIG15ICRsZXZlbHNyYyA9ICdERUZBVUxUJzsKICAgIGlmICggJGFjdGlvbiBl
cSAnZ2V0JyApIHsgI0dldCBwcmV2IHN0YXRlL2xldmVsIGZyb20gdGhlIGJvZHkgb2YgdGhlIGdl
dCAKICAgICAgICBpZiAgICAoICRzdGF0ZSA9fiAvXCIob24pXCI6KHRydWUpLyApICAgeyAkcHN0
YXRlID0gJ29uJzsgJHN0YXRlc3JjID0gJ0FMRVhBJzsgfQogICAgICAgIGVsc2lmICggJHN0YXRl
ID1+IC9cIihvbilcIjooZmFsc2UpLyApICB7ICRwc3RhdGUgPSAnb2ZmJzsgJHN0YXRlc3JjID0g
J0FMRVhBJzsgfQogICAgICAgIGlmICAgICggJHN0YXRlID1+IC9cIihicmkpXCI6KFxkKykvICkg
ICB7ICRwbGV2ZWwgPSAkMjsgJGxldmVsc3JjID0gJ0FMRVhBJzsgfQogICAgfQoKCiAgICBpZiAo
ICRyZWFsbmFtZSA9fiAvXlwkLyApIHsKICAgICAgICBteSAkb2JqZWN0ID0gOjpnZXRfb2JqZWN0
X2J5X25hbWUoJHJlYWxuYW1lKTsKICAgICAgICByZXR1cm4gcXFbIm9uIjp0cnVlLCJicmkiOjI1
NF0gdW5sZXNzIGRlZmluZWQgJG9iamVjdDsKICAgICAgICBpZiAoICRhY3Rpb24gZXEgJ2dldCcg
KSB7CiAgICAgICAgICAgIG15ICRjc3RhdGUgPSAkb2JqZWN0LT4kc3RhdGVzdWI7CiAgICAgICAg
ICAgICRjc3RhdGUgPX4gcy9cJS8vOwogICAgICAgICAgICBteSAkbGV2ZWwgPSAkcGxldmVsOyAj
U2V0IHRoZSBkZWZhdWx0IGxldmVsIHRvIHRoZSBwcmV2IGxldmVsIGZyb20gdGhlIGJvZHkgb2Yg
dGhlIGdldAogICAgICAgICAgICBteSAkdHlwZSAgPSAkb2JqZWN0LT5nZXRfdHlwZSgpOwogICAg
ICAgICAgICBteSAkZGVidWcgPSAiW0FsZXhhXSBEZWJ1ZzogZ2V0X3NldF9zdGF0ZSAoYWN0dWFs
IG9iamVjdCBzdGF0ZTogJGNzdGF0ZSkgLSAob2JqZWN0IHR5cGU6ICR0eXBlKSAtICI7CiAgICAg
ICAgICAgIG15ICRyZXR1cm47CiAgICAgICAgICAgIGlmICggJG9iamVjdC0+Y2FuKCdpc19kaW1t
YWJsZScpICAmJiAgJG9iamVjdC0+aXNfZGltbWFibGUgKSB7CiAgICAgICAgICAgICAgICBteSAk
bCA9ICRvYmplY3QtPmxldmVsOwogICAgICAgICAgICAgICAgJGwgPX4gcy9cJS8vOwogICAgICAg
ICAgICAgICAgaWYgKCAkbCA9fiAvXGQrLyApIHsKICAgICAgICAgICAgICAgICAgICAkbGV2ZWwg
PSAoICZyb3VuZG9mZiggKCRsKSAqIDIuNTQgKSApOwogICAgICAgICAgICAgICAgICAgICRkZWJ1
ZyAuPSAiKGxldmVsOiAkbGV2ZWwpIC0gIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg
fQogICAgICAgICAgICBpZiAoIGxjKCR0eXBlKSA9fiAveDEwLyApIHsKICAgICAgICAgICAgICAg
IGlmICggKCAkY3N0YXRlID1+IC9cZCsvICkgfHwgKCAkY3N0YXRlID1+IC9kaW0vICkgfHwgKCAk
Y3N0YXRlID1+IC9icmlnaHQvICkgKSB7ICRjc3RhdGUgPSAnb24nIH0KICAgICAgICAgICAgICAg
ICRkZWJ1ZyAuPSAiKGRldGVybWluZWQgc3RhdGU6ICRjc3RhdGUpIC0gIjsKICAgICAgICAgICAg
fQogICAgICAgICAgICBpZiAgICAoIGxjKCAkQWxleGFPYmplY3RzLT57J3V1aWQnfS0+eyR1dWlk
fS0+eydvbid9ICkgZXEgbGMoJGNzdGF0ZSkgKSAgeyAkcmV0dXJuID0gcXFbIm9uIjp0cnVlLCJi
cmkiOiRsZXZlbF0gfQogICAgICAgICAgICBlbHNpZiAoIGxjKCAkQWxleGFPYmplY3RzLT57J3V1
aWQnfS0+eyR1dWlkfS0+eydvZmYnfSApIGVxIGxjKCRjc3RhdGUpICkgeyAkcmV0dXJuID0gcXFb
Im9uIjpmYWxzZSwiYnJpIjokbGV2ZWxdIH0KICAgICAgICAgICAgZWxzaWYgKCAkY3N0YXRlID1+
IC9cZCsvICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsg
JHJldHVybiA9IHFxWyJvbiI6dHJ1ZSwiYnJpIjpdIC4gJnJvdW5kb2ZmKCAkY3N0YXRlICogMi41
NCApIH0KICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJHJldHVybiA9IHFxWyJvbiI6dHJ1
ZSwiYnJpIjokbGV2ZWxdIH0KICAgICAgICAgICAgJm1haW46OnByaW50X2xvZygiJGRlYnVnIHJl
dHVybmluZyAtICRyZXR1cm5cbiIpIGlmICRtYWluOjpEZWJ1Z3snYWxleGEnfTsKICAgICAgICAg
ICAgcmV0dXJuICRyZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJGFjdGlvbiBlcSAn
c2V0JyApIHsKICAgICAgICAgICAgaWYgKCAkb2JqZWN0LT5jYW4oJ2lzX2RpbW1hYmxlJykgJiYg
JG9iamVjdC0+aXNfZGltbWFibGUgJiYgJHN0YXRlID1+IC9cZCsvICkgeyAkc3RhdGUgPSAkc3Rh
dGUgLiAnJScgfQogICAgICAgICAgICAmbWFpbjo6cHJpbnRfbG9nKCJbQWxleGFdIERlYnVnOiBz
ZXR0aW5nIG9iamVjdCAoICRyZWFsbmFtZSApIHRvIHN0YXRlICggJHN0YXRlIClcbiIpIGlmICRt
YWluOjpEZWJ1Z3snYWxleGEnfTsKICAgICAgICAgICAgaWYgICAoIGxjKCR0eXBlKSA9fiAvY2xp
cHNhbF9jYnVzLyApIHsgJG9iamVjdC0+JHN1YiggJHN0YXRlLCAnQWxleGEnICkgfQogICAgICAg
ICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAkb2JqZWN0LT4kc3Vi
KCAkc3RhdGUsICdBbGV4YScgKSB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9
CiAgICBlbHNpZiAoICRzdWIgPX4gL15ydW5fdm9pY2VfY21kJC8gKSB7CiAgICAgICAgaWYgKCAk
YWN0aW9uIGVxICdzZXQnICkgewogICAgICAgICAgICAkcmVhbG5hbWUgPX4gcy8jLyRzdGF0ZS87
CiAgICAgICAgICAgICRyZWFsbmFtZSA9fiBzLyEvJHN0YXRlLzsKICAgICAgICAgICAgJm1haW46
OnByaW50X2xvZygiW0FsZXhhXSBEZWJ1ZzogcnVubmluZyB2b2ljZSBjb21tYW5kOiAoICRyZWFs
bmFtZSApXG4iKSBpZiAkbWFpbjo6RGVidWd7J2FsZXhhJ307CiAgICAgICAgICAgICZtYWluOjpy
dW5fdm9pY2VfY21kKCIkcmVhbG5hbWUiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0K
ICAgICAgICBlbHNpZiAoICRhY3Rpb24gZXEgJ2dldCcgKSB7ICNSZXR1cm4gcHJldiBzdGF0ZS9s
ZXZlbCBzZW50IGluIHRoZSBib2R5IG9mIHRoZSBnZXQKICAgICAgICAgICAgJHBzdGF0ZSA9ICci
b24iOnRydWUnIGlmICRwc3RhdGUgZXEgJ29uJzsKICAgICAgICAgICAgJHBzdGF0ZSA9ICcib24i
OmZhbHNlJyBpZiAkcHN0YXRlIGVxICdvZmYnOwogICAgICAgICAgICBteSAkcmV0dXJuID0gcXFb
JHBzdGF0ZSwiYnJpIjokcGxldmVsXTsKICAgICAgICAgICAgJm1haW46OnByaW50X2xvZygiW0Fs
ZXhhXSBEZWJ1ZzogZ2V0X3NldF9zdGF0ZSByZXF1ZXN0OiAoIGdldCApIHZvaWNlIGNvbW1hbmQ6
ICggJHJlYWxuYW1lICkgLSByZXR1cm5pbmcgJHJldHVybiIpIGlmICRtYWluOjpEZWJ1Z3snYWxl
eGEnfTsKICAgICAgICAgICAgcmV0dXJuICRyZXR1cm47CiAgICAgICAgfQoKICAgIH0KICAgIGVs
c2lmICggcmVmKCRzdWIpIGVxICdDT0RFJyApIHsKICAgICAgICBpZiAoICRhY3Rpb24gZXEgJ3Nl
dCcgKSB7CiAgICAgICAgICAgICZtYWluOjpwcmludF9sb2coIltBbGV4YV0gRGVidWc6IHJ1bm5p
bmcgc3ViOiAkc3ViKCBzZXQsICRzdGF0ZSApIFxuIikgaWYgJG1haW46OkRlYnVneydhbGV4YSd9
OwogICAgICAgICAgICAmeyRzdWJ9KCAnc2V0JywgJHN0YXRlICk7CiAgICAgICAgICAgIHJldHVy
bjsKICAgICAgICB9IGVsc2lmICggJGFjdGlvbiBlcSAnZ2V0JyApIHsKICAgICAgICAgICAgbXkg
JGRlYnVnID0gIltBbGV4YV0gRGVidWc6IGdldF9zZXRfc3RhdGUgcnVubmluZyBzdWI6ICRzdWIo
IHN0YXRlLCAkcGxldmVsICkgLSAiOwogICAgICAgICAgICBteSAkc3RhdGUgPSAmeyRzdWJ9KCdz
dGF0ZScsJHBzdGF0ZSwkc3RhdGVzcmMsJnJvdW5kb2ZmKCAkcGxldmVsIC8gMi41NCApLCRsZXZl
bHNyYyk7ICNUcnkgdG8gZ2V0IHRoZSBzdGF0ZSBmcm9tIHRoZSBzdWIKICAgICAgICAgICAgbXkg
JGxldmVsOwoKICAgICAgICAgICAgI0FsbG93IHJldHVybmluZyBzdGF0ZSBhbmQgbGV2ZWwgY29t
bWEgc2VwZXJhdGVkCiAgICAgICAgICAgICNJRTogb24sNTAKICAgICAgICAgICAgaWYgKCRzdGF0
ZSA9fiAvLC8pIHsgCiAgICAgICAgICAgICAgICBteSBAc3Bsc3RyID0gc3BsaXQgLywvLCAkc3Rh
dGU7CiAgICAgICAgICAgICAgICAkbGV2ZWwgPSAkc3Bsc3RyWzFdOyAKICAgICAgICAgICAgICAg
ICRzdGF0ZSA9IGxjKCRzcGxzdHJbMF0pOwogICAgICAgICAgICAgICAgJGxldmVsID1+IHMvIC8v
ZzsKICAgICAgICAgICAgICAgICRzdGF0ZSA9fiBzLyAvL2c7CiAgICAgICAgICAgICAgICAjJm1h
aW46OnByaW50X2xvZygiU3BsaXQgcmV0dXJuIHN0YXRlOiAkc3RhdGUgIGxldmVsOiAkbGV2ZWwi
KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgIyBDaGVjayBvbi9vZmYg
aGFzIGJlZW4gbWFwcGVkIHRvIGEgZGlmZmVyZW50IHN0YXRlIGJ5IHVzZXIgaW4gQWxleGFCcmlk
Z2VfSXRlbQogICAgICAgICAgICBpZiAgICAoIChkZWZpbmVkICRzdGF0ZSkgYW5kIChsYyggJEFs
ZXhhT2JqZWN0cy0+eyd1dWlkJ30tPnskdXVpZH0tPnsnb24nfSkgKSBlcSBsYygkc3RhdGUpICkg
IHsgJHN0YXRlID0gJ29uJyB9CiAgICAgICAgICAgIGVsc2lmICggKGRlZmluZWQgJHN0YXRlKSBh
bmQgKGxjKCAkQWxleGFPYmplY3RzLT57J3V1aWQnfS0+eyR1dWlkfS0+eydvZmYnfSkgKSBlcSBs
Yygkc3RhdGUpICkgeyAkc3RhdGUgPSAnb2ZmJyB9CiAgICAgICAgICAgIAogICAgICAgICAgICAK
ICAgICAgICAgICAgaWYgKCAoZGVmaW5lZCAkc3RhdGUpIGFuZCAoJHN0YXRlID1+IC9cZCsvKSAp
IHsKICAgICAgICAgICAgICAgICRsZXZlbCA9ICggJnJvdW5kb2ZmKCAoICRzdGF0ZSAqIDIuNTQg
KSApICk7CiAgICAgICAgICAgICAgICAkZGVidWcgLj0gInVzaW5nIHN0YXRlOiAkbGV2ZWwgcmV0
dXJuZWQgZnJvbSBTVUIgLSBzdGF0ZSBkZWZhdWx0aW5nIHRvIG9uIC0gIjsKICAgICAgICAgICAg
ICAgIG15ICRyZXR1cm4gPSBxcVsib24iOnRydWUsImJyaSI6JGxldmVsXTsKICAgICAgICAgICAg
ICAgCSZtYWluOjpwcmludF9sb2coIiRkZWJ1ZyByZXR1cm5pbmcgLSAkcmV0dXJuXG4iKSBpZiAk
bWFpbjo6RGVidWd7J2FsZXhhJ307CiAgICAgICAgICAgICAgIAlyZXR1cm4gJHJldHVybjsKICAg
ICAgICAgICAgfSBlbHNpZiAoIChkZWZpbmVkICRsZXZlbCkgYW5kICgkbGV2ZWwgPX4gL1xkKy8p
ICkgeyAjTGV2ZWwgc3BsaXQgZnJvbSBzdGF0ZQogICAgICAgICAgICAgICAgJGxldmVsID0gKCAm
cm91bmRvZmYoICggJGxldmVsICogMi41NCApICkgKTsgI0NvbnZlcnQgMCAtIDEwMCBzY2FsZSB0
byAwIC0gMjU0IAogICAgICAgICAgICAgICAgJGRlYnVnIC49ICJ1c2luZyBsZXZlbDogJGxldmVs
IHJldHVybmVkIGZyb20gU1VCIC0gIjsKICAgICAgICAgICAgfSBlbHNlIHsgCiAgICAgICAgICAg
ICAgICAkbGV2ZWwgPSAkcGxldmVsOyAjVXNlIHByZXYgbGV2ZWwgc2VudCBpbiB0aGUgYm9keSBv
ZiB0aGUgZ2V0LCBpZiBub3QgcmV0dXJuZWQgZnJvbSB0aGUgc3ViCiAgICAgICAgICAgICAgICAk
ZGVidWcgLj0gInVzaW5nIGxldmVsOiAkbGV2ZWwgcmV0dXJuZWQgZnJvbSAkbGV2ZWxzcmMgLSAi
OwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaWYg
KCAoZGVmaW5lZCAkc3RhdGUpIGFuZCAoJHN0YXRlID1+IC9vbnxvZmYvKSApIHsgCiAgICAgICAg
ICAgICAgICAkZGVidWcgLj0gInVzaW5nIHN0YXRlOiAkc3RhdGUgcmV0dXJuZWQgZnJvbSBTVUIg
LSAiOyAKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgJHN0YXRlID0gJHBzdGF0
ZTsgI1VzZSBwcmV2IHN0YXRlIHNlbnQgaW4gdGhlIGJvZHkgb2YgdGhlIGdldCwgaWYgbm90IHJl
dHVybmVkIGZyb20gdGhlIHN1YgogICAgICAgICAgICAgICAkZGVidWcgLj0gInVzaW5nIHN0YXRl
OiAkc3RhdGUgcmV0dXJuZWQgZnJvbSAkc3RhdGVzcmMgLSAiOwogICAgICAgICAgICB9CiAgICAg
ICAgCiAgICAgICAgICAgICRzdGF0ZSA9ICcib24iOnRydWUnIGlmICRzdGF0ZSBlcSAnb24nOwog
ICAgICAgICAgICAkc3RhdGUgPSAnIm9uIjpmYWxzZScgaWYgJHN0YXRlIGVxICdvZmYnOwogICAg
ICAgICAgICAKICAgICAgICAgICAgbXkgJHJldHVybiA9IHFxWyRzdGF0ZSwiYnJpIjokbGV2ZWxd
OwogICAgICAgICAgICAmbWFpbjo6cHJpbnRfbG9nKCIkZGVidWcgcmV0dXJuaW5nIC0gJHJldHVy
blxuIikgaWYgJG1haW46OkRlYnVneydhbGV4YSd9OwogICAgICAgICAgICByZXR1cm4gJHJldHVy
bjsKICAgICAgICB9CiAgICB9Cn0KCnN1YiBnZXRfc3RhdGUgewogICAgbXkgKCAkc2VsZiwgJG9i
amVjdCwgJHN0YXRlc3ViICkgPSBAXzsKICAgIG15ICRjc3RhdGUgPSAkb2JqZWN0LT4kc3RhdGVz
dWI7CiAgICAkY3N0YXRlID1+IHMvXCUvLzsKICAgIG15ICR0eXBlICA9ICRvYmplY3QtPmdldF90
eXBlKCk7CiAgICBteSAkZGVidWcgPSAiW0FsZXhhXSBEZWJ1ZzogZ2V0X3N0YXRlIChhY3R1YWwg
b2JqZWN0IHN0YXRlOiAkY3N0YXRlKSAtIChvYmplY3QgdHlwZTogJHR5cGUpIC0gIjsKICAgIGlm
ICggbGMoJHR5cGUpID1+IC94MTAvICkgewogICAgICAgIGlmICggKCAkc3RhdGUgPX4gL1xkKy8g
KSB8fCAoICRzdGF0ZSA9fiAvZGltLyApIHx8ICggJHN0YXRlID1+IC9icmlnaHQvICkgKSB7ICRj
c3RhdGUgPSAnb24nIH0KICAgIH0KICAgICRkZWJ1ZyAuPSAiKGRldGVybWluZWQgc3RhdGU6ICRj
c3RhdGUpIC0gIjsKICAgIHJldHVybiAkY3N0YXRlOwp9CgpzdWIgcm91bmRvZmYgewogICAgbXkg
JG51bSA9IHNoaWZ0OwogICAgbXkgJHJvdW5kdG8gPSBzaGlmdCB8fCAxOwoKICAgIHJldHVybiBp
bnQoICRudW0gLyAkcm91bmR0byArIDAuNSApICogJHJvdW5kdG87Cn0KCnN1YiBuZXcgewogICAg
bXkgKCRjbGFzcykgPSBAXzsKICAgIG15ICRzZWxmID0gbmV3IEdlbmVyaWNfSXRlbSgpOwogICAg
Ymxlc3MgJHNlbGYsICRjbGFzczsKICAgIHJldHVybiAkc2VsZjsKfQoKc3ViIHJlZ2lzdGVyIHsK
ICAgIG15ICggJHNlbGYsICRjaGlsZCApID0gQF87CiAgICAkc2VsZi0+e2NoaWxkfSA9ICRjaGls
ZDsKfQoKPWJhY2sKCj1oZWFkMSBCPEFsZXhhQnJpZGdlX0l0ZW0+Cgo9aGVhZDIgREVTQ1JJUFRJ
T04KClRoZSBBbGV4YUJyaWRnZV9JdGVtIG9iamVjdCBob2xkcyB0aGUgY29uZmlndXJlZCBNaXN0
ZXJob3VzZSBvYmplY3RzIHRoYXQgYXJlIHByZXNlbnRlZCB0byB0aGUgQW1hem9uIEVjaG8gb3Ig
R29vZ2xlIEhvbWUKCj1oZWFkMiBtaC5wcml2YXRlLmluaSBDb25maWd1cmF0aW9uCgpTZWUgTDxB
bGV4YUJyaWRnZT4KCj1oZWFkMiBEZWZpbmluZyB0aGUgQ2hpbGQgb2JqZWN0CgpUaGUgb2JqZWN0
IGNhbiBiZSBkZWZpbmVkIGluIHRoZSB1c2VyIGNvZGUgb3IgaW4gYSAubWh0IGZpbGUuCgpJbiBt
aHQ6CgpBTEVYQUJSSURHRV9JVEVNLCA8b2JqZWN0IG5hbWU+LCA8cHJpbWFyeSBvYmplY3QgbmFt
ZT4KCmllOgoKIEFMRVhBQlJJREdFX0lURU0sIEFsZXhhSXRlbXMsIEFsZXhhCgoKT3IgaW4gdXNl
ciBjb2RlOgoKPG9iamVjdCBuYW1lPiA9IG5ldyBBbGV4YUJyaWRnZV9JdGVtKDxwcmltYXJ5IG9i
amVjdCBuYW1lPik7CgppZToKCiAkQWxleGFJdGVtcyA9IG5ldyBBbGV4YUJyaWRnZV9JdGVtKCRB
bGV4YSk7CgoKPWhlYWQyIE5PVEVTCgpTZWUgTDxBbGV4YUJyaWRnZT4gZm9yIGNvbXBsZXRlIGV4
YW1wbGVzCgo9aGVhZDIgSU5IRVJJVFMKCkw8R2VuZXJpY19JdGVtPgoKPWhlYWQyIE1FVEhPRFMK
Cj1vdmVyCgo9Y3V0CgpwYWNrYWdlIEFsZXhhQnJpZGdlX0l0ZW07CgpAQWxleGFCcmlkZ2VfSXRl
bTo6SVNBID0gKCdHZW5lcmljX0l0ZW0nKTsKdXNlIFN0b3JhYmxlOwoKc3ViIG5ldyB7CiAgICBt
eSAoICRjbGFzcywgJHBhcmVudCApID0gQF87CiAgICBteSAkc2VsZiA9IG5ldyBHZW5lcmljX0l0
ZW0oKTsKICAgIG15ICRmaWxlID0gJDo6Y29uZmlnX3Bhcm1zeydkYXRhX2Rpcid9IC4gJy9hbGV4
YV90ZW1wLnNhdmVkX2lkJzsKICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CiAgICAkcGFyZW50LT5y
ZWdpc3Rlcigkc2VsZik7CiAgICBmb3JlYWNoIG15ICRBbGV4YUh0dHBOYW1lICgga2V5cyAleyAk
QWxleGFHbG9iYWwtPntodHRwX3NvY2tldHN9IH0gKSB7CiAgICAgICAgbXkgJEFsZXhhSHR0cFBv
cnQgPSAkQWxleGFHbG9iYWwtPntodHRwX3NvY2tldHN9LT57JEFsZXhhSHR0cE5hbWV9LT57cG9y
dH07CiAgICAgICAgJHNlbGYtPnsncG9ydHMnfS0+eyRBbGV4YUh0dHBQb3J0fSA9IDA7CiAgICAg
ICAgJm1haW46OnByaW50X2xvZygiW0FsZXhhXSBEZWJ1ZzogQ29uZmlndXJlZCBmb3IgcG9ydCAk
QWxleGFIdHRwUG9ydFxuIikgaWYgJG1haW46OkRlYnVneydhbGV4YSd9OwogICAgfQogICAgaWYg
KCAoICQ6OmNvbmZpZ19wYXJtc3snYWxleGFIdHRwUG9ydENvdW50J30gZXEgMCApICYmICggJDo6
Y29uZmlnX3Bhcm1zeydhbGV4YUh0dHBQb3J0J30gKSApIHsKICAgICAgICAkc2VsZi0+eydwb3J0
cyd9LT57ICQ6OmNvbmZpZ19wYXJtc3snYWxleGFIdHRwUG9ydCd9IH0gPSAwOyAgICAjIFRoaXMg
aXMgdG8gZGlzYWJsZSBhbGwgTUggcHJveHkgcG9ydHMgYW5kIHVzZSBhbiBleHRlcm5hbCBwcm94
eSBwb3J0IHZpYSBBcGFjaGUKICAgICAgICAmbWFpbjo6cHJpbnRfbG9nKCJbQWxleGFdIERlYnVn
OiBDb25maWd1cmVkIGZvciBhIEVYVEVSTkFMIHByb3h5IG9uIHBvcnQgJDo6Y29uZmlnX3Bhcm1z
eydhbGV4YUh0dHBQb3J0J31cbiIpIGlmICRtYWluOjpEZWJ1Z3snYWxleGEnfTsKICAgIH0KICAg
IGVsc2lmICggKCAkOjpjb25maWdfcGFybXN7J2FsZXhhTm9EZWZhdWx0SHR0cCd9ICkgJiYgKCAk
Ojpjb25maWdfcGFybXN7J2FsZXhhSHR0cFBvcnQnfSApICkgewoKICAgICAgICAjdGhpcyBpcyB0
byBkaXNhYmxlIHRoZSBkZWZhdWx0IE1IIHdlYiBwb3J0IGFuZCBvbmx5IHVzZSBhIHByb3h5IHBv
cnQKICAgICAgICAmbWFpbjo6cHJpbnRfbG9nKCJbQWxleGFdIERlYnVnOiBDb25maWd1cmVkIHRv
IGRpc2FibGUgcG9ydCAkOjpjb25maWdfcGFybXN7J2h0dHBfcG9ydCd9IGFuZCBwcm94eSBwb3J0
ICQ6OmNvbmZpZ19wYXJtc3snYWxleGFIdHRwUG9ydCd9XG4iKQogICAgICAgICAgaWYgJG1haW46
OkRlYnVneydhbGV4YSd9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJHNlbGYtPnsncG9ydHMn
fS0+eyAkOjpjb25maWdfcGFybXN7J2h0dHBfcG9ydCd9IH0gPSAwOwogICAgICAgICZtYWluOjpw
cmludF9sb2coIltBbGV4YV0gRGVidWc6IENvbmZpZ3VyZWQgZm9yIHBvcnQgJDo6Y29uZmlnX3Bh
cm1zeydodHRwX3BvcnQnfVxuIikgaWYgJG1haW46OkRlYnVneydhbGV4YSd9OwogICAgfQogICAg
aWYgKCAtZSAkZmlsZSApIHsKICAgICAgICBteSAkcmVzdG9yZWRoYXNoID0gcmV0cmlldmUoJGZp
bGUpOwogICAgICAgICRzZWxmLT57aWRtYXB9ID0gJHJlc3RvcmVkaGFzaC0+e2lkbWFwfTsKICAg
IH0KICAgIGVsc2UgeyAkc2VsZi0+e2lkbWFwfSB9CiAgICByZXR1cm4gJHNlbGY7Cn0KCj1pdGVt
IEM8YWRkKCk+CgpQcmVzZW50cyBtaXN0ZXJob3VzZSBvYmplY3RzLCBzdWJzLCBvciB2b2ljZSBj
b29tbWFuZHMgdG8gdGhlIEVjaG8sIEdvb2dsZSBIb21lLCBvciBhbnkgdGhpbmcgdGhhdCBzdXBw
b3J0cwp0aGUgSFVFIGJyaWRnZS4gCgphZGQoJzxhY3R1YWwgb2JqZWN0IG5hbWU+JywnPG5hbWUg
eW91IHdhbnQgRWNoby9HSCB0byBzZWU+JywKJzxzdWIgdXNlZCB0byBjaGFuZ2UgdGhlIG9iamVj
dCBzdGF0ZT4nLCc8U3RhdGUgbWFwcGVkIHRvIEVjaG8vR0ggT04gY29tbWFuZD4nLAonPFN0YXRl
IG1hcHBlZCB0byBFY2hvL0dIIE9GRiBjb21tYW5kPicsJzxzdWIgdXNlZCB0byBnZXQgdGhlIG9i
amVjdCBzdGF0ZT4nKTsKCj1jdXQKCnN1YiBhZGQgewogICAgbXkgKCAkc2VsZiwgJHJlYWxuYW1l
LCAkbmFtZSwgJHN1YiwgJG9uLCAkb2ZmLCAkc3RhdGVzdWIgKSA9IEBfOwoKICAgIHJldHVybiB1
bmxlc3MgZGVmaW5lZCAkcmVhbG5hbWU7CiAgICBteSAkZnVsbG5hbWU7CiAgICBteSAkY2xlYW5u
YW1lID0gJHJlYWxuYW1lOwogICAgJGNsZWFubmFtZSA9fiBzL1wkLy9nOwogICAgJGNsZWFubmFt
ZSA9fiBzLyAvL2c7CiAgICAkY2xlYW5uYW1lID1+IHMvIy8vZzsKICAgICRjbGVhbm5hbWUgPX4g
cy9cXC8vZzsKICAgICRjbGVhbm5hbWUgPX4gcy8mLy9nOwoKICAgIGlmICggZGVmaW5lZCgkbmFt
ZSkgKSB7CiAgICAgICAgJGZ1bGxuYW1lID0gJGNsZWFubmFtZSAuICcuJyAuICRuYW1lOwogICAg
fQogICAgZWxzZSB7CiAgICAgICAgJGZ1bGxuYW1lID0gJGNsZWFubmFtZSAuICcuJyAuICRjbGVh
bm5hbWU7CiAgICB9CgogICAgI3VzZSBEYXRhOjpEdW1wZXI7CiAgICBteSAkdXVpZCA9ICRzZWxm
LT51dWlkKCRmdWxsbmFtZSk7CiAgICBteSAkYWxleGFPYmplY3RzUGVyR2V0ID0gJDo6Y29uZmln
X3Bhcm1zeydhbGV4YU9iamVjdHNQZXJHZXQnfSB8fCAnNjAnOwoKICAgIGlmICggJDo6Y29uZmln
X3Bhcm1zeydhbGV4YUVuYWJsZUNodW5rZWQnfSApIHsKICAgICAgICAkc2VsZi0+e2Z1bGxsaXN0
fS0+eyd1dWlkJ30tPnskdXVpZH0tPnsncmVhbG5hbWUnfSA9ICRyZWFsbmFtZTsKICAgICAgICAk
c2VsZi0+e2Z1bGxsaXN0fS0+eyd1dWlkJ30tPnskdXVpZH0tPnsnbmFtZSd9ICAgICA9ICRuYW1l
IHx8ICRjbGVhbm5hbWU7CiAgICAgICAgJHNlbGYtPntmdWxsbGlzdH0tPnsndXVpZCd9LT57JHV1
aWR9LT57J3N1Yid9ICAgICAgPSAkc3ViIHx8ICdzZXQnOwogICAgICAgICRzZWxmLT57ZnVsbGxp
c3R9LT57J3V1aWQnfS0+eyR1dWlkfS0+eydvbid9ICAgICAgID0gbGMoJG9uKSB8fCAnb24nOwog
ICAgICAgICRzZWxmLT57ZnVsbGxpc3R9LT57J3V1aWQnfS0+eyR1dWlkfS0+eydvZmYnfSAgICAg
ID0gbGMoJG9mZikgfHwgJ29mZic7CiAgICAgICAgJHNlbGYtPntmdWxsbGlzdH0tPnsndXVpZCd9
LT57JHV1aWR9LT57J3N0YXRlc3ViJ30gPSAkc3RhdGVzdWIgfHwgJ3N0YXRlJzsKICAgICAgICBm
b3IgbXkgJGNvdW50ICggMCAuLiA1ICkgewogICAgICAgICAgICBteSAkc2l6ZSA9IGtleXMgJXsg
JHNlbGYtPnskY291bnR9LT57J3V1aWQnfSB9OwogICAgICAgICAgICBuZXh0IGlmICggJHNpemUg
ZXEgJGFsZXhhT2JqZWN0c1BlckdldCApOwogICAgICAgICAgICAkc2VsZi0+eyRjb3VudH0tPnsn
dXVpZCd9LT57JHV1aWR9LT57J3JlYWxuYW1lJ30gPSAkcmVhbG5hbWU7CiAgICAgICAgICAgICRz
ZWxmLT57JGNvdW50fS0+eyd1dWlkJ30tPnskdXVpZH0tPnsnbmFtZSd9ICAgICA9ICRuYW1lIHx8
ICRjbGVhbm5hbWU7CiAgICAgICAgICAgICRzZWxmLT57JGNvdW50fS0+eyd1dWlkJ30tPnskdXVp
ZH0tPnsnc3ViJ30gICAgICA9ICRzdWIgfHwgJ3NldCc7CiAgICAgICAgICAgICRzZWxmLT57JGNv
dW50fS0+eyd1dWlkJ30tPnskdXVpZH0tPnsnb24nfSAgICAgICA9IGxjKCRvbikgfHwgJ29uJzsK
ICAgICAgICAgICAgJHNlbGYtPnskY291bnR9LT57J3V1aWQnfS0+eyR1dWlkfS0+eydvZmYnfSAg
ICAgID0gbGMoJG9mZikgfHwgJ29mZic7CiAgICAgICAgICAgICRzZWxmLT57JGNvdW50fS0+eyd1
dWlkJ30tPnskdXVpZH0tPnsnc3RhdGVzdWInfSA9ICRzdGF0ZXN1YiB8fCAnc3RhdGUnOwogICAg
ICAgICAgICAkc2VsZi0+e0Noa0NudH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
PSAkY291bnQ7CiAgICAgICAgICAgICZtYWluOjpwcmludF9sb2coIltBbGV4YV0gRGVidWc6IFVV
SUQ6KCAkdXVpZCApIE5hbWU6ICggJHJlYWxuYW1lICkgQ291bnQ6ICggJGNvdW50ICkgXG4iKSBp
ZiAkbWFpbjo6RGVidWd7J2FsZXhhJ307CiAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgfQogICAg
fQogICAgZWxzZSB7CiAgICAgICAgZm9yZWFjaCBteSAkcG9ydCAoICggc29ydCBrZXlzICV7ICRz
ZWxmLT57J3BvcnRzJ30gfSApICkgewogICAgICAgICAgICBteSAkc2l6ZSA9IGtleXMgJXsgJHNl
bGYtPnskcG9ydH0tPnsndXVpZCd9IH07CiAgICAgICAgICAgIG5leHQgaWYgKCAkc2l6ZSBlcSAk
YWxleGFPYmplY3RzUGVyR2V0ICk7CiAgICAgICAgICAgICRzZWxmLT57JHBvcnR9LT57J3V1aWQn
fS0+eyR1dWlkfS0+eydyZWFsbmFtZSd9ID0gJHJlYWxuYW1lOwogICAgICAgICAgICAkc2VsZi0+
eyRwb3J0fS0+eyd1dWlkJ30tPnskdXVpZH0tPnsnbmFtZSd9ICAgICA9ICRuYW1lIHx8ICRjbGVh
bm5hbWU7CiAgICAgICAgICAgICRzZWxmLT57JHBvcnR9LT57J3V1aWQnfS0+eyR1dWlkfS0+eydz
dWInfSAgICAgID0gJHN1YiB8fCAnc2V0JzsKICAgICAgICAgICAgJHNlbGYtPnskcG9ydH0tPnsn
dXVpZCd9LT57JHV1aWR9LT57J29uJ30gICAgICAgPSBsYygkb24pIHx8ICdvbic7CiAgICAgICAg
ICAgICRzZWxmLT57JHBvcnR9LT57J3V1aWQnfS0+eyR1dWlkfS0+eydvZmYnfSAgICAgID0gbGMo
JG9mZikgfHwgJ29mZic7CiAgICAgICAgICAgICRzZWxmLT57JHBvcnR9LT57J3V1aWQnfS0+eyR1
dWlkfS0+eydzdGF0ZXN1Yid9ID0gJHN0YXRlc3ViIHx8ICdzdGF0ZSc7CiAgICAgICAgICAgIGxh
c3Q7CiAgICAgICAgfQogICAgfQoKICAgICMgJHNlbGYtPns4MDgwfS0+eyd1dWlkJ30tPnszfS0+
eydyZWFsbmFtZSd9PSRyZWFsbmFtZTsKICAgICMgJHNlbGYtPns4MDgwfS0+eyd1dWlkJ30tPnsz
fS0+eyduYW1lJ309JG5hbWUgfHwgJGNsZWFubmFtZTsKICAgICMgJHNlbGYtPns4MDgwfS0+eyd1
dWlkJ30tPnszfS0+eydzdWInfT0kc3ViIHx8ICdzZXQnOwogICAgIyAkc2VsZi0+ezgwODB9LT57
J3V1aWQnfS0+ezN9LT57J29uJ309JG9uIHx8ICdvbic7CiAgICAjICRzZWxmLT57ODA4MH0tPnsn
dXVpZCd9LT57M30tPnsnb2ZmJ309JG9mZiB8fCAnb2ZmJzsKICAgICMgJHNlbGYtPns4MDgwfS0+
eyd1dWlkJ30tPnszfS0+eydzdGF0ZXN1Yid9PSRzdGF0ZXN1YiB8fCAnc3RhdGUnOwoKICAgICMg
VGVzdGluZyBncm91cHMsIHNhdyB0aGUgRWNobyBoaXQgL2FwaS9vZHRRZHdUYWlUalBnVVJvNFp5
RXRHZklxUmdmU2VDbTFmbDJBTUcyL2dyb3Vwcy8wCiAgICAjJHNlbGYtPnsnZ3JvdXBzJ30tPnsw
fS0+eyduYW1lJ309J2dyb3VwMCc7CiAgICAjJHNlbGYtPnsnZ3JvdXBzJ30tPnswfS0+eydyZWFs
bmFtZSd9PSckbGlnaHQwJzsKICAgICMkc2VsZi0+eydncm91cHMnfS0+ezB9LT57J3N1Yid9PSdz
ZXQnOwogICAgIyRzZWxmLT57J2dyb3Vwcyd9LT57MH0tPnsnb24nfT0nb24nOwogICAgIyRzZWxm
LT57J2dyb3Vwcyd9LT57MH0tPnsnb2ZmJ309J29mZic7CiAgICAjJHNlbGYtPnsnZ3JvdXBzJ30t
PnsxfS0+eyduYW1lJ309J2dyb3VwMSc7CiAgICAjJHNlbGYtPnsnZ3JvdXBzJ30tPnsxfS0+eydy
ZWFsbmFtZSd9PSckbGlnaHQxJzsKICAgICMkc2VsZi0+eydncm91cHMnfS0+ezF9LT57J3N1Yid9
PSdzZXQnOwogICAgIyRzZWxmLT57J2dyb3Vwcyd9LT57MX0tPnsnb24nfT0nb24nOwogICAgIyRz
ZWxmLT57J2dyb3Vwcyd9LT57MX0tPnsnb2ZmJ309J29mZic7CiAgICAjJHNlbGYtPnsnZ3JvdXBz
J30tPnsyfS0+eyduYW1lJ309J2dyb3VwMic7CiAgICAjJHNlbGYtPnsnZ3JvdXBzJ30tPnsyfS0+
eydyZWFsbmFtZSd9PSckbGlnaHQyJzsKICAgICMkc2VsZi0+eydncm91cHMnfS0+ezJ9LT57J3N1
Yid9PSdzZXQnOwogICAgIyRzZWxmLT57J2dyb3Vwcyd9LT57Mn0tPnsnb24nfT0nb24nOwogICAg
IyRzZWxmLT57J2dyb3Vwcyd9LT57Mn0tPnsnb2ZmJ309J29mZic7CiAgICAjJm1haW46OnByaW50
X2xvZyggRGF0YTo6RHVtcGVyLT5EdW1wZXIoJHNlbGYtPnsndXVpZCd9KSApOwp9CgpzdWIgZ2V0
X29iamVjdHMgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgcmV0dXJuICRzZWxmLT57J3V1aWQn
fTsKfQoKc3ViIHV1aWQgewogICAgbXkgKCAkc2VsZiwgJG5hbWUgKSA9IEBfOwogICAgbXkgJGZp
bGUgPSAkOjpjb25maWdfcGFybXN7J2RhdGFfZGlyJ30gLiAnL2FsZXhhX3RlbXAuc2F2ZWRfaWQn
OwogICAgcmV0dXJuICRzZWxmLT57J2lkbWFwJ30tPntvYmplY3RzfS0+eyRuYW1lfSBpZiAoICRz
ZWxmLT57J2lkbWFwJ30tPntvYmplY3RzfS0+eyRuYW1lfSApOwoKICAgIG15ICRoaWdoaWQ7CiAg
ICBteSAkbWlzc2luZzsKICAgIG15ICRjb3VudCA9ICQ6OmNvbmZpZ19wYXJtc3snYWxleGFVdWlk
U3RhcnQnfSB8fCAxOwogICAgZm9yZWFjaCBteSAkb2JqZWN0ICgga2V5cyAleyAkc2VsZi0+e2lk
bWFwfS0+e29iamVjdHN9IH0gKSB7CiAgICAgICAgbXkgJGN1cnJlbnRpZCA9ICRzZWxmLT57aWRt
YXB9LT57b2JqZWN0c30tPnskb2JqZWN0fTsKICAgICAgICAkaGlnaGlkID0gJGN1cnJlbnRpZCBp
ZiAoICRjdXJyZW50aWQgPiAkaGlnaGlkICk7CiAgICAgICAgJG1pc3NpbmcgPSAkY291bnQgdW5s
ZXNzICggZXhpc3RzICRzZWxmLT57J2lkbWFwJ30tPntpZHN9LT57JGNvdW50fSApOyAgICAjV2Ug
aGF2ZSBhIG51bWJlciB0aGF0IGhhcyBubyB2YWx1ZQogICAgICAgICRjb3VudCsrOwogICAgfQog
ICAgJGhpZ2hpZCsrOwoKICAgICRoaWdoaWQgPSAkbWlzc2luZyBpZiAoIGRlZmluZWQoJG1pc3Np
bmcpICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSZXVzZSBudW1iZXJzIGZvciBkZWxl
dGVkIG9iamVjdHMgdG8ga2VlcCB0aGUgY291bnQgZnJvbSBncm93bmluZyBmb3IgZXZlci4KICAg
ICRoaWdoaWQgPSAkY291bnQgdW5sZXNzICgga2V5cyAleyAkc2VsZi0+e2lkbWFwfS0+e29iamVj
dHN9IH0gKTsgICNVc2UgdGhlIGRlZmluZWQgYWxleGFVdWlkU3RhcnQgaWYgdGhlIGZpbGUgaXMg
bmV3IGFuZCBub3RoaW5nIGRlZmluZWQuCgogICAgJHNlbGYtPnsnaWRtYXAnfS0+e29iamVjdHN9
LT57JG5hbWV9ID0gJGhpZ2hpZDsKICAgICRzZWxmLT57J2lkbWFwJ30tPntpZHN9LT57JGhpZ2hp
ZH0gICA9ICRuYW1lOwoKICAgIG15ICRpZG1hcC0+eydpZG1hcCd9ID0gJHNlbGYtPnsnaWRtYXAn
fTsKICAgIHN0b3JlICRpZG1hcCwgJGZpbGU7CiAgICByZXR1cm4gJGhpZ2hpZDsKfQoKc3ViIGlz
RGVsZXRlZCB7CiAgICBteSAoICRzZWxmLCAkdXVpZCApID0gQF87CiAgICBteSAkY291bnQ7CiAg
ICBmb3JlYWNoIG15ICRwb3J0ICggKCBzb3J0IGtleXMgJXsgJHNlbGYtPnsncG9ydHMnfSB9ICkg
KSB7CiAgICAgICAgJGNvdW50KysgaWYgKCAkc2VsZi0+eyRwb3J0fS0+eyd1dWlkJ30tPnskdXVp
ZH0gKTsKICAgIH0KICAgIHJldHVybiAxIHVubGVzcyAkY291bnQ7CiAgICByZXR1cm4gMDsKfQoK
MTsKCj1iYWNrCgo9aGVhZDIgTk9URVMKCj1oZWFkMiBBVVRIT1IKCldheW5lIEdhdGxpbiA8d2F5
bmVAcmF6b3JjbGEud3M+Cgo9aGVhZDIgU0VFIEFMU08KCj1oZWFkMiBMSUNFTlNFCgpUaGlzIHBy
b2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgoKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdy
aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KCj1jdXQKCg==
--0000000000006e74fa06185cd716
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


--0000000000006e74fa06185cd716
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


--0000000000006e74fa06185cd716--