delorie.com/archives/browse.cgi   search  
Mail Archives: geda-user/2015/11/03/17:35:05

X-Authentication-Warning: delorie.com: mail set sender to geda-user-bounces using -f
X-Recipient: geda-user AT delorie DOT com
X-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=20120113;
h=mime-version:date:message-id:subject:from:to:content-type;
bh=fkOmakAbUQ/4VF+IRvn4CzAsJibqU1Vtlh10HLfH8BU=;
b=ljsxpM9h7qGZryMHxzWs1PP4t20xVf9Fs6sga6riWW4gcxSkmf+mu71VBMQzuW9om4
1w5VgGmx/xuaS0Owz7trDsJhuIlVL/gWQUEGOjicEEWDXwz3iEjAC3BUOK3AYwDKvLCP
6/9TlYAw3qcvw9BNjdNyIHnrJHZOq8hI28ZaHvxzAtep2pv7DosWv/PIP4UNCjyZz5FS
419yzklJO0oOVBMiTc7McD1VvexQgzy8USakzi55sDCjX+8hC20holeOaJhUXmViptur
T9CizOZmgeX/VNtiK1Cd4x4IWVijQHsqbbDnwWkcw+jkDp2sUPzrht9ktYuOF2iMrg4k
EVRw==
MIME-Version: 1.0
X-Received: by 10.194.8.227 with SMTP id u3mr32124370wja.38.1446590042327;
Tue, 03 Nov 2015 14:34:02 -0800 (PST)
Date: Tue, 3 Nov 2015 13:34:02 -0900
Message-ID: <CAC4O8c84pEJS40_57SLkq9Q-AUGze87DBGdNxRsatmB=tV8NWA@mail.gmail.com>
Subject: [geda-user] geometry.h
From: "Britton Kerin (britton DOT kerin AT gmail DOT com) [via geda-user AT delorie DOT com]" <geda-user AT delorie DOT com>
To: geda-user AT delorie DOT com
Reply-To: geda-user AT delorie DOT com

--047d7b5d9c079c58e60523aa7d49
Content-Type: multipart/alternative; boundary=047d7b5d9c079c58e20523aa7d47

--047d7b5d9c079c58e20523aa7d47
Content-Type: text/plain; charset=UTF-8

I just pushed the latest to home/bkerin/geometry_module_2.  I'm attaching
them also for Igor

It's pretty usable now, giving good results in improving intersection tests
particularly for arcs.

There are some things I'm uncertain about:

1.  Would it be worth adding Union type and doing generic intersection
tests there instead of
    scattered elsewhere?

       Pros: consolidate ad-hoc union-and-test operations in one place
       Cons: would need external type marks, miss geometrical short-cuts
for some constructs

2.  Would it be worth parameterizing for coordinate types?  So could have a
wrapper header and
     #define GEOM_COORD Coord or so.  I guess this is mainly for Igor, but
it would be nice to have
     geometry.h have only math and nothing pcb-specific.  The thing with
this is I use double for e.g.
     square-of-Coord and I'm not sure how to usefully and comprehensibly
parameterize that sort
     of thing

--047d7b5d9c079c58e20523aa7d47
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><div style=3D"">I just pushed the latest to home/bkeri=
n/geometry_module_2.=C2=A0 I&#39;m attaching them also for Igor</div><div s=
tyle=3D""><br></div><div style=3D"">It&#39;s pretty usable now, giving good=
 results in improving intersection tests particularly for arcs.</div><div s=
tyle=3D""><br></div><div style=3D"">There are some things I&#39;m uncertain=
 about:</div><div style=3D""><br></div><div style=3D"">1.=C2=A0 Would it be=
 worth adding Union type and doing generic intersection tests there instead=
 of</div><div style=3D"">=C2=A0 =C2=A0 scattered elsewhere? =C2=A0</div><di=
v style=3D""><br></div><div style=3D"">=C2=A0 =C2=A0 =C2=A0 =C2=A0Pros: con=
solidate ad-hoc union-and-test operations in one place</div><div style=3D""=
>=C2=A0 =C2=A0 =C2=A0 =C2=A0Cons: would need external type marks, miss geom=
etrical short-cuts for some constructs</div><div style=3D""><br></div><div =
style=3D"">2.=C2=A0 Would it be worth parameterizing for coordinate types?=
=C2=A0 So could have a wrapper header and=C2=A0</div><div style=3D"">=C2=A0=
 =C2=A0 =C2=A0#define GEOM_COORD Coord or so.=C2=A0 I guess this is mainly =
for Igor, but it would be nice to have</div><div style=3D"">=C2=A0 =C2=A0 =
=C2=A0geometry.h have only math and nothing pcb-specific.=C2=A0 The thing w=
ith this is I use double for e.g.</div><div style=3D"">=C2=A0 =C2=A0 =C2=A0=
square-of-Coord and I&#39;m not sure how to usefully and comprehensibly par=
ameterize that sort</div><div style=3D"">=C2=A0 =C2=A0 =C2=A0of thing</div>=
<div style=3D""><br></div><div style=3D""><br></div></div>

--047d7b5d9c079c58e20523aa7d47--
--047d7b5d9c079c58e60523aa7d49
Content-Type: text/x-chdr; charset=US-ASCII; name="geometry.h"
Content-Disposition: attachment; filename="geometry.h"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_igjxaf2n0

Ly8gU2ltcGxlIDJEIGdlb21ldHJpY2FsIHR5cGVzIChlLmcuIHZlY3RvciwgbGluZSwgY2lybGUs
IGVsbGlwc2UsIGFyYykKLy8gYW5kIHJlbGF0ZWQgdGVzdHMgYW5kIG1ldGhvZHMuCgojaWZuZGVm
CVBDQl9HRU9NRVRSWV9ICiNkZWZpbmUJUENCX0dFT01FVFJZX0gKCiNpbmNsdWRlICJnbG9iYWwu
aCIKCnR5cGVkZWYgc3RydWN0IHsKICBDb29yZCB4LCB5Owp9IFZlYzsKCnR5cGVkZWYgc3RydWN0
IHsKICBWZWMgcGEsIHBiOwp9IExpbmVTZWdtZW50OwoKdHlwZWRlZiBzdHJ1Y3QgewogIC8vIGNv
cm5lclswXSBpcyBkaWFnb25hbCB0byBjb3JuZXJbMl0sIGNvcm5lclsxXSBpcyBkaWFnb25hbCB0
byBjb3JuZXJbM10KICBWZWMgY29ybmVyWzRdOwp9IFJlY3RhbmdsZTsKCnR5cGVkZWYgc3RydWN0
IHsKICBWZWMgY2VudGVyOwogIENvb3JkIHJhZGl1czsKfSBDaXJjbGU7Cgp0eXBlZGVmIHN0cnVj
dCB7CiAgQ2lyY2xlIGNpcmNsZTsKICBkb3VibGUgc3RhcnRfYW5nbGU7ICAgLy8gTWVhc3Vpbmcg
ZnJvbSAreCB0b3dhcmRzICt5LCBpbiBbMCwgMiBwaSkKICBkb3VibGUgYW5nbGVfZGVsdGE7ICAg
Ly8gTWVhc3VpbmcgZnJvbSAreCB0b3dhcmRzICt5LCBpbiBbMCwgMiBwaSkKfSBBcmM7Cgpkb3Vi
bGUKdmVjX21hZyAoVmVjIHZlYyk7CgovLyBSZXR1cm4gdmVjIHNjYWxlZCBieSBzY2FsZV9mYWN0
b3IuICBOb3RlIHRoYXQgc2NhbGluZyBpbnRlZ2VyIHZlY3RvcnMKLy8gdG8gc21hbGwgbWFnbml0
dWRlcyBjYW4gcmVzdWx0IGluIGEgbG90IG9mIGVycm9yLiAgVHJ5aW5nIHRvIG1ha2UgdW5pdAov
LyB2ZWN0b3JzIHdvbid0IHdvcmsgZm9yIHRoaXMgcmVhc29uLgpWZWMKdmVjX3NjYWxlIChWZWMg
dmVjLCBkb3VibGUgc2NhbGVfZmFjdG9yKTsKCi8vIFJldHVybiB2ZWMgZXh0ZW5kZWQgYnkgZGlz
dGFuY2UuICBMaWtlIHZlY19zY2FsZSgpLCBidXQgYWRkaXRpdmUuClZlYwp2ZWNfZXh0ZW5kIChW
ZWMgdmVjLCBkb3VibGUgZGlzdGFuY2UpOwoKVmVjCnZlY19zdW0gKFZlYyB2YSwgVmVjIHZiKTsK
Ci8vIFJldHVybiB2ZWN0b3IgZnJvbSB2YSB0byB2YiwgYWthICh2YiAtIHZhKQpWZWMKdmVjX2Zy
b20gKFZlYyB2YSwgVmVjIHZiKTsKCmRvdWJsZQp2ZWNfZG90IChWZWMgdmEsIFZlYyB2Yik7Cgov
LyBSZXR1cm4gcHJvamVjdGlvbiBvZiB2YSBvbnRvIHZiLiAgUHJvamVjdGluZyBvbnRvIGEgdmVj
dG9yIG9mIHplcm8KLy8gbWFnbml0dWRlIHdpbGwgcmVzdWx0IGluIGEgZGl2aWRlLWJ5LXplcm8g
ZXJyb3IuClZlYwp2ZWNfcHJvaiAoVmVjIHZhLCBWZWMgdmIpOwoKLy8gUmV0dXJuIGFuZ2xlIG5v
cm1hbGl6ZWQgaW50byB0aGUgWzAsIDIgcGkpIHJhbmdlLgpkb3VibGUKbm9ybWFsaXplX2FuZ2xl
X2luX3JhZGlhbnMgKGRvdWJsZSBhbmdsZSk7CgovLyBSZXR1cm4gdHJ1ZSBpZmYgdGhldGEgaXMg
YmV0d2VlbiBzdGFydF9hbmdsZSBhbmQgc3RhcnRfYW5nbGUgKyBhbmdsZV9kZWx0YQovLyBpbiBy
YWRpYW5zICh3aW5kaW5nIHBvc2l0aXZlIGFuZ2xlcyBmcm9tICt4IHRvd2FyZHMgK3kpLgpib29s
CmFuZ2xlX2luX3NwYW4gKGRvdWJsZSB0aGV0YSwgZG91YmxlIHN0YXJ0X2FuZ2xlLCBkb3VibGUg
YW5nbGVfZGVsdGEpOwoKLy8gUmV0dXJuIHRydWUgaWZmIHB0IGlzIGluIHJlY3QgKHdpdGggcmVj
dCByZWdhcmRlZCBhcyBmaWxsZWQpLgpib29sCnBvaW50X2ludGVyc2VjdHNfcmVjdGFuZ2xlIChW
ZWMgcHQsIFJlY3RhbmdsZSBjb25zdCAqcmVjdCk7CgovLyBSZXR1cm4gdHJ1ZSBpZmYgcHQgaXMg
aW4gY2lyYyAod2l0aCBjaXJjIHJlZ2FyZGVkIGFzIGZpbGxlZCkuCmJvb2wKcG9pbnRfaW50ZXJz
ZWN0c19jaXJjbGUgKFZlYyBwdCwgQ2lyY2xlIGNvbnN0ICpjaXJjKTsKCi8vIFJldHVybiB0aGUg
cG9pbnQgb24gc2VnIGNsb3Nlc3QgdG8gcHQuClZlYwpuZWFyZXN0X3BvaW50X29uX2xpbmVfc2Vn
bWVudCAoVmVjIHB0LCBMaW5lU2VnbWVudCBjb25zdCAqc2VnKTsKCi8vIFJldHVybiB0aGUgcG9p
bnQgb24gQXJjIGNsb3Nlc3QgdG8gcHQuClZlYwpuZWFyZXN0X3BvaW50X29uX2FyYyAoVmVjIHB0
LCBBcmMgY29uc3QgKmFyYyk7CgovLyBSZXR1cm4gdHJ1ZSBpZmYgZmlsbGVkIGNpcmNsZSBpbnRl
cnNlY3RzIHNlZy4gIElmIHBpaSAoUG9pbnQgSW4KLy8gSW50ZXJzZWN0aW9uKSBpcyBub3QgTlVM
TCwgc2V0ICpwaWkgdG8gYSBwb2ludCBpbiB0aGUgaW50ZXJzZWN0aW9uLgovLyBOb3RlIHRoYXQg
aXQncyBjb25zaWRlcmVkIGFuIGludGVyc2VjdGlvbiBpZiBzZWcgbGllcyBlbnRpcmVseSBpbnNp
ZGUgY2lyYy4KYm9vbApjaXJjbGVfaW50ZXJzZWN0c19saW5lX3NlZ21lbnQgKAogICAgQ2lyY2xl
ICAgICAgY29uc3QgKmNpcmMsCiAgICBMaW5lU2VnbWVudCBjb25zdCAqc2VnLAogICAgVmVjICAg
ICAgICAgICAgICAgKnBpaSApOwoKLy8gUmV0dXJuIHRydWUgaWZmIGZpbGxlZCBjaXJjIGludGVy
c2VjdHMgZmlsbGVkIHJlY3QuICBJZiBhbiBpbnRlcnNlY3Rpb24KLy8gaXMgZm91bmQgYW5kIHBp
aSAoUG9pbnQgSW4gSW50ZXJzZWN0aW9uKSBpcyBub3QgTlVMTCwgcmV0dXJuIGEgcG9pbnQgaW4K
Ly8gdGhlIGludGVyc2VjdGlvbiBpbiBwaWkuICBOb3RlIHRoYXQgaXQncyBjb25zaWRlcmVkIGFu
IGludGVyc2VjdGlvbiBpZgovLyBvbmUgZmlndXJlIGxpZXMgZW50aXJlbHkgaW5zaWRlIHRoZSBv
dGhlci4KYm9vbApjaXJjbGVfaW50ZXJzZWN0c19yZWN0YW5nbGUgKAogICAgQ2lyY2xlICAgIGNv
bnN0ICpjaXJjLAogICAgUmVjdGFuZ2xlIGNvbnN0ICpyZWN0LAogICAgVmVjICAgICAgICAgICAg
ICpwaWkgKTsKCi8vIFJldHVybiB0cnVlIGlmZiBmaWxsZWQgY2lyY2xlcyBjYSBhbmQgY2IgaW50
ZXJzZWN0LiAgSWYgcGlpIChQb2ludAovLyBJbiBJbnRlcnNlY3Rpb24pIGlzIG5vdCBOVUxMLCBz
ZXQgKnBpaSB0byBhIHBvaW50IGluIHRoZSBpbnRlcnNlY3Rpb24KLy8gKHRyZWF0aW5nIHRoZSBj
aXJjbGVzIGFzIGZpbGxlZCkuCmJvb2wKY2lyY2xlX2ludGVyc2VjdHNfY2lyY2xlICgKICAgIENp
cmNsZSBjb25zdCAqY2EsCiAgICBDaXJjbGUgY29uc3QgKmNiLAogICAgVmVjICAgICAgICAgICpw
aWkgKTsKCi8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgaW50ZXJzZWN0aW9u
IG9mIGNpcmMgYW5kIHNlZyAoMCwgMSwKLy8gb3IgMiksIGFzc3VtaW5nIG5vIGZsb2F0aW5nIHBv
aW50IHByb2JsZW1zLiAgVGhpcyBmdW5jdGlvbiB2aWV3cyBjaXJjIGFzCi8vIHVuZmlsbGVkOiBp
ZiBzZWcgbGllcyBlbnRpcmVseSBpbnNpZGUgY2lyYyBubyBpbnRlcnNlY3Rpb24gd2lsbCBiZSBm
b3VuZC4KLy8gSWYgdGhlIHJlc3VsdCBpcyBub24temVybyBhbmQgaW50ZXJzZWN0aW9ucyBpcyBu
b24tTlVMTCwgdGhlIGludGVyc2VjdGlvbgovLyBwb2ludChzKSBhcmUgcmV0dXJuZWQgdGhlcmUu
ICBEZWdlbmVyYXRlICh6ZXJvIGxlbmd0aCkgc2VnIGFyZ3VtZW50cyBhcmUKLy8gdHJlYXRlZCBh
cyBwb2ludHMuICBEZWdlbmVyYXRlIChyYWRpdXMgPD0gMCkgY2lyYyBhcmd1bWVudHMgYXJlbid0
IGFsbG93ZWQuCi8vIE5vdGUgdGhhdCBkZXRlY3Rpb24gb2YgdGhlIGludGVyc2VjdGlvbiBmb3Ig
bGluZSBzZWdtZW50cyB0YW5nZW50IHRvIGNpcmMKLy8gaXMgc3ViamVjdCB0byByb3VuZGluZyBl
cnJvciBhbmQgYSByZXN1bHQgb2YgMSBpcyBkb3VidGZ1bCBpbiB0aGlzIGNhc2UuCmludApjaXJj
bGVfbGluZV9zZWdtZW50X2ludGVyc2VjdGlvbiAoCiAgICBDaXJjbGUgICAgICBjb25zdCAqY2ly
YywKICAgIExpbmVTZWdtZW50IGNvbnN0ICpzZWcsCiAgICBWZWMgICAgICAgICAgICAgICAgaW50
ZXJzZWN0aW9uWzJdICk7CgovLyBSZXR1cm4gdGhlIGVuZCBwb2ludHMgb2YgYXJjIGluICplcC4g
IEFyY3Mgc3Bhbm5pbmcgPiAyIHBpIHJhZGlhbnMgYXJlCi8vIHN0aWxsIGNvbnNpZGVyZWQgdG8g
aGF2ZSBkaXN0aW5jdCBlbmQgcG9pbnRzLgp2b2lkCmFyY19lbmRfcG9pbnRzIChBcmMgKmFyYywg
VmVjIGVwWzJdKTsKCi8vIExpa2UgY2lyY2xlX2xpbmVfc2VnbWVudF9pbnRlcnNlY3Rpb24oKSwg
YnV0IGZvciBhbiBhcmMgb2YgYSBjaXJsZS4KaW50CmFyY19saW5lX3NlZ21lbnRfaW50ZXJzZWN0
aW9uICgKICAgIEFyYyAgICAgICAgIGNvbnN0ICphcmMsCiAgICBMaW5lU2VnbWVudCBjb25zdCAq
c2VnLAogICAgVmVjICAgICAgICAgICAgICAgIGludGVyc2VjdGlvblsyXSApOwoKCiNlbmRpZiAg
IC8vIFBDQl9HRU9NRVRSWV9ICg==
--047d7b5d9c079c58e60523aa7d49
Content-Type: text/x-csrc; charset=US-ASCII; name="geometry.c"
Content-Disposition: attachment; filename="geometry.c"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_igjxaiui1

Ly8gSW50ZXJmYWNlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXNjcmliZWQgaW4gZ2VvbWV0cnku
aC4KCiNkZWZpbmUgX0dOVV9TT1VSQ0UKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPG1h
dGguaD4KCiNpbmNsdWRlICJnZW9tZXRyeS5oIgoKZG91YmxlCnZlY19tYWcgKFZlYyB2ZWMpCnsK
ICAvLyBGSVhNRTogdGhpcyBoaWRkZW4gcm91bmQgaXMgd2VpcmQsIHNob3VsZCBtYWtlIGNsaWVu
dHMgZG8gaXQgYXQgbmVlZAogIHJldHVybiByb3VuZCAoaHlwb3QgKHZlYy54LCB2ZWMueSkpOwp9
CgpWZWMKdmVjX3NjYWxlIChWZWMgdmVjLCBkb3VibGUgc2NhbGVfZmFjdG9yKQp7CiAgVmVjIHJl
c3VsdDsKCiAgcmVzdWx0LnggPSByb3VuZCAodmVjLnggKiBzY2FsZV9mYWN0b3IpOwogIHJlc3Vs
dC55ID0gcm91bmQgKHZlYy55ICogc2NhbGVfZmFjdG9yKTsKCiAgcmV0dXJuIHJlc3VsdDsKfQoK
VmVjCnZlY19leHRlbmQgKFZlYyB2ZWMsIGRvdWJsZSBkaXN0YW5jZSkKewogIC8vIEZJWE1FOiBJ
J20gZGVhZCBzaW1wbGUgYnV0IG5vdCB0ZXN0ZWQgeWV0CgogIGRvdWJsZSBpbSA9IHZlY19tYWcg
KHZlYyk7ICAgLy8gSW5pdGlhbCBNYWduaXR1ZGUKCiAgcmV0dXJuIHZlY19zY2FsZSAodmVjLCAo
aW0gKyBkaXN0YW5jZSkgLyBpbSk7Cn0KClZlYwp2ZWNfc3VtIChWZWMgdmEsIFZlYyB2YikKewog
IFZlYyByZXN1bHQ7CgogIHJlc3VsdC54ID0gdmEueCArIHZiLng7CiAgcmVzdWx0LnkgPSB2YS55
ICsgdmIueTsKCiAgcmV0dXJuIHJlc3VsdDsKfQoKVmVjCnZlY19mcm9tIChWZWMgdmEsIFZlYyB2
YikKewogIFZlYyByZXN1bHQgPSB7IHZiLnggLSB2YS54LCB2Yi55IC0gdmEueSB9OwogIAogIHJl
dHVybiByZXN1bHQ7Cn0KCmRvdWJsZQp2ZWNfZG90IChWZWMgdmEsIFZlYyB2YikKewogIHJldHVy
biAoKGRvdWJsZSkgdmEueCkgKiB2Yi54ICsgKChkb3VibGUpIHZhLnkpICogdmIueTsKfQoKVmVj
CnZlY19wcm9qIChWZWMgdmEsIFZlYyB2YikKewogIHJldHVybiB2ZWNfc2NhbGUgKHZiLCB2ZWNf
ZG90ICh2YSwgdmIpIC8gdmVjX2RvdCAodmIsIHZiKSk7Cn0KCmRvdWJsZQpub3JtYWxpemVfYW5n
bGVfaW5fcmFkaWFucyAoZG91YmxlIGFuZ2xlKQp7CiAgd2hpbGUgKCBhbmdsZSA8IDAuMCApIHsK
ICAgIGFuZ2xlICs9IDIuMCAqIE1fUEk7CiAgfQogIHdoaWxlICggYW5nbGUgPj0gMi4wICogTV9Q
SSApIHsKICAgIGFuZ2xlIC09IDIuMCAqIE1fUEk7CiAgfQoKICByZXR1cm4gYW5nbGU7Cn0KCmJv
b2wKYW5nbGVfaW5fc3BhbiAoZG91YmxlIHRoZXRhLCBkb3VibGUgc3RhcnRfYW5nbGUsIGRvdWJs
ZSBhbmdsZV9kZWx0YSkKewogIGlmICggYW5nbGVfZGVsdGEgPiAwLjAgKSB7CiAgICByZXR1cm4g
YW5nbGVfZGVsdGEgPj0gbm9ybWFsaXplX2FuZ2xlX2luX3JhZGlhbnMgKHRoZXRhIC0gc3RhcnRf
YW5nbGUpOwogIH0KICBlbHNlIHsKICAgIHJldHVybiAtYW5nbGVfZGVsdGEgPj0gbm9ybWFsaXpl
X2FuZ2xlX2luX3JhZGlhbnMgKC10aGV0YSArIHN0YXJ0X2FuZ2xlKTsKICB9Cn0KCmJvb2wKcG9p
bnRfaW50ZXJzZWN0c19yZWN0YW5nbGUgKFZlYyBwdCwgUmVjdGFuZ2xlIGNvbnN0ICpyZWN0KQp7
CiAgLy8gRklYTUU6IHJvdGF0aW5nIGFuZCB0cmFuc2xhdGluZyBwb2ludCB0byBwdXQgcmVjdCBy
ZWxhdGl2ZWx5IGF0IG9yaWdpbgogIC8vIG9yIGF0IGxlYXN0IGF4aXMtYWxpZ25lZCB3b3VsZCBi
ZSBmYXN0ZXIKCiAgLy8gU2lkZXMgYXMgbGluZSBzZWdtZW50cwogIExpbmVTZWdtZW50IGMxX2My
ID0geyByZWN0LT5jb3JuZXJbMF0sIHJlY3QtPmNvcm5lclsxXSB9OwogIExpbmVTZWdtZW50IGMy
X2MzID0geyByZWN0LT5jb3JuZXJbMV0sIHJlY3QtPmNvcm5lclsyXSB9OwogIExpbmVTZWdtZW50
IGMzX2M0ID0geyByZWN0LT5jb3JuZXJbMl0sIHJlY3QtPmNvcm5lclszXSB9OwogIExpbmVTZWdt
ZW50IGM0X2MxID0geyByZWN0LT5jb3JuZXJbM10sIHJlY3QtPmNvcm5lclswXSB9OwoKICAvLyBE
aXN0YW5jZSBiZXR3ZWVuIHBhaXJzIG9mIG9wcG9zaXRlIHNpZGVzCiAgZG91YmxlIGRfYzFfYzJf
dG9fYzNfYzQKICAgID0gdmVjX21hZyAodmVjX2Zyb20gKHJlY3QtPmNvcm5lclswXSwgcmVjdC0+
Y29ybmVyWzNdKSk7CiAgZG91YmxlIGRfYzJfYzNfdG9fYzRfYzEKICAgID0gdmVjX21hZyAodmVj
X2Zyb20gKHJlY3QtPmNvcm5lclswXSwgcmVjdC0+Y29ybmVyWzFdKSk7CiAgIAogIC8vIE5lYXJl
c3QgUG9pbnQgKHRvIHB0KSBPbiBTaWRlcwogIFZlYyBucG9fYzFfYzIgPSBuZWFyZXN0X3BvaW50
X29uX2xpbmVfc2VnbWVudCAocHQsICZjMV9jMik7CiAgVmVjIG5wb19jMl9jMyA9IG5lYXJlc3Rf
cG9pbnRfb25fbGluZV9zZWdtZW50IChwdCwgJmMyX2MzKTsKICBWZWMgbnBvX2MzX2M0ID0gbmVh
cmVzdF9wb2ludF9vbl9saW5lX3NlZ21lbnQgKHB0LCAmYzNfYzQpOwogIFZlYyBucG9fYzRfYzEg
PSBuZWFyZXN0X3BvaW50X29uX2xpbmVfc2VnbWVudCAocHQsICZjNF9jMSk7CgogIC8vIERpc3Rh
bmNlcyBmcm9tIHB0IHRvIG5lYXJlc3QgcG9pbnQgb24gZWFjaCBzaWRlCiAgZG91YmxlIGRfcHRf
YzFfYzIgPSB2ZWNfbWFnICh2ZWNfZnJvbSAocHQsIG5wb19jMV9jMikpOwogIGRvdWJsZSBkX3B0
X2MyX2MzID0gdmVjX21hZyAodmVjX2Zyb20gKHB0LCBucG9fYzJfYzMpKTsKICBkb3VibGUgZF9w
dF9jM19jNCA9IHZlY19tYWcgKHZlY19mcm9tIChwdCwgbnBvX2MzX2M0KSk7CiAgZG91YmxlIGRf
cHRfYzRfYzEgPSB2ZWNfbWFnICh2ZWNfZnJvbSAocHQsIG5wb19jNF9jMSkpOwoKICByZXR1cm4g
KAogICAgICBkX3B0X2MxX2MyIDw9IGRfYzFfYzJfdG9fYzNfYzQgJiYKICAgICAgZF9wdF9jM19j
NCA8PSBkX2MxX2MyX3RvX2MzX2M0ICYmCiAgICAgIGRfcHRfYzJfYzMgPD0gZF9jMl9jM190b19j
NF9jMSAmJgogICAgICBkX3B0X2M0X2MxIDw9IGRfYzJfYzNfdG9fYzRfYzEgKTsKfQoKYm9vbApw
b2ludF9pbnRlcnNlY3RzX2NpcmNsZSAoVmVjIHB0LCBDaXJjbGUgY29uc3QgKmNpcmMpCnsKICAv
LyBUcmFuc2xhdGUgcHQgc3QgY2lyYyBpcyByZWxhdGl2ZWx5IHNpdHVhdGVkIGF0IG9yaWdpbi4K
ICBwdC54IC09IGNpcmMtPmNlbnRlci54OwogIHB0LnkgLT0gY2lyYy0+Y2VudGVyLnk7CgogIHJl
dHVybiBoeXBvdCAocHQueCwgcHQueSkgPD0gY2lyYy0+cmFkaXVzOwp9CgpWZWMKbmVhcmVzdF9w
b2ludF9vbl9saW5lX3NlZ21lbnQgKFZlYyBwdCwgTGluZVNlZ21lbnQgY29uc3QgKnNlZykKewog
IC8vIEZJWE1FOiBJIGRvbid0IGRvIGFueXRoaW5nIGVmZmljaWVudCBmb3IgaG9yaXpvbnRhbC92
ZXJ0aWNhbCBsaW5lCiAgLy8gc2VnbWVudHMKCiAgLy8gRklYTUU6IFN0YWNrIG92ZXJmbG93IGhh
cyBhIHNvbWV3aGF0IG1vcmUKICAvLyBlZmZpY2llbnQgc29sdXRpb24gdXNpbmcgc2FtZSBiYXNp
YyBpZGVhOgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvODQ5MjExLwog
IC8vIHNob3J0ZXN0LWRpc3RhbmNlLWJldHdlZW4tYS1wb2ludC1hbmQtYS1saW5lLXNlZ21lbnQK
CiAgVmVjIHNwYV9zcGI7ICAgLy8gVmVjdG9yIGZyb20gc2VnbWVudCBwb2ludCBhIHRvIHBvaW50
IGIKICBWZWMgc3BhX3B0OyAgICAvLyBWZWN0b3IgZnJvbSBzZWdtZW50IHBvaW50IGEgdG8gcHQK
ICBWZWMgcHRsOyAgICAgICAvLyBQcm9qZWN0aW9uIG9mIHB0IG9udG8gc2VnIHZlY3RvciAob250
byBzcGFfc3BiKQogIGRvdWJsZSBzbTsgICAgIC8vIFNlZ21lbnQgTWFnbml0dWRlCiAgZG91Ymxl
IHBtOyAgICAgLy8gUHJvamVjdGlvbiBNYWduaXR1ZGUKICBWZWMgcHA7ICAgICAgICAvLyBQcm9q
ZWN0ZWQgUG9pbnQKICBkb3VibGUgc3BwbTsgICAvLyBNYWduaXR1ZGUgc3BhX3NwYiArIHNwYV9w
dCAoU2VnbWVudCBQbHVzIFByb2ouIE1hZy4pCiAgVmVjIHJlc3VsdDsgICAgLy8gUmVzdWx0IHRv
IGJlIHJldHVybmVkCgogIC8vIERlZ2VuZXJhdGUgY2FzZTogc2VnIGlzIGEgcG9pbnQKICBpZiAo
IHNlZy0+cGEueCA9PSBzZWctPnBiLnggJiYgc2VnLT5wYS55ID09IHNlZy0+cGIueSApIHsKICAg
IHJlc3VsdC54ID0gc2VnLT5wYS54OwogICAgcmVzdWx0LnkgPSBzZWctPnBhLnk7CiAgICByZXR1
cm4gcmVzdWx0OwogIH0KCiAgc3BhX3NwYiA9IHZlY19mcm9tIChzZWctPnBhLCBzZWctPnBiKTsK
ICBzcGFfcHQgID0gdmVjX2Zyb20gKHNlZy0+cGEsIHB0KTsKICBwdGwgICAgID0gdmVjX3Byb2og
KHNwYV9wdCwgc3BhX3NwYik7CiAgc20gICAgICA9IHZlY19tYWcgKHNwYV9zcGIpOwogIHBtICAg
ICAgPSB2ZWNfbWFnIChwdGwpOwogIHBwICAgICAgPSB2ZWNfc3VtIChzZWctPnBhLCBwdGwpOwog
IHNwcG0gICAgPSB2ZWNfbWFnICh2ZWNfc3VtIChzcGFfc3BiLCBwdGwpKTsKICAKICBpZiAoIHNw
cG0gPCBzbSB8fCBzcHBtIDwgcG0gKSB7CiAgICByZXR1cm4gc2VnLT5wYTsgIC8vIFNlZ21lbnQg
KyBQcm9qZWN0aW9uIGFkZCBkZXNjdHJ1Y3RpdmVseSwgc28gZW5kIGEgCiAgfQogIGVsc2UgaWYg
KCBwbSA+IHNtICkgewogICAgcmV0dXJuIHNlZy0+cGI7ICAvLyBQcm9qZWN0aW9uIGlzIHBhc3Qg
b3RoZXIgZW5kIG9mIHNlZ21lbnQsIHNvIGVuZCBiCiAgfQogIGVsc2UgewogICAgcmV0dXJuIHBw
OyAgICAgICAvLyBQcm9qZWN0aW9uIGxhbmRlZCBvbiBsaW5lLCBzbyBwcm9qZWN0ZWQgcG9pbnQK
ICB9Cn0KClZlYwpuZWFyZXN0X3BvaW50X29uX2FyYyAoVmVjIHB0LCBBcmMgY29uc3QgKmFyYykK
ewogIFZlYyBjZW50ID0gYXJjLT5jaXJjbGUuY2VudGVyOwogIENvb3JkIHJhZCA9IGFyYy0+Y2ly
Y2xlLnJhZGl1czsKCiAgLy8gVHJhbnNsYXRlIHB0IHN0IEFyYyBjaXJjbGUgaXMgY2VudGVyZWQg
YXQgb3JpZ2luIHdydCBpdAogIHB0LnggLT0gY2VudC54OwogIHB0LnkgLT0gY2VudC55OwoKICBk
b3VibGUgc2EgPSBhcmMtPnN0YXJ0X2FuZ2xlOwogIGRvdWJsZSBhZCA9IGFyYy0+YW5nbGVfZGVs
dGE7CiAgZG91YmxlIGVhID0gc2EgKyBhZDsgICAvLyBFbmQgQW5nbGUuICAgTm90ZTogaW4gWzAs
IDQuMCAqIE1fUEkpCgogIC8vIE5lYXJlc3QgUG9pbnQgb24gQ2lyY2xlCiAgVmVjIG5wb2MgPSB2
ZWNfc2NhbGUgKHB0LCByYWQgLyB2ZWNfbWFnIChwdCkpOwoKICBkb3VibGUgdGhldGFfbnBvYyA9
IGF0YW4yIChucG9jLnksIG5wb2MueCk7CgogIFZlYyByZXN1bHQ7CgogIC8vIElmIHRoZSBuZWFy
ZXN0IHBvaW50IG9uIHRoZSB1bmRlcmx5aW5nIGNpcmNsZSBpcyBwYXJ0IG9mIHRoZSBhcmMsCiAg
Ly8gdGhlIHBvaW50IGl0c2VsZiBpcyB0aGUgcmVzdWx0IHdlIHdhbnQsIG90aGVyd2lzZSB0aGUg
ZW5kIHBvaW50IG9mCiAgLy8gdGhlIGFyYyBjbG9zZXN0IHRvIHRoZSBuZWFyZXN0IHBvaW50IGlz
IHRoZSBvbmUgd2Ugd2FudC4KICBpZiAoIGFuZ2xlX2luX3NwYW4gKHRoZXRhX25wb2MsIHNhLCBh
ZCkgKSB7CiAgICByZXN1bHQgPSBucG9jOwogIH0KICBlbHNlIHsKICAgIC8vIFdlIHNob3VsZCB1
c2Ugc2luY29zKCkgaGVyZSB3aGVuIGl0IGJlY29tZXMgc3RhbmRhcmQKICAgIC8vIEVuZCBQb2lu
dCBBLgogICAgVmVjIGVwYSA9IHsgcm91bmQgKHJhZCAqIGNvcyAoc2EpKSwgcm91bmQgKHJhZCAq
IHNpbiAoc2EpKSB9OwogICAgLy8gRW5kIFBvaW50IEIKICAgIFZlYyBlcGIgPSB7IHJvdW5kIChy
YWQgKiBjb3MgKGVhKSksIHJvdW5kIChyYWQgKiBzaW4gKGVhKSkgfTsKICAgIGRvdWJsZSBtX25w
b2NfZXBhID0gdmVjX21hZyAodmVjX2Zyb20gKG5wb2MsIGVwYSkpOwogICAgZG91YmxlIG1fbnBv
Y19lcGIgPSB2ZWNfbWFnICh2ZWNfZnJvbSAobnBvYywgZXBiKSk7CiAgICByZXN1bHQgID0gKG1f
bnBvY19lcGEgPCBtX25wb2NfZXBiID8gZXBhIDogZXBiKTsKICB9CgogIC8vIFRyYW5zbGF0ZSBi
YWNrIHRvIHRydWUgcG9zaXRpb24KICByZXN1bHQueCArPSBjZW50Lng7CiAgcmVzdWx0LnkgKz0g
Y2VudC55OwoKICByZXR1cm4gcmVzdWx0Owp9Cgpib29sCmNpcmNsZV9pbnRlcnNlY3RzX2xpbmVf
c2VnbWVudCAoCiAgICBDaXJjbGUgICAgICBjb25zdCAqY2lyYywKICAgIExpbmVTZWdtZW50IGNv
bnN0ICpzZWcsCiAgICBWZWMgICAgICAgICAgICAgICAqcGlpICkKewogIFZlYyBucCA9IG5lYXJl
c3RfcG9pbnRfb25fbGluZV9zZWdtZW50IChjaXJjLT5jZW50ZXIsIHNlZyk7CgogIFZlYyBjY19u
cCA9IHZlY19mcm9tIChjaXJjLT5jZW50ZXIsIG5wKTsKCiAgZG91YmxlIG1jY19ucCA9IHZlY19t
YWcgKGNjX25wKTsKCiAgaWYgKCBtY2NfbnAgPD0gY2lyYy0+cmFkaXVzICkgewogICAgaWYgKCBw
aWkgIT0gTlVMTCApIHsKICAgICAgKnBpaSA9IG5wOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAg
fQogIGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKYm9vbApjaXJjbGVfaW50ZXJzZWN0
c19yZWN0YW5nbGUgKAogICAgQ2lyY2xlICAgIGNvbnN0ICpjaXJjLAogICAgUmVjdGFuZ2xlIGNv
bnN0ICpyZWN0LAogICAgVmVjICAgICAgICAgICAgICpwaWkgKQp7CiAgLy8gRklYTUU6IHRoZXNl
IGFsaWFzZXMgYXJlbid0IHdvcnRoIGl0IGluIHRoaXMgZnVuY3Rpb24KICBWZWMgY2MgPSBjaXJj
LT5jZW50ZXI7CiAgZG91YmxlIGNyMiA9IHBvdyAoY2lyYy0+cmFkaXVzLCAyLjApOwoKICAvLyBD
aGVjayBpZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUgaXMgb24gdGhlIHJlY3RhbmdsZS4gIE5v
dGUgdGhhdCB0aGlzCiAgLy8gY2F0Y2hlcyB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZSBjaXJjbGUg
aXMgZW50aXJlbHkgaW5zaWRlIHRoZSByZWN0YW5nbGUuCiAgaWYgKCBwb2ludF9pbnRlcnNlY3Rz
X3JlY3RhbmdsZSAoY2lyYy0+Y2VudGVyLCByZWN0KSApIHsKICAgICpwaWkgPSBjYzsKICAgIHJl
dHVybiB0cnVlOwogIH0KCiAgVmVjIGNvbnN0ICpjYSA9IHJlY3QtPmNvcm5lcjsgICAvLyBDb252
ZW5pZW5jZSBhbGlhcyBmb3IgdGhlIENvcm5lciBBcnJheQoKICAvLyBDaGVjayBpZiBhbnkgb2Yg
dGhlIGNvcm5lcnMgb2YgdGhlIHJlY3QgbGllIGluc2lkZSBjaXJjLiAgTm90ZSB0aGF0CiAgLy8g
dGhpcyBjYXRjaGVzIHRoZSBjYXNlIHdoZXJlIHRoZSByZWN0YW5nbGUgaXMgZW50aXJlbHkgaW5z
aWRlIHRoZSBjaXJjbGUuCiAgLy8gRklYTUU6IEl0IG1pZ2h0IGJlIGJldHRlciB0byB1c2UgaHlw
b3QoKSwgc2luY2UgdGhhdCBmdW5jdGlvbiBzYXlzIGl0CiAgLy8gYXZvaWRzIG92ZXIvdW5kZXIt
Zmxvdy4gIFRoZSBvbmUgZXh0cmEgc3FydCgpIGlzIHByb2JhYmx5IHdvcnRoIHRoYXQuCiAgLy8g
QnV0IG90aGVyIG1ldGhvZHMgaW4gdGhpcyBpbnRlcmZhY2UgdXNlIHBvdygpIGFuZCBJJ20gbm90
IHN1cmUgaG93IHRvCiAgLy8gYXZvaWQgaXQsIHNvIHBlcmhhcHMgdGhlcmUncyBub3QgcmVhbGx5
IG11Y2ggcG9pbnQuCiAgLy8gRklYTUU6IGNoZWNrIHRoYXQgdGhpcyB0ZXN0IHdvcmsgcmlnaHQK
ICBmb3IgKCBpbnQgaWkgPSAwIDsgaWkgPCA0IDsgaWkrKyApIHsKICAgIFZlYyB0YyA9IHsgY2Fb
aWldLnggLSBjYy54LCBjYVtpaV0ueSAtIGNjLnkgfTsgICAvLyBUcmFuc2xhdGVkIENvcm5lcgog
ICAgaWYgKCBwb3cgKHRjLngsIDIuMCkgKyBwb3cgKHRjLnksIDIuMCkgPD0gY3IyICkgewogICAg
ICAqcGlpID0gY2FbaWldOwogICAgIHJldHVybiB0cnVlOyAKICAgIH0KICB9CiAKICAvLyBMaW5l
IHNlZ21lbnRzIGJldHdlZW4gY29ybmVycyBvZiByZWN0YW5nbGUKICBMaW5lU2VnbWVudCBjMV9j
MiA9IHsgY2FbMF0sIGNhWzFdIH07CiAgTGluZVNlZ21lbnQgYzJfYzMgPSB7IGNhWzFdLCBjYVsy
XSB9OwogIExpbmVTZWdtZW50IGMzX2M0ID0geyBjYVsyXSwgY2FbM10gfTsKICBMaW5lU2VnbWVu
dCBjNF9jMSA9IHsgY2FbM10sIGNhWzBdIH07CgogIC8vIE5vdGUgdGhhdCBwaWkgKGlmIG5vdCBO
VUxMKSBpcyBjb21wdXRlZCBieSB0aGUgZmlyc3Qgc2hvcnQtY2lyY3VpdCB0cnVlCiAgLy8gcmVz
dWx0IGhlcmUuCiAgcmV0dXJuICgKICAgICAgY2lyY2xlX2ludGVyc2VjdHNfbGluZV9zZWdtZW50
IChjaXJjLCAmYzFfYzIsIHBpaSkgfHwKICAgICAgY2lyY2xlX2ludGVyc2VjdHNfbGluZV9zZWdt
ZW50IChjaXJjLCAmYzJfYzMsIHBpaSkgfHwKICAgICAgY2lyY2xlX2ludGVyc2VjdHNfbGluZV9z
ZWdtZW50IChjaXJjLCAmYzNfYzQsIHBpaSkgfHwKICAgICAgY2lyY2xlX2ludGVyc2VjdHNfbGlu
ZV9zZWdtZW50IChjaXJjLCAmYzRfYzEsIHBpaSkgKTsKfQoKYm9vbApjaXJjbGVfaW50ZXJzZWN0
c19jaXJjbGUgKAogICAgQ2lyY2xlIGNvbnN0ICpjYSwKICAgIENpcmNsZSBjb25zdCAqY2IsCiAg
ICBWZWMgICAgICAgICAgKnBpaSApCnsKCiAgVmVjIGFfYiA9IHZlY19mcm9tIChjYS0+Y2VudGVy
LCBjYi0+Y2VudGVyKTsgICAgICAgLy8gVmVjdG9yIGZyb20gYSB0byBiCiAgZG91YmxlIG1hX2Ig
PSB2ZWNfbWFnIChhX2IpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFnbml0dWRlIG9mIGFf
YgogIGRvdWJsZSBvdmVybGFwID0gY2EtPnJhZGl1cyArIGNiLT5yYWRpdXMgLSBtYV9iOyAgIC8v
IE92ZXJsYXAgc2l6ZSAobGVuZ3RoKQoKICBpZiAoIG92ZXJsYXAgPj0gMC4wICkgewogICAgaWYg
KCBwaWkgIT0gTlVMTCApIHsKICAgICAgaWYgICAgICAoIGNhLT5yYWRpdXMgPD0gb3ZlcmxhcCAp
IHsKICAgICAgICAqcGlpID0gY2EtPmNlbnRlcjsgICAvLyBjYSBpcyBjb250YWluZWQgaW4gY2IK
ICAgICAgfQogICAgICBlbHNlIGlmICggY2ItPnJhZGl1cyA8PSBvdmVybGFwICkgewogICAgICAg
ICpwaWkgPSBjYi0+Y2VudGVyOyAgIC8vIGNiIGlzIGNvbnRhaW5lZCBpbiBjYQogICAgICB9CiAg
ICAgIGVsc2UgewogICAgICAgICpwaWkgCiAgICAgICAgICA9IHZlY19zdW0gKAogICAgICAgICAg
ICAgIGNhLT5jZW50ZXIsCiAgICAgICAgICAgICAgdmVjX3NjYWxlIChhX2IsIChjYS0+cmFkaXVz
IC0gb3ZlcmxhcCAvIDIuMCkgLyBtYV9iKSApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1
ZTsKICB9CiAgZWxzZSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKfQoKaW50CmNpcmNsZV9saW5l
X3NlZ21lbnRfaW50ZXJzZWN0aW9uICgKICAgIENpcmNsZSAgICAgIGNvbnN0ICpjaXJjLAogICAg
TGluZVNlZ21lbnQgY29uc3QgKnNlZywKICAgIFZlYyAgICAgICAgICAgICAgICBpbnRlcnNlY3Rp
b25bMl0gKQp7CiAgLy8gVHJhbnNsYXRlZCBlbmQgcG9pbnQgY29vcmRpbmF0ZXMgc3QgY2lyYyBp
cyByZWxhdGl2ZWx5IHNpdHVhdGVkIGF0ICgwLCAwKS4KICBDb29yZCB4MSA9IHNlZy0+cGEueCAt
IGNpcmMtPmNlbnRlci54OwogIENvb3JkIHkxID0gc2VnLT5wYS55IC0gY2lyYy0+Y2VudGVyLnk7
CiAgQ29vcmQgeDIgPSBzZWctPnBiLnggLSBjaXJjLT5jZW50ZXIueDsKICBDb29yZCB5MiA9IHNl
Zy0+cGIueSAtIGNpcmMtPmNlbnRlci55OwoKICAvLyBEZWdlbmVyYXRlIGNhc2U6IHNlZyBpcyBh
IHBvaW50LgogIGlmICggeDEgPT0geDIgJiYgeTEgPT0geTIgKSB7CiAgICBpZiAoIHBvaW50X2lu
dGVyc2VjdHNfY2lyY2xlIChzZWctPnBhLCBjaXJjKSApIHsKICAgICAgaWYgKCBpbnRlcnNlY3Rp
b24gIT0gTlVMTCApIHsKICAgICAgICBpbnRlcnNlY3Rpb25bMF0gPSBzZWctPnBhOwogICAgICB9
CiAgICAgIHJldHVybiAxOwogICAgfQogIH0KCiAgLy8gRGVnZW5lcmF0ZSBjaXJjbGVzIGFyZW4n
dCBhbGxvd2VkLgogIGFzc2VydCAoY2lyYy0+cmFkaXVzID4gMCk7CgogIC8vIFN0cmFpZ2h0IGZy
b20gaHR0cDovL21hdGh3b3JsZC53b2xmcmFtLmNvbS9DaXJjbGUtTGluZUludGVyc2VjdGlvbi5o
dG1sCiAgQ29vcmQgZHggPSB4MiAtIHgxOwogIENvb3JkIGR5ID0geTIgLSB5MTsKICBkb3VibGUg
ZHIgPSBoeXBvdCAoZHgsIGR5KTsKICBkb3VibGUgZGV0ZXJtaW5hbnQgPSAoKGRvdWJsZSkgeDEp
ICogeTIgLSAoKGRvdWJsZSkgeDIpICogeTE7CiAgZG91YmxlIGRyMiA9IHBvdyAoZHIsIDIuMCk7
CiAgZG91YmxlIGRpc2NyaW1pbmFudCA9IHBvdyAoY2lyYy0+cmFkaXVzLCAyLjApICogZHIyIC0g
cG93IChkZXRlcm1pbmFudCwgMi4wKTsKICBpZiAoIGRpc2NyaW1pbmFudCA8IDAgKSB7CiAgICBy
ZXR1cm4gMDsgICAvLyBXZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBpbWFnaW5hcnkgaW50ZXJzZWN0
aW9ucwogIH0KICBkb3VibGUgc3FydF9kaXNjID0gc3FydCAoZGlzY3JpbWluYW50KTsKICBkb3Vi
bGUgdGVtcCA9IChkeSA8IDAgPyAtMS4wIDogMS4wKSAqIGR4ICogc3FydF9kaXNjOwogIENvb3Jk
IGlwMXggPSByb3VuZCAoKGRldGVybWluYW50ICogZHkgKyB0ZW1wKSAvIGRyMik7CiAgQ29vcmQg
aXAyeCA9IHJvdW5kICgoZGV0ZXJtaW5hbnQgKiBkeSAtIHRlbXApIC8gZHIyKTsKICB0ZW1wID0g
ZmFicyAoZHkpICogc3FydF9kaXNjOwogIENvb3JkIGlwMXkgPSByb3VuZCAoKC1kZXRlcm1pbmFu
dCAqIGR4ICsgdGVtcCkgLyBkcjIpOwogIENvb3JkIGlwMnkgPSByb3VuZCAoKC1kZXRlcm1pbmFu
dCAqIGR4IC0gdGVtcCkgLyBkcjIpOwogIAogIGludCByZXN1bHQgPSAwOwoKICAvLyBOb3cgd2Ug
anVzdCBuZWVkIHRvIGNoZWNrIHdoaWNoIG9mIHRoZSBpbnRlcnNlY3Rpb25zIGFyZSBpbiBvdXIg
c2VnbWVudC4KICAvLyBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIGNvb3JkaW5hdGUsIHNpbmNl
IHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzIGFyZQogIC8vIGtub3duIHRvIGJlIG9uIHRoZSAoaW5m
aW5pdGUpIHVuZGVybHlpbmcgZ2VvbWF0cmljYWwgbGluZS4gIEhvd2V2ZXIsCiAgLy8gYmVjYXVz
ZSBpcDF4IGFuZCBpcDJ4IGFyZSB0YWludGVkIGJ5IGZsb2F0aW5nIHBvaW50IGFuZCBvdXIgbGlu
ZXMgYXJlCiAgLy8gbGlrZWx5IHRvIGJlIHBhcmFsbGVsIHRvIHRoZSBheGVzLCB3ZSBtYWtlIHN1
cmUgdG8gY2hlY2sgdGhlIHdpZGVyIHNwYW4uCiAgaWYgKCBhYnMgKGR4KSA+PSBhYnMgKGR5KSAp
IHsKICAgIENvb3JkIGx4ID0gKCB4MSA8IHgyID8geDEgOiB4Mik7ICAgLy8gTG93ZXIgeAogICAg
Q29vcmQgaHggPSAoIHgxIDwgeDIgPyB4MiA6IHgxKTsgICAvLyBIaWdoZXIgeAogICAgaWYgKCBs
eCA8PSBpcDF4ICYmIGlwMXggPD0gaHggKSB7CiAgICAgIGlmICggaW50ZXJzZWN0aW9uICE9IE5V
TEwgKSB7CiAgICAgICAgaW50ZXJzZWN0aW9uW3Jlc3VsdF0KICAgICAgICAgID0gKChWZWMpIHsg
aXAxeCArIGNpcmMtPmNlbnRlci54LCBpcDF5ICsgY2lyYy0+Y2VudGVyLnkgfSk7CiAgICAgIH0K
ICAgICAgcmVzdWx0Kys7CiAgICB9CiAgICBpZiAoIGx4IDw9IGlwMnggJiYgaXAyeCA8PSBoeCAp
IHsKICAgICAgaWYgKCBpbnRlcnNlY3Rpb24gIT0gTlVMTCApIHsKICAgICAgICBpbnRlcnNlY3Rp
b25bcmVzdWx0XQogICAgICAgICAgPSAoKFZlYykgeyBpcDJ4ICsgY2lyYy0+Y2VudGVyLngsIGlw
MnkgKyBjaXJjLT5jZW50ZXIueSB9KTsKICAgICAgfQogICAgICByZXN1bHQrKzsKICAgIH0KICB9
CiAgZWxzZSB7CiAgICBDb29yZCBseSA9ICggeTEgPCB5MiA/IHkxIDogeTIpOyAgIC8vIExvd2Vy
IHkKICAgIENvb3JkIGh5ID0gKCB5MSA8IHkyID8geTIgOiB5MSk7ICAgLy8gSGlnaGVyIHkKICAg
IGlmICggbHkgPD0gaXAxeSAmJiBpcDF5IDw9IGh5ICkgewogICAgICBpZiAoIGludGVyc2VjdGlv
biAhPSBOVUxMICkgewogICAgICAgIGludGVyc2VjdGlvbltyZXN1bHRdCiAgICAgICAgICA9ICgo
VmVjKSB7IGlwMXggKyBjaXJjLT5jZW50ZXIueCwgaXAxeSArIGNpcmMtPmNlbnRlci55IH0pOwog
ICAgICB9CiAgICAgIHJlc3VsdCsrOwogICAgfQogICAgaWYgKCBseSA8PSBpcDJ5ICYmIGlwMnkg
PD0gaHkgKSB7CiAgICAgIGlmICggaW50ZXJzZWN0aW9uICE9IE5VTEwgKSB7CiAgICAgICAgaW50
ZXJzZWN0aW9uW3Jlc3VsdF0KICAgICAgICAgID0gKChWZWMpIHsgaXAyeCArIGNpcmMtPmNlbnRl
ci54LCBpcDJ5ICsgY2lyYy0+Y2VudGVyLnkgfSk7CiAgICAgIH0KICAgICAgcmVzdWx0Kys7CiAg
ICB9CiAgfQogIAogIHJldHVybiByZXN1bHQ7Cn0KCnZvaWQKYXJjX2VuZF9wb2ludHMgKEFyYyAq
YXJjLCBWZWMgZXBbMl0pCnsKICAvLyBTaW5lcyBhbmQgY29zaW5lcyBvZiBTdGFydCBBbmdsZS9F
bmQgQW5nbGUKICBkb3VibGUKICAgIHNpbl9zYSA9IHNpbiAoYXJjLT5zdGFydF9hbmdsZSksCiAg
ICBjb3Nfc2EgPSBjb3MgKGFyYy0+c3RhcnRfYW5nbGUpLAogICAgc2luX2VhID0gc2luIChhcmMt
PnN0YXJ0X2FuZ2xlICsgYXJjLT5hbmdsZV9kZWx0YSksCiAgICBjb3NfZWEgPSBjb3MgKGFyYy0+
c3RhcnRfYW5nbGUgKyBhcmMtPmFuZ2xlX2RlbHRhKTsKCiAgLy8gSXQgd291bGQgYmUgbmljZXIg
dG8gZG8gdGhpcyBidXQgc2luY29zKCkgY3VycmVudGx5IG5lZWRzIF9HTlVfU09VUkNFOgogIC8v
ZG91YmxlIHNpbl9zYSwgY29zX3NhLCBzaW5fZWEsIGNvc19lYTsKICAvL3NpbmNvcyAoYXJjLT5z
dGFydF9hbmdsZSwgJnNpbl9zYSwgJmNvc19zYSk7CiAgLy9zaW5jb3MgKGFyYy0+c3RhcnRfYW5n
bGUgKyBhcmMtPmFuZ2xlX2RlbHRhLCAmc2luX2VhLCAmY29zX2VhKTsKCiAgZG91YmxlIHJhZCA9
IGFyYy0+Y2lyY2xlLnJhZGl1czsKCiAgQ29vcmQgY3ggPSBhcmMtPmNpcmNsZS5jZW50ZXIueCwg
Y3kgPSBhcmMtPmNpcmNsZS5jZW50ZXIueTsKCiAgZXBbMF0gPSAoKFZlYykgeyBjeCArIHJvdW5k
IChyYWQgKiBjb3Nfc2EpLCBjeSArIHJvdW5kIChyYWQgKiBzaW5fc2EpIH0pOwogIGVwWzFdID0g
KChWZWMpIHsgY3ggKyByb3VuZCAocmFkICogY29zX2VhKSwgY3kgKyByb3VuZCAocmFkICogc2lu
X2VhKSB9KTsKfQoKaW50CmFyY19saW5lX3NlZ21lbnRfaW50ZXJzZWN0aW9uICgKICAgIEFyYyAg
ICAgICAgIGNvbnN0ICphcmMsCiAgICBMaW5lU2VnbWVudCBjb25zdCAqc2VnLAogICAgVmVjICAg
ICAgICAgICAgICAgIGludGVyc2VjdGlvblsyXSApCnsKICBDaXJjbGUgY29uc3QgKnVjID0gJihh
cmMtPmNpcmNsZSk7ICAgLy8gVW5kZXJseWluZyBDaXJjbGUKICAgCiAgLy8gR2V0IGludGVyc2Vj
dGlvbiBjb3VudCBhbmQgaW50ZXJzZWN0aW9uIHBvaW50cyAKICBWZWMgY2lbMl07ICAgLy8gQ2ly
Y2xlIEludGVyc2VjdGlvbiAodXAgdG8gdHdvIHBvaW50cykKICBpbnQgY2ljOyAgICAgLy8gQ2ly
Y2xlIEludGVyc2VjdGlvbiBDb3VudAogIGNpYyA9IGNpcmNsZV9saW5lX3NlZ21lbnRfaW50ZXJz
ZWN0aW9uICh1Yywgc2VnLCBjaSk7CgogIGludCByZXN1bHQgPSAwOwoKICB3aGlsZSAoIGNpYyA+
IDAgKSB7CiAgICBib29sIGlpb2EgICAvLyBJbnRlcnNlY3Rpb24gSXMgT24gQXJjCiAgICAgID0g
YW5nbGVfaW5fc3BhbiAoCiAgICAgICAgICBhdGFuMiAoY2lbY2ljIC0gMV0ueSAtIHVjLT5jZW50
ZXIueSwgY2lbY2ljIC0gMV0ueCAtIHVjLT5jZW50ZXIueCksCiAgICAgICAgICBhcmMtPnN0YXJ0
X2FuZ2xlLAogICAgICAgICAgYXJjLT5hbmdsZV9kZWx0YSApOwogICAgaWYgKCBpaW9hICkgewog
ICAgICBpZiAoIGludGVyc2VjdGlvbiAhPSBOVUxMICkgewogICAgICAgIGludGVyc2VjdGlvblty
ZXN1bHRdID0gY2lbY2ljIC0gMV07CiAgICAgIH0KICAgICAgcmVzdWx0Kys7CiAgICB9CiAgICBj
aWMtLTsKICB9CgogIHJldHVybiByZXN1bHQ7Cn0KCg==
--047d7b5d9c079c58e60523aa7d49--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019