[MLton] cvs commit: critical sections during thread switch

Matthew Fluet fluet@cs.cornell.edu
Sun, 4 Apr 2004 22:02:59 -0400 (EDT)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-959030623-1081130579=:25682
Content-Type: TEXT/PLAIN; charset=US-ASCII


Here's a revised gc.c.  It seems to pass the regressions (with the slow
GC_switchToThread), but I don't want to check it in without someone else
taking a look at it.

Essentially, here's what changed:

  switchToThread(GC_state s, GC_thread t)
     - never invokes a GC, it just modifies s->currentThread;
       it's up to the caller to (indirectly) invoke doGC.

  I moved the send of a GC signal to doGC, which seems where it really
  belongs.

  mutatorFrontierInvariant, mutatorStackInvariant, and
  ensureMutatorInvariant work together to check that enough frontier and
  stack are available for the current thread, possibly invoking a GC if
  necessary.

My big question is whether or not the stack resizing in forward is correct
given the new invariants.


---559023410-959030623-1081130579=:25682
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="gc.c"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.GSO.4.44.0404042202590.25682@snoball.cs.cornell.edu>
Content-Description: 
Content-Disposition: attachment; filename="gc.c"

LyogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgSGVucnkgQ2VqdGluLCBNYXR0
aGV3IEZsdWV0LCBTdXJlc2gNCiAqICAgIEphZ2FubmF0aGFuLCBhbmQgU3Rl
cGhlbiBXZWVrcy4NCiAqIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5IE5FQyBS
ZXNlYXJjaCBJbnN0aXR1dGUuDQogKg0KICogTUx0b24gaXMgcmVsZWFzZWQg
dW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLg0K
ICogUGxlYXNlIHNlZSB0aGUgZmlsZSBNTHRvbi1MSUNFTlNFIGZvciBsaWNl
bnNlIGluZm9ybWF0aW9uLg0KICovDQoNCiNpbmNsdWRlICJnYy5oIg0KI2lu
Y2x1ZGUgPGVycm5vLmg+DQojaW5jbHVkZSA8ZmNudGwuaD4NCiNpbmNsdWRl
IDxtYXRoLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQoNCiNpZiAoZGVmaW5l
ZCAoX19GcmVlQlNEX18pKQ0KI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4NCiNl
bmRpZg0KDQojaWYgKGRlZmluZWQgKF9fTmV0QlNEX18pKQ0KI2luY2x1ZGUg
PHN5cy9wYXJhbS5oPg0KI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4NCiNlbmRp
Zg0KDQojaW5jbHVkZSA8c3lzL21tYW4uaD4NCiNpbmNsdWRlIDxzeXMvcmVz
b3VyY2UuaD4NCiNpbmNsdWRlIDxzeXMvdGltZXMuaD4NCiNpbmNsdWRlIDx0
aW1lLmg+DQoNCiNpZiAoZGVmaW5lZCAoX19DWUdXSU5fXykpDQojaW5jbHVk
ZSA8d2luZG93cy5oPg0KI2VuZGlmDQoNCiNpZiAoZGVmaW5lZCAoX19saW51
eF9fKSkNCiNpbmNsdWRlIDx2YWx1ZXMuaD4NCiNpbmNsdWRlIDxzeXMvc3lz
aW5mby5oPg0KI2VuZGlmDQoNCiNpZiAoZGVmaW5lZCAoX19GcmVlQlNEX18p
KQ0KI2luY2x1ZGUgPGxpbWl0cy5oPg0KI2VuZGlmDQoNCiNpZiAoZGVmaW5l
ZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVm
aW5lZCAoX19zdW5fXykpDQojaW5jbHVkZSA8c2lnbmFsLmg+DQojaW5jbHVk
ZSA8c3lzL3N0YXQuaD4NCiNpbmNsdWRlIDxzeXMvdGltZS5oPg0KI2luY2x1
ZGUgPHN5cy90eXBlcy5oPg0KI2luY2x1ZGUgPHVjb250ZXh0Lmg+DQojZW5k
aWYNCg0KI2luY2x1ZGUgIkludEluZi5oIg0KDQovKiBTVVBQT1JUU19XRUFL
IGlzIHRydWUgaWYgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIHRoZSB3ZWFrIGF0
dHJpYnV0ZS4gKi8NCiNpZiAoZGVmaW5lZCAoX19GcmVlQlNEX18pIHx8IGRl
ZmluZWQgKF9fbGludXhfXykgfHwgZGVmaW5lZCAoX19OZXRCU0RfXykgfHwg
ZGVmaW5lZCAoX19zdW5fXykpDQojZGVmaW5lIFNVUFBPUlRTX1dFQUsgMQ0K
I2VsaWYgKGRlZmluZWQgKF9fQ1lHV0lOX18pKQ0KI2RlZmluZSBTVVBQT1JU
U19XRUFLIDANCiNlbGlmDQojZXJyb3IgU1VQUE9SVFNfV0VBSyBub3QgZGVm
aW5lZCBvbiBwbGF0Zm9ybQ0KI2VuZGlmDQoNCi8qIE9uIExpbnV4LCBXZSBu
ZWVkIHRoZSB2YWx1ZSBvZiBNUkVNQVBfTUFZTU9WRSwgd2hpY2ggc2hvdWxk
IGNvbWUgZnJvbQ0KICogc3lzL21tYW4uaCwgYnV0IGlzbid0IHRoZXJlLiAg
SXQgaXMgaW4gbGludXgvbW1hbi5oLCBidXQgd2UgY2FuJ3QgI2luY2x1ZGUN
CiAqIHRoYXQgaGVyZSwgYmVjYXVzZSBrZXJuZWwgaGVhZGVycyBkb24ndCBt
aXggd2l0aCBzeXN0ZW0gaGVhZGVycy4gIFdlIGNvdWxkDQogKiBjcmVhdGUg
YSBzZXBhcmF0ZSBmaWxlLCBpbmNsdWRlIHRoZSBrZXJuZWwgaGVhZGVycyB0
aGVyZSwgYW5kIGRlZmluZSBhIGdsb2JhbC4NCiAqIEJ1dCB0aGVyZSBzb21l
dGltZXMgc2VlbSB0byBiZSBwcm9ibGVtcyBpbmNsdWRpbmcga2VybmVsIGhl
YWRlcnMsIHNvIHRoZSANCiAqIGVhc2llc3QgdGhpbmcgdG8gZG8gaXMganVz
dCBkZWZpbmUgTVJFTUFQX01BWU1PVkUuDQogKi8NCiNpZiAoZGVmaW5lZCAo
X19saW51eF9fKSkNCiNkZWZpbmUgTVJFTUFQX01BWU1PVkUgMQ0KI2VuZGlm
DQoNCi8qIFRoZSBtdXRhdG9yIHNob3VsZCBtYWludGFpbiB0aGUgaW52YXJp
YW50cw0KICoNCiAqICBmdW5jdGlvbiBlbnRyeTogc3RhY2tUb3AgKyBtYXhG
cmFtZVNpemUgPD0gZW5kT2ZTdGFjaw0KICogIGFueXdoZXJlIGVsc2U6IHN0
YWNrVG9wICsgMiAqIG1heEZyYW1lU2l6ZSA8PSBlbmRPZlN0YWNrDQogKiAN
CiAqIFRoZSBsYXR0ZXIgd2lsbCBnaXZlIGl0IGVub3VnaCBzcGFjZSB0byBt
YWtlIGEgZnVuY3Rpb24gY2FsbCBhbmQgYWx3YXlzDQogKiBzYXRpc2Z5IHRo
ZSBmb3JtZXIuICBUaGUgZm9ybWVyIHdpbGwgYWxsb3cgaXQgdG8gbWFrZSBh
IGdjIGNhbGwgYXQgdGhlDQogKiBmdW5jdGlvbiBlbnRyeSBsaW1pdC4NCiAq
Lw0KDQplbnVtIHsNCglCT0dVU19FWE5fU1RBQ0sgPSAweEZGRkZGRkZGLA0K
CUNPUFlfQ0hVTktfU0laRSA9IDB4MjAwMDAwMCwgLyogMzJNICovDQoJQ1JP
U1NfTUFQX0VNUFRZID0gMjU1LA0KCUNVUlJFTlRfU09VUkNFX1VOREVGSU5F
RCA9IDB4RkZGRkZGRkYsDQoJREVCVUcgPSBGQUxTRSwNCglERUJVR19BUlJB
WSA9IEZBTFNFLA0KCURFQlVHX0NBUkRfTUFSS0lORyA9IEZBTFNFLA0KCURF
QlVHX0RFVEFJTEVEID0gRkFMU0UsDQoJREVCVUdfR0VORVJBVElPTkFMID0g
RkFMU0UsDQoJREVCVUdfTUFSS19DT01QQUNUID0gRkFMU0UsDQoJREVCVUdf
TUVNID0gRkFMU0UsDQoJREVCVUdfUFJPRklMRSA9IEZBTFNFLA0KCURFQlVH
X1JFU0laSU5HID0gRkFMU0UsDQoJREVCVUdfU0lHTkFMUyA9IEZBTFNFLA0K
CURFQlVHX1NUQUNLUyA9IEZBTFNFLA0KCURFQlVHX1RIUkVBRFMgPSBGQUxT
RSwNCglERUJVR19XRUFLID0gRkFMU0UsDQoJREVCVUdfV09STEQgPSBGQUxT
RSwNCglGT1JDRV9HRU5FUkFUSU9OQUwgPSBGQUxTRSwNCglGT1JDRV9NQVJL
X0NPTVBBQ1QgPSBGQUxTRSwNCglGT1JXQVJERUQgPSAweEZGRkZGRkZGLA0K
CVNUQUNLX0hFQURFUl9TSVpFID0gV09SRF9TSVpFLA0KfTsNCg0KdHlwZWRl
ZiBlbnVtIHsNCglNQVJLX01PREUsDQoJVU5NQVJLX01PREUsDQp9IE1hcmtN
b2RlOw0KDQojZGVmaW5lIEVNUFRZX0hFQURFUiBHQ19vYmplY3RIZWFkZXIg
KEVNUFRZX1RZUEVfSU5ERVgpDQojZGVmaW5lIFNUQUNLX0hFQURFUiBHQ19v
YmplY3RIZWFkZXIgKFNUQUNLX1RZUEVfSU5ERVgpDQojZGVmaW5lIFNUUklO
R19IRUFERVIgR0Nfb2JqZWN0SGVhZGVyIChTVFJJTkdfVFlQRV9JTkRFWCkN
CiNkZWZpbmUgVEhSRUFEX0hFQURFUiBHQ19vYmplY3RIZWFkZXIgKFRIUkVB
RF9UWVBFX0lOREVYKQ0KI2RlZmluZSBXRUFLX0dPTkVfSEVBREVSIEdDX29i
amVjdEhlYWRlciAoV0VBS19HT05FX1RZUEVfSU5ERVgpDQojZGVmaW5lIFdP
UkQ4X1ZFQ1RPUl9IRUFERVIgR0Nfb2JqZWN0SGVhZGVyIChXT1JEOF9UWVBF
X0lOREVYKQ0KDQojZGVmaW5lIFNQTElUX0hFQURFUigpCQkJCQkJCQlcDQoJ
ZG8gewkJCQkJCQkJCVwNCgkJaW50IG9iamVjdFR5cGVJbmRleDsJCQkJCQlc
DQoJCUdDX09iamVjdFR5cGUgKnQ7CQkJCQkJXA0KCQkJCQkJCQkJCVwNCgkJ
YXNzZXJ0ICgxID09IChoZWFkZXIgJiAxKSk7CQkJCQlcDQoJCW9iamVjdFR5
cGVJbmRleCA9IChoZWFkZXIgJiBUWVBFX0lOREVYX01BU0spID4+IDE7CQlc
DQoJCWFzc2VydCAoMCA8PSBvYmplY3RUeXBlSW5kZXgJCQkJCVwNCgkJCQlh
bmQgb2JqZWN0VHlwZUluZGV4IDwgcy0+b2JqZWN0VHlwZXNTaXplKTsJXA0K
CQl0ID0gJnMtPm9iamVjdFR5cGVzIFtvYmplY3RUeXBlSW5kZXhdOwkJCQlc
DQoJCXRhZyA9IHQtPnRhZzsJCQkJCQkJXA0KCQludW1Ob25Qb2ludGVycyA9
IHQtPm51bU5vblBvaW50ZXJzOwkJCQlcDQoJCW51bVBvaW50ZXJzID0gdC0+
bnVtUG9pbnRlcnM7CQkJCQlcDQoJCWlmIChERUJVR19ERVRBSUxFRCkJCQkJ
CQlcDQoJCQlmcHJpbnRmIChzdGRlcnIsICJTUExJVF9IRUFERVIgKDB4JTA4
eCkgIG51bU5vblBvaW50ZXJzID0gJXUgIG51bVBvaW50ZXJzID0gJXVcbiIs
IFwNCgkJCQkJKHVpbnQpaGVhZGVyLCBudW1Ob25Qb2ludGVycywgbnVtUG9p
bnRlcnMpOwlcDQoJfSB3aGlsZSAoMCkNCg0Kc3RhdGljIGNoYXIqIHRhZ1Rv
U3RyaW5nIChHQ19PYmplY3RUeXBlVGFnIHQpIHsNCglzd2l0Y2ggKHQpIHsN
CgljYXNlIEFSUkFZX1RBRzoNCglyZXR1cm4gIkFSUkFZIjsNCgljYXNlIE5P
Uk1BTF9UQUc6DQoJcmV0dXJuICJOT1JNQUwiOw0KCWNhc2UgU1RBQ0tfVEFH
Og0KCXJldHVybiAiU1RBQ0siOw0KCWNhc2UgV0VBS19UQUc6DQoJcmV0dXJu
ICJXRUFLIjsNCglkZWZhdWx0Og0KCWRpZSAoImJhZCB0YWcgJXUiLCB0KTsN
Cgl9DQp9DQoNCnN0YXRpYyBpbmxpbmUgdWxvbmcgbWVnICh1aW50IG4pIHsN
CglyZXR1cm4gbiAvICgxMDI0dWwgKiAxMDI0dWwpOw0KfQ0KDQpzdGF0aWMg
aW5saW5lIHVpbnQgdG9CeXRlcyAodWludCBuKSB7DQoJcmV0dXJuIG4gPDwg
MjsNCn0NCg0KI2lmIChkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVmaW5l
ZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChfX05ldEJTRF9fKSB8fCBkZWZp
bmVkIChfX3N1bl9fKSkNCnN0YXRpYyBpbmxpbmUgdWludCBtaW4gKHVpbnQg
eCwgdWludCB5KSB7DQoJcmV0dXJuICgoeCA8IHkpID8geCA6IHkpOw0KfQ0K
DQpzdGF0aWMgaW5saW5lIHVpbnQgbWF4ICh1aW50IHgsIHVpbnQgeSkgew0K
CXJldHVybiAoKHggPiB5KSA/IHggOiB5KTsNCn0NCiNlbmRpZg0KDQpzdGF0
aWMgaW5saW5lIFc2NCBtaW42NCAoVzY0IHgsIFc2NCB5KSB7DQoJcmV0dXJu
ICgoeCA8IHkpID8geCA6IHkpOw0KfQ0KDQpzdGF0aWMgaW5saW5lIFc2NCBt
YXg2NCAoVzY0IHgsIFc2NCB5KSB7DQoJcmV0dXJuICgoeCA+IHkpID8geCA6
IHkpOw0KfQ0KDQpzdGF0aWMgaW5saW5lIHVpbnQgcm91bmREb3duICh1aW50
IGEsIHVpbnQgYikgew0KCXJldHVybiBhIC0gKGEgJSBiKTsNCn0NCg0Kc3Rh
dGljIGlubGluZSB1aW50IGFsaWduICh1aW50IGEsIHVpbnQgYikgew0KCWFz
c2VydCAoYSA+PSAwKTsNCglhc3NlcnQgKGIgPj0gMSk7DQoJYSArPSBiIC0g
MTsNCglhIC09IGEgJSBiOw0KCXJldHVybiBhOwkNCn0NCg0Kc3RhdGljIGlu
bGluZSBXNjQgdzY0YWxpZ24gKFc2NCBhLCB1aW50IGIpIHsNCglXNjQgcmVz
Ow0KDQoJYXNzZXJ0IChhID49IDApOw0KCWFzc2VydCAoYiA+PSAxKTsNCgly
ZXMgPSBhICsgYiAtIDE7DQoJcmVzID0gcmVzIC0gcmVzICUgYjsNCglpZiAo
RkFMU0UpDQoJCWZwcmludGYgKHN0ZGVyciwgIiVsbHUgPSB3NjRBbGlnbiAo
JWxsdSwgJXUpXG4iLCByZXMsIGEsIGIpOw0KCXJldHVybiByZXM7DQp9DQoN
CnN0YXRpYyBib29sIGlzQWxpZ25lZCAodWludCBhLCB1aW50IGIpIHsNCgly
ZXR1cm4gMCA9PSBhICUgYjsNCn0NCg0KI2lmIEFTU0VSVA0Kc3RhdGljIGJv
b2wgaXNBbGlnbmVkRnJvbnRpZXIgKEdDX3N0YXRlIHMsIHBvaW50ZXIgcCkg
ew0KCXJldHVybiBpc0FsaWduZWQgKCh1aW50KXAgKyBHQ19OT1JNQUxfSEVB
REVSX1NJWkUsIHMtPmFsaWdubWVudCk7DQp9DQoNCnN0YXRpYyBib29sIGlz
QWxpZ25lZFJlc2VydmVkIChHQ19zdGF0ZSBzLCB1aW50IHIpIHsNCglyZXR1
cm4gaXNBbGlnbmVkIChTVEFDS19IRUFERVJfU0laRSArIHNpemVvZiAoc3Ry
dWN0IEdDX3N0YWNrKSArIHIsIA0KCQkJCXMtPmFsaWdubWVudCk7DQp9DQoj
ZW5kaWYNCg0Kc3RhdGljIGlubGluZSBwb2ludGVyIGFsaWduRnJvbnRpZXIg
KEdDX3N0YXRlIHMsIHBvaW50ZXIgcCkgew0KCXJldHVybiAocG9pbnRlcikg
KGFsaWduICgodWludClwICsgR0NfTk9STUFMX0hFQURFUl9TSVpFLCBzLT5h
bGlnbm1lbnQpDQoJCQkJLSBHQ19OT1JNQUxfSEVBREVSX1NJWkUpOw0KfQ0K
DQpwb2ludGVyIEdDX2FsaWduRnJvbnRpZXIgKEdDX3N0YXRlIHMsIHBvaW50
ZXIgcCkgew0KCXJldHVybiBhbGlnbkZyb250aWVyIChzLCBwKTsNCn0NCg0K
c3RhdGljIGlubGluZSB1aW50IHN0YWNrUmVzZXJ2ZWQgKEdDX3N0YXRlIHMs
IHVpbnQgcikgew0KCXVpbnQgcmVzOw0KDQoJcmVzID0gYWxpZ24gKFNUQUNL
X0hFQURFUl9TSVpFICsgc2l6ZW9mIChzdHJ1Y3QgR0Nfc3RhY2spICsgciwg
DQoJCQlzLT5hbGlnbm1lbnQpDQoJCS0gKFNUQUNLX0hFQURFUl9TSVpFICsg
c2l6ZW9mIChzdHJ1Y3QgR0Nfc3RhY2spKTsNCglpZiAoREVCVUdfU1RBQ0tT
KQ0KCQlmcHJpbnRmIChzdGRlcnIsICIlcyA9IHN0YWNrUmVzZXJ2ZWQgKCVz
KVxuIiwNCgkJCQl1aW50VG9Db21tYVN0cmluZyAocmVzKSwNCgkJCQl1aW50
VG9Db21tYVN0cmluZyAocikpOw0KCXJldHVybiByZXM7DQp9DQoNCnN0YXRp
YyB2b2lkIHN1bmxpbmsgKGNoYXIgKnBhdGgpIHsNCgl1bmxlc3MgKDAgPT0g
dW5saW5rIChwYXRoKSkNCgkJZGllZSAoInVubGluayAoJXMpIGZhaWxlZCIs
IHBhdGgpOw0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAg
ICAgICAgICAgICAgICAgICAgVmlydHVhbCBNZW1vcnkgTWFuYWdlbWVudCAg
ICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
ICovDQoNCiNpZiAoZGVmaW5lZCAoX19DWUdXSU5fXykpDQoNCnN0YXRpYyB2
b2lkIHNob3dNYXBzICgpIHsNCglNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04g
YnVmOw0KCUxQQ1ZPSUQgbHBBZGRyZXNzOw0KCWNoYXIgKnN0YXRlID0gIjx1
bnNldD4iOw0KCWNoYXIgKnByb3RlY3QgPSAiPHVuc2V0PiI7DQoNCglmb3Ig
KGxwQWRkcmVzcyA9IDA7IGxwQWRkcmVzcyA8IChMUENWT0lEKTB4ODAwMDAw
MDA7ICkgew0KCQlWaXJ0dWFsUXVlcnkgKGxwQWRkcmVzcywgJmJ1Ziwgc2l6
ZW9mIChidWYpKTsNCg0KCQlzd2l0Y2ggKGJ1Zi5Qcm90ZWN0KSB7DQoJCWNh
c2UgUEFHRV9SRUFET05MWToNCgkJCXByb3RlY3QgPSAiUEFHRV9SRUFET05M
WSI7DQoJCQlicmVhazsNCgkJY2FzZSBQQUdFX1JFQURXUklURToNCgkJCXBy
b3RlY3QgPSAiUEFHRV9SRUFEV1JJVEUiOw0KCQkJYnJlYWs7DQoJCWNhc2Ug
UEFHRV9XUklURUNPUFk6DQoJCQlwcm90ZWN0ID0gIlBBR0VfV1JJVEVDT1BZ
IjsNCgkJCWJyZWFrOw0KCQljYXNlIFBBR0VfRVhFQ1VURToNCgkJCXByb3Rl
Y3QgPSAiUEFHRV9FWEVDVVRFIjsNCgkJCWJyZWFrOw0KCQljYXNlIFBBR0Vf
RVhFQ1VURV9SRUFEOg0KCQkJcHJvdGVjdCA9ICJQQUdFX0VYRUNVVEVfUkVB
RCI7DQoJCQlicmVhazsNCgkJY2FzZSBQQUdFX0VYRUNVVEVfUkVBRFdSSVRF
Og0KCQkJcHJvdGVjdCA9ICJQQUdFX0VYRUNVVEVfUkVBRFdSSVRFIjsNCgkJ
CWJyZWFrOw0KCQljYXNlIFBBR0VfRVhFQ1VURV9XUklURUNPUFk6DQoJCQlw
cm90ZWN0ID0gIlBBR0VfRVhFQ1VURV9XUklURUNPUFkiOw0KCQkJYnJlYWs7
DQoJCWNhc2UgUEFHRV9HVUFSRDoNCgkJCXByb3RlY3QgPSAiUEFHRV9HVUFS
RCI7DQoJCQlicmVhazsNCgkJY2FzZSBQQUdFX05PQUNDRVNTOg0KCQkJcHJv
dGVjdCA9ICJQQUdFX05PQUNDRVNTIjsNCgkJCWJyZWFrOw0KCQljYXNlIFBB
R0VfTk9DQUNIRToNCgkJCXByb3RlY3QgPSAiUEFHRV9OT0NBQ0hFIjsNCgkJ
CWJyZWFrOw0KCQl9DQoJCXN3aXRjaCAoYnVmLlN0YXRlKSB7DQoJCWNhc2Ug
TUVNX0NPTU1JVDoNCgkJCXN0YXRlID0gIk1FTV9DT01NSVQiOw0KCQkJYnJl
YWs7DQoJCWNhc2UgTUVNX0ZSRUU6DQoJCQlzdGF0ZSA9ICJNRU1fRlJFRSI7
DQoJCQlicmVhazsNCgkJY2FzZSBNRU1fUkVTRVJWRToNCgkJCXN0YXRlID0g
Ik1FTV9SRVNFUlZFIjsNCgkJCWJyZWFrOw0KCQl9DQoJCWZwcmludGYoc3Rk
ZXJyLCAiMHglOHggJTEwdSAgJXMgJXNcbiIsDQoJCQkodWludClidWYuQmFz
ZUFkZHJlc3MsDQoJCQkodWludClidWYuUmVnaW9uU2l6ZSwNCgkJCXN0YXRl
LCBwcm90ZWN0KTsNCgkJbHBBZGRyZXNzICs9IGJ1Zi5SZWdpb25TaXplOw0K
CX0NCn0NCg0Kc3RhdGljIHZvaWQgc2hvd01lbSAoKSB7DQoJTUVNT1JZU1RB
VFVTIG1zOyANCg0KCW1zLmR3TGVuZ3RoID0gc2l6ZW9mIChNRU1PUllTVEFU
VVMpOyANCglHbG9iYWxNZW1vcnlTdGF0dXMgKCZtcyk7IA0KCWZwcmludGYo
c3RkZXJyLCAiVG90YWwgUGh5cy4gTWVtOiAlbGRcbkF2YWlsIFBoeXMuIE1l
bTogJWxkXG5Ub3RhbCBQYWdlIEZpbGU6ICVsZFxuQXZhaWwgUGFnZSBGaWxl
OiAlbGRcblRvdGFsIFZpcnR1YWw6ICVsZFxuQXZhaWwgVmlydHVhbDogJWxk
XG4iLA0KCQkJIG1zLmR3VG90YWxQaHlzLCANCgkJCSBtcy5kd0F2YWlsUGh5
cywgDQoJCQkgbXMuZHdUb3RhbFBhZ2VGaWxlLCANCgkJCSBtcy5kd0F2YWls
UGFnZUZpbGUsIA0KCQkJIG1zLmR3VG90YWxWaXJ0dWFsLCANCgkJCSBtcy5k
d0F2YWlsVmlydHVhbCk7IA0KCXNob3dNYXBzKCk7DQp9DQoNCiNlbGlmIChk
ZWZpbmVkIChfX0ZyZWVCU0RfXykpDQoNCnN0YXRpYyB2b2lkIHNob3dNZW0g
KCkgew0KCXN0YXRpYyBjaGFyIGJ1ZmZlclsyNTZdOw0KDQoJc3ByaW50ZiAo
YnVmZmVyLCAiL2Jpbi9jYXQgL3Byb2MvJWQvbWFwXG4iLCAoaW50KWdldHBp
ZCAoKSk7DQoJKHZvaWQpc3lzdGVtIChidWZmZXIpOw0KfQ0KDQojZWxpZiAo
ZGVmaW5lZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChfX05ldEJTRF9fKSkN
Cg0Kc3RhdGljIHZvaWQgc2hvd01lbSAoKSB7DQoJc3RhdGljIGNoYXIgYnVm
ZmVyWzI1Nl07DQoNCglzcHJpbnRmIChidWZmZXIsICIvYmluL2NhdCAvcHJv
Yy8lZC9tYXBzXG4iLCAoaW50KWdldHBpZCAoKSk7DQoJKHZvaWQpc3lzdGVt
IChidWZmZXIpOw0KfQ0KDQojZWxpZiAoZGVmaW5lZCAoX19zdW5fXykpDQoN
CnN0YXRpYyB2b2lkIHNob3dNZW0gKCkgew0KCXN0YXRpYyBjaGFyIGJ1ZmZl
clsyNTZdOw0KCXNwcmludGYgKGJ1ZmZlciwgInBtYXAgJWRcbiIsIChpbnQp
Z2V0cGlkICgpKTsNCglzeXN0ZW0gKGJ1ZmZlcik7DQp9DQoNCiNlbHNlDQoN
CiNlcnJvciBzaG93TWVtIG5vdCBkZWZpbmVkIG9uIHBsYXRmb3JtDQoNCiNl
bmRpZg0KDQpzdGF0aWMgdm9pZCAqbW1hcEFub24gKHZvaWQgKnN0YXJ0LCBz
aXplX3QgbGVuZ3RoKSB7DQoJdm9pZCAqcmVzdWx0Ow0KDQojaWYgKGRlZmlu
ZWQgKF9fQ1lHV0lOX18pKQkNCglyZXN1bHQgPSBWaXJ0dWFsQWxsb2MgKChM
UFZPSUQpc3RhcnQsIGxlbmd0aCwgTUVNX0NPTU1JVCwgDQoJCQkJUEFHRV9S
RUFEV1JJVEUpOw0KCWlmIChOVUxMID09IHJlc3VsdCkNCgkJcmVzdWx0ID0g
KHZvaWQqKS0xOw0KI2VsaWYgKGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCBk
ZWZpbmVkIChfX2xpbnV4X18pIHx8IGRlZmluZWQgKF9fTmV0QlNEX18pKQ0K
CXJlc3VsdCA9IG1tYXAgKHN0YXJ0LCBsZW5ndGgsIFBST1RfUkVBRCB8IFBS
T1RfV1JJVEUsIA0KCQkJTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiwgLTEsIDAp
Ow0KI2VsaWYgKGRlZmluZWQgKF9fc3VuX18pKQ0KLyogT24gU29sYXJpcyA1
LjcsIE1BUF9BTk9OIGNhdXNlcyBFSU5WQUwgYW5kIG1tYXAgcmVxdWlyZXMg
YSBmaWxlIGRlc2NyaXB0b3IuICovDQogICAgICAgIHsNCgkJc3RhdGljIGlu
dCBmZCA9IC0xOw0KDQoJCWlmICgtMSA9PSBmZCkNCgkJCWZkID0gb3BlbiAo
Ii9kZXYvemVybyIsIE9fUkRPTkxZKTsNCgkJcmVzdWx0ID0gbW1hcCAoc3Rh
cnQsIGxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgDQoJCQkJTUFQ
X1BSSVZBVEUsIGZkLCAwKTsNCgl9DQojZWxzZQ0KI2Vycm9yIG1tYXBBbm9u
IG5vdCBkZWZpbmVkDQojZW5kaWYJDQoJaWYgKERFQlVHX01FTSkNCgkJZnBy
aW50ZiAoc3RkZXJyLCAiMHglMDh4ID0gbW1hcEFub24gKDB4JTA4eCwgJXMp
XG4iLA0KCQkJCQkodWludClyZXN1bHQsDQoJCQkJCSh1aW50KXN0YXJ0LCAN
CgkJCQkJdWludFRvQ29tbWFTdHJpbmcgKGxlbmd0aCkpOw0KCXJldHVybiBy
ZXN1bHQ7DQp9DQoNCnN0YXRpYyB2b2lkICpzbW1hcCAoc2l6ZV90IGxlbmd0
aCkgew0KCXZvaWQgKnJlc3VsdDsNCg0KCXJlc3VsdCA9IG1tYXBBbm9uIChO
VUxMLCBsZW5ndGgpOw0KCWlmICgodm9pZCopLTEgPT0gcmVzdWx0KSB7DQoJ
CXNob3dNZW0gKCk7DQoJCWRpZSAoIk91dCBvZiBtZW1vcnkuIik7DQoJfQ0K
CXJldHVybiByZXN1bHQ7DQp9DQoNCiNpZiAoZGVmaW5lZCAoX19GcmVlQlNE
X18pIHx8IGRlZmluZWQgKF9fbGludXhfXykgfHwgZGVmaW5lZCAoX19OZXRC
U0RfXykgfHwgZGVmaW5lZCAoX19zdW5fXykpDQpzdGF0aWMgdm9pZCBzbXVu
bWFwICh2b2lkICpiYXNlLCBzaXplX3QgbGVuZ3RoKSB7DQoJaWYgKERFQlVH
X01FTSkNCgkJZnByaW50ZiAoc3RkZXJyLCAic211bm1hcCAoMHglMDh4LCAl
cylcbiIsDQoJCQkJKHVpbnQpYmFzZSwNCgkJCQl1aW50VG9Db21tYVN0cmlu
ZyAobGVuZ3RoKSk7DQoJYXNzZXJ0IChiYXNlICE9IE5VTEwpOw0KCWlmICgw
ID09IGxlbmd0aCkNCgkJcmV0dXJuOw0KCWlmICgwICE9IG11bm1hcCAoYmFz
ZSwgbGVuZ3RoKSkNCgkJZGllZSAoIm11bm1hcCBmYWlsZWQiKTsNCn0NCiNl
bmRpZg0KDQojaWYgKGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVk
IChfX2xpbnV4X18pIHx8IGRlZmluZWQgKF9fTmV0QlNEX18pIHx8IGRlZmlu
ZWQgKF9fc3VuX18pKQ0KLyogQSBzdXBlci1zYWZlIG1tYXAuDQogKiAgQWxs
b2NhdGVzIGEgcmVnaW9uIG9mIG1lbW9yeSB3aXRoIGRlYWQgem9uZXMgYXQg
dGhlIGhpZ2ggYW5kIGxvdyBlbmRzLg0KICogIEFueSBhdHRlbXB0IHRvIHRv
dWNoIHRoZSBkZWFkIHpvbmUgKHJlYWQgb3Igd3JpdGUpIHdpbGwgY2F1c2Ug
YQ0KICogICBzZWdtZW50YXRpb24gZmF1bHQuDQogKi8NCnN0YXRpYyB2b2lk
ICpzc21tYXAgKHNpemVfdCBsZW5ndGgsIHNpemVfdCBkZWFkX2xvdywgc2l6
ZV90IGRlYWRfaGlnaCkgew0KCXZvaWQgKmJhc2UsKmxvdywqcmVzdWx0LCpo
aWdoOw0KDQoJYmFzZSA9IHNtbWFwIChsZW5ndGggKyBkZWFkX2xvdyArIGRl
YWRfaGlnaCk7DQoJbG93ID0gYmFzZTsNCglpZiAobXByb3RlY3QgKGxvdywg
ZGVhZF9sb3csIFBST1RfTk9ORSkpDQoJCWRpZWUgKCJtcHJvdGVjdCBmYWls
ZWQiKTsNCglyZXN1bHQgPSBsb3cgKyBkZWFkX2xvdzsNCgloaWdoID0gcmVz
dWx0ICsgbGVuZ3RoOw0KCWlmIChtcHJvdGVjdCAoaGlnaCwgZGVhZF9oaWdo
LCBQUk9UX05PTkUpKQ0KCQlkaWVlICgibXByb3RlY3QgZmFpbGVkIik7DQoJ
cmV0dXJuIHJlc3VsdDsNCn0NCg0KI2VsaWYgKGRlZmluZWQgKF9fQ1lHV0lO
X18pKQ0KDQovKiBOb3RoaW5nIG5lZWRlZC4gKi8NCg0KI2Vsc2UNCg0KI2Vy
cm9yIHNzbW1hcCBub3QgZGVmaW5lZCBvbiBwbGF0Zm9ybQ0KDQojZW5kaWYN
Cg0Kc3RhdGljIHZvaWQgcmVsZWFzZSAodm9pZCAqYmFzZSwgc2l6ZV90IGxl
bmd0aCkgew0KCWlmIChERUJVR19NRU0pDQoJCWZwcmludGYgKHN0ZGVyciwg
InJlbGVhc2UgKDB4JTA4eCwgJXMpXG4iLA0KCQkJCSh1aW50KWJhc2UsIHVp
bnRUb0NvbW1hU3RyaW5nIChsZW5ndGgpKTsNCiNpZiAoZGVmaW5lZCAoX19D
WUdXSU5fXykpDQoJaWYgKDAgPT0gVmlydHVhbEZyZWUgKGJhc2UsIDAsIE1F
TV9SRUxFQVNFKSkNCgkJZGllICgiVmlydHVhbEZyZWUgcmVsZWFzZSBmYWls
ZWQiKTsNCiNlbGlmIChkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVmaW5l
ZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChfX05ldEJTRF9fKSB8fCBkZWZp
bmVkIChfX3N1bl9fKSkNCglzbXVubWFwIChiYXNlLCBsZW5ndGgpOw0KI2Vs
c2UNCiNlcnJvciByZWxlYXNlIG5vdCBkZWZpbmVkDQojZW5kaWYNCn0NCg0K
c3RhdGljIHZvaWQgZGVjb21taXQgKHZvaWQgKmJhc2UsIHNpemVfdCBsZW5n
dGgpIHsNCglpZiAoREVCVUdfTUVNKQ0KCQlmcHJpbnRmIChzdGRlcnIsICJk
ZWNvbW1pdCAoMHglMDh4LCAlcylcbiIsDQoJCQkJKHVpbnQpYmFzZSwgdWlu
dFRvQ29tbWFTdHJpbmcgKGxlbmd0aCkpOw0KI2lmIChkZWZpbmVkIChfX0NZ
R1dJTl9fKSkNCglpZiAoMCA9PSBWaXJ0dWFsRnJlZSAoYmFzZSwgbGVuZ3Ro
LCBNRU1fREVDT01NSVQpKQ0KCQlkaWUgKCJWaXJ0dWFsRnJlZSBkZWNvbW1p
dCBmYWlsZWQiKTsNCiNlbGlmIChkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwg
ZGVmaW5lZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChfX05ldEJTRF9fKSB8
fCBkZWZpbmVkIChfX3N1bl9fKSkNCglzbXVubWFwIChiYXNlLCBsZW5ndGgp
Ow0KI2Vsc2UNCiNlcnJvciBkZWNvbW1pdCBub3QgZGVmaW5lZAkNCiNlbmRp
Zg0KfQ0KDQpzdGF0aWMgaW5saW5lIHZvaWQgY29weSAocG9pbnRlciBzcmMs
IHBvaW50ZXIgZHN0LCB1aW50IHNpemUpIHsNCgl1aW50CSp0bywNCgkJKmZy
b20sDQoJCSpsaW1pdDsNCg0KCWlmIChERUJVR19ERVRBSUxFRCkNCgkJZnBy
aW50ZiAoc3RkZXJyLCAiY29weSAoMHglMDh4LCAweCUwOHgsICV1KVxuIiwN
CgkJCQkodWludClzcmMsICh1aW50KWRzdCwgc2l6ZSk7DQoJYXNzZXJ0IChp
c0FsaWduZWQgKCh1aW50KXNyYywgV09SRF9TSVpFKSk7DQoJYXNzZXJ0IChp
c0FsaWduZWQgKCh1aW50KWRzdCwgV09SRF9TSVpFKSk7DQoJYXNzZXJ0IChp
c0FsaWduZWQgKHNpemUsIFdPUkRfU0laRSkpOw0KCWFzc2VydCAoZHN0IDw9
IHNyYyBvciBzcmMgKyBzaXplIDw9IGRzdCk7DQoJaWYgKHNyYyA9PSBkc3Qp
DQoJCXJldHVybjsNCglmcm9tID0gKHVpbnQqKXNyYzsNCgl0byA9ICh1aW50
Kilkc3Q7DQoJbGltaXQgPSAodWludCopKHNyYyArIHNpemUpOw0KCXVudGls
IChmcm9tID09IGxpbWl0KQ0KCQkqdG8rKyA9ICpmcm9tKys7DQp9DQoNCi8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcnVzYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KaW50IGZpeGVk
R2V0cnVzYWdlIChpbnQgd2hvLCBzdHJ1Y3QgcnVzYWdlICpydXApIHsNCglz
dHJ1Y3QgdG1zCXRidWZmOw0KCWludAkJcmVzOw0KCWNsb2NrX3QJCXVzZXIs
DQoJCQlzeXM7DQoJc3RhdGljIGJvb2wJZmlyc3QgPSBUUlVFOw0KCXN0YXRp
YyBsb25nCWh6Ow0KDQoJaWYgKGZpcnN0KSB7DQoJCWZpcnN0ID0gRkFMU0U7
DQoJCWh6ID0gc3lzY29uZiAoX1NDX0NMS19UQ0spOw0KCX0NCglyZXMgPSBn
ZXRydXNhZ2UgKHdobywgcnVwKTsNCgl1bmxlc3MgKHJlcyA9PSAwKQ0KCQly
ZXR1cm4gKHJlcyk7DQoJaWYgKHRpbWVzICgmdGJ1ZmYpID09IC0xKQ0KCQlk
aWVlICgiSW1wb3NzaWJsZTogdGltZXMoKSBmYWlsZWQiKTsNCglzd2l0Y2gg
KHdobykgew0KCWNhc2UgUlVTQUdFX1NFTEY6DQoJCXVzZXIgPSB0YnVmZi50
bXNfdXRpbWU7DQoJCXN5cyA9IHRidWZmLnRtc19zdGltZTsNCgkJYnJlYWs7
DQoJY2FzZSBSVVNBR0VfQ0hJTERSRU46DQoJCXVzZXIgPSB0YnVmZi50bXNf
Y3V0aW1lOw0KCQlzeXMgPSB0YnVmZi50bXNfY3N0aW1lOw0KCQlicmVhazsN
CglkZWZhdWx0Og0KCQlkaWUgKCJnZXRydXNhZ2UoKSBhY2NlcHRlZCB1bmtu
b3duIHdobzogJWQiLCB3aG8pOw0KCQlleGl0ICgxKTsgIC8qIG5lZWRlZCB0
byBrZWVwIGdjYyBmcm9tIHdoaW5pbmcuICovDQoJfQ0KCXJ1cC0+cnVfdXRp
bWUudHZfc2VjID0gdXNlciAvIGh6Ow0KCXJ1cC0+cnVfdXRpbWUudHZfdXNl
YyA9ICh1c2VyICUgaHopICogKDEwMDAwMDAgLyBoeik7DQoJcnVwLT5ydV9z
dGltZS50dl9zZWMgPSBzeXMgLyBoejsNCglydXAtPnJ1X3N0aW1lLnR2X3Vz
ZWMgPSAoc3lzICUgaHopICogKDEwMDAwMDAgLyBoeik7DQoJcmV0dXJuICgw
KTsNCn0NCg0Kc3RhdGljIGlubGluZSB2b2lkIHJ1c2FnZVplcm8gKHN0cnVj
dCBydXNhZ2UgKnJ1KSB7DQoJbWVtc2V0IChydSwgMCwgc2l6ZW9mICgqcnUp
KTsNCn0NCg0Kc3RhdGljIHZvaWQgcnVzYWdlUGx1c01heCAoc3RydWN0IHJ1
c2FnZSAqcnUxLA0KCQkJICAgICAgc3RydWN0IHJ1c2FnZSAqcnUyLA0KCQkJ
ICAgICAgc3RydWN0IHJ1c2FnZSAqcnUpIHsNCgljb25zdCBpbnQJbWlsbGlv
biA9IDEwMDAwMDA7DQoJdGltZV90CQlzZWMsDQoJCQl1c2VjOw0KDQoJc2Vj
ID0gcnUxLT5ydV91dGltZS50dl9zZWMgKyBydTItPnJ1X3V0aW1lLnR2X3Nl
YzsNCgl1c2VjID0gcnUxLT5ydV91dGltZS50dl91c2VjICsgcnUyLT5ydV91
dGltZS50dl91c2VjOw0KCXNlYyArPSAodXNlYyAvIG1pbGxpb24pOw0KCXVz
ZWMgJT0gbWlsbGlvbjsNCglydS0+cnVfdXRpbWUudHZfc2VjID0gc2VjOw0K
CXJ1LT5ydV91dGltZS50dl91c2VjID0gdXNlYzsNCg0KCXNlYyA9IHJ1MS0+
cnVfc3RpbWUudHZfc2VjICsgcnUyLT5ydV9zdGltZS50dl9zZWM7DQoJdXNl
YyA9IHJ1MS0+cnVfc3RpbWUudHZfdXNlYyArIHJ1Mi0+cnVfc3RpbWUudHZf
dXNlYzsNCglzZWMgKz0gKHVzZWMgLyBtaWxsaW9uKTsNCgl1c2VjICU9IG1p
bGxpb247DQoJcnUtPnJ1X3N0aW1lLnR2X3NlYyA9IHNlYzsNCglydS0+cnVf
c3RpbWUudHZfdXNlYyA9IHVzZWM7DQoNCglydS0+cnVfbWF4cnNzID0gbWF4
KHJ1MS0+cnVfbWF4cnNzLCBydTItPnJ1X21heHJzcyk7DQoJcnUtPnJ1X2l4
cnNzID0gbWF4KHJ1MS0+cnVfaXhyc3MsIHJ1Mi0+cnVfaXhyc3MpOw0KCXJ1
LT5ydV9pZHJzcyA9IG1heChydTEtPnJ1X2lkcnNzLCBydTItPnJ1X2lkcnNz
KTsNCglydS0+cnVfaXNyc3MgPSBtYXgocnUxLT5ydV9pc3JzcywgcnUyLT5y
dV9pc3Jzcyk7DQoJcnUtPnJ1X21pbmZsdCA9IHJ1MS0+cnVfbWluZmx0ICsg
cnUyLT5ydV9taW5mbHQ7DQoJcnUtPnJ1X21hamZsdCA9IHJ1MS0+cnVfbWFq
Zmx0ICsgcnUyLT5ydV9tYWpmbHQ7DQoJcnUtPnJ1X25zd2FwID0gcnUxLT5y
dV9uc3dhcCArIHJ1Mi0+cnVfbnN3YXA7DQoJcnUtPnJ1X2luYmxvY2sgPSBy
dTEtPnJ1X2luYmxvY2sgKyBydTItPnJ1X2luYmxvY2s7DQoJcnUtPnJ1X291
YmxvY2sgPSBydTEtPnJ1X291YmxvY2sgKyBydTItPnJ1X291YmxvY2s7DQoJ
cnUtPnJ1X21zZ3NuZCA9IHJ1MS0+cnVfbXNnc25kICsgcnUyLT5ydV9tc2dz
bmQ7DQoJcnUtPnJ1X21zZ3JjdiA9IHJ1MS0+cnVfbXNncmN2ICsgcnUyLT5y
dV9tc2dyY3Y7DQoJcnUtPnJ1X25zaWduYWxzID0gcnUxLT5ydV9uc2lnbmFs
cyArIHJ1Mi0+cnVfbnNpZ25hbHM7DQoJcnUtPnJ1X252Y3N3ID0gcnUxLT5y
dV9udmNzdyArIHJ1Mi0+cnVfbnZjc3c7DQoJcnUtPnJ1X25pdmNzdyA9IHJ1
MS0+cnVfbml2Y3N3ICsgcnUyLT5ydV9uaXZjc3c7DQp9DQoNCnN0YXRpYyB2
b2lkIHJ1c2FnZU1pbnVzTWF4IChzdHJ1Y3QgcnVzYWdlICpydTEsDQoJCQkJ
c3RydWN0IHJ1c2FnZSAqcnUyLA0KCQkJCXN0cnVjdCBydXNhZ2UgKnJ1KSB7
DQoJY29uc3QgaW50CW1pbGxpb24gPSAxMDAwMDAwOw0KCXRpbWVfdAkJc2Vj
LA0KCQkJdXNlYzsNCg0KCXNlYyA9IChydTEtPnJ1X3V0aW1lLnR2X3NlYyAt
IHJ1Mi0+cnVfdXRpbWUudHZfc2VjKSAtIDE7DQoJdXNlYyA9IHJ1MS0+cnVf
dXRpbWUudHZfdXNlYyArIG1pbGxpb24gLSBydTItPnJ1X3V0aW1lLnR2X3Vz
ZWM7DQoJc2VjICs9ICh1c2VjIC8gbWlsbGlvbik7DQoJdXNlYyAlPSBtaWxs
aW9uOw0KCXJ1LT5ydV91dGltZS50dl9zZWMgPSBzZWM7DQoJcnUtPnJ1X3V0
aW1lLnR2X3VzZWMgPSB1c2VjOw0KDQoJc2VjID0gKHJ1MS0+cnVfc3RpbWUu
dHZfc2VjIC0gcnUyLT5ydV9zdGltZS50dl9zZWMpIC0gMTsNCgl1c2VjID0g
cnUxLT5ydV9zdGltZS50dl91c2VjICsgbWlsbGlvbiAtIHJ1Mi0+cnVfc3Rp
bWUudHZfdXNlYzsNCglzZWMgKz0gKHVzZWMgLyBtaWxsaW9uKTsNCgl1c2Vj
ICU9IG1pbGxpb247DQoJcnUtPnJ1X3N0aW1lLnR2X3NlYyA9IHNlYzsNCgly
dS0+cnVfc3RpbWUudHZfdXNlYyA9IHVzZWM7DQoNCglydS0+cnVfbWF4cnNz
ID0gbWF4KHJ1MS0+cnVfbWF4cnNzLCBydTItPnJ1X21heHJzcyk7DQoJcnUt
PnJ1X2l4cnNzID0gbWF4KHJ1MS0+cnVfaXhyc3MsIHJ1Mi0+cnVfaXhyc3Mp
Ow0KCXJ1LT5ydV9pZHJzcyA9IG1heChydTEtPnJ1X2lkcnNzLCBydTItPnJ1
X2lkcnNzKTsNCglydS0+cnVfaXNyc3MgPSBtYXgocnUxLT5ydV9pc3Jzcywg
cnUyLT5ydV9pc3Jzcyk7DQoJcnUtPnJ1X21pbmZsdCA9IHJ1MS0+cnVfbWlu
Zmx0IC0gcnUyLT5ydV9taW5mbHQ7DQoJcnUtPnJ1X21hamZsdCA9IHJ1MS0+
cnVfbWFqZmx0IC0gcnUyLT5ydV9tYWpmbHQ7DQoJcnUtPnJ1X25zd2FwID0g
cnUxLT5ydV9uc3dhcCAtIHJ1Mi0+cnVfbnN3YXA7DQoJcnUtPnJ1X2luYmxv
Y2sgPSBydTEtPnJ1X2luYmxvY2sgLSBydTItPnJ1X2luYmxvY2s7DQoJcnUt
PnJ1X291YmxvY2sgPSBydTEtPnJ1X291YmxvY2sgLSBydTItPnJ1X291Ymxv
Y2s7DQoJcnUtPnJ1X21zZ3NuZCA9IHJ1MS0+cnVfbXNnc25kIC0gcnUyLT5y
dV9tc2dzbmQ7DQoJcnUtPnJ1X21zZ3JjdiA9IHJ1MS0+cnVfbXNncmN2IC0g
cnUyLT5ydV9tc2dyY3Y7DQoJcnUtPnJ1X25zaWduYWxzID0gcnUxLT5ydV9u
c2lnbmFscyAtIHJ1Mi0+cnVfbnNpZ25hbHM7DQoJcnUtPnJ1X252Y3N3ID0g
cnUxLT5ydV9udmNzdyAtIHJ1Mi0+cnVfbnZjc3c7DQoJcnUtPnJ1X25pdmNz
dyA9IHJ1MS0+cnVfbml2Y3N3IC0gcnUyLT5ydV9uaXZjc3c7DQp9DQoNCnN0
YXRpYyB1aW50IHJ1c2FnZVRpbWUgKHN0cnVjdCBydXNhZ2UgKnJ1KSB7DQoJ
dWludAlyZXN1bHQ7DQoNCglyZXN1bHQgPSAwOw0KCXJlc3VsdCArPSAxMDAw
ICogcnUtPnJ1X3V0aW1lLnR2X3NlYzsNCglyZXN1bHQgKz0gMTAwMCAqIHJ1
LT5ydV9zdGltZS50dl9zZWM7DQoJcmVzdWx0ICs9IHJ1LT5ydV91dGltZS50
dl91c2VjIC8gMTAwMDsNCglyZXN1bHQgKz0gcnUtPnJ1X3N0aW1lLnR2X3Vz
ZWMgLyAxMDAwOw0KCXJldHVybiByZXN1bHQ7DQp9DQoNCi8qIFJldHVybiB0
aW1lIGFzIG51bWJlciBvZiBtaWxsaXNlY29uZHMuICovDQpzdGF0aWMgdWlu
dCBjdXJyZW50VGltZSAoKSB7DQoJc3RydWN0IHJ1c2FnZQlydTsNCg0KCWZp
eGVkR2V0cnVzYWdlIChSVVNBR0VfU0VMRiwgJnJ1KTsNCglyZXR1cm4gcnVz
YWdlVGltZSAoJnJ1KTsNCn0NCg0Kc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0
VGltaW5nIChzdHJ1Y3QgcnVzYWdlICpydV9zdGFydCkgew0KCWZpeGVkR2V0
cnVzYWdlIChSVVNBR0VfU0VMRiwgcnVfc3RhcnQpOw0KfQ0KDQpzdGF0aWMg
dWludCBzdG9wVGltaW5nIChzdHJ1Y3QgcnVzYWdlICpydV9zdGFydCwgc3Ry
dWN0IHJ1c2FnZSAqcnVfZ2MpIHsNCglzdHJ1Y3QgcnVzYWdlIHJ1X2Zpbmlz
aCwgcnVfdG90YWw7DQoNCglmaXhlZEdldHJ1c2FnZSAoUlVTQUdFX1NFTEYs
ICZydV9maW5pc2gpOw0KCXJ1c2FnZU1pbnVzTWF4ICgmcnVfZmluaXNoLCBy
dV9zdGFydCwgJnJ1X3RvdGFsKTsNCglydXNhZ2VQbHVzTWF4IChydV9nYywg
JnJ1X3RvdGFsLCBydV9nYyk7DQoJcmV0dXJuIHJ1c2FnZVRpbWUgKCZydV90
b3RhbCk7DQp9DQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEdDX2Rpc3BsYXkgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g
Ki8NCg0Kdm9pZCBHQ19kaXNwbGF5IChHQ19zdGF0ZSBzLCBGSUxFICpzdHJl
YW0pIHsNCglmcHJpbnRmIChzdHJlYW0sICJHQyBzdGF0ZVxuXHRjYXJkTWFw
ID0gMHglMDh4XG5cdG9sZEdlbiA9IDB4JTA4eFxuXHRvbGRHZW5TaXplID0g
JXNcblx0b2xkR2VuICsgb2xkR2VuU2l6ZSA9IDB4JTA4eFxuXHRudXJzZXJ5
ID0gMHglMDh4XG5cdGZyb250aWVyID0gMHglMDh4XG5cdGZyb250aWVyIC0g
bnVyc2VyeSA9ICV1XG5cdGxpbWl0UGx1c1Nsb3AgLSBmcm9udGllciA9ICVk
XG4iLA0KCQkJKHVpbnQpIHMtPmNhcmRNYXAsDQogICAJCQkodWludCkgcy0+
aGVhcC5zdGFydCwNCgkJCXVpbnRUb0NvbW1hU3RyaW5nIChzLT5vbGRHZW5T
aXplKSwNCgkJCSh1aW50KSBzLT5oZWFwLnN0YXJ0ICsgcy0+b2xkR2VuU2l6
ZSwNCgkJCSh1aW50KSBzLT5udXJzZXJ5LCANCgkJCSh1aW50KSBzLT5mcm9u
dGllciwNCgkJCXMtPmZyb250aWVyIC0gcy0+bnVyc2VyeSwNCgkJCXMtPmxp
bWl0UGx1c1Nsb3AgLSBzLT5mcm9udGllcik7DQoJZnByaW50ZiAoc3RyZWFt
LCAiXHRjYW5IYW5kbGUgPSAlZFxuXHRzaWduYWxzSXNQZW5kaW5nID0gJWRc
biIsIHMtPmNhbkhhbmRsZSwgcy0+c2lnbmFsSXNQZW5kaW5nKTsNCglmcHJp
bnRmIChzdGRlcnIsICJcdGN1cnJlbnRUaHJlYWQgPSAweCUwOHhcbiIsICh1
aW50KSBzLT5jdXJyZW50VGhyZWFkKTsNCglmcHJpbnRmIChzdHJlYW0sICJc
dHN0YWNrQm90dG9tID0gMHglMDh4XG5cdHN0YWNrVG9wIC0gc3RhY2tCb3R0
b20gPSAldVxuXHRzdGFja0xpbWl0IC0gc3RhY2tUb3AgPSAldVxuIiwNCgkJ
CSh1aW50KXMtPnN0YWNrQm90dG9tLA0KCQkJcy0+c3RhY2tUb3AgLSBzLT5z
dGFja0JvdHRvbSwNCgkJCShzLT5zdGFja0xpbWl0IC0gcy0+c3RhY2tUb3Ap
KTsNCglmcHJpbnRmIChzdHJlYW0sICJcdGV4blN0YWNrID0gJXVcblx0Ynl0
ZXNOZWVkZWQgPSAldVxuXHRyZXNlcnZlZCA9ICV1XG5cdHVzZWQgPSAldVxu
IiwNCgkJCXMtPmN1cnJlbnRUaHJlYWQtPmV4blN0YWNrLA0KCQkJcy0+Y3Vy
cmVudFRocmVhZC0+Ynl0ZXNOZWVkZWQsDQoJCQlzLT5jdXJyZW50VGhyZWFk
LT5zdGFjay0+cmVzZXJ2ZWQsDQoJCQlzLT5jdXJyZW50VGhyZWFkLT5zdGFj
ay0+dXNlZCk7DQoJaWYgKERFQlVHX0dFTkVSQVRJT05BTCBhbmQgREVCVUdf
REVUQUlMRUQpIHsNCgkJaW50IGk7DQoNCgkJZnByaW50ZiAoc3RkZXJyLCAi
Y3Jvc3NNYXAgdHJ1ZXNcbiIpOw0KCQlmb3IgKGkgPSAwOyBpIDwgcy0+Y3Jv
c3NNYXBTaXplOyArK2kpDQoJCQl1bmxlc3MgKENST1NTX01BUF9FTVBUWSA9
PSBzLT5jcm9zc01hcFtpXSkNCgkJCQlmcHJpbnRmIChzdGRlcnIsICJcdCV1
XG4iLCBpKTsNCgkJZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsNCgl9CQkNCn0N
Cg0Kc3RhdGljIGlubGluZSB1aW50IGNhcmROdW1Ub1NpemUgKEdDX3N0YXRl
IHMsIHVpbnQgbikgew0KCXJldHVybiBuIDw8IHMtPmNhcmRTaXplTG9nMjsN
Cn0NCg0Kc3RhdGljIGlubGluZSB1aW50IGRpdkNhcmRTaXplIChHQ19zdGF0
ZSBzLCB1aW50IG4pIHsNCglyZXR1cm4gbiA+PiBzLT5jYXJkU2l6ZUxvZzI7
DQp9DQoNCnN0YXRpYyBpbmxpbmUgcG9pbnRlciBjYXJkTWFwQWRkciAoR0Nf
c3RhdGUgcywgcG9pbnRlciBwKSB7DQoJcG9pbnRlciByZXM7DQoNCglyZXMg
PSAmcy0+Y2FyZE1hcEZvck11dGF0b3IgW2RpdkNhcmRTaXplIChzLCAodWlu
dClwKV07DQoJaWYgKERFQlVHX0NBUkRfTUFSS0lORykNCgkJZnByaW50ZiAo
c3RkZXJyLCAiMHglMDh4ID0gY2FyZE1hcEFkZHIgKDB4JTA4eClcbiIsDQoJ
CQkJKHVpbnQpcmVzLCAodWludClwKTsNCglyZXR1cm4gcmVzOw0KfQ0KDQpz
dGF0aWMgaW5saW5lIGJvb2wgY2FyZElzTWFya2VkIChHQ19zdGF0ZSBzLCBw
b2ludGVyIHApIHsNCglyZXR1cm4gKmNhcmRNYXBBZGRyIChzLCBwKTsNCn0N
Cg0Kc3RhdGljIGlubGluZSB2b2lkIG1hcmtDYXJkIChHQ19zdGF0ZSBzLCBw
b2ludGVyIHApIHsNCglpZiAoREVCVUdfQ0FSRF9NQVJLSU5HKQ0KCQlmcHJp
bnRmIChzdGRlcnIsICJtYXJrQ2FyZCAoMHglMDh4KVxuIiwgKHVpbnQpcCk7
DQoJaWYgKHMtPm11dGF0b3JNYXJrc0NhcmRzKQ0KCQkqY2FyZE1hcEFkZHIg
KHMsIHApID0gJ1wwMDEnOw0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
ICovDQovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrcyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tICovDQoNCi8qIHN0YWNrU2xvcCByZXR1cm5zIHRoZSBhbW91
bnQgb2YgInNsb3AiIHNwYWNlIG5lZWRlZCBiZXR3ZWVuIHRoZSB0b3Agb2Yg
DQogKiB0aGUgc3RhY2sgYW5kIHRoZSBlbmQgb2YgdGhlIHN0YWNrIHNwYWNl
Lg0KICovDQpzdGF0aWMgaW5saW5lIHVpbnQgc3RhY2tTbG9wIChHQ19zdGF0
ZSBzKSB7DQoJcmV0dXJuIDIgKiBzLT5tYXhGcmFtZVNpemU7DQp9DQoNCnN0
YXRpYyBpbmxpbmUgdWludCBpbml0aWFsU3RhY2tTaXplIChHQ19zdGF0ZSBz
KSB7DQoJcmV0dXJuIHN0YWNrU2xvcCAocyk7DQp9DQoNCnN0YXRpYyBpbmxp
bmUgdWludCBzdGFja0J5dGVzIChHQ19zdGF0ZSBzLCB1aW50IHNpemUpIHsN
Cgl1aW50IHJlczsNCg0KCXJlcyA9IGFsaWduIChTVEFDS19IRUFERVJfU0la
RSArIHNpemVvZiAoc3RydWN0IEdDX3N0YWNrKSArIHNpemUsDQoJCQlzLT5h
bGlnbm1lbnQpOw0KCWlmIChERUJVR19TVEFDS1MpDQoJCWZwcmludGYgKHN0
ZGVyciwgIiVzID0gc3RhY2tCeXRlcyAoJXMpXG4iLA0KCQkJCXVpbnRUb0Nv
bW1hU3RyaW5nIChyZXMpLA0KCQkJCXVpbnRUb0NvbW1hU3RyaW5nIChzaXpl
KSk7DQoJcmV0dXJuIHJlczsNCn0NCg0Kc3RhdGljIGlubGluZSBwb2ludGVy
IHN0YWNrQm90dG9tIChHQ19zdGF0ZSBzLCBHQ19zdGFjayBzdGFjaykgew0K
CXBvaW50ZXIgcmVzOw0KDQoJcmVzID0gKChwb2ludGVyKXN0YWNrKSArIHNp
emVvZiAoc3RydWN0IEdDX3N0YWNrKTsNCglhc3NlcnQgKGlzQWxpZ25lZCAo
KHVpbnQpcmVzLCBzLT5hbGlnbm1lbnQpKTsNCglyZXR1cm4gcmVzOw0KfQ0K
DQovKiBQb2ludGVyIHRvIHRoZSB0b3Btb3N0IHdvcmQgaW4gdXNlIG9uIHRo
ZSBzdGFjay4gKi8NCnN0YXRpYyBpbmxpbmUgcG9pbnRlciBzdGFja1RvcCAo
R0Nfc3RhdGUgcywgR0Nfc3RhY2sgc3RhY2spIHsNCglyZXR1cm4gc3RhY2tC
b3R0b20gKHMsIHN0YWNrKSArIHN0YWNrLT51c2VkOw0KfQ0KDQovKiBQb2lu
dGVyIHRvIHRoZSBlbmQgb2Ygc3RhY2suICovDQpzdGF0aWMgaW5saW5lIHBv
aW50ZXIgZW5kT2ZTdGFjayAoR0Nfc3RhdGUgcywgR0Nfc3RhY2sgc3RhY2sp
IHsNCglyZXR1cm4gc3RhY2tCb3R0b20gKHMsIHN0YWNrKSArIHN0YWNrLT5y
ZXNlcnZlZDsNCn0NCg0KLyogVGhlIG1heGltdW0gdmFsdWUgc3RhY2tUb3Ag
bWF5IHRha2Ugb24uICovDQpzdGF0aWMgaW5saW5lIHBvaW50ZXIgc3RhY2tM
aW1pdCAoR0Nfc3RhdGUgcywgR0Nfc3RhY2sgc3RhY2spIHsNCglyZXR1cm4g
ZW5kT2ZTdGFjayAocywgc3RhY2spIC0gc3RhY2tTbG9wIChzKTsNCn0NCg0K
c3RhdGljIGlubGluZSBib29sIHN0YWNrSXNFbXB0eSAoR0Nfc3RhY2sgc3Rh
Y2spIHsNCglyZXR1cm4gMCA9PSBzdGFjay0+dXNlZDsNCn0NCg0Kc3RhdGlj
IGlubGluZSB1aW50IGdldEZyYW1lSW5kZXggKEdDX3N0YXRlIHMsIHdvcmQg
cmV0dXJuQWRkcmVzcykgew0KCXVpbnQgcmVzOw0KDQoJaWYgKHMtPm5hdGl2
ZSkgew0KCQlpZiAoREVCVUdfUFJPRklMRSkNCgkJCWZwcmludGYgKHN0ZGVy
ciwgImdldEZyYW1lSW5kZXggKDB4JTA4eCkgPSAiLCANCgkJCQkJcmV0dXJu
QWRkcmVzcyk7DQoJCXJlcyA9ICooKHVpbnQqKShyZXR1cm5BZGRyZXNzIC0g
V09SRF9TSVpFKSk7DQoJfSBlbHNlIHsNCgkJaWYgKERFQlVHX1BST0ZJTEUp
DQoJCQlmcHJpbnRmIChzdGRlcnIsICJnZXRGcmFtZUluZGV4ICgldSkgPSAi
LCByZXR1cm5BZGRyZXNzKTsNCgkJcmVzID0gKHVpbnQpcmV0dXJuQWRkcmVz
czsNCgl9DQoJaWYgKERFQlVHX1BST0ZJTEUpDQoJCWZwcmludGYgKHN0ZGVy
ciwgIiV1XG4iLCByZXMpOw0KCXJldHVybiByZXM7DQp9DQoNCnN0YXRpYyBp
bmxpbmUgdWludCB0b3BGcmFtZUluZGV4IChHQ19zdGF0ZSBzKSB7DQoJdWlu
dCByZXM7DQoNCglhc3NlcnQgKHMtPnN0YWNrVG9wID4gcy0+c3RhY2tCb3R0
b20pOw0KCXJlcyA9IGdldEZyYW1lSW5kZXggKHMsICood29yZCopKHMtPnN0
YWNrVG9wIC0gV09SRF9TSVpFKSk7DQoJaWYgKERFQlVHX1BST0ZJTEUpDQoJ
CWZwcmludGYgKHN0ZGVyciwgInRvcEZyYW1lSW5kZXggPSAldVxuIiwgcmVz
KTsNCglyZXR1cm4gcmVzOw0KfQ0KDQpzdGF0aWMgaW5saW5lIHVpbnQgdG9w
RnJhbWVTb3VyY2VTZXFJbmRleCAoR0Nfc3RhdGUgcykgew0KCXJldHVybiBz
LT5mcmFtZVNvdXJjZXNbdG9wRnJhbWVJbmRleCAocyldOw0KfQ0KDQpzdGF0
aWMgaW5saW5lIEdDX2ZyYW1lTGF5b3V0ICogZ2V0RnJhbWVMYXlvdXQgKEdD
X3N0YXRlIHMsIHdvcmQgcmV0dXJuQWRkcmVzcykgew0KCUdDX2ZyYW1lTGF5
b3V0ICpsYXlvdXQ7DQoJdWludCBpbmRleDsNCg0KCWluZGV4ID0gZ2V0RnJh
bWVJbmRleCAocywgcmV0dXJuQWRkcmVzcyk7DQoJaWYgKERFQlVHX0RFVEFJ
TEVEKQ0KCQlmcHJpbnRmIChzdGRlcnIsICJyZXR1cm5BZGRyZXNzID0gMHgl
MDh4ICBpbmRleCA9ICVkICBmcmFtZUxheW91dHNTaXplID0gJWRcbiIsDQoJ
CQkJcmV0dXJuQWRkcmVzcywgaW5kZXgsIHMtPmZyYW1lTGF5b3V0c1NpemUp
Ow0KCWFzc2VydCAoMCA8PSBpbmRleCBhbmQgaW5kZXggPCBzLT5mcmFtZUxh
eW91dHNTaXplKTsNCglsYXlvdXQgPSAmKHMtPmZyYW1lTGF5b3V0c1tpbmRl
eF0pOw0KCWFzc2VydCAobGF5b3V0LT5udW1CeXRlcyA+IDApOw0KCXJldHVy
biBsYXlvdXQ7DQp9DQoNCnN0YXRpYyBpbmxpbmUgdWludCB0b3BGcmFtZVNp
emUgKEdDX3N0YXRlIHMsIEdDX3N0YWNrIHN0YWNrKSB7DQoJR0NfZnJhbWVM
YXlvdXQgKmxheW91dDsNCgkNCglhc3NlcnQgKG5vdCAoc3RhY2tJc0VtcHR5
IChzdGFjaykpKTsNCglsYXlvdXQgPSBnZXRGcmFtZUxheW91dCAocywgKih3
b3JkKikoc3RhY2tUb3AgKHMsIHN0YWNrKSAtIFdPUkRfU0laRSkpOw0KCXJl
dHVybiBsYXlvdXQtPm51bUJ5dGVzOw0KfQ0KDQpzdGF0aWMgaW5saW5lIHVp
bnQgc3RhY2tOZWVkc1Jlc2VydmVkIChHQ19zdGF0ZSBzLCBHQ19zdGFjayBz
dGFjaykgew0KCXJldHVybiBzdGFjay0+dXNlZCArIHN0YWNrU2xvcCAocykg
LSB0b3BGcmFtZVNpemUgKHMsIHN0YWNrKTsNCn0NCg0Kc3RhdGljIGlubGlu
ZSBib29sIHN0YWNrVG9wSXNPayAoR0Nfc3RhdGUgcywgR0Nfc3RhY2sgc3Rh
Y2spIHsNCglyZXR1cm4gc3RhY2tUb3AgKHMsIHN0YWNrKSA8PSANCgkJc3Rh
Y2tMaW1pdCAocywgc3RhY2spICsgcy0+bWF4RnJhbWVTaXplICsNCgkJKHN0
YWNrSXNFbXB0eShzdGFjaykgPyAwIDogdG9wRnJhbWVTaXplIChzLCBzdGFj
aykpOw0KfQ0KDQojaWYgQVNTRVJUDQpzdGF0aWMgYm9vbCBoYXNCeXRlc0Zy
ZWUgKEdDX3N0YXRlIHMsIFczMiBvbGRHZW4sIFczMiBudXJzZXJ5KSB7DQoJ
Ym9vbCByZXM7DQoNCglyZXMgPSBzLT5vbGRHZW5TaXplICsgb2xkR2VuIA0K
CQkJKyAocy0+Y2FuTWlub3IgPyAyIDogMSkgDQoJCQkJKiAocy0+bGltaXRQ
bHVzU2xvcCAtIHMtPm51cnNlcnkpDQoJCQk8PSBzLT5oZWFwLnNpemUNCgkJ
YW5kIG51cnNlcnkgPD0gcy0+bGltaXRQbHVzU2xvcCAtIHMtPmZyb250aWVy
Ow0KCWlmIChERUJVR19ERVRBSUxFRCkNCgkJZnByaW50ZiAoc3RkZXJyLCAi
JXMgPSBoYXNCeXRlc0ZyZWUgKCVzLCAlcylcbiIsDQoJCQkJYm9vbFRvU3Ry
aW5nIChyZXMpLA0KCQkJCXVpbnRUb0NvbW1hU3RyaW5nIChvbGRHZW4pLA0K
CQkJCXVpbnRUb0NvbW1hU3RyaW5nIChudXJzZXJ5KSk7DQoJcmV0dXJuIHJl
czsNCn0NCiNlbmRpZg0KDQovKiBieXRlc1JlcXVlc3RlZCBpbmNsdWRlcyB0
aGUgaGVhZGVyLiAqLw0Kc3RhdGljIHBvaW50ZXIgb2JqZWN0IChHQ19zdGF0
ZSBzLCB1aW50IGhlYWRlciwgVzMyIGJ5dGVzUmVxdWVzdGVkLA0KCQkJCWJv
b2wgYWxsb2NJbk9sZEdlbiwNCgkJCQlCb29sIGhhc0RvdWJsZSkgew0KCXBv
aW50ZXIgZnJvbnRpZXI7DQoJcG9pbnRlciByZXN1bHQ7DQoNCglpZiAoREVC
VUcpDQoJCWZwcmludGYgKHN0ZGVyciwgIm9iamVjdCAoMHglMDh4LCAldSwg
JXMpXG4iLA0KCQkJCWhlYWRlciwgDQoJCQkJKHVpbnQpYnl0ZXNSZXF1ZXN0
ZWQsDQoJCQkJYm9vbFRvU3RyaW5nIChhbGxvY0luT2xkR2VuKSk7DQoJYXNz
ZXJ0IChpc0FsaWduZWQgKGJ5dGVzUmVxdWVzdGVkLCBzLT5hbGlnbm1lbnQp
KTsNCglhc3NlcnQgKGFsbG9jSW5PbGRHZW4NCgkJCT8gaGFzQnl0ZXNGcmVl
IChzLCBieXRlc1JlcXVlc3RlZCwgMCkNCgkJCTogaGFzQnl0ZXNGcmVlIChz
LCAwLCBieXRlc1JlcXVlc3RlZCkpOw0KCWlmIChhbGxvY0luT2xkR2VuKSB7
DQoJCWZyb250aWVyID0gcy0+aGVhcC5zdGFydCArIHMtPm9sZEdlblNpemU7
DQoJCXMtPm9sZEdlblNpemUgKz0gYnl0ZXNSZXF1ZXN0ZWQ7DQoJCXMtPmJ5
dGVzQWxsb2NhdGVkICs9IGJ5dGVzUmVxdWVzdGVkOw0KCX0gZWxzZSB7DQoJ
CWlmIChERUJVR19ERVRBSUxFRCkNCgkJCWZwcmludGYgKHN0ZGVyciwgImZy
b250aWVyIGNoYW5nZWQgZnJvbSAweCUwOHggdG8gMHglMDh4XG4iLA0KCQkJ
CQkodWludClzLT5mcm9udGllciwgDQoJCQkJCSh1aW50KShzLT5mcm9udGll
ciArIGJ5dGVzUmVxdWVzdGVkKSk7DQoJCWZyb250aWVyID0gcy0+ZnJvbnRp
ZXI7DQoJCXMtPmZyb250aWVyICs9IGJ5dGVzUmVxdWVzdGVkOw0KCX0NCglH
Q19wcm9maWxlQWxsb2NJbmMgKHMsIGJ5dGVzUmVxdWVzdGVkKTsNCgkqKHVp
bnQqKShmcm9udGllcikgPSBoZWFkZXI7DQoJcmVzdWx0ID0gZnJvbnRpZXIg
KyBHQ19OT1JNQUxfSEVBREVSX1NJWkU7DQoJcmV0dXJuIHJlc3VsdDsNCn0N
Cg0Kc3RhdGljIEdDX3N0YWNrIG5ld1N0YWNrIChHQ19zdGF0ZSBzLCB1aW50
IHJlc2VydmVkLCBib29sIGFsbG9jSW5PbGRHZW4pIHsNCglHQ19zdGFjayBz
dGFjazsNCg0KCXJlc2VydmVkID0gc3RhY2tSZXNlcnZlZCAocywgcmVzZXJ2
ZWQpOw0KCWlmIChyZXNlcnZlZCA+IHMtPm1heFN0YWNrU2l6ZVNlZW4pDQoJ
CXMtPm1heFN0YWNrU2l6ZVNlZW4gPSByZXNlcnZlZDsNCglzdGFjayA9IChH
Q19zdGFjaykgb2JqZWN0IChzLCBTVEFDS19IRUFERVIsIHN0YWNrQnl0ZXMg
KHMsIHJlc2VydmVkKSwNCgkJCQkJYWxsb2NJbk9sZEdlbiwgVFJVRSk7DQoJ
c3RhY2stPnJlc2VydmVkID0gcmVzZXJ2ZWQ7DQoJc3RhY2stPnVzZWQgPSAw
Ow0KCWlmIChERUJVR19TVEFDS1MpDQoJCWZwcmludGYgKHN0ZGVyciwgIjB4
JXggPSBuZXdTdGFjayAoJXUpXG4iLCAodWludClzdGFjaywgDQoJCQkJcmVz
ZXJ2ZWQpOw0KCXJldHVybiBzdGFjazsNCn0NCg0Kc3RhdGljIHZvaWQgc2V0
U3RhY2sgKEdDX3N0YXRlIHMpIHsNCglHQ19zdGFjayBzdGFjazsNCg0KCXMt
PmV4blN0YWNrID0gcy0+Y3VycmVudFRocmVhZC0+ZXhuU3RhY2s7DQoJc3Rh
Y2sgPSBzLT5jdXJyZW50VGhyZWFkLT5zdGFjazsNCglzLT5zdGFja0JvdHRv
bSA9IHN0YWNrQm90dG9tIChzLCBzdGFjayk7DQoJcy0+c3RhY2tUb3AgPSBz
dGFja1RvcCAocywgc3RhY2spOw0KCXMtPnN0YWNrTGltaXQgPSBzdGFja0xp
bWl0IChzLCBzdGFjayk7DQoJLyogV2UgbXVzdCBjYXJkIG1hcmsgdGhlIHN0
YWNrIGJlY2F1c2UgaXQgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoZSBtdXRhdG9y
Lg0KCSAqLw0KCW1hcmtDYXJkIChzLCAocG9pbnRlcilzdGFjayk7DQp9DQoN
CnN0YXRpYyB2b2lkIHN0YWNrQ29weSAoR0Nfc3RhdGUgcywgR0Nfc3RhY2sg
ZnJvbSwgR0Nfc3RhY2sgdG8pIHsNCglhc3NlcnQgKGZyb20tPnVzZWQgPD0g
dG8tPnJlc2VydmVkKTsNCgl0by0+dXNlZCA9IGZyb20tPnVzZWQ7DQoJaWYg
KERFQlVHX1NUQUNLUykNCgkJZnByaW50ZiAoc3RkZXJyLCAic3RhY2tDb3B5
IGZyb20gMHglMDh4IHRvIDB4JTA4eCBvZiBsZW5ndGggJXVcbiIsDQoJCQkJ
KHVpbnQpIHN0YWNrQm90dG9tIChzLCBmcm9tKSwgDQoJCQkJKHVpbnQpIHN0
YWNrQm90dG9tIChzLCB0byksDQoJCQkJZnJvbS0+dXNlZCk7DQoJbWVtY3B5
IChzdGFja0JvdHRvbSAocywgdG8pLCBzdGFja0JvdHRvbSAocywgZnJvbSks
IGZyb20tPnVzZWQpOw0KfQ0KDQovKiBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBi
eSB0aGUgc3RhY2suICovDQpzdGF0aWMgaW5saW5lIHVpbnQgY3VycmVudFN0
YWNrVXNlZCAoR0Nfc3RhdGUgcykgew0KCXJldHVybiBzLT5zdGFja1RvcCAt
IHMtPnN0YWNrQm90dG9tOw0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
ICovDQovKiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaEdsb2Jh
bCAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tICovDQoNCnR5cGVkZWYgdm9pZCAoKkdDX3BvaW50ZXJGdW4p
IChHQ19zdGF0ZSBzLCBwb2ludGVyICpwKTsNCg0Kc3RhdGljIGlubGluZSB2
b2lkIG1heWJlQ2FsbCAoR0NfcG9pbnRlckZ1biBmLCBHQ19zdGF0ZSBzLCBw
b2ludGVyICpwcCkgew0KCWlmIChHQ19pc1BvaW50ZXIgKCpwcCkpDQoJCWYg
KHMsIHBwKTsNCn0NCg0KLyogQXBwbHkgZiB0byBlYWNoIGdsb2JhbCBwb2lu
dGVyIGludG8gdGhlIGhlYXAuICovDQpzdGF0aWMgaW5saW5lIHZvaWQgZm9y
ZWFjaEdsb2JhbCAoR0Nfc3RhdGUgcywgR0NfcG9pbnRlckZ1biBmKSB7DQoJ
aW50IGk7DQoNCiAJZm9yIChpID0gMDsgaSA8IHMtPmdsb2JhbHNTaXplOyAr
K2kpIHsNCgkJaWYgKERFQlVHX0RFVEFJTEVEKQ0KCQkJZnByaW50ZiAoc3Rk
ZXJyLCAiZm9yZWFjaEdsb2JhbCAldVxuIiwgaSk7DQoJCW1heWJlQ2FsbCAo
ZiwgcywgJnMtPmdsb2JhbHMgW2ldKTsNCgl9DQoJaWYgKERFQlVHX0RFVEFJ
TEVEKQ0KCQlmcHJpbnRmIChzdGRlcnIsICJmb3JlYWNoR2xvYmFsIHRocmVh
ZHNcbiIpOw0KCW1heWJlQ2FsbCAoZiwgcywgKHBvaW50ZXIqKSZzLT5jYWxs
RnJvbUNIYW5kbGVyKTsNCgltYXliZUNhbGwgKGYsIHMsIChwb2ludGVyKikm
cy0+Y3VycmVudFRocmVhZCk7DQoJbWF5YmVDYWxsIChmLCBzLCAocG9pbnRl
ciopJnMtPnNhdmVkVGhyZWFkKTsNCgltYXliZUNhbGwgKGYsIHMsIChwb2lu
dGVyKikmcy0+c2lnbmFsSGFuZGxlcik7DQp9DQoNCi8qIFRoZSBudW1iZXIg
b2YgYnl0ZXMgaW4gYW4gYXJyYXksIG5vdCBpbmNsdWRpbmcgdGhlIGhlYWRl
ci4gKi8NCnN0YXRpYyBpbmxpbmUgdWludCBhcnJheU51bUJ5dGVzIChHQ19z
dGF0ZSBzLA0KCQkJCQlwb2ludGVyIHAsIA0KCQkJCQl1aW50IG51bVBvaW50
ZXJzLA0KCQkJCQl1aW50IG51bU5vblBvaW50ZXJzKSB7DQoJdWludCBieXRl
c1BlckVsZW1lbnQ7DQoJdWludCBudW1FbGVtZW50czsNCgl1aW50IHJlc3Vs
dDsNCgkNCgludW1FbGVtZW50cyA9IEdDX2FycmF5TnVtRWxlbWVudHMgKHAp
Ow0KCWJ5dGVzUGVyRWxlbWVudCA9IG51bU5vblBvaW50ZXJzICsgdG9CeXRl
cyAobnVtUG9pbnRlcnMpOw0KCXJlc3VsdCA9IG51bUVsZW1lbnRzICogYnl0
ZXNQZXJFbGVtZW50Ow0KCS8qIEVtcHR5IGFycmF5cyBoYXZlIFBPSU5URVJf
U0laRSBieXRlcyBmb3IgdGhlIGZvcndhcmRpbmcgcG9pbnRlciAqLw0KCWlm
ICgwID09IHJlc3VsdCkgDQoJCXJlc3VsdCA9IFBPSU5URVJfU0laRTsNCgly
ZXR1cm4gYWxpZ24gKHJlc3VsdCArIEdDX0FSUkFZX0hFQURFUl9TSVpFLCBz
LT5hbGlnbm1lbnQpIA0KCQktIEdDX0FSUkFZX0hFQURFUl9TSVpFOw0KfQ0K
DQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICAgICAg
ICAgICAgICBmb3JlYWNoUG9pbnRlckluT2JqZWN0ICAgICAgICAgICAgICAg
ICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiBmb3Jl
YWNoUG9pbnRlckluT2JqZWN0IChzLCBwLGYsIHdzKSBhcHBsaWVzIGYgdG8g
ZWFjaCBwb2ludGVyIGluIHRoZSBvYmplY3QNCiAqIHBvaW50ZXIgdG8gYnkg
cC4NCiAqIFJldHVybnMgcG9pbnRlciB0byB0aGUgZW5kIG9mIG9iamVjdCwg
aS5lLiBqdXN0IHBhc3Qgb2JqZWN0Lg0KICoNCiAqIElmIHdzLCB0aGVuIHRo
ZSBvYmplY3QgcG9pbnRlciBpbiB3ZWFrIG9iamVjdHMgaXMgc2tpcHBlZC4N
CiAqLw0KDQpzdGF0aWMgaW5saW5lIHBvaW50ZXIgZm9yZWFjaFBvaW50ZXJJ
bk9iamVjdCAoR0Nfc3RhdGUgcywgcG9pbnRlciBwLA0KCQkJCQkJQm9vbCBz
a2lwV2Vha3MsDQoJCQkJCQlHQ19wb2ludGVyRnVuIGYpIHsNCgl3b3JkIGhl
YWRlcjsNCgl1aW50IG51bVBvaW50ZXJzOw0KCXVpbnQgbnVtTm9uUG9pbnRl
cnM7DQoJdWludCB0YWc7DQoNCgloZWFkZXIgPSBHQ19nZXRIZWFkZXIgKHAp
Ow0KCVNQTElUX0hFQURFUigpOw0KCWlmIChERUJVR19ERVRBSUxFRCkNCgkJ
ZnByaW50ZiAoc3RkZXJyLCAiZm9yZWFjaFBvaW50ZXJJbk9iamVjdCBwID0g
MHgleCAgaGVhZGVyID0gMHgleCAgdGFnID0gJXMgIG51bU5vblBvaW50ZXJz
ID0gJWQgIG51bVBvaW50ZXJzID0gJWRcbiIsIA0KCQkJKHVpbnQpcCwgaGVh
ZGVyLCB0YWdUb1N0cmluZyAodGFnKSwgDQoJCQludW1Ob25Qb2ludGVycywg
bnVtUG9pbnRlcnMpOw0KCWlmIChOT1JNQUxfVEFHID09IHRhZykgew0KCQlw
b2ludGVyIG1heDsNCg0KCQlwICs9IHRvQnl0ZXMgKG51bU5vblBvaW50ZXJz
KTsNCgkJbWF4ID0gcCArIHRvQnl0ZXMgKG51bVBvaW50ZXJzKTsNCgkJLyog
QXBwbHkgZiB0byBhbGwgaW50ZXJuYWwgcG9pbnRlcnMuICovDQoJCWZvciAo
IDsgcCA8IG1heDsgcCArPSBQT0lOVEVSX1NJWkUpIHsNCgkJCWlmIChERUJV
R19ERVRBSUxFRCkNCgkJCQlmcHJpbnRmIChzdGRlcnIsICJwID0gMHglMDh4
ICAqcCA9IDB4JTA4eFxuIiwNCgkJCQkJCSh1aW50KXAsICoodWludCopcCk7
DQoJCQltYXliZUNhbGwgKGYsIHMsIChwb2ludGVyKilwKTsNCgkJfQ0KCX0g
ZWxzZSBpZiAoV0VBS19UQUcgPT0gdGFnKSB7DQoJCWlmIChub3Qgc2tpcFdl
YWtzIGFuZCAxID09IG51bVBvaW50ZXJzKQ0KCQkJbWF5YmVDYWxsIChmLCBz
LCAocG9pbnRlciopJigoKEdDX3dlYWspcCktPm9iamVjdCkpOw0KCQlwICs9
IHNpemVvZiAoc3RydWN0IEdDX3dlYWspOw0KCX0gZWxzZSBpZiAoQVJSQVlf
VEFHID09IHRhZykgew0KCQl1aW50IG51bUJ5dGVzOw0KCQlwb2ludGVyIG1h
eDsNCg0KCQlhc3NlcnQgKEFSUkFZX1RBRyA9PSB0YWcpOw0KCQludW1CeXRl
cyA9IGFycmF5TnVtQnl0ZXMgKHMsIHAsIG51bVBvaW50ZXJzLCBudW1Ob25Q
b2ludGVycyk7DQoJCW1heCA9IHAgKyBudW1CeXRlczsNCgkJaWYgKG51bVBv
aW50ZXJzID09IDApIHsNCgkJCS8qIFRoZXJlIGFyZSBubyBwb2ludGVycywg
anVzdCB1cGRhdGUgcC4gKi8NCgkJCXAgPSBtYXg7DQoJCX0gZWxzZSBpZiAo
bnVtTm9uUG9pbnRlcnMgPT0gMCkgew0KCQkgIAkvKiBJdCdzIGFuIGFycmF5
IHdpdGggb25seSBwb2ludGVycy4gKi8NCgkJCWlmICgwID09IEdDX2FycmF5
TnVtRWxlbWVudHMgKHApKQ0KCQkJCS8qIFNraXAgdGhlIHNwYWNlIGZvciB0
aGUgZm9yd2FyZGluZyBwb2ludGVyLiAqLw0KCQkJCXAgPSBtYXg7DQoJCQll
bHNlDQoJCQkJZm9yICg7IHAgPCBtYXg7IHAgKz0gUE9JTlRFUl9TSVpFKQ0K
CQkJCQltYXliZUNhbGwgKGYsIHMsIChwb2ludGVyKilwKTsNCgkJfSBlbHNl
IHsNCgkJCXVpbnQgbnVtQnl0ZXNQb2ludGVyczsNCgkJCQ0KCQkJbnVtQnl0
ZXNQb2ludGVycyA9IHRvQnl0ZXMobnVtUG9pbnRlcnMpOw0KCQkJLyogRm9y
IGVhY2ggYXJyYXkgZWxlbWVudC4gKi8NCgkJCXdoaWxlIChwIDwgbWF4KSB7
DQoJCQkJcG9pbnRlciBtYXgyOw0KCQkJCQlwICs9IG51bU5vblBvaW50ZXJz
Ow0KCQkJCW1heDIgPSBwICsgbnVtQnl0ZXNQb2ludGVyczsNCgkJCQkvKiBG
b3IgZWFjaCBpbnRlcm5hbCBwb2ludGVyLiAqLw0KCQkJCWZvciAoIDsgcCA8
IG1heDI7IHAgKz0gUE9JTlRFUl9TSVpFKSANCgkJCQkJbWF5YmVDYWxsKGYs
IHMsIChwb2ludGVyKilwKTsNCgkJCX0NCgkJfQ0KCQlhc3NlcnQgKHAgPT0g
bWF4KTsNCgl9IGVsc2UgeyAvKiBzdGFjayAqLw0KCQlHQ19zdGFjayBzdGFj
azsNCgkJcG9pbnRlciB0b3AsIGJvdHRvbTsNCgkJaW50IGk7DQoJCXdvcmQg
cmV0dXJuQWRkcmVzczsNCgkJR0NfZnJhbWVMYXlvdXQgKmxheW91dDsNCgkJ
R0Nfb2Zmc2V0cyBmcmFtZU9mZnNldHM7DQoNCgkJYXNzZXJ0IChTVEFDS19U
QUcgPT0gdGFnKTsNCgkJc3RhY2sgPSAoR0Nfc3RhY2spcDsNCgkJYm90dG9t
ID0gc3RhY2tCb3R0b20gKHMsIHN0YWNrKTsNCgkJdG9wID0gc3RhY2tUb3Ag
KHMsIHN0YWNrKTsNCgkJYXNzZXJ0IChzdGFjay0+dXNlZCA8PSBzdGFjay0+
cmVzZXJ2ZWQpOw0KCQl3aGlsZSAodG9wID4gYm90dG9tKSB7DQoJCQkvKiBJ
bnZhcmlhbnQ6IHRvcCBwb2ludHMganVzdCBwYXN0IGEgInJldHVybiBhZGRy
ZXNzIi4gKi8NCgkJCXJldHVybkFkZHJlc3MgPSAqKHdvcmQqKSAodG9wIC0g
V09SRF9TSVpFKTsNCgkJCWlmIChERUJVRykgew0KCQkJCWZwcmludGYgKHN0
ZGVyciwgIiAgdG9wID0gJWQgIHJldHVybiBhZGRyZXNzID0gIiwNCgkJCQkJ
CXRvcCAtIGJvdHRvbSk7DQoJCQkJaWYgKHMtPm5hdGl2ZSkNCgkJCQkJZnBy
aW50ZiAoc3RkZXJyLCAiMHglMDh4LlxuIiwgDQoJCQkJCQkJcmV0dXJuQWRk
cmVzcyk7DQoJCQkJZWxzZQ0KCQkJCQlmcHJpbnRmIChzdGRlcnIsICIldVxu
IiwgcmV0dXJuQWRkcmVzcyk7DQoJCQl9DQoJCQlsYXlvdXQgPSBnZXRGcmFt
ZUxheW91dCAocywgcmV0dXJuQWRkcmVzcyk7IA0KCQkJZnJhbWVPZmZzZXRz
ID0gbGF5b3V0LT5vZmZzZXRzOw0KCQkJdG9wIC09IGxheW91dC0+bnVtQnl0
ZXM7DQoJCQlmb3IgKGkgPSAwIDsgaSA8IGZyYW1lT2Zmc2V0c1swXSA7ICsr
aSkgew0KCQkJCWlmIChERUJVRykNCgkJCQkJZnByaW50ZihzdGRlcnIsIA0K
CQkJCQkJIiAgICBvZmZzZXQgJXUgIGFkZHJlc3MgMHglMDh4XG4iLCANCgkJ
CQkJCWZyYW1lT2Zmc2V0c1tpICsgMV0sDQoJCQkJCQkodWludCkoKihwb2lu
dGVyKikodG9wICsgZnJhbWVPZmZzZXRzW2kgKyAxXSkpKTsNCgkJCQltYXli
ZUNhbGwoZiwgcywgDQoJCQkJCSAgKHBvaW50ZXIqKQ0KCQkJCQkgICh0b3Ag
KyBmcmFtZU9mZnNldHNbaSArIDFdKSk7DQoJCQl9DQoJCX0NCgkJYXNzZXJ0
KHRvcCA9PSBib3R0b20pOw0KCQlwICs9IHNpemVvZiAoc3RydWN0IEdDX3N0
YWNrKSArIHN0YWNrLT5yZXNlcnZlZDsNCgl9DQoJcmV0dXJuIHA7DQp9DQoN
Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdG9EYXRhICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyogSWYg
cCBwb2ludHMgYXQgdGhlIGJlZ2lubmluZyBvZiBhbiBvYmplY3QsIHRoZW4g
dG9EYXRhIHAgcmV0dXJucyBhIHBvaW50ZXIgDQogKiB0byB0aGUgc3RhcnQg
b2YgdGhlIG9iamVjdCBkYXRhLg0KICovDQpzdGF0aWMgaW5saW5lIHBvaW50
ZXIgdG9EYXRhIChHQ19zdGF0ZSBzLCBwb2ludGVyIHApIHsNCgl3b3JkIGhl
YWRlcjsNCglwb2ludGVyIHJlczsNCg0KCWFzc2VydCAoaXNBbGlnbmVkRnJv
bnRpZXIgKHMsIHApKTsNCgloZWFkZXIgPSAqKHdvcmQqKXA7DQoJaWYgKDAg
PT0gaGVhZGVyKQ0KCQkvKiBMb29raW5nIGF0IHRoZSBjb3VudGVyIHdvcmQg
aW4gYW4gYXJyYXkuICovDQoJCXJlcyA9IHAgKyBHQ19BUlJBWV9IRUFERVJf
U0laRTsNCgllbHNlDQoJCS8qIExvb2tpbmcgYXQgYSBoZWFkZXIgd29yZC4g
Ki8NCgkJcmVzID0gcCArIEdDX05PUk1BTF9IRUFERVJfU0laRTsNCglhc3Nl
cnQgKGlzQWxpZ25lZCAoKHVpbnQpcmVzLCBzLT5hbGlnbm1lbnQpKTsNCgly
ZXR1cm4gcmVzOw0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQov
KiAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoUG9pbnRlckluUmFuZ2Ug
ICAgICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tICovDQoNCi8qIGZvcmVhY2hQb2ludGVySW5SYW5nZSAocywgZnJvbnQs
IGJhY2ssIHdzLCBmKQ0KICogQXBwbHkgZiB0byBlYWNoIHBvaW50ZXIgYmV0
d2VlbiBmcm9udCBhbmQgKmJhY2ssIHdoaWNoIHNob3VsZCBiZSBhIA0KICog
Y29udGlndW91cyBzZXF1ZW5jZSBvZiBvYmplY3RzLCB3aGVyZSBmcm9udCBw
b2ludHMgYXQgdGhlIGJlZ2lubmluZyBvZg0KICogdGhlIGZpcnN0IG9iamVj
dCBhbmQgKmJhY2sgcG9pbnRzIGp1c3QgcGFzdCB0aGUgZW5kIG9mIHRoZSBs
YXN0IG9iamVjdC4NCiAqIGYgbWF5IGluY3JlYXNlICpiYWNrIChmb3IgZXhh
bXBsZSwgdGhpcyBpcyBkb25lIGJ5IGZvcndhcmQpLg0KICogZm9yZWFjaFBv
aW50ZXJJblJhbmdlIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbmQgb2Yg
dGhlIGxhc3Qgb2JqZWN0IGl0DQogKiB2aXNpdHMuDQogKg0KICogSWYgd3Ms
IHRoZW4gdGhlIG9iamVjdCBwb2ludGVyIGluIHdlYWsgb2JqZWN0cyBpcyBz
a2lwcGVkLg0KICovDQoNCnN0YXRpYyBpbmxpbmUgcG9pbnRlciBmb3JlYWNo
UG9pbnRlckluUmFuZ2UgKEdDX3N0YXRlIHMsIA0KCQkJCQkJcG9pbnRlciBm
cm9udCwgDQoJCQkJCQlwb2ludGVyICpiYWNrLA0KCQkJCQkJQm9vbCBza2lw
V2Vha3MsDQoJCQkJCQlHQ19wb2ludGVyRnVuIGYpIHsNCglwb2ludGVyIGI7
DQoNCglhc3NlcnQgKGlzQWxpZ25lZEZyb250aWVyIChzLCBmcm9udCkpOw0K
CWlmIChERUJVR19ERVRBSUxFRCkNCgkJZnByaW50ZiAoc3RkZXJyLCAiZm9y
ZWFjaFBvaW50ZXJJblJhbmdlICBmcm9udCA9IDB4JTA4eCAgKmJhY2sgPSAw
eCUwOHhcbiIsDQoJCQkJKHVpbnQpZnJvbnQsICoodWludCopYmFjayk7DQoJ
YiA9ICpiYWNrOw0KCWFzc2VydCAoZnJvbnQgPD0gYik7DQogCXdoaWxlIChm
cm9udCA8IGIpIHsNCgkJd2hpbGUgKGZyb250IDwgYikgew0KCQkJYXNzZXJ0
IChpc0FsaWduZWQgKCh1aW50KWZyb250LCBXT1JEX1NJWkUpKTsNCgkgICAg
ICAgCQlpZiAoREVCVUdfREVUQUlMRUQpDQoJCQkJZnByaW50ZiAoc3RkZXJy
LCAiZnJvbnQgPSAweCUwOHggICpiYWNrID0gMHglMDh4XG4iLA0KCQkJCQkJ
KHVpbnQpZnJvbnQsICoodWludCopYmFjayk7DQoJCQlmcm9udCA9IGZvcmVh
Y2hQb2ludGVySW5PYmplY3QgDQoJCQkJCShzLCB0b0RhdGEgKHMsIGZyb250
KSwgc2tpcFdlYWtzLCBmKTsNCgkJfQ0KCQliID0gKmJhY2s7DQoJfQ0KCXJl
dHVybiBmcm9udDsNCn0NCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0K
LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YXJpYW50ICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLw0KDQpzdGF0aWMgYm9vbCBtdXRhdG9yRnJvbnRpZXJJbnZhcmlh
bnQgKEdDX3N0YXRlIHMpIHsNCglyZXR1cm4gKHMtPmN1cnJlbnRUaHJlYWQt
PmJ5dGVzTmVlZGVkIDw9IA0KCQkJcy0+bGltaXRQbHVzU2xvcCAtIHMtPmZy
b250aWVyKTsNCn0NCg0Kc3RhdGljIGJvb2wgbXV0YXRvclN0YWNrSW52YXJp
YW50IChHQ19zdGF0ZSBzKSB7DQoJcmV0dXJuIChzdGFja1RvcCAocywgcy0+
Y3VycmVudFRocmVhZC0+c3RhY2spIDw9IA0KCQkJc3RhY2tMaW1pdCAocywg
cy0+Y3VycmVudFRocmVhZC0+c3RhY2spICsgDQoJCQkoc3RhY2tJc0VtcHR5
KHMtPmN1cnJlbnRUaHJlYWQtPnN0YWNrKSA/IA0KCQkJCTAgOiB0b3BGcmFt
ZVNpemUgKHMsIHMtPmN1cnJlbnRUaHJlYWQtPnN0YWNrKSkpOw0KfQ0KDQpz
dGF0aWMgYm9vbCByYXRpb3NPayAoR0Nfc3RhdGUgcykgew0KCXJldHVybiAx
LjAgPCBzLT5ncm93UmF0aW8NCgkJCWFuZCAxLjAgPCBzLT5udXJzZXJ5UmF0
aW8NCgkJCWFuZCAxLjAgPCBzLT5tYXJrQ29tcGFjdFJhdGlvDQoJCQlhbmQg
cy0+bWFya0NvbXBhY3RSYXRpbyA8PSBzLT5jb3B5UmF0aW8NCgkJCWFuZCBz
LT5jb3B5UmF0aW8gPD0gcy0+bGl2ZVJhdGlvOw0KfQ0KDQpzdGF0aWMgaW5s
aW5lIGJvb2wgaXNJbk51cnNlcnkgKEdDX3N0YXRlIHMsIHBvaW50ZXIgcCkg
ew0KCXJldHVybiBzLT5udXJzZXJ5IDw9IHAgYW5kIHAgPCBzLT5mcm9udGll
cjsNCn0NCg0KI2lmIEFTU0VSVA0KDQpzdGF0aWMgaW5saW5lIGJvb2wgaXNJ
bk9sZEdlbiAoR0Nfc3RhdGUgcywgcG9pbnRlciBwKSB7DQoJcmV0dXJuIHMt
PmhlYXAuc3RhcnQgPD0gcCBhbmQgcCA8IHMtPmhlYXAuc3RhcnQgKyBzLT5v
bGRHZW5TaXplOw0KfQ0KDQpzdGF0aWMgaW5saW5lIGJvb2wgaXNJbkZyb21T
cGFjZSAoR0Nfc3RhdGUgcywgcG9pbnRlciBwKSB7DQogCXJldHVybiAoaXNJ
bk9sZEdlbiAocywgcCkgb3IgaXNJbk51cnNlcnkgKHMsIHApKTsNCn0NCg0K
c3RhdGljIGlubGluZSB2b2lkIGFzc2VydElzSW5Gcm9tU3BhY2UgKEdDX3N0
YXRlIHMsIHBvaW50ZXIgKnApIHsNCiNpZiBBU1NFUlQNCgl1bmxlc3MgKGlz
SW5Gcm9tU3BhY2UgKHMsICpwKSkNCgkJZGllICgiZ2MuYzogYXNzZXJ0SXNJ
bkZyb21TcGFjZSBwID0gMHglMDh4ICAqcCA9IDB4JTA4eCk7XG4iLA0KCQkJ
KHVpbnQpcCwgKih1aW50KilwKTsNCgkvKiBUaGUgZm9sbG93aW5nIGNoZWNr
cyB0aGF0IGludGVyZ2VuZXJhdGlvbmFsIHBvaW50ZXJzIGhhdmUgdGhlDQoJ
ICogYXBwcm9wcmlhdGUgY2FyZCBtYXJrZWQuICBVbmZvcnR1bmF0ZWx5LCBp
dCBkb2Vzbid0IHdvcmsgYmVjYXVzZQ0KCSAqIGZvciBzdGFja3MsIHRoZSBj
YXJkIGNvbnRhaW5pbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RhY2sgaXMg
bWFya2VkLA0KCSAqIGJ1dCBhbnkgcmVtYWluaW5nIGNhcmRzIGFyZW4ndC4N
CgkgKi8NCglpZiAoRkFMU0UgYW5kIHMtPm11dGF0b3JNYXJrc0NhcmRzIA0K
CQlhbmQgaXNJbk9sZEdlbiAocywgKHBvaW50ZXIpcCkgDQogCQlhbmQgaXNJ
bk51cnNlcnkgKHMsICpwKQ0KCQlhbmQgbm90IGNhcmRJc01hcmtlZCAocywg
KHBvaW50ZXIpcCkpIHsNCgkJR0NfZGlzcGxheSAocywgc3RkZXJyKTsNCgkJ
ZGllICgiZ2MuYzogaW50ZXJnZW5lcmF0aW9uYWwgcG9pbnRlciBmcm9tIDB4
JTA4eCB0byAweCUwOHggd2l0aCB1bm1hcmtlZCBjYXJkLlxuIiwNCgkJCSh1
aW50KXAsICoodWludCopcCk7DQoJfQ0KI2VuZGlmDQp9DQoNCnN0YXRpYyBp
bmxpbmUgYm9vbCBpc0luVG9TcGFjZSAoR0Nfc3RhdGUgcywgcG9pbnRlciBw
KSB7DQoJcmV0dXJuIChub3QgKEdDX2lzUG9pbnRlciAocCkpDQoJCQlvciAo
cy0+dG9TcGFjZSA8PSBwIGFuZCBwIDwgcy0+dG9MaW1pdCkpOw0KfQ0KDQpz
dGF0aWMgYm9vbCBpbnZhcmlhbnQgKEdDX3N0YXRlIHMpIHsNCglpbnQgaTsN
Cglwb2ludGVyIGJhY2s7DQoJR0Nfc3RhY2sgc3RhY2s7DQoNCglpZiAoREVC
VUcpDQoJCWZwcmludGYgKHN0ZGVyciwgImludmFyaWFudFxuIik7DQoJYXNz
ZXJ0IChyYXRpb3NPayAocykpOw0KCS8qIEZyYW1lIGxheW91dHMgKi8NCglm
b3IgKGkgPSAwOyBpIDwgcy0+ZnJhbWVMYXlvdXRzU2l6ZTsgKytpKSB7DQoJ
CUdDX2ZyYW1lTGF5b3V0ICpsYXlvdXQ7DQoNCgkJbGF5b3V0ID0gJihzLT5m
cmFtZUxheW91dHNbaV0pOw0KCQlpZiAobGF5b3V0LT5udW1CeXRlcyA+IDAp
IHsNCgkJCUdDX29mZnNldHMgb2Zmc2V0czsNCi8vCQkJaW50IGo7DQoNCgkJ
CWFzc2VydCAobGF5b3V0LT5udW1CeXRlcyA8PSBzLT5tYXhGcmFtZVNpemUp
Ow0KCQkJb2Zmc2V0cyA9IGxheW91dC0+b2Zmc2V0czsNCi8vIE5vIGxvbmdl
ciBjb3JyZWN0LCBzaW5jZSBoYW5kbGVyIGZyYW1lcyBoYXZlIGEgInNpemUi
IChpLmUuIHJldHVybiBhZGRyZXNzKQ0KLy8gcG9pbnRpbmcgaW50byB0aGUg
bWlkZGxlIG9mIHRoZSBmcmFtZS4NCi8vCQkJZm9yIChqID0gMDsgaiA8IG9m
ZnNldHNbMF07ICsraikNCi8vCQkJCWFzc2VydCAob2Zmc2V0c1tqICsgMV0g
PCBsYXlvdXQtPm51bUJ5dGVzKTsNCgkJfQ0KCX0NCglpZiAocy0+bXV0YXRv
ck1hcmtzQ2FyZHMpIHsNCgkJYXNzZXJ0IChzLT5jYXJkTWFwID09IA0KCQkJ
CSZzLT5jYXJkTWFwRm9yTXV0YXRvcltkaXZDYXJkU2l6ZShzLCAodWludClz
LT5oZWFwLnN0YXJ0KV0pOw0KCQlhc3NlcnQgKCZzLT5jYXJkTWFwRm9yTXV0
YXRvcltkaXZDYXJkU2l6ZSAocywgKHVpbnQpcy0+aGVhcC5zdGFydCArIHMt
PmhlYXAuc2l6ZSAtIFdPUkRfU0laRSldDQoJCQkJPCBzLT5jYXJkTWFwICsg
cy0+Y2FyZE1hcFNpemUpOw0KCX0NCgkvKiBIZWFwICovDQoJYXNzZXJ0IChp
c0FsaWduZWQgKHMtPmhlYXAuc2l6ZSwgcy0+cGFnZVNpemUpKTsNCglhc3Nl
cnQgKGlzQWxpZ25lZCAoKHVpbnQpcy0+aGVhcC5zdGFydCwgcy0+Y2FyZFNp
emUpKTsNCglhc3NlcnQgKGlzQWxpZ25lZEZyb250aWVyIChzLCBzLT5oZWFw
LnN0YXJ0ICsgcy0+b2xkR2VuU2l6ZSkpOw0KCWFzc2VydCAoaXNBbGlnbmVk
RnJvbnRpZXIgKHMsIHMtPm51cnNlcnkpKTsNCglhc3NlcnQgKGlzQWxpZ25l
ZEZyb250aWVyIChzLCBzLT5mcm9udGllcikpOw0KCWFzc2VydCAocy0+bnVy
c2VyeSA8PSBzLT5mcm9udGllcik7DQoJdW5sZXNzICgwID09IHMtPmhlYXAu
c2l6ZSkgew0KCQlhc3NlcnQgKHMtPm51cnNlcnkgPD0gcy0+ZnJvbnRpZXIp
Ow0KCQlhc3NlcnQgKHMtPmZyb250aWVyIDw9IHMtPmxpbWl0UGx1c1Nsb3Ap
Ow0KCQlhc3NlcnQgKHMtPmxpbWl0ID09IHMtPmxpbWl0UGx1c1Nsb3AgLSBM
SU1JVF9TTE9QKTsNCgkJYXNzZXJ0IChoYXNCeXRlc0ZyZWUgKHMsIDAsIDAp
KTsNCgl9DQoJYXNzZXJ0IChzLT5oZWFwMi5zdGFydCA9PSBOVUxMIG9yIHMt
PmhlYXAuc2l6ZSA9PSBzLT5oZWFwMi5zaXplKTsNCgkvKiBDaGVjayB0aGF0
IGFsbCBwb2ludGVycyBhcmUgaW50byBmcm9tIHNwYWNlLiAqLw0KCWZvcmVh
Y2hHbG9iYWwgKHMsIGFzc2VydElzSW5Gcm9tU3BhY2UpOw0KCWJhY2sgPSBz
LT5oZWFwLnN0YXJ0ICsgcy0+b2xkR2VuU2l6ZTsNCglpZiAoREVCVUdfREVU
QUlMRUQpDQoJCWZwcmludGYgKHN0ZGVyciwgIkNoZWNraW5nIG9sZCBnZW5l
cmF0aW9uLlxuIik7DQoJZm9yZWFjaFBvaW50ZXJJblJhbmdlIChzLCBhbGln
bkZyb250aWVyIChzLCBzLT5oZWFwLnN0YXJ0KSwgJmJhY2ssIEZBTFNFLA0K
CQkJCWFzc2VydElzSW5Gcm9tU3BhY2UpOw0KCWlmIChERUJVR19ERVRBSUxF
RCkNCgkJZnByaW50ZiAoc3RkZXJyLCAiQ2hlY2tpbmcgbnVyc2VyeS5cbiIp
Ow0KCWZvcmVhY2hQb2ludGVySW5SYW5nZSAocywgcy0+bnVyc2VyeSwgJnMt
PmZyb250aWVyLCBGQUxTRSwNCgkJCQlhc3NlcnRJc0luRnJvbVNwYWNlKTsN
CgkvKiBDdXJyZW50IHRocmVhZC4gKi8NCglzdGFjayA9IHMtPmN1cnJlbnRU
aHJlYWQtPnN0YWNrOw0KCWFzc2VydCAoaXNBbGlnbmVkUmVzZXJ2ZWQgKHMs
IHN0YWNrLT5yZXNlcnZlZCkpOw0KCWFzc2VydCAocy0+c3RhY2tCb3R0b20g
PT0gc3RhY2tCb3R0b20gKHMsIHN0YWNrKSk7DQoJYXNzZXJ0IChzLT5zdGFj
a1RvcCA9PSBzdGFja1RvcCAocywgc3RhY2spKTsNCiAJYXNzZXJ0IChzLT5z
dGFja0xpbWl0ID09IHN0YWNrTGltaXQgKHMsIHN0YWNrKSk7DQoJYXNzZXJ0
IChzdGFjay0+dXNlZCA9PSBjdXJyZW50U3RhY2tVc2VkIChzKSk7DQoJYXNz
ZXJ0IChzdGFjay0+dXNlZCA8PSBzdGFjay0+cmVzZXJ2ZWQpOw0KIAlhc3Nl
cnQgKHMtPnN0YWNrQm90dG9tIDw9IHMtPnN0YWNrVG9wKTsNCglpZiAoREVC
VUcpDQoJCWZwcmludGYgKHN0ZGVyciwgImludmFyaWFudCBwYXNzZWRcbiIp
Ow0KCXJldHVybiBUUlVFOw0KfQ0KDQpzdGF0aWMgYm9vbCBtdXRhdG9ySW52
YXJpYW50IChHQ19zdGF0ZSBzKSB7DQoJaWYgKERFQlVHKQ0KCQlHQ19kaXNw
bGF5IChzLCBzdGRlcnIpOw0KCWFzc2VydCAobXV0YXRvckZyb250aWVySW52
YXJpYW50KHMpKTsNCglhc3NlcnQgKG11dGF0b3JTdGFja0ludmFyaWFudChz
KSk7DQoJYXNzZXJ0IChpbnZhcmlhbnQgKHMpKTsNCglyZXR1cm4gVFJVRTsN
Cn0NCiNlbmRpZiAvKiAjaWYgQVNTRVJUICovDQoNCi8qIFRoZSBwdXJwb3Nl
IG9mIGJsb2NraW5nIHNpZ25hbHMgaW4gR0MgaXMgdG8gcHJldmVudCBHQ19o
YW5kbGVyIGZyb20gcnVubmluZywNCiAqIHdoaWNoIHdvdWxkIG11Y2sgd2l0
aCBzLT5saW1pdC4gIEhvd2V2ZXIsIGlmIHRoZSBwcm9ncmFtIGRvZXNuJ3Qg
aGFuZGxlIA0KICogc2lnbmFscywgd2UgZG9uJ3QgbmVlZCB0byBibG9jayB0
aGVtLiAgVGhpcyBjYW4gYmUgdGVzdGVkIHZpYSB0aGUgd2VhayBzeW1ib2wN
CiAqIFBvc2l4X1NpZ25hbF9oYW5kbGUuDQogKi8NCiNpZiBTVVBQT1JUU19X
RUFLDQp2b2lkIFBvc2l4X1NpZ25hbF9oYW5kbGUgKCkgX19hdHRyaWJ1dGVf
XyAoKHdlYWspKTsgDQojZWxzZQ0Kdm9pZCBQb3NpeF9TaWduYWxfaGFuZGxl
ICgpOw0KI2VuZGlmDQpzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkQmxvY2tT
aWduYWxzICgpIHsNCglyZXR1cm4gMCAhPSBQb3NpeF9TaWduYWxfaGFuZGxl
Ow0KfQ0KDQpzdGF0aWMgaW5saW5lIHZvaWQgYmxvY2tTaWduYWxzIChHQ19z
dGF0ZSBzKSB7DQoJaWYgKHNob3VsZEJsb2NrU2lnbmFscyAoKSkNCgkJc2ln
cHJvY21hc2sgKFNJR19CTE9DSywgJnMtPnNpZ25hbHNIYW5kbGVkLCAmcy0+
c2lnbmFsc0Jsb2NrZWQpOw0KfQ0KDQpzdGF0aWMgaW5saW5lIHZvaWQgdW5i
bG9ja1NpZ25hbHMgKEdDX3N0YXRlIHMpIHsNCglpZiAoc2hvdWxkQmxvY2tT
aWduYWxzICgpKQ0KCQlzaWdwcm9jbWFzayAoU0lHX1NFVE1BU0ssICZzLT5z
aWduYWxzQmxvY2tlZCwgTlVMTCk7DQp9DQoNCi8qIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gKi8NCi8qICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyIGFu
ZCBsZWF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi8qIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gKi8NCg0KLyogZW50ZXIgYW5kIGxlYXZlIHNob3Vs
ZCBiZSBjYWxsZWQgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgZXZlcnkgR0Mg
ZnVuY3Rpb24NCiAqIHRoYXQgaXMgZXhwb3J0ZWQgdG8gdGhlIG91dHNpZGUg
d29ybGQuICBUaGV5IG1ha2Ugc3VyZSB0aGF0IHNpZ25hbHMgYXJlDQogKiBi
bG9ja2VkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGZ1bmN0aW9uIGFuZCBj
aGVjayB0aGUgR0MgaW52YXJpYW50DQogKiBUaGV5IGFyZSBhIGJpdCB0cmlj
a3kgYmVjYXVzZSBvZiB0aGUgY2FzZSB3aGVuIHRoZSBydW50aW1lIHN5c3Rl
bSBpcyBpbnZva2VkDQogKiBmcm9tIHdpdGhpbiBhbiBNTCBzaWduYWwgaGFu
ZGxlci4NCiAqLw0Kdm9pZCBlbnRlciAoR0Nfc3RhdGUgcykgew0KCWlmIChE
RUJVRykNCgkJZnByaW50ZiAoc3RkZXJyLCAiZW50ZXJcbiIpOw0KCS8qIHVz
ZWQgbmVlZHMgdG8gYmUgc2V0IGJlY2F1c2UgdGhlIG11dGF0b3IgaGFzIGNo
YW5nZWQgcy0+c3RhY2tUb3AuICovDQoJcy0+Y3VycmVudFRocmVhZC0+c3Rh
Y2stPnVzZWQgPSBjdXJyZW50U3RhY2tVc2VkIChzKTsNCglzLT5jdXJyZW50
VGhyZWFkLT5leG5TdGFjayA9IHMtPmV4blN0YWNrOw0KCWlmIChERUJVRykg
DQoJCUdDX2Rpc3BsYXkgKHMsIHN0ZGVycik7DQoJdW5sZXNzIChzLT5pblNp
Z25hbEhhbmRsZXIpIHsNCgkJYmxvY2tTaWduYWxzIChzKTsNCgkJaWYgKDAg
PT0gcy0+bGltaXQpDQoJCQlzLT5saW1pdCA9IHMtPmxpbWl0UGx1c1Nsb3Ag
LSBMSU1JVF9TTE9QOw0KCX0NCglhc3NlcnQgKGludmFyaWFudCAocykpOw0K
CWlmIChERUJVRykNCgkJZnByaW50ZiAoc3RkZXJyLCAiZW50ZXIgb2tcbiIp
Ow0KfQ0KDQp2b2lkIGxlYXZlIChHQ19zdGF0ZSBzKSB7DQoJaWYgKERFQlVH
KQ0KCQlmcHJpbnRmIChzdGRlcnIsICJsZWF2ZVxuIik7DQoJYXNzZXJ0ICht
dXRhdG9ySW52YXJpYW50IChzKSk7DQoJaWYgKHMtPnNpZ25hbElzUGVuZGlu
ZyBhbmQgMCA9PSBzLT5jYW5IYW5kbGUpDQoJCXMtPmxpbWl0ID0gMDsNCgl1
bmxlc3MgKHMtPmluU2lnbmFsSGFuZGxlcikNCgkJdW5ibG9ja1NpZ25hbHMg
KHMpOw0KCWlmIChERUJVRykNCgkJZnByaW50ZiAoc3RkZXJyLCAibGVhdmUg
b2tcbiIpOw0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlYXBzICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
ICovDQoNCi8qIGhlYXBEZXNpcmVkU2l6ZSAocywgbCwgYykgcmV0dXJucyB0
aGUgZGVzaXJlZCBoZWFwIHNpemUgZm9yIGEgaGVhcCB3aXRoDQogKiBsIGJ5
dGVzIGxpdmUsIGdpdmVuIHRoYXQgdGhlIGN1cnJlbnQgaGVhcCBzaXplIGlz
IGMuDQogKi8NCnN0YXRpYyBXMzIgaGVhcERlc2lyZWRTaXplIChHQ19zdGF0
ZSBzLCBXNjQgbGl2ZSwgVzMyIGN1cnJlbnRTaXplKSB7DQoJVzMyIHJlczsN
CglmbG9hdCByYXRpbzsNCg0KCXJhdGlvID0gKGZsb2F0KXMtPnJhbSAvIChm
bG9hdClsaXZlOw0KICAgICAgICBpZiAocmF0aW8gPj0gcy0+bGl2ZVJhdGlv
ICsgcy0+Z3Jvd1JhdGlvKSB7DQoJCS8qIENoZW5leSBjb3B5aW5nIGZpdHMg
aW4gUkFNIHdpdGggZGVzaXJlZCBsaXZlUmF0aW8uICovDQoJCXJlcyA9IGxp
dmUgKiBzLT5saXZlUmF0aW87DQoJCS8qIElmIHRoZSBoZWFwIGlzIGN1cnJl
bnRseSBjbG9zZSBpbiBzaXplIHRvIHdoYXQgd2Ugd2FudCwgbGVhdmUNCgkJ
ICogaXQgYWxvbmUuICBGYXZvciBncm93aW5nIG92ZXIgc2hyaW5raW5nLg0K
CQkgKi8NCgkJdW5sZXNzIChyZXMgPj0gMS4xICogY3VycmVudFNpemUgDQoJ
CQkJb3IgcmVzIDw9IC41ICogY3VycmVudFNpemUpDQoJCQlyZXMgPSBjdXJy
ZW50U2l6ZTsNCgl9IGVsc2UgaWYgKHMtPmdyb3dSYXRpbyA+PSBzLT5jb3B5
UmF0aW8NCgkJCWFuZCByYXRpbyA+PSAyICogcy0+Y29weVJhdGlvKSB7DQoJ
CS8qIFNwbGl0IFJBTSBpbiBoYWxmLiAgUm91bmQgZG93biBieSBwYWdlU2l6
ZSBzbyB0aGF0IHRoZSB0b3RhbA0KCQkgKiBhbW91bnQgb2Ygc3BhY2UgdGFr
ZW4gaXNuJ3QgZ3JlYXRlciB0aGFuIFJBTSBvbmNlIHJvdW5kaW5nDQoJCSAq
IGhhcHBlbnMuICBUaGlzIGlzIHNvIHJlc2l6ZUhlYXAyIGRvZXNuJ3QgZ2V0
IGNvbmZ1c2VkIGFuZA0KCQkgKiBmcmVlIGEgc2VtaXNwYWNlIGluIGEgbWlz
Z3VpZGVkIGF0dGVtcHQgdG8gYXZvaWQgcGFnaW5nLg0KCQkgKi8NCgkJcmVz
ID0gcm91bmREb3duIChzLT5yYW0gLyAyLCBzLT5wYWdlU2l6ZSkgOw0KCX0g
ZWxzZSBpZiAocmF0aW8gPj0gcy0+Y29weVJhdGlvICsgcy0+Z3Jvd1JhdGlv
KSB7DQoJCS8qIENoZW5leSBjb3B5aW5nIGZpdHMgaW4gUkFNLiAqLw0KCQly
ZXMgPSBzLT5yYW0gLSBzLT5ncm93UmF0aW8gKiBsaXZlOw0KCQkvKiBJZiB0
aGUgaGVhcCBpc24ndCB0b28gbXVjaCBzbWFsbGVyIHRoYW4gd2hhdCB3ZSB3
YW50LCBsZWF2ZQ0KCQkgKiBpdCBhbG9uZS4gIE9uIHRoZSBvdGhlciBoYW5k
LCBpZiBpdCBpcyBiaWdnZXIgd2Ugd2FudCB0bw0KCQkgKiBsZWF2ZSByZXMg
YXMgaXMgc28gdGhhdCB0aGUgaGVhcCBpcyBzaHJ1bmssIHRvIHRyeSB0byBh
dm9pZA0KCQkgKiBwYWdpbmcuDQoJCSAqLw0KCQlpZiAoMC45ICogcmVzIDw9
IGN1cnJlbnRTaXplIGFuZCBjdXJyZW50U2l6ZSA8PSByZXMpDQoJCQlyZXMg
PSBjdXJyZW50U2l6ZTsNCgl9IGVsc2UgaWYgKHJhdGlvID49IHMtPm1hcmtD
b21wYWN0UmF0aW8pIHsNCgkJLyogTWFyayBjb21wYWN0IGZpdHMgaW4gcmFt
LiAgSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgY3VycmVudA0KCQkgKiBz
aXplIGlzLiAgSWYgdGhlIGhlYXAgaXMgY3VycmVudGx5IHNtYWxsZXIsIHdl
IGFyZSB1c2luZw0KCQkgKiBjb3B5aW5nIGFuZCBzaG91bGQgc3dpdGNoIHRv
IG1hcmstY29tcGFjdC4gIElmIHRoZSBoZWFwIGlzDQoJCSAqIGN1cnJlbnRs
eSBiaWdnZXIsIHdlIHdhbnQgdG8gc2hyaW5rIGJhY2sgdG8gcmFtIHNpemUg
dG8gYXZvaWQNCgkJICogcGFnaW5nLg0KCQkgKi8NCgkJcmVzID0gcy0+cmFt
Ow0KCX0gZWxzZSB7IC8qIFJlcXVpcmVkIGxpdmUgcmF0aW8uICovDQoJCXJl
cyA9IGxpdmUgKiBzLT5tYXJrQ29tcGFjdFJhdGlvOw0KCQkvKiBJZiB0aGUg
Y3VycmVudCBoZWFwIGlzIGJpZ2dlciB0aGFuIHJlcywgdGhlIHNocmlua2lu
ZyBhbHdheXMNCgkJICogc291bmRzIGxpa2UgYSBnb29kIGlkZWEuICBIb3dl
dmVyLCBkZXBlbmRpbmcgb24gd2hhdCBwYWdlcw0KCQkgKiB0aGUgVk0ga2Vl
cHMgYXJvdW5kLCBncm93aW5nIGNvdWxkIGJlIHZlcnkgZXhwZW5zaXZlLCBp
ZiBpdA0KCQkgKiBpbnZvbHZlcyBwYWdpbmcgdGhlIGVudGlyZSBoZWFwLiAg
SG9wZWZ1bGx5IHRoZSBjb3B5IGxvb3ANCgkJICogaW4gZ3Jvd0Zyb21TcGFj
ZSB3aWxsIG1ha2UgdGhlIHJpZ2h0IHRoaW5nIGhhcHBlbi4NCgkJICovIA0K
CX0NCglpZiAocy0+Zml4ZWRIZWFwID4gMCkgew0KCQlpZiAocmVzID4gcy0+
Zml4ZWRIZWFwIC8gMikNCgkJCXJlcyA9IHMtPmZpeGVkSGVhcDsNCgkJZWxz
ZQ0KCQkJcmVzID0gcy0+Zml4ZWRIZWFwIC8gMjsNCgkJaWYgKHJlcyA8IGxp
dmUpDQoJCQlkaWUgKCJPdXQgb2YgbWVtb3J5IHdpdGggZml4ZWQgaGVhcCBz
aXplICVzLiIsDQoJCQkJdWludFRvQ29tbWFTdHJpbmcgKHMtPmZpeGVkSGVh
cCkpOw0KCX0gZWxzZSBpZiAocy0+bWF4SGVhcCA+IDApIHsNCgkJaWYgKHJl
cyA+IHMtPm1heEhlYXApDQoJCQlyZXMgPSBzLT5tYXhIZWFwOw0KCQlpZiAo
cmVzIDwgbGl2ZSkNCgkJCWRpZSAoIk91dCBvZiBtZW1vcnkgd2l0aCBtYXgg
aGVhcCBzaXplICVzLiIsDQoJCQkJdWludFRvQ29tbWFTdHJpbmcgKHMtPm1h
eEhlYXApKTsNCgl9DQoJaWYgKERFQlVHX1JFU0laSU5HKQ0KCQlmcHJpbnRm
IChzdGRlcnIsICIlcyA9IGhlYXBEZXNpcmVkU2l6ZSAoJXMpXG4iLA0KCQkJ
CXVpbnRUb0NvbW1hU3RyaW5nIChyZXMpLA0KCQkJCXVsbG9uZ1RvQ29tbWFT
dHJpbmcgKGxpdmUpKTsNCglhc3NlcnQgKHJlcyA+PSBsaXZlKTsNCglyZXR1
cm4gcmVzOw0KfQ0KDQpzdGF0aWMgaW5saW5lIHZvaWQgaGVhcEluaXQgKEdD
X2hlYXAgaCkgew0KCWgtPnNpemUgPSAwOw0KCWgtPnN0YXJ0ID0gTlVMTDsN
Cn0NCg0Kc3RhdGljIGlubGluZSBib29sIGhlYXBJc0luaXQgKEdDX2hlYXAg
aCkgew0KCXJldHVybiAwID09IGgtPnNpemU7DQp9DQoNCnN0YXRpYyB2b2lk
IGhlYXBSZWxlYXNlIChHQ19zdGF0ZSBzLCBHQ19oZWFwIGgpIHsNCglpZiAo
TlVMTCA9PSBoLT5zdGFydCkNCgkJcmV0dXJuOw0KCWlmIChERUJVRyBvciBz
LT5tZXNzYWdlcykNCgkJZnByaW50ZiAoc3RkZXJyLCAiUmVsZWFzaW5nIGhl
YXAgYXQgMHglMDh4IG9mIHNpemUgJXMuXG4iLCANCgkJCQkodWludCloLT5z
dGFydCwgDQoJCQkJdWludFRvQ29tbWFTdHJpbmcgKGgtPnNpemUpKTsNCgly
ZWxlYXNlIChoLT5zdGFydCwgaC0+c2l6ZSk7DQoJaGVhcEluaXQgKGgpOw0K
fQ0KDQpzdGF0aWMgdm9pZCBoZWFwU2hyaW5rIChHQ19zdGF0ZSBzLCBHQ19o
ZWFwIGgsIFczMiBrZWVwKSB7DQoJYXNzZXJ0IChrZWVwIDw9IGgtPnNpemUp
Ow0KCWlmICgwID09IGtlZXApIHsNCgkJaGVhcFJlbGVhc2UgKHMsIGgpOw0K
CQlyZXR1cm47DQoJfQ0KCWtlZXAgPSBhbGlnbiAoa2VlcCwgcy0+cGFnZVNp
emUpOw0KCWlmIChrZWVwIDwgaC0+c2l6ZSkgew0KCQlpZiAoREVCVUcgb3Ig
cy0+bWVzc2FnZXMpDQoJCQlmcHJpbnRmIChzdGRlcnIsIA0KCQkJCSJTaHJp
bmtpbmcgaGVhcCBhdCAweCUwOHggb2Ygc2l6ZSAlcyB0byAlcyBieXRlcy5c
biIsDQoJCQkJKHVpbnQpaC0+c3RhcnQsIA0KCQkJCXVpbnRUb0NvbW1hU3Ry
aW5nIChoLT5zaXplKSwNCgkJCQl1aW50VG9Db21tYVN0cmluZyAoa2VlcCkp
Ow0KCQlkZWNvbW1pdCAoaC0+c3RhcnQgKyBrZWVwLCBoLT5zaXplIC0ga2Vl
cCk7DQoJCWgtPnNpemUgPSBrZWVwOw0KCX0NCn0NCg0Kc3RhdGljIHZvaWQg
Y2xlYXJDYXJkTWFwIChHQ19zdGF0ZSBzKSB7DQoJbWVtc2V0IChzLT5jYXJk
TWFwLCAwLCBzLT5jYXJkTWFwU2l6ZSk7DQp9DQoNCnN0YXRpYyB2b2lkIHNl
dE51cnNlcnkgKEdDX3N0YXRlIHMsIFczMiBvbGRHZW5CeXRlc1JlcXVlc3Rl
ZCwNCgkJCQlXMzIgbnVyc2VyeUJ5dGVzUmVxdWVzdGVkKSB7DQoJR0NfaGVh
cCBoOw0KCXVpbnQgbnVyc2VyeVNpemU7DQoNCglpZiAoREVCVUdfREVUQUlM
RUQpDQoJCWZwcmludGYgKHN0ZGVyciwgInNldE51cnNlcnkuICBvbGRHZW5C
eXRlc1JlcXVlc3RlZCA9ICVzICBmcm9udGllciA9IDB4JTA4eFxuIiwgIA0K
CQkJCXVpbnRUb0NvbW1hU3RyaW5nIChvbGRHZW5CeXRlc1JlcXVlc3RlZCks
DQoJCQkJKHVpbnQpcy0+ZnJvbnRpZXIpOw0KCWggPSAmcy0+aGVhcDsNCglh
c3NlcnQgKGlzQWxpZ25lZEZyb250aWVyIChzLCBoLT5zdGFydCArIHMtPm9s
ZEdlblNpemUgDQoJCQkJCSsgb2xkR2VuQnl0ZXNSZXF1ZXN0ZWQpKTsNCglu
dXJzZXJ5U2l6ZSA9IGgtPnNpemUgLSBzLT5vbGRHZW5TaXplIC0gb2xkR2Vu
Qnl0ZXNSZXF1ZXN0ZWQ7DQoJcy0+bGltaXRQbHVzU2xvcCA9IGgtPnN0YXJ0
ICsgaC0+c2l6ZTsNCglzLT5saW1pdCA9IHMtPmxpbWl0UGx1c1Nsb3AgLSBM
SU1JVF9TTE9QOw0KCWFzc2VydCAoaXNBbGlnbmVkIChudXJzZXJ5U2l6ZSwg
V09SRF9TSVpFKSk7DQoJaWYgKAkoRk9SQ0VfR0VORVJBVElPTkFMDQoJCW9y
ICggDQoJCS8qIFRoZSBtdXRhdG9yIG1hcmtzIGNhcmRzLiAqLw0KCQlzLT5t
dXRhdG9yTWFya3NDYXJkcw0KCQkvKiBUaGUgbGl2ZSByYXRpbyBpcyBsb3cg
ZW5vdWdoIHRvIG1ha2UgZ2VuZXJhdGlvbmFsIEdDDQoJCSAqIHdvcnRod2hp
bGUuDQoJCSAqLw0KCQlhbmQgKGZsb2F0KWgtPnNpemUgLyAoZmxvYXQpcy0+
Ynl0ZXNMaXZlIA0KCQkJPD0gKGgtPnNpemUgPCBzLT5yYW0NCgkJCQk/IHMt
PmNvcHlHZW5lcmF0aW9uYWxSYXRpbw0KCQkJCTogcy0+bWFya0NvbXBhY3RH
ZW5lcmF0aW9uYWxSYXRpbykNCgkJLyogVGhlIG51cnNlcnkgaXMgbGFyZ2Ug
ZW5vdWdoIHRvIGJlIHdvcnRoIGl0LiAqLw0KCQlhbmQgKChmbG9hdCkoaC0+
c2l6ZSAtIHMtPmJ5dGVzTGl2ZSkgDQoJCQkvIChmbG9hdCludXJzZXJ5U2l6
ZSkgPD0gcy0+bnVyc2VyeVJhdGlvDQoJCSkpDQoJCS8qIFRoZXJlIGlzIGVu
b3VnaCBzcGFjZSBpbiB0aGUgbnVyc2VyeS4gKi8NCgkJYW5kIG51cnNlcnlC
eXRlc1JlcXVlc3RlZCANCgkJCTw9IHMtPmxpbWl0UGx1c1Nsb3ANCgkJCQkt
IGFsaWduRnJvbnRpZXIgKHMsIHMtPmxpbWl0UGx1c1Nsb3ANCgkJCQkJCQkt
IG51cnNlcnlTaXplLzIgKyAyKQ0KCQkpIHsNCgkJcy0+Y2FuTWlub3IgPSBU
UlVFOw0KCQludXJzZXJ5U2l6ZSAvPSAyOw0KCQl1bmxlc3MgKGlzQWxpZ25l
ZCAobnVyc2VyeVNpemUsIFdPUkRfU0laRSkpDQoJCQludXJzZXJ5U2l6ZSAt
PSAyOw0KCQljbGVhckNhcmRNYXAgKHMpOw0KCX0gZWxzZSB7DQoJCXVubGVz
cyAobnVyc2VyeUJ5dGVzUmVxdWVzdGVkIA0KCQkJCTw9IHMtPmxpbWl0UGx1
c1Nsb3ANCgkJCQkJLSBhbGlnbkZyb250aWVyIChzLCBzLT5saW1pdFBsdXNT
bG9wDQoJCQkJCQkJCS0gbnVyc2VyeVNpemUpKQ0KCQkJZGllICgiT3V0IG9m
IG1lbW9yeS4gIEluc3VmZmljaWVudCBzcGFjZSBpbiBudXJzZXJ5LiIpOw0K
CQlzLT5jYW5NaW5vciA9IEZBTFNFOw0KCX0NCglhc3NlcnQgKG51cnNlcnlC
eXRlc1JlcXVlc3RlZCANCgkJCTw9IHMtPmxpbWl0UGx1c1Nsb3ANCgkJCQkt
IGFsaWduRnJvbnRpZXIgKHMsIHMtPmxpbWl0UGx1c1Nsb3AgDQoJCQkJCQkJ
LSBudXJzZXJ5U2l6ZSkpOw0KCXMtPm51cnNlcnkgPSBhbGlnbkZyb250aWVy
IChzLCBzLT5saW1pdFBsdXNTbG9wIC0gbnVyc2VyeVNpemUpOw0KCXMtPmZy
b250aWVyID0gcy0+bnVyc2VyeTsNCglhc3NlcnQgKG51cnNlcnlCeXRlc1Jl
cXVlc3RlZCA8PSBzLT5saW1pdFBsdXNTbG9wIC0gcy0+ZnJvbnRpZXIpOw0K
CWFzc2VydCAoaXNBbGlnbmVkRnJvbnRpZXIgKHMsIHMtPm51cnNlcnkpKTsN
Cglhc3NlcnQgKGhhc0J5dGVzRnJlZSAocywgb2xkR2VuQnl0ZXNSZXF1ZXN0
ZWQsIG51cnNlcnlCeXRlc1JlcXVlc3RlZCkpOw0KfQ0KDQpzdGF0aWMgaW5s
aW5lIHZvaWQgY2xlYXJDcm9zc01hcCAoR0Nfc3RhdGUgcykgew0KCWlmIChE
RUJVR19HRU5FUkFUSU9OQUwgYW5kIERFQlVHX0RFVEFJTEVEKQ0KCQlmcHJp
bnRmIChzdGRlcnIsICJjbGVhckNyb3NzTWFwICgpXG4iKTsNCglzLT5jcm9z
c01hcFZhbGlkU2l6ZSA9IDA7DQoJbWVtc2V0IChzLT5jcm9zc01hcCwgQ1JP
U1NfTUFQX0VNUFRZLCBzLT5jcm9zc01hcFNpemUpOw0KfQ0KDQpzdGF0aWMg
dm9pZCBzZXRDYXJkTWFwRm9yTXV0YXRvciAoR0Nfc3RhdGUgcykgew0KCXVu
bGVzcyAocy0+bXV0YXRvck1hcmtzQ2FyZHMpDQoJCXJldHVybjsNCgkvKiBJ
dCdzIE9LIGlmIHRoZSBzdWJ0cmFjdGlvbiBiZWxvdyB1bmRlcmZsb3dzIGJl
Y2F1c2UgYWxsIHRoZSANCiAgICAgICAgICogc3Vic2VxdWVudCBhZGRpdGlv
bnMgdG8gbWFyayB0aGUgY2FyZHMgd2lsbCBvdmVyZmxvdyBhbmQgcHV0IHVz
DQoJICogaW4gdGhlIHJpZ2h0IHBsYWNlLg0KICAgICAgICAgKi8NCglzLT5j
YXJkTWFwRm9yTXV0YXRvciA9IHMtPmNhcmRNYXAgLSBkaXZDYXJkU2l6ZSAo
cywgKHVpbnQpcy0+aGVhcC5zdGFydCk7DQoJaWYgKERFQlVHX0NBUkRfTUFS
S0lORykNCgkJZnByaW50ZiAoc3RkZXJyLCAiY2FyZE1hcEZvck11dGF0b3Ig
PSAweCUwOHhcbiIsDQoJCQkJKHVpbnQpcy0+Y2FyZE1hcEZvck11dGF0b3Ip
Ow0KfQ0KDQpzdGF0aWMgdm9pZCBjcmVhdGVDYXJkTWFwQW5kQ3Jvc3NNYXAg
KEdDX3N0YXRlIHMpIHsNCglHQ19oZWFwIGg7DQoNCgl1bmxlc3MgKHMtPm11
dGF0b3JNYXJrc0NhcmRzKSB7DQoJCXMtPmNhcmRNYXBTaXplID0gMDsNCgkJ
cy0+Y2FyZE1hcCA9IE5VTEw7DQoJCXMtPmNhcmRNYXBGb3JNdXRhdG9yID0g
TlVMTDsNCgkJcy0+Y3Jvc3NNYXBTaXplID0gMDsNCgkJcy0+Y3Jvc3NNYXAg
PSBOVUxMOw0KCQlyZXR1cm47DQoJfQ0KCWggPSAmcy0+aGVhcDsNCglhc3Nl
cnQgKGlzQWxpZ25lZCAoaC0+c2l6ZSwgcy0+Y2FyZFNpemUpKTsNCglzLT5j
YXJkTWFwU2l6ZSA9IGFsaWduIChkaXZDYXJkU2l6ZSAocywgaC0+c2l6ZSks
IHMtPnBhZ2VTaXplKTsNCglzLT5jcm9zc01hcFNpemUgPSBzLT5jYXJkTWFw
U2l6ZTsNCglpZiAoREVCVUdfTUVNKQ0KCQlmcHJpbnRmIChzdGRlcnIsICJD
cmVhdGluZyBjYXJkL2Nyb3NzIG1hcCBvZiBzaXplICVzXG4iLA0KCQkJCXVp
bnRUb0NvbW1hU3RyaW5nDQoJCQkJCShzLT5jYXJkTWFwU2l6ZSArIHMtPmNy
b3NzTWFwU2l6ZSkpOw0KCXMtPmNhcmRNYXAgPSBzbW1hcCAocy0+Y2FyZE1h
cFNpemUgKyBzLT5jcm9zc01hcFNpemUpOw0KCXMtPmNyb3NzTWFwID0gcy0+
Y2FyZE1hcCArIHMtPmNhcmRNYXBTaXplOw0KCWlmIChERUJVR19DQVJEX01B
UktJTkcpDQoJCWZwcmludGYgKHN0ZGVyciwgImNhcmRNYXAgPSAweCUwOHgg
IGNyb3NzTWFwID0gMHglMDh4XG4iLCANCgkJCQkodWludClzLT5jYXJkTWFw
LA0KCQkJCSh1aW50KXMtPmNyb3NzTWFwKTsNCglzZXRDYXJkTWFwRm9yTXV0
YXRvciAocyk7DQoJY2xlYXJDcm9zc01hcCAocyk7DQp9DQoNCi8qIGhlYXBD
cmVhdGUgKHMsIGgsIG5lZWQsIG1pblNpemUpIGFsbG9jYXRlcyBhIGhlYXAg
b2YgdGhlIHNpemUgbmVjZXNzYXJ5IHRvDQogKiB3b3JrIHdpdGggbmVlZCBs
aXZlIGRhdGEsIGFuZCBlbnN1cmVzIHRoYXQgYXQgbGVhc3QgbWluU2l6ZSBp
cyBhdmFpbGFibGUuDQogKiBJdCByZXR1cm5zIFRSVUUgaWYgaXQgaXMgYWJs
ZSB0byBhbGxvY2F0ZSB0aGUgc3BhY2UsIGFuZCByZXR1cm5zIEZBTFNFIGlm
IGl0DQogKiBpcyB1bmFibGUuICBJZiBhIHJlYXNvbmFibGUgc2l6ZSB0byBz
cGFjZSBpcyBhbHJlYWR5IHRoZXJlLCB0aGVuIGhlYXBDcmVhdGUNCiAqIGxl
YXZlcyBpdC4NCiAqLw0Kc3RhdGljIGJvb2wgaGVhcENyZWF0ZSAoR0Nfc3Rh
dGUgcywgR0NfaGVhcCBoLCBXMzIgZGVzaXJlZFNpemUsIFczMiBtaW5TaXpl
KSB7DQoJVzMyIGJhY2tvZmY7DQoNCglpZiAoREVCVUcpDQoJCWZwcmludGYg
KHN0ZGVyciwgImhlYXBDcmVhdGUgIGRlc2lyZWQgc2l6ZSA9ICVzICBtaW4g
c2l6ZSA9ICVzXG4iLA0KCQkJCXVpbnRUb0NvbW1hU3RyaW5nIChkZXNpcmVk
U2l6ZSksDQoJCQkJdWludFRvQ29tbWFTdHJpbmcgKG1pblNpemUpKTsNCglh
c3NlcnQgKGhlYXBJc0luaXQgKGgpKTsNCglpZiAoZGVzaXJlZFNpemUgPCBt
aW5TaXplKQ0KCQlkZXNpcmVkU2l6ZSA9IG1pblNpemU7DQogCWRlc2lyZWRT
aXplID0gYWxpZ24gKGRlc2lyZWRTaXplLCBzLT5wYWdlU2l6ZSk7DQoJYXNz
ZXJ0ICgwID09IGgtPnNpemUgYW5kIE5VTEwgPT0gaC0+c3RhcnQpOw0KCWJh
Y2tvZmYgPSAoZGVzaXJlZFNpemUgLSBtaW5TaXplKSAvIDIwOw0KCWlmICgw
ID09IGJhY2tvZmYpDQoJCWJhY2tvZmYgPSAxOyAvKiBlbm91Z2ggdG8gdGVy
bWluYXRlIHRoZSBsb29wIGJlbG93ICovDQoJYmFja29mZiA9IGFsaWduIChi
YWNrb2ZmLCBzLT5wYWdlU2l6ZSk7DQoJLyogbW1hcCB0b2dnbGluZyBiYWNr
IGFuZCBmb3J0aCBiZXR3ZWVuIGhpZ2ggYW5kIGxvdyBhZGRyZXNzZXMgdG8N
CiAgICAgICAgICogZGVjcmVhc2UgdGhlIGNoYW5jZSBvZiB2aXJ0dWFsIG1l
bW9yeSBmcmFnbWVudGF0aW9uIGNhdXNpbmcgYW4gbW1hcA0KCSAqIHRvIGZh
aWwuICBUaGlzIGlzIGltcG9ydGFudCBmb3IgbGFyZ2UgaGVhcHMuDQoJICov
DQoJZm9yIChoLT5zaXplID0gZGVzaXJlZFNpemU7IGgtPnNpemUgPj0gbWlu
U2l6ZTsgaC0+c2l6ZSAtPSBiYWNrb2ZmKSB7DQoJCXN0YXRpYyBpbnQgZGly
ZWN0aW9uID0gMTsNCgkJaW50IGk7DQoNCgkJYXNzZXJ0IChpc0FsaWduZWQg
KGgtPnNpemUsIHMtPnBhZ2VTaXplKSk7DQoJCWZvciAoaSA9IDA7IGkgPCAz
MjsgaSsrKSB7DQoJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3M7DQoNCgkJCWFk
ZHJlc3MgPSBpICogMHgwODAwMDAwMHVsOw0KCQkJaWYgKGRpcmVjdGlvbikN
CgkJCQlhZGRyZXNzID0gMHhmODAwMDAwMHVsIC0gYWRkcmVzczsNCi8qIEZJ
WE1FLg0KICogVGhpcyAjaWYgaXMgaGVyZSBiZWNhdXNlIG9uIFdpbmRvd3Ms
IHRoZSBhZGRyZXNzIHBhc3NlZCB0byBtbWFwQW5vbiwgd2hpY2ggDQogKiBj
YWxscyBWaXJ0dWFsQWxsb2MsIGRvZXNuJ3Qgc2VlbSB0byBtYXR0ZXIuDQog
Ki8NCiNpZiAoZGVmaW5lZCAoX19DWUdXSU5fXykpDQoJCQlhZGRyZXNzID0g
MDsgDQoJCQlpID0gMzE7DQojZW5kaWYNCgkJCWgtPnN0YXJ0ID0gbW1hcEFu
b24gKCh2b2lkKilhZGRyZXNzLCBoLT5zaXplKTsNCgkJCWlmICgodm9pZCop
LTEgPT0gaC0+c3RhcnQpDQoJCQkJaC0+c3RhcnQgPSAodm9pZCopTlVMTDsN
CgkJCXVubGVzcyAoKHZvaWQqKU5VTEwgPT0gaC0+c3RhcnQpIHsNCgkJCQlk
aXJlY3Rpb24gPSAoZGlyZWN0aW9uPT0wKTsNCgkJCQlpZiAoaC0+c2l6ZSA+
IHMtPm1heEhlYXBTaXplU2VlbikNCgkJCQkJcy0+bWF4SGVhcFNpemVTZWVu
ID0gaC0+c2l6ZTsNCgkJCQlpZiAoREVCVUcgb3Igcy0+bWVzc2FnZXMpDQoJ
CQkJCWZwcmludGYgKHN0ZGVyciwgIkNyZWF0ZWQgaGVhcCBvZiBzaXplICVz
IGF0IDB4JTA4eC5cbiIsDQoJCQkJCQkJdWludFRvQ29tbWFTdHJpbmcgKGgt
PnNpemUpLA0KCQkJCQkJCSh1aW50KWgtPnN0YXJ0KTsNCgkJCQlhc3NlcnQg
KGgtPnNpemUgPj0gbWluU2l6ZSk7DQoJCQkJcmV0dXJuIFRSVUU7DQoJCQl9
DQoJCX0NCgkJaWYgKHMtPm1lc3NhZ2VzKQ0KCQkJZnByaW50ZihzdGRlcnIs
ICJbUmVxdWVzdGVkICVsdU0gY2Fubm90IGJlIHNhdGlzZmllZCwgYmFja2lu
ZyBvZmYgYnkgJWx1TSAobWluIHNpemUgPSAlbHVNKS5cbiIsDQoJCQkJbWVn
IChoLT5zaXplKSwgbWVnIChiYWNrb2ZmKSwgbWVnIChtaW5TaXplKSk7DQoJ
fQ0KCWgtPnNpemUgPSAwOw0KCXJldHVybiBGQUxTRTsNCn0NCg0Kc3RhdGlj
IGlubGluZSB1aW50IG9iamVjdFNpemUgKEdDX3N0YXRlIHMsIHBvaW50ZXIg
cCkgew0KCXVpbnQgaGVhZGVyQnl0ZXMsIG9iamVjdEJ5dGVzOw0KICAgICAg
IAl3b3JkIGhlYWRlcjsNCgl1aW50IHRhZywgbnVtUG9pbnRlcnMsIG51bU5v
blBvaW50ZXJzOw0KDQoJaGVhZGVyID0gR0NfZ2V0SGVhZGVyKHApOw0KCVNQ
TElUX0hFQURFUigpOw0KCWlmIChOT1JNQUxfVEFHID09IHRhZykgeyAvKiBG
aXhlZCBzaXplIG9iamVjdC4gKi8NCgkJaGVhZGVyQnl0ZXMgPSBHQ19OT1JN
QUxfSEVBREVSX1NJWkU7DQoJCW9iamVjdEJ5dGVzID0gdG9CeXRlcyAobnVt
UG9pbnRlcnMgKyBudW1Ob25Qb2ludGVycyk7DQoJfSBlbHNlIGlmIChBUlJB
WV9UQUcgPT0gdGFnKSB7DQoJCWhlYWRlckJ5dGVzID0gR0NfQVJSQVlfSEVB
REVSX1NJWkU7DQoJCW9iamVjdEJ5dGVzID0gYXJyYXlOdW1CeXRlcyAocywg
cCwgbnVtUG9pbnRlcnMsIG51bU5vblBvaW50ZXJzKTsNCgl9IGVsc2UgaWYg
KFdFQUtfVEFHID09IHRhZykgew0KCQloZWFkZXJCeXRlcyA9IEdDX05PUk1B
TF9IRUFERVJfU0laRTsNCgkJb2JqZWN0Qnl0ZXMgPSBzaXplb2YgKHN0cnVj
dCBHQ193ZWFrKTsNCgl9IGVsc2UgeyAvKiBTdGFjay4gKi8NCgkJYXNzZXJ0
IChTVEFDS19UQUcgPT0gdGFnKTsNCgkJaGVhZGVyQnl0ZXMgPSBTVEFDS19I
RUFERVJfU0laRTsNCgkJb2JqZWN0Qnl0ZXMgPSBzaXplb2YgKHN0cnVjdCBH
Q19zdGFjaykgKyAoKEdDX3N0YWNrKXApLT5yZXNlcnZlZDsNCgl9DQoJcmV0
dXJuIGhlYWRlckJ5dGVzICsgb2JqZWN0Qnl0ZXM7DQp9DQoNCi8qIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgICAgICAgICAgICBDaGVu
ZXkgQ29weWluZyBDb2xsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8N
Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyogZm9yd2FyZCAocywg
cHApIGZvcndhcmRzIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSAqcHAgYW5k
IHVwZGF0ZXMgKnBwIHRvIA0KICogcG9pbnQgdG8gdGhlIG5ldyBvYmplY3Qu
IA0KICogSXQgYWxzbyB1cGRhdGVzIHRoZSBjcm9zc01hcC4NCiAqLw0Kc3Rh
dGljIGlubGluZSB2b2lkIGZvcndhcmQgKEdDX3N0YXRlIHMsIHBvaW50ZXIg
KnBwKSB7DQoJcG9pbnRlciBwOw0KCXdvcmQgaGVhZGVyOw0KCXdvcmQgdGFn
Ow0KDQoJaWYgKERFQlVHX0RFVEFJTEVEKQ0KCQlmcHJpbnRmIChzdGRlcnIs
ICJmb3J3YXJkICBwcCA9IDB4JXggICpwcCA9IDB4JXhcbiIsICh1aW50KXBw
LCAqKHVpbnQqKXBwKTsNCglhc3NlcnQgKGlzSW5Gcm9tU3BhY2UgKHMsICpw
cCkpOw0KCXAgPSAqcHA7DQoJaGVhZGVyID0gR0NfZ2V0SGVhZGVyIChwKTsN
CglpZiAoREVCVUdfREVUQUlMRUQgYW5kIEZPUldBUkRFRCA9PSBoZWFkZXIp
DQoJCWZwcmludGYgKHN0ZGVyciwgImFscmVhZHkgRk9SV0FSREVEXG4iKTsN
CglpZiAoaGVhZGVyICE9IEZPUldBUkRFRCkgeyAvKiBmb3J3YXJkIHRoZSBv
YmplY3QgKi8NCgkJdWludCBoZWFkZXJCeXRlcywgb2JqZWN0Qnl0ZXMsIHNp
emUsIHNraXA7DQoJCXVpbnQgbnVtUG9pbnRlcnMsIG51bU5vblBvaW50ZXJz
Ow0KDQoJCS8qIENvbXB1dGUgdGhlIHNwYWNlIHRha2VuIGJ5IHRoZSBoZWFk
ZXIgYW5kIG9iamVjdCBib2R5LiAqLw0KCQlTUExJVF9IRUFERVIoKTsNCgkJ
aWYgKE5PUk1BTF9UQUcgPT0gdGFnKSB7IC8qIEZpeGVkIHNpemUgb2JqZWN0
LiAqLw0KCQkJaGVhZGVyQnl0ZXMgPSBHQ19OT1JNQUxfSEVBREVSX1NJWkU7
DQoJCQlvYmplY3RCeXRlcyA9IHRvQnl0ZXMgKG51bVBvaW50ZXJzICsgbnVt
Tm9uUG9pbnRlcnMpOw0KCQkJc2tpcCA9IDA7DQoJCX0gZWxzZSBpZiAoQVJS
QVlfVEFHID09IHRhZykgew0KCQkJaGVhZGVyQnl0ZXMgPSBHQ19BUlJBWV9I
RUFERVJfU0laRTsNCgkJCW9iamVjdEJ5dGVzID0gYXJyYXlOdW1CeXRlcyAo
cywgcCwgbnVtUG9pbnRlcnMsDQoJCQkJCQkJbnVtTm9uUG9pbnRlcnMpOw0K
CQkJc2tpcCA9IDA7DQoJCX0gZWxzZSBpZiAoV0VBS19UQUcgPT0gdGFnKSB7
DQoJCQloZWFkZXJCeXRlcyA9IEdDX05PUk1BTF9IRUFERVJfU0laRTsNCgkJ
CW9iamVjdEJ5dGVzID0gc2l6ZW9mIChzdHJ1Y3QgR0Nfd2Vhayk7DQoJCQlz
a2lwID0gMDsNCgkJfSBlbHNlIHsgLyogU3RhY2suICovDQoJCQlHQ19zdGFj
ayBzdGFjazsNCg0KCQkJYXNzZXJ0IChTVEFDS19UQUcgPT0gdGFnKTsNCgkJ
CWhlYWRlckJ5dGVzID0gU1RBQ0tfSEVBREVSX1NJWkU7DQoJCQkvKiBTaHJp
bmsgc3RhY2tzIHRoYXQgZG9uJ3QgdXNlIGEgbG90IG9mIHRoZWlyIHJlc2Vy
dmVkDQoJCSAJICogc3BhY2UuDQoJCQkgKi8NCgkJCXN0YWNrID0gKEdDX3N0
YWNrKXA7DQoJCQlpZiAoc3RhY2stPnVzZWQgPD0gc3RhY2stPnJlc2VydmVk
IC8gNCkgew0KCQkJCVczMiBuZXc7DQoNCgkJCQlpZiAoREVCVUdfVEhSRUFE
UykNCgkJCQkJZnByaW50ZiAoc3RkZXJyLCAiZm9yd2FyZCAoMHglMDh4KSAg
dXNlZCA9ICV1ICByZXNlcnZlZCA9ICV1XG4iLCANCgkJCQkJCQkodWludClz
dGFjaywgc3RhY2stPnVzZWQsIHN0YWNrLT5yZXNlcnZlZCk7DQoNCgkJCQlu
ZXcgPSBzdGFja1Jlc2VydmVkDQoJCQkJCSAocywgbWF4IChzdGFjay0+cmVz
ZXJ2ZWQgLyAyLCANCgkJCQkJCQlzdGFja05lZWRzUmVzZXJ2ZWQgKHMsIHN0
YWNrKSkpOw0KCQkJCS8qIEl0J3MgcG9zc2libGUgdGhhdCBuZXcgPiBzdGFj
ay0+cmVzZXJ2ZWQgaWYNCgkJCQkgKiB0aGUgc3RhY2sgaXMgdGhlIGN1cnJl
bnQgb25lIGFuZCB0aGUgc3RhY2sNCgkJCQkgKiB0b3AgaXNuJ3QgT0suICBJ
biB0aGF0IGNhc2UsIHdlIHdhbnQgdG8gbGVhdmUNCgkJCQkgKiB0aGUgc3Rh
Y2sgYWxvbmUsIGJlY2F1c2Ugc29tZSBvdGhlciBwYXJ0IG9mDQoJCQkJICog
dGhlIGdjIHdpbGwgZ3JvdyB0aGUgc3RhY2suICBXZSBjYW5ub3QgZG8gYW55
DQoJCQkJICogZ3Jvd2luZyBoZXJlIGJlY2F1c2Ugd2UgbWF5IHJ1biBvdXQg
b2YgdG8NCgkJCQkgKiBzcGFjZS4NCgkJCQkgKi8NCgkJCQlpZiAobmV3IDw9
IHN0YWNrLT5yZXNlcnZlZCkNCgkJCQkJc3RhY2stPnJlc2VydmVkID0gbmV3
Ow0KCQkJfQ0KCQkJb2JqZWN0Qnl0ZXMgPSBzaXplb2YgKHN0cnVjdCBHQ19z
dGFjaykgKyBzdGFjay0+dXNlZDsNCgkJCXNraXAgPSBzdGFjay0+cmVzZXJ2
ZWQgLSBzdGFjay0+dXNlZDsNCgkJfQ0KCQlzaXplID0gaGVhZGVyQnl0ZXMg
KyBvYmplY3RCeXRlczsNCgkJYXNzZXJ0IChzLT5iYWNrICsgc2l6ZSArIHNr
aXAgPD0gcy0+dG9MaW1pdCk7DQogIAkJLyogQ29weSB0aGUgb2JqZWN0LiAq
Lw0KCQljb3B5IChwIC0gaGVhZGVyQnl0ZXMsIHMtPmJhY2ssIHNpemUpOw0K
CQkvKiBJZiB0aGUgb2JqZWN0IGhhcyBhIHZhbGlkIHdlYWsgcG9pbnRlciwg
bGluayBpdCBpbnRvIHRoZSB3ZWFrcw0KCQkgKiBmb3IgdXBkYXRlIGFmdGVy
IHRoZSBjb3B5aW5nIEdDIGlzIGRvbmUuDQoJCSAqLw0KCQlpZiAoV0VBS19U
QUcgPT0gdGFnIGFuZCAxID09IG51bVBvaW50ZXJzKSB7DQoJCQlHQ193ZWFr
IHc7DQoNCgkJCXcgPSAoR0Nfd2Vhaykocy0+YmFjayArIEdDX05PUk1BTF9I
RUFERVJfU0laRSk7DQoJCQlpZiAoREVCVUdfV0VBSykNCgkJCQlmcHJpbnRm
IChzdGRlcnIsICJmb3J3YXJkaW5nIHdlYWsgMHglMDh4ICIsDQoJCQkJCQko
dWludCl3KTsNCgkJCWlmIChHQ19pc1BvaW50ZXIgKHctPm9iamVjdCkNCgkJ
CQlhbmQgKG5vdCBzLT5hbUluTWlub3JHQw0KCQkJCQlvciBpc0luTnVyc2Vy
eSAocywgdy0+b2JqZWN0KSkpIHsNCgkJCQlpZiAoREVCVUdfV0VBSykNCgkJ
CQkJZnByaW50ZiAoc3RkZXJyLCAibGlua2luZ1xuIik7DQoJCQkJdy0+bGlu
ayA9IHMtPndlYWtzOw0KCQkJCXMtPndlYWtzID0gdzsNCgkJCX0gZWxzZSB7
DQoJCQkJaWYgKERFQlVHX1dFQUspDQoJCQkJCWZwcmludGYgKHN0ZGVyciwg
Im5vdCBsaW5raW5nXG4iKTsNCgkJCX0NCgkJfQ0KIAkJLyogU3RvcmUgdGhl
IGZvcndhcmRpbmcgcG9pbnRlciBpbiB0aGUgb2xkIG9iamVjdC4gKi8NCgkJ
Kih3b3JkKikocCAtIFdPUkRfU0laRSkgPSBGT1JXQVJERUQ7DQoJCSoocG9p
bnRlciopcCA9IHMtPmJhY2sgKyBoZWFkZXJCeXRlczsNCgkJLyogVXBkYXRl
IHRoZSBiYWNrIG9mIHRoZSBxdWV1ZS4gKi8NCgkJcy0+YmFjayArPSBzaXpl
ICsgc2tpcDsNCgkJYXNzZXJ0IChpc0FsaWduZWQgKCh1aW50KXMtPmJhY2sg
KyBHQ19OT1JNQUxfSEVBREVSX1NJWkUsDQoJCQkJCXMtPmFsaWdubWVudCkp
Ow0KCX0NCgkqcHAgPSAqKHBvaW50ZXIqKXA7DQoJYXNzZXJ0IChpc0luVG9T
cGFjZSAocywgKnBwKSk7DQp9DQoNCnN0YXRpYyB2b2lkIHVwZGF0ZVdlYWtz
IChHQ19zdGF0ZSBzKSB7DQoJR0Nfd2VhayB3Ow0KDQoJZm9yICh3ID0gcy0+
d2Vha3M7IHcgIT0gTlVMTDsgdyA9IHctPmxpbmspIHsNCgkJYXNzZXJ0ICgo
cG9pbnRlcilCT0dVU19QT0lOVEVSICE9IHctPm9iamVjdCk7DQoNCgkJaWYg
KERFQlVHX1dFQUspDQoJCQlmcHJpbnRmIChzdGRlcnIsICJ1cGRhdGVXZWFr
cyAgdyA9IDB4JTA4eCAgIiwgKHVpbnQpdyk7DQoJCWlmIChGT1JXQVJERUQg
PT0gR0NfZ2V0SGVhZGVyICgocG9pbnRlcil3LT5vYmplY3QpKSB7DQoJCQlp
ZiAoREVCVUdfV0VBSykNCgkJCQlmcHJpbnRmIChzdGRlcnIsICJmb3J3YXJk
ZWQgZnJvbSAweCUwOHggdG8gMHglMDh4XG4iLA0KCQkJCQkJKHVpbnQpdy0+
b2JqZWN0LA0KCQkJCQkJKHVpbnQpKihwb2ludGVyKil3LT5vYmplY3QpOw0K
CQkJdy0+b2JqZWN0ID0gKihwb2ludGVyKil3LT5vYmplY3Q7DQoJCX0gZWxz
ZSB7DQoJCQlpZiAoREVCVUdfV0VBSykNCgkJCQlmcHJpbnRmIChzdGRlcnIs
ICJjbGVhcmVkXG4iKTsNCgkJCSooR0NfZ2V0SGVhZGVycCgocG9pbnRlcil3
KSkgPSBXRUFLX0dPTkVfSEVBREVSOw0KCQkJdy0+b2JqZWN0ID0gKHBvaW50
ZXIpQk9HVVNfUE9JTlRFUjsNCgkJfQ0KCX0NCglzLT53ZWFrcyA9IE5VTEw7
DQp9DQoNCnN0YXRpYyB2b2lkIHN3YXBTZW1pcyAoR0Nfc3RhdGUgcykgew0K
CXN0cnVjdCBHQ19oZWFwIGg7DQoNCgloID0gcy0+aGVhcDI7DQoJcy0+aGVh
cDIgPSBzLT5oZWFwOw0KCXMtPmhlYXAgPSBoOw0KCXNldENhcmRNYXBGb3JN
dXRhdG9yIChzKTsNCn0NCg0Kc3RhdGljIGlubGluZSBib29sIGRldGFpbGVk
R0NUaW1lIChHQ19zdGF0ZSBzKSB7DQoJcmV0dXJuIHMtPnN1bW1hcnk7DQp9
DQoNCnN0YXRpYyB2b2lkIGNoZW5leUNvcHkgKEdDX3N0YXRlIHMpIHsNCglz
dHJ1Y3QgcnVzYWdlIHJ1X3N0YXJ0Ow0KCXBvaW50ZXIgdG9TdGFydDsNCg0K
CWFzc2VydCAocy0+aGVhcDIuc2l6ZSA+PSBzLT5vbGRHZW5TaXplKTsNCglp
ZiAoZGV0YWlsZWRHQ1RpbWUgKHMpKQ0KCQlzdGFydFRpbWluZyAoJnJ1X3N0
YXJ0KTsNCglzLT5udW1Db3B5aW5nR0NzKys7DQoJcy0+dG9TcGFjZSA9IHMt
PmhlYXAyLnN0YXJ0Ow0KCXMtPnRvTGltaXQgPSBzLT5oZWFwMi5zdGFydCAr
IHMtPmhlYXAyLnNpemU7DQogCWlmIChERUJVRyBvciBzLT5tZXNzYWdlcykg
ew0KCQlmcHJpbnRmIChzdGRlcnIsICJNYWpvciBjb3B5aW5nIEdDLlxuIik7
DQoJIAlmcHJpbnRmIChzdGRlcnIsICJmcm9tU3BhY2UgPSAweCUwOHggb2Yg
c2l6ZSAlc1xuIiwgDQoJCQkJKHVpbnQpIHMtPmhlYXAuc3RhcnQsDQoJCQkJ
dWludFRvQ29tbWFTdHJpbmcgKHMtPmhlYXAuc2l6ZSkpOw0KCQlmcHJpbnRm
IChzdGRlcnIsICJ0b1NwYWNlID0gMHglMDh4IG9mIHNpemUgJXNcbiIsDQoJ
CQkJKHVpbnQpIHMtPmhlYXAyLnN0YXJ0LA0KCQkJCXVpbnRUb0NvbW1hU3Ry
aW5nIChzLT5oZWFwMi5zaXplKSk7DQoJfQ0KCWFzc2VydCAocy0+aGVhcDIu
c3RhcnQgIT0gKHZvaWQqKU5VTEwpOw0KCS8qIFRoZSBuZXh0IGFzc2VydCBl
bnN1cmVzIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBmb3IgdGhlIGNvcHkgdG8g
c3VjY2VlZC4NCgkgKiBJdCBkb2VzIG5vdCBhc3NlcnQgKHMtPmhlYXAyLnNp
emUgPj0gcy0+aGVhcC5zaXplKSBiZWNhdXNlIHRoYXQNCiAgICAgICAgICog
aXMgdG9vIHN0cm9uZy4NCgkgKi8NCglhc3NlcnQgKHMtPmhlYXAyLnNpemUg
Pj0gcy0+b2xkR2VuU2l6ZSk7DQoJdG9TdGFydCA9IGFsaWduRnJvbnRpZXIg
KHMsIHMtPmhlYXAyLnN0YXJ0KTsNCglzLT5iYWNrID0gdG9TdGFydDsNCglm
b3JlYWNoR2xvYmFsIChzLCBmb3J3YXJkKTsNCglmb3JlYWNoUG9pbnRlcklu
UmFuZ2UgKHMsIHRvU3RhcnQsICZzLT5iYWNrLCBUUlVFLCBmb3J3YXJkKTsN
Cgl1cGRhdGVXZWFrcyAocyk7DQoJcy0+b2xkR2VuU2l6ZSA9IHMtPmJhY2sg
LSBzLT5oZWFwMi5zdGFydDsNCglzLT5ieXRlc0NvcGllZCArPSBzLT5vbGRH
ZW5TaXplOw0KCWlmIChERUJVRykNCgkJZnByaW50ZiAoc3RkZXJyLCAiJXMg
Ynl0ZXMgbGl2ZS5cbiIsIA0KCQkJCXVpbnRUb0NvbW1hU3RyaW5nIChzLT5v
bGRHZW5TaXplKSk7DQoJc3dhcFNlbWlzIChzKTsNCgljbGVhckNyb3NzTWFw
IChzKTsNCglpZiAoZGV0YWlsZWRHQ1RpbWUgKHMpKQ0KCQlzdG9wVGltaW5n
ICgmcnVfc3RhcnQsICZzLT5ydV9nY0NvcHkpOwkJDQogCWlmIChERUJVRyBv
ciBzLT5tZXNzYWdlcykNCgkJZnByaW50ZiAoc3RkZXJyLCAiTWFqb3IgY29w
eWluZyBHQyBkb25lLlxuIik7DQp9DQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8NCi8qICAgICAgICAgICAgICAgICAgICAgTWlub3IgY29weWluZyBj
b2xsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8NCi8qIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8NCg0KI2lmIEFTU0VSVA0KDQpzdGF0aWMgaW5saW5l
IHBvaW50ZXIgY3Jvc3NNYXBDYXJkU3RhcnQgKEdDX3N0YXRlIHMsIHBvaW50
ZXIgcCkgew0KCS8qIFRoZSBwIC0gMSBpcyBzbyB0aGF0IGEgcG9pbnRlciB0
byB0aGUgYmVnaW5uaW5nIG9mIGEgY2FyZA0KCSAqIGZhbGxzIGludG8gdGhl
IGluZGV4IGZvciB0aGUgcHJldmlvdXMgY3Jvc3NNYXAgZW50cnkuDQoJICov
DQoJcmV0dXJuIChwID09IHMtPmhlYXAuc3RhcnQpDQoJCT8gcy0+aGVhcC5z
dGFydA0KCQk6IChwIC0gMSkgLSAoKHVpbnQpKHAgLSAxKSAlIHMtPmNhcmRT
aXplKTsNCn0NCg0KLyogY3Jvc3NNYXBJc09LIGlzIGEgc2xvd2VyLCBidXQg
ZWFzaWVyIHRvIHVuZGVyc3RhbmQsIHdheSBvZiBjb21wdXRpbmcgdGhlDQog
KiBjcm9zc01hcC4gIHVwZGF0ZUNyb3NzTWFwIChiZWxvdykgaW5jcmVtZW50
YWxseSB1cGRhdGVzIHRoZSBjcm9zc01hcCwgY2hlY2tpbmcNCiAqIG9ubHkg
dGhlIHBhcnQgb2YgdGhlIG9sZCBnZW5lcmF0aW9uIHRoYXQgaXQgaGFzbid0
IHNlZW4gYmVmb3JlLiAgY3Jvc3NNYXBJc09LDQogKiBzaW1wbHkgd2Fsa3Mg
dGhyb3VnaCB0aGUgZW50aXJlIG9sZCBnZW5lcmF0aW9uLiAgSXQgaXMgdXNl
ZnVsIHRvIGNoZWNrIHRoYXQNCiAqIHRoZSBpbmNyZW1lbnRhbCB1cGRhdGUg
aXMgd29ya2luZyBjb3JyZWN0bHkuDQogKi8NCnN0YXRpYyBib29sIGNyb3Nz
TWFwSXNPSyAoR0Nfc3RhdGUgcykgew0KCXBvaW50ZXIgYmFjazsNCgl1aW50
IGNhcmRJbmRleDsNCglwb2ludGVyIGNhcmRTdGFydDsNCglwb2ludGVyIGZy
b250Ow0KCXVpbnQgaTsNCglzdGF0aWMgdWNoYXIgKm07DQoNCglpZiAoREVC
VUcpDQoJCWZwcmludGYgKHN0ZGVyciwgImNyb3NzTWFwSXNPSyAoKVxuIik7
DQoJbSA9IHNtbWFwIChzLT5jcm9zc01hcFNpemUpOw0KCW1lbXNldCAobSwg
Q1JPU1NfTUFQX0VNUFRZLCBzLT5jcm9zc01hcFNpemUpOw0KCWJhY2sgPSBz
LT5oZWFwLnN0YXJ0ICsgcy0+b2xkR2VuU2l6ZTsNCgljYXJkSW5kZXggPSAw
Ow0KCWZyb250ID0gYWxpZ25Gcm9udGllciAocywgcy0+aGVhcC5zdGFydCk7
DQpsb29wT2JqZWN0czoNCglhc3NlcnQgKGZyb250IDw9IGJhY2spOw0KCWNh
cmRTdGFydCA9IGNyb3NzTWFwQ2FyZFN0YXJ0IChzLCBmcm9udCk7DQoJY2Fy
ZEluZGV4ID0gZGl2Q2FyZFNpemUgKHMsIGNhcmRTdGFydCAtIHMtPmhlYXAu
c3RhcnQpOw0KCW1bY2FyZEluZGV4XSA9IChmcm9udCAtIGNhcmRTdGFydCkg
LyBXT1JEX1NJWkU7DQoJaWYgKGZyb250IDwgYmFjaykgew0KCQlmcm9udCAr
PSBvYmplY3RTaXplIChzLCB0b0RhdGEgKHMsIGZyb250KSk7DQoJCWdvdG8g
bG9vcE9iamVjdHM7DQoJfQ0KCWZvciAoaSA9IDA7IGkgPCBjYXJkSW5kZXg7
ICsraSkNCgkJYXNzZXJ0IChtW2ldID09IHMtPmNyb3NzTWFwW2ldKTsNCgly
ZWxlYXNlIChtLCBzLT5jcm9zc01hcFNpemUpOw0KCXJldHVybiBUUlVFOw0K
fQ0KDQojZW5kaWYgLyogQVNTRVJUICovDQoNCnN0YXRpYyB2b2lkIHVwZGF0
ZUNyb3NzTWFwIChHQ19zdGF0ZSBzKSB7DQoJR0NfaGVhcCBoOw0KCXBvaW50
ZXIgY2FyZEVuZDsNCgl1aW50IGNhcmRJbmRleDsNCglwb2ludGVyIGNhcmRT
dGFydDsNCglwb2ludGVyIG5leHQ7DQoJcG9pbnRlciBvYmplY3RTdGFydDsN
Cglwb2ludGVyIG9sZEdlbkVuZDsNCg0KCWggPSAmKHMtPmhlYXApOw0KCWlm
IChzLT5jcm9zc01hcFZhbGlkU2l6ZSA9PSBzLT5vbGRHZW5TaXplKQ0KCQln
b3RvIGRvbmU7DQoJb2xkR2VuRW5kID0gaC0+c3RhcnQgKyBzLT5vbGRHZW5T
aXplOw0KCW9iamVjdFN0YXJ0ID0gaC0+c3RhcnQgKyBzLT5jcm9zc01hcFZh
bGlkU2l6ZTsNCglpZiAob2JqZWN0U3RhcnQgPT0gaC0+c3RhcnQpIHsNCgkJ
Y2FyZEluZGV4ID0gMDsNCgkJb2JqZWN0U3RhcnQgPSBhbGlnbkZyb250aWVy
IChzLCBvYmplY3RTdGFydCk7DQoJfSBlbHNlDQoJCWNhcmRJbmRleCA9IGRp
dkNhcmRTaXplIChzLCAodWludCkob2JqZWN0U3RhcnQgLSAxIC0gaC0+c3Rh
cnQpKTsNCgljYXJkU3RhcnQgPSBoLT5zdGFydCArIGNhcmROdW1Ub1NpemUg
KHMsIGNhcmRJbmRleCk7DQoJY2FyZEVuZCA9IGNhcmRTdGFydCArIHMtPmNh
cmRTaXplOw0KbG9vcE9iamVjdHM6DQoJYXNzZXJ0IChvYmplY3RTdGFydCA8
IG9sZEdlbkVuZCk7DQoJYXNzZXJ0ICgob2JqZWN0U3RhcnQgPT0gaC0+c3Rh
cnQgb3IgY2FyZFN0YXJ0IDwgb2JqZWN0U3RhcnQpDQoJCQlhbmQgb2JqZWN0
U3RhcnQgPD0gY2FyZEVuZCk7DQoJbmV4dCA9IG9iamVjdFN0YXJ0ICsgb2Jq
ZWN0U2l6ZSAocywgdG9EYXRhIChzLCBvYmplY3RTdGFydCkpOw0KCWlmIChu
ZXh0ID4gY2FyZEVuZCkgew0KCQkvKiBXZSdyZSBhYm91dCB0byBtb3ZlIHRv
IGEgbmV3IGNhcmQsIHNvIHdlIGFyZSBsb29raW5nIGF0IHRoZQ0KCQkgKiBs
YXN0IG9iamVjdCBib3VuZGFyeSBpbiB0aGUgY3VycmVudCBjYXJkLiAgU3Rv
cmUgaXQgaW4gdGhlIA0KCQkgKiBjcm9zc01hcC4NCgkJICovDQoJCXVpbnQg
b2Zmc2V0Ow0KDQoJCW9mZnNldCA9IChvYmplY3RTdGFydCAtIGNhcmRTdGFy
dCkgLyBXT1JEX1NJWkU7DQoJCWFzc2VydCAob2Zmc2V0IDwgQ1JPU1NfTUFQ
X0VNUFRZKTsNCgkJaWYgKERFQlVHX0dFTkVSQVRJT05BTCkNCgkJCWZwcmlu
dGYgKHN0ZGVyciwgImNyb3NzTWFwWyV1XSA9ICV1XG4iLCANCgkJCQkJY2Fy
ZEluZGV4LCBvZmZzZXQpOw0KCQlzLT5jcm9zc01hcFtjYXJkSW5kZXhdID0g
b2Zmc2V0Ow0KCQljYXJkSW5kZXggPSBkaXZDYXJkU2l6ZSAocywgbmV4dCAt
IDEgLSBoLT5zdGFydCk7DQoJCWNhcmRTdGFydCA9IGgtPnN0YXJ0ICsgY2Fy
ZE51bVRvU2l6ZSAocywgY2FyZEluZGV4KTsNCgkJY2FyZEVuZCA9IGNhcmRT
dGFydCArIHMtPmNhcmRTaXplOw0KCX0NCglvYmplY3RTdGFydCA9IG5leHQ7
DQoJaWYgKG9iamVjdFN0YXJ0IDwgb2xkR2VuRW5kKSANCgkJZ290byBsb29w
T2JqZWN0czsNCglhc3NlcnQgKG9iamVjdFN0YXJ0ID09IG9sZEdlbkVuZCk7
DQoJcy0+Y3Jvc3NNYXBbY2FyZEluZGV4XSA9IChvbGRHZW5FbmQgLSBjYXJk
U3RhcnQpIC8gV09SRF9TSVpFOw0KCXMtPmNyb3NzTWFwVmFsaWRTaXplID0g
cy0+b2xkR2VuU2l6ZTsNCmRvbmU6DQoJYXNzZXJ0IChzLT5jcm9zc01hcFZh
bGlkU2l6ZSA9PSBzLT5vbGRHZW5TaXplKTsNCglhc3NlcnQgKGNyb3NzTWFw
SXNPSyAocykpOw0KfQ0KDQpzdGF0aWMgaW5saW5lIHZvaWQgZm9yd2FyZElm
SW5OdXJzZXJ5IChHQ19zdGF0ZSBzLCBwb2ludGVyICpwcCkgew0KCXBvaW50
ZXIgcDsNCg0KCXAgPSAqcHA7DQoJaWYgKHAgPCBzLT5udXJzZXJ5KQ0KCQly
ZXR1cm47DQoJaWYgKERFQlVHX0dFTkVSQVRJT05BTCkNCgkJZnByaW50ZiAo
c3RkZXJyLCAiaW50ZXJnZW5lcmF0aW9uYWwgcG9pbnRlciBmcm9tIDB4JTA4
eCB0byAweCUwOHhcbiIsDQoJCQkodWludClwcCwgKih1aW50KilwcCk7DQoJ
YXNzZXJ0IChzLT5udXJzZXJ5IDw9IHAgYW5kIHAgPCBzLT5saW1pdFBsdXNT
bG9wKTsNCglmb3J3YXJkIChzLCBwcCk7DQp9DQoNCg0KLyogV2FsayB0aHJv
dWdoIGFsbCB0aGUgY2FyZHMgYW5kIGZvcndhcmQgYWxsIGludGVyZ2VuZXJh
dGlvbmFsIHBvaW50ZXJzLiAqLw0Kc3RhdGljIHZvaWQgZm9yd2FyZEludGVy
R2VuZXJhdGlvbmFsUG9pbnRlcnMgKEdDX3N0YXRlIHMpIHsNCglwb2ludGVy
IGNhcmRNYXA7DQoJdWludCBjYXJkTnVtOw0KCXBvaW50ZXIgY2FyZFN0YXJ0
Ow0KCXVjaGFyICpjcm9zc01hcDsNCglHQ19oZWFwIGg7DQoJdWludCBudW1D
YXJkczsNCglwb2ludGVyIG9iamVjdFN0YXJ0Ow0KCXBvaW50ZXIgb2xkR2Vu
U3RhcnQ7DQoJcG9pbnRlciBvbGRHZW5FbmQ7DQoNCglpZiAoREVCVUdfR0VO
RVJBVElPTkFMKQ0KCQlmcHJpbnRmIChzdGRlcnIsICJGb3J3YXJkaW5nIGlu
dGVyLWdlbmVyYXRpb25hbCBwb2ludGVycy5cbiIpOw0KCXVwZGF0ZUNyb3Nz
TWFwIChzKTsNCgloID0gJnMtPmhlYXA7DQoJLyogQ29uc3RhbnRzLiAqLw0K
CWNhcmRNYXAgPSBzLT5jYXJkTWFwOw0KCWNyb3NzTWFwID0gcy0+Y3Jvc3NN
YXA7DQoJbnVtQ2FyZHMgPSBkaXZDYXJkU2l6ZSAocywgYWxpZ24gKHMtPm9s
ZEdlblNpemUsIHMtPmNhcmRTaXplKSk7DQoJb2xkR2VuU3RhcnQgPSBzLT5o
ZWFwLnN0YXJ0Ow0KCW9sZEdlbkVuZCA9IG9sZEdlblN0YXJ0ICsgcy0+b2xk
R2VuU2l6ZTsNCgkvKiBMb29wIHZhcmlhYmxlcyovDQoJb2JqZWN0U3RhcnQg
PSBhbGlnbkZyb250aWVyIChzLCBzLT5oZWFwLnN0YXJ0KTsNCgljYXJkTnVt
ID0gMDsNCgljYXJkU3RhcnQgPSBvbGRHZW5TdGFydDsNCmNoZWNrQWxsOg0K
CWFzc2VydCAoY2FyZE51bSA8PSBudW1DYXJkcyk7DQoJYXNzZXJ0IChpc0Fs
aWduZWRGcm9udGllciAocywgb2JqZWN0U3RhcnQpKTsNCglpZiAoY2FyZE51
bSA9PSBudW1DYXJkcykNCgkJZ290byBkb25lOw0KY2hlY2tDYXJkOg0KCWlm
IChERUJVR19HRU5FUkFUSU9OQUwpDQoJCWZwcmludGYgKHN0ZGVyciwgImNo
ZWNraW5nIGNhcmQgJXUgIG9iamVjdFN0YXJ0ID0gMHglMDh4ICBjYXJkRW5k
ID0gMHglMDh4XG4iLA0KCQkJCWNhcmROdW0sIA0KCQkJCSh1aW50KW9iamVj
dFN0YXJ0LA0KCQkJCSh1aW50KW9sZEdlblN0YXJ0ICsgY2FyZE51bVRvU2l6
ZSAocywgY2FyZE51bSArIDEpKTsNCglhc3NlcnQgKG9iamVjdFN0YXJ0IDwg
b2xkR2VuU3RhcnQgKyBjYXJkTnVtVG9TaXplIChzLCBjYXJkTnVtICsgMSkp
Ow0KCWlmIChjYXJkTWFwW2NhcmROdW1dKSB7DQoJCXBvaW50ZXIgY2FyZEVu
ZDsNCgkJcG9pbnRlciBvcmlnOw0KCQl1aW50IHNpemU7DQoNCgkJcy0+bWFy
a2VkQ2FyZHMrKzsNCgkJaWYgKERFQlVHX0dFTkVSQVRJT05BTCkNCgkJCWZw
cmludGYgKHN0ZGVyciwgImNhcmQgJXUgaXMgbWFya2VkICBvYmplY3RTdGFy
dCA9IDB4JTA4eFxuIiwgDQoJCQkJCWNhcmROdW0sICh1aW50KW9iamVjdFN0
YXJ0KTsNCgkJb3JpZyA9IG9iamVjdFN0YXJ0Ow0Kc2tpcE9iamVjdHM6DQoJ
CWFzc2VydCAoaXNBbGlnbmVkRnJvbnRpZXIgKHMsIG9iamVjdFN0YXJ0KSk7
DQoJCXNpemUgPSBvYmplY3RTaXplIChzLCB0b0RhdGEgKHMsIG9iamVjdFN0
YXJ0KSk7DQoJCWlmIChvYmplY3RTdGFydCArIHNpemUgPCBjYXJkU3RhcnQp
IHsNCgkJCW9iamVjdFN0YXJ0ICs9IHNpemU7DQoJCQlnb3RvIHNraXBPYmpl
Y3RzOw0KCQl9DQoJCXMtPm1pbm9yQnl0ZXNTa2lwcGVkICs9IG9iamVjdFN0
YXJ0IC0gb3JpZzsNCgkJY2FyZEVuZCA9IGNhcmRTdGFydCArIHMtPmNhcmRT
aXplOw0KCQlpZiAob2xkR2VuRW5kIDwgY2FyZEVuZCkgDQoJCQljYXJkRW5k
ID0gb2xkR2VuRW5kOw0KCQlhc3NlcnQgKG9iamVjdFN0YXJ0IDwgY2FyZEVu
ZCk7DQoJCW9yaWcgPSBvYmplY3RTdGFydDsNCgkJLyogSWYgd2UgZXZlciBh
ZGQgV2Vhay5zZXQsIHRoZW4gdGhlcmUgY291bGQgYmUgaW50ZXJnZW5lcmF0
aW9uYWwNCgkJICogd2VhayBwb2ludGVycywgaW4gd2hpY2ggY2FzZSB3ZSB3
b3VsZCBuZWVkIHRvIGxpbmsgdGhlIHdlYWsNCgkJICogb2JqZWN0cyBpbnRv
IHMtPndlYWtzLiAgQnV0IGZvciBub3csIHNpbmNlIHRoZXJlIGlzIG5vIA0K
CQkgKiBXZWFrLnNldCwgdGhlIGZvcmVhY2hQb2ludGVySW5SYW5nZSB3aWxs
IGRvIHRoZSByaWdodCB0aGluZw0KCQkgKiBvbiB3ZWFrcywgc2luY2UgdGhl
IHdlYWsgcG9pbnRlciB3aWxsIG5ldmVyIGJlIGludG8gdGhlIA0KCQkgKiBu
dXJzZXJ5Lg0KCQkgKi8NCgkJb2JqZWN0U3RhcnQgPSANCgkJCWZvcmVhY2hQ
b2ludGVySW5SYW5nZSAocywgb2JqZWN0U3RhcnQsICZjYXJkRW5kLCBGQUxT
RSwNCgkJCQkJCWZvcndhcmRJZkluTnVyc2VyeSk7DQoJCXMtPm1pbm9yQnl0
ZXNTY2FubmVkICs9IG9iamVjdFN0YXJ0IC0gb3JpZzsNCgkJaWYgKG9iamVj
dFN0YXJ0ID09IG9sZEdlbkVuZCkNCgkJCWdvdG8gZG9uZTsNCgkJY2FyZE51
bSA9IGRpdkNhcmRTaXplIChzLCBvYmplY3RTdGFydCAtIG9sZEdlblN0YXJ0
KTsNCgkJY2FyZFN0YXJ0ID0gb2xkR2VuU3RhcnQgKyBjYXJkTnVtVG9TaXpl
IChzLCBjYXJkTnVtKTsNCgkJZ290byBjaGVja0NhcmQ7DQoJfSBlbHNlIHsN
CgkJdW5sZXNzIChDUk9TU19NQVBfRU1QVFkgPT0gY3Jvc3NNYXBbY2FyZE51
bV0pDQoJCQlvYmplY3RTdGFydCA9IGNhcmRTdGFydCArIGNyb3NzTWFwW2Nh
cmROdW1dICogV09SRF9TSVpFOw0KCQlpZiAoREVCVUdfR0VORVJBVElPTkFM
KQ0KCQkJZnByaW50ZiAoc3RkZXJyLCAiY2FyZCAldSBpcyBub3QgbWFya2Vk
ICBjcm9zc01hcFsldV0gPT0gJXUgIG9iamVjdFN0YXJ0ID0gMHglMDh4XG4i
LCANCgkJCQkJY2FyZE51bSwNCgkJCQkJY2FyZE51bSwgDQoJCQkJCWNyb3Nz
TWFwW2NhcmROdW1dICogV09SRF9TSVpFLA0KCQkJCQkodWludClvYmplY3RT
dGFydCk7DQoJCWNhcmROdW0rKzsNCgkJY2FyZFN0YXJ0ICs9IHMtPmNhcmRT
aXplOw0KCQlnb3RvIGNoZWNrQWxsOw0KCX0NCglhc3NlcnQgKEZBTFNFKTsN
CmRvbmU6DQoJaWYgKERFQlVHX0dFTkVSQVRJT05BTCkNCgkJZnByaW50ZiAo
c3RkZXJyLCAiRm9yd2FyZGluZyBpbnRlci1nZW5lcmF0aW9uYWwgcG9pbnRl
cnMgZG9uZS5cbiIpOw0KfQ0KDQpzdGF0aWMgdm9pZCBtaW5vckdDIChHQ19z
dGF0ZSBzKSB7DQoJVzMyIGJ5dGVzQWxsb2NhdGVkOw0KCVczMiBieXRlc0Nv
cGllZDsNCglzdHJ1Y3QgcnVzYWdlIHJ1X3N0YXJ0Ow0KDQoJaWYgKERFQlVH
X0dFTkVSQVRJT05BTCkNCgkJZnByaW50ZiAoc3RkZXJyLCAibWlub3JHQyAg
bnVyc2VyeSA9IDB4JTA4eCAgZnJvbnRpZXIgPSAweCUwOHhcbiIsIA0KCQkJ
CSh1aW50KXMtPm51cnNlcnksDQoJCQkJKHVpbnQpcy0+ZnJvbnRpZXIpOw0K
CWFzc2VydCAoaW52YXJpYW50IChzKSk7DQoJYnl0ZXNBbGxvY2F0ZWQgPSBz
LT5mcm9udGllciAtIHMtPm51cnNlcnk7DQoJaWYgKGJ5dGVzQWxsb2NhdGVk
ID09IDApDQoJCXJldHVybjsNCiAJcy0+Ynl0ZXNBbGxvY2F0ZWQgKz0gYnl0
ZXNBbGxvY2F0ZWQ7DQoJaWYgKG5vdCBzLT5jYW5NaW5vcikgew0KCQlzLT5v
bGRHZW5TaXplICs9IGJ5dGVzQWxsb2NhdGVkOw0KCQlieXRlc0NvcGllZCA9
IDA7DQoJfSBlbHNlIHsNCgkJaWYgKERFQlVHX0dFTkVSQVRJT05BTCBvciBz
LT5tZXNzYWdlcykNCgkJCWZwcmludGYgKHN0ZGVyciwgIk1pbm9yIEdDLlxu
Iik7DQoJCWlmIChkZXRhaWxlZEdDVGltZSAocykpDQoJCQlzdGFydFRpbWlu
ZyAoJnJ1X3N0YXJ0KTsNCgkJcy0+YW1Jbk1pbm9yR0MgPSBUUlVFOw0KCQlz
LT50b1NwYWNlID0gcy0+aGVhcC5zdGFydCArIHMtPm9sZEdlblNpemU7DQoJ
CWlmIChERUJVR19HRU5FUkFUSU9OQUwpDQoJCQlmcHJpbnRmIChzdGRlcnIs
ICJ0b1NwYWNlID0gMHglMDh4XG4iLA0KCQkJCQkodWludClzLT50b1NwYWNl
KTsNCgkJYXNzZXJ0IChpc0FsaWduZWRGcm9udGllciAocywgcy0+dG9TcGFj
ZSkpOw0KCQlzLT50b0xpbWl0ID0gcy0+dG9TcGFjZSArIGJ5dGVzQWxsb2Nh
dGVkOw0KCQlhc3NlcnQgKGludmFyaWFudCAocykpOw0KCQlzLT5udW1NaW5v
ckdDcysrOw0KCQlzLT5udW1NaW5vcnNTaW5jZUxhc3RNYWpvcisrOw0KCQlz
LT5iYWNrID0gcy0+dG9TcGFjZTsNCgkJLyogRm9yd2FyZCBhbGwgZ2xvYmFs
cy4gIFdvdWxkIGxpa2UgdG8gYXZvaWQgZG9pbmcgdGhpcyBvbmNlIGFsbA0K
CSAJICogdGhlIGdsb2JhbHMgaGF2ZSBiZWVuIGFzc2lnbmVkLg0KCQkgKi8N
CgkJZm9yZWFjaEdsb2JhbCAocywgZm9yd2FyZElmSW5OdXJzZXJ5KTsNCgkJ
Zm9yd2FyZEludGVyR2VuZXJhdGlvbmFsUG9pbnRlcnMgKHMpOw0KCQlmb3Jl
YWNoUG9pbnRlckluUmFuZ2UgKHMsIHMtPnRvU3BhY2UsICZzLT5iYWNrLCBU
UlVFLA0KCQkJCQlmb3J3YXJkSWZJbk51cnNlcnkpOw0KCQl1cGRhdGVXZWFr
cyAocyk7DQoJCWJ5dGVzQ29waWVkID0gcy0+YmFjayAtIHMtPnRvU3BhY2U7
DQoJCXMtPmJ5dGVzQ29waWVkTWlub3IgKz0gYnl0ZXNDb3BpZWQ7DQoJCXMt
Pm9sZEdlblNpemUgKz0gYnl0ZXNDb3BpZWQ7DQoJCXMtPmFtSW5NaW5vckdD
ID0gRkFMU0U7DQoJCWlmIChkZXRhaWxlZEdDVGltZSAocykpDQoJCQlzdG9w
VGltaW5nICgmcnVfc3RhcnQsICZzLT5ydV9nY01pbm9yKTsNCgkJaWYgKERF
QlVHX0dFTkVSQVRJT05BTCBvciBzLT5tZXNzYWdlcykNCgkJCWZwcmludGYg
KHN0ZGVyciwgIk1pbm9yIEdDIGRvbmUuICAlcyBieXRlcyBjb3BpZWQuXG4i
LA0KCQkJCQl1aW50VG9Db21tYVN0cmluZyAoYnl0ZXNDb3BpZWQpKTsNCgl9
DQp9DQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAg
ICAgICAgICAgICAgICBEZXB0aC1maXJzdCBNYXJraW5nICAgICAgICAgICAg
ICAgICAgICAgICAgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0K
c3RhdGljIGlubGluZSB1aW50ICphcnJheUNvdW50ZXJwIChwb2ludGVyIGEp
IHsNCglyZXR1cm4gKCh1aW50KilhIC0gMyk7DQp9DQoNCnN0YXRpYyBpbmxp
bmUgdWludCBhcnJheUNvdW50ZXIgKHBvaW50ZXIgYSkgew0KCXJldHVybiAq
KGFycmF5Q291bnRlcnAgKGEpKTsNCn0NCg0Kc3RhdGljIGlubGluZSBib29s
IGlzTWFya2VkIChwb2ludGVyIHApIHsNCglyZXR1cm4gTUFSS19NQVNLICYg
R0NfZ2V0SGVhZGVyIChwKTsNCn0NCg0Kc3RhdGljIGJvb2wgbW9kZUVxTWFy
ayAoTWFya01vZGUgbSwgcG9pbnRlciBwKSB7DQoJcmV0dXJuICgoKE1BUktf
TU9ERSA9PSBtKSBhbmQgaXNNYXJrZWQgKHApKQ0KCQlvciAoKFVOTUFSS19N
T0RFID09IG0pIGFuZCBub3QgaXNNYXJrZWQgKHApKSk7DQp9DQoNCi8qIG1h
cmsgKHMsIHApIHNldHMgYWxsIHRoZSBtYXJrIGJpdHMgaW4gdGhlIG9iamVj
dCBncmFwaCBwb2ludGVkIHRvIGJ5IHAuIA0KICogSWYgdGhlIG1vZGUgaXMg
TUFSSywgaXQgc2V0cyB0aGUgYml0cyB0byAxLg0KICogSWYgdGhlIG1vZGUg
aXMgVU5NQVJLLCBpdCBzZXRzIHRoZSBiaXRzIHRvIDAuDQogKg0KICogSXQg
cmV0dXJucyB0aGUgdG90YWwgc2l6ZSBpbiBieXRlcyBvZiB0aGUgb2JqZWN0
cyBtYXJrZWQuDQogKi8NClczMiBtYXJrIChHQ19zdGF0ZSBzLCBwb2ludGVy
IHJvb3QsIE1hcmtNb2RlIG1vZGUpIHsNCglwb2ludGVyIGN1cjsgIC8qIFRo
ZSBjdXJyZW50IG9iamVjdCBiZWluZyBtYXJrZWQuICovDQoJR0Nfb2Zmc2V0
cyBmcmFtZU9mZnNldHM7DQoJSGVhZGVyKiBoZWFkZXJwOw0KCUhlYWRlciBo
ZWFkZXI7DQoJdWludCBpbmRleDsNCglHQ19mcmFtZUxheW91dCAqbGF5b3V0
Ow0KCXBvaW50ZXIgbWF4OyAvKiBUaGUgZW5kIG9mIHRoZSBwb2ludGVycyBp
biBhbiBvYmplY3QuICovDQoJcG9pbnRlciBuZXh0OyAvKiBUaGUgbmV4dCBv
YmplY3QgdG8gbWFyay4gKi8NCglIZWFkZXIgKm5leHRIZWFkZXJwOw0KCUhl
YWRlciBuZXh0SGVhZGVyOw0KCVczMiBudW1CeXRlczsNCgl1aW50IG51bU5v
blBvaW50ZXJzOw0KCXVpbnQgbnVtUG9pbnRlcnM7DQoJcG9pbnRlciBwcmV2
OyAvKiBUaGUgcHJldmlvdXMgb2JqZWN0IG9uIHRoZSBtYXJrIHN0YWNrLiAq
Lw0KCVczMiBzaXplOw0KCXVpbnQgdGFnOw0KCXBvaW50ZXIgdG9kbzsgLyog
QSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIGluIGN1ciB0byBuZXh0LiAqLw0K
CXBvaW50ZXIgdG9wOyAvKiBUaGUgdG9wIG9mIHRoZSBuZXh0IHN0YWNrIGZy
YW1lIHRvIG1hcmsuICovDQoNCglpZiAobW9kZUVxTWFyayAobW9kZSwgcm9v
dCkpDQoJCS8qIE9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIG1hcmtlZC4gKi8N
CgkJcmV0dXJuIDA7DQoJc2l6ZSA9IDA7DQoJY3VyID0gcm9vdDsNCglwcmV2
ID0gTlVMTDsNCgloZWFkZXJwID0gR0NfZ2V0SGVhZGVycCAoY3VyKTsNCglo
ZWFkZXIgPSAqKEhlYWRlciopaGVhZGVycDsNCglnb3RvIG1hcms7CQ0KbWFy
a05leHQ6DQoJLyogY3VyIGlzIHRoZSBvYmplY3QgdGhhdCB3YXMgYmVpbmcg
bWFya2VkLg0KCSAqIHByZXYgaXMgdGhlIG1hcmsgc3RhY2suDQoJICogbmV4
dCBpcyB0aGUgdW5tYXJrZWQgb2JqZWN0IHRvIGJlIG1hcmtlZC4NCgkgKiB0
b2RvIGlzIGEgcG9pbnRlciB0byB0aGUgcG9pbnRlciBpbnNpZGUgY3VyIHRo
YXQgcG9pbnRzIHRvIG5leHQuDQoJICogaGVhZGVycCBwb2ludHMgdG8gdGhl
IGhlYWRlciBvZiBuZXh0Lg0KCSAqIGhlYWRlciBpcyB0aGUgaGVhZGVyIG9m
IG5leHQuDQoJICovDQoJaWYgKERFQlVHX01BUktfQ09NUEFDVCkNCgkJZnBy
aW50ZiAoc3RkZXJyLCAibWFya05leHQgIGN1ciA9IDB4JTA4eCAgbmV4dCA9
IDB4JTA4eCAgcHJldiA9IDB4JTA4eCAgdG9kbyA9IDB4JTA4eFxuIiwNCgkJ
CQkodWludCljdXIsICh1aW50KW5leHQsICh1aW50KXByZXYsICh1aW50KXRv
ZG8pOw0KCWFzc2VydCAobm90IG1vZGVFcU1hcmsgKG1vZGUsIG5leHQpKTsN
Cglhc3NlcnQgKGhlYWRlciA9PSBHQ19nZXRIZWFkZXIgKG5leHQpKTsNCglh
c3NlcnQgKGhlYWRlcnAgPT0gR0NfZ2V0SGVhZGVycCAobmV4dCkpOw0KCWFz
c2VydCAoKihwb2ludGVyKikgdG9kbyA9PSBuZXh0KTsNCgkqKHBvaW50ZXIq
KXRvZG8gPSBwcmV2Ow0KCXByZXYgPSBjdXI7DQoJY3VyID0gbmV4dDsNCm1h
cms6DQoJaWYgKERFQlVHX01BUktfQ09NUEFDVCkNCgkJZnByaW50ZiAoc3Rk
ZXJyLCAibWFyayAgY3VyID0gMHglMDh4ICBwcmV2ID0gMHglMDh4ICBtb2Rl
ID0gJXNcbiIsDQoJCQkJKHVpbnQpY3VyLCAodWludClwcmV2LA0KCQkJCSht
b2RlID09IE1BUktfTU9ERSkgPyAibWFyayIgOiAidW5tYXJrIik7DQoJLyog
Y3VyIGlzIHRoZSBvYmplY3QgdG8gbWFyay4gDQoJICogcHJldiBpcyB0aGUg
bWFyayBzdGFjay4NCgkgKiBoZWFkZXJwIHBvaW50cyB0byB0aGUgaGVhZGVy
IG9mIGN1ci4NCgkgKiBoZWFkZXIgaXMgdGhlIGhlYWRlciBvZiBjdXIuDQoJ
ICovDQoJYXNzZXJ0IChub3QgbW9kZUVxTWFyayAobW9kZSwgY3VyKSk7DQoJ
YXNzZXJ0IChoZWFkZXIgPT0gR0NfZ2V0SGVhZGVyIChjdXIpKTsNCglhc3Nl
cnQgKGhlYWRlcnAgPT0gR0NfZ2V0SGVhZGVycCAoY3VyKSk7DQoJaGVhZGVy
ID0gKE1BUktfTU9ERSA9PSBtb2RlKQ0KCQkJPyBoZWFkZXIgfCBNQVJLX01B
U0sNCgkJCTogaGVhZGVyICYgfk1BUktfTUFTSzsNCglTUExJVF9IRUFERVIo
KTsNCglpZiAoTk9STUFMX1RBRyA9PSB0YWcpIHsNCgkJdG9kbyA9IGN1ciAr
IHRvQnl0ZXMgKG51bU5vblBvaW50ZXJzKTsNCgkJbWF4ID0gdG9kbyArIHRv
Qnl0ZXMgKG51bVBvaW50ZXJzKTsNCgkJc2l6ZSArPSBHQ19OT1JNQUxfSEVB
REVSX1NJWkUgKyAobWF4IC0gY3VyKTsNCgkJaW5kZXggPSAwOw0KbWFya0lu
Tm9ybWFsOg0KCQlhc3NlcnQgKHRvZG8gPD0gbWF4KTsNCgkJaWYgKERFQlVH
X01BUktfQ09NUEFDVCkNCgkJCWZwcmludGYgKHN0ZGVyciwgIm1hcmtJbk5v
cm1hbCAgaW5kZXggPSAlZFxuIiwgaW5kZXgpOw0KCQlpZiAodG9kbyA9PSBt
YXgpIHsNCgkJCSpoZWFkZXJwID0gaGVhZGVyICYgfkNPVU5URVJfTUFTSzsN
CgkJCWdvdG8gcmV0Ow0KCQl9DQoJCW5leHQgPSAqKHBvaW50ZXIqKXRvZG87
DQoJCWlmIChub3QgR0NfaXNQb2ludGVyIChuZXh0KSkgew0KbWFya05leHRJ
bk5vcm1hbDoNCgkJCXRvZG8gKz0gUE9JTlRFUl9TSVpFOw0KCQkJaW5kZXgr
KzsNCgkJCWdvdG8gbWFya0luTm9ybWFsOw0KCQl9DQoJCW5leHRIZWFkZXJw
ID0gR0NfZ2V0SGVhZGVycCAobmV4dCk7DQoJCW5leHRIZWFkZXIgPSAqbmV4
dEhlYWRlcnA7DQoJCWlmICgobmV4dEhlYWRlciAmIE1BUktfTUFTSykNCgkJ
CT09IChNQVJLX01PREUgPT0gbW9kZSA/IE1BUktfTUFTSyA6IDApKQ0KCQkJ
Z290byBtYXJrTmV4dEluTm9ybWFsOw0KCQkqaGVhZGVycCA9IChoZWFkZXIg
JiB+Q09VTlRFUl9NQVNLKSB8DQoJCQkJKGluZGV4IDw8IENPVU5URVJfU0hJ
RlQpOw0KCQloZWFkZXJwID0gbmV4dEhlYWRlcnA7DQoJCWhlYWRlciA9IG5l
eHRIZWFkZXI7DQoJCWdvdG8gbWFya05leHQ7DQoJfSBlbHNlIGlmIChXRUFL
X1RBRyA9PSB0YWcpIHsNCgkJLyogU3RvcmUgdGhlIG1hcmtlZCBoZWFkZXIg
YW5kIGRvbid0IGZvbGxvdyBhbnkgcG9pbnRlcnMuICovDQoJCSpoZWFkZXJw
ID0gaGVhZGVyOw0KCQlnb3RvIHJldDsNCgl9IGVsc2UgaWYgKEFSUkFZX1RB
RyA9PSB0YWcpIHsNCgkJbnVtQnl0ZXMgPSBhcnJheU51bUJ5dGVzIChzLCBj
dXIsIG51bVBvaW50ZXJzLCBudW1Ob25Qb2ludGVycyk7DQoJCXNpemUgKz0g
R0NfQVJSQVlfSEVBREVSX1NJWkUgKyBudW1CeXRlczsNCgkJKmhlYWRlcnAg
PSBoZWFkZXI7DQoJCWlmICgwID09IG51bVBvaW50ZXJzIG9yIDAgPT0gR0Nf
YXJyYXlOdW1FbGVtZW50cyAoY3VyKSkNCgkJCWdvdG8gcmV0Ow0KCQlhc3Nl
cnQgKDAgPT0gbnVtTm9uUG9pbnRlcnMpOw0KCQltYXggPSBjdXIgKyBudW1C
eXRlczsNCgkJdG9kbyA9IGN1cjsNCgkJaW5kZXggPSAwOw0KbWFya0luQXJy
YXk6DQoJCWlmIChERUJVR19NQVJLX0NPTVBBQ1QpDQoJCQlmcHJpbnRmIChz
dGRlcnIsICJtYXJrSW5BcnJheSBpbmRleCA9ICVkXG4iLCBpbmRleCk7DQoJ
CWlmICh0b2RvID09IG1heCkgew0KCQkJKmFycmF5Q291bnRlcnAgKGN1cikg
PSAwOw0KCQkJZ290byByZXQ7DQoJCX0NCgkJbmV4dCA9ICoocG9pbnRlciop
dG9kbzsNCgkJaWYgKG5vdCBHQ19pc1BvaW50ZXIgKG5leHQpKSB7DQptYXJr
TmV4dEluQXJyYXk6DQoJCQl0b2RvICs9IFBPSU5URVJfU0laRTsNCgkJCWlu
ZGV4Kys7DQoJCQlnb3RvIG1hcmtJbkFycmF5Ow0KCQl9DQoJCW5leHRIZWFk
ZXJwID0gR0NfZ2V0SGVhZGVycCAobmV4dCk7DQoJCW5leHRIZWFkZXIgPSAq
bmV4dEhlYWRlcnA7DQoJCWlmICgobmV4dEhlYWRlciAmIE1BUktfTUFTSykN
CgkJCT09IChNQVJLX01PREUgPT0gbW9kZSA/IE1BUktfTUFTSyA6IDApKQ0K
CQkJZ290byBtYXJrTmV4dEluQXJyYXk7DQoJCSphcnJheUNvdW50ZXJwIChj
dXIpID0gaW5kZXg7DQoJCWhlYWRlcnAgPSBuZXh0SGVhZGVycDsNCgkJaGVh
ZGVyID0gbmV4dEhlYWRlcjsNCgkJZ290byBtYXJrTmV4dDsNCgl9IGVsc2Ug
ew0KCQlhc3NlcnQgKFNUQUNLX1RBRyA9PSB0YWcpOw0KCQkqaGVhZGVycCA9
IGhlYWRlcjsNCgkJc2l6ZSArPSBzdGFja0J5dGVzIChzLCAoKEdDX3N0YWNr
KWN1ciktPnJlc2VydmVkKTsNCgkJdG9wID0gc3RhY2tUb3AgKHMsIChHQ19z
dGFjayljdXIpOw0KCQlhc3NlcnQgKCgoR0Nfc3RhY2spY3VyKS0+dXNlZCA8
PSAoKEdDX3N0YWNrKWN1ciktPnJlc2VydmVkKTsNCm1hcmtJblN0YWNrOg0K
CQkvKiBJbnZhcmlhbnQ6IHRvcCBwb2ludHMganVzdCBwYXN0IHRoZSByZXR1
cm4gYWRkcmVzcyBvZiB0aGUNCgkJICogZnJhbWUgdG8gYmUgbWFya2VkLg0K
CQkgKi8NCgkJYXNzZXJ0IChzdGFja0JvdHRvbSAocywgKEdDX3N0YWNrKWN1
cikgPD0gdG9wKTsNCgkJaWYgKERFQlVHX01BUktfQ09NUEFDVCkNCgkJCWZw
cmludGYgKHN0ZGVyciwgIm1hcmtJblN0YWNrICB0b3AgPSAlZFxuIiwNCgkJ
CQkJdG9wIC0gc3RhY2tCb3R0b20gKHMsIChHQ19zdGFjayljdXIpKTsNCgkJ
CQkJDQoJCWlmICh0b3AgPT0gc3RhY2tCb3R0b20gKHMsIChHQ19zdGFjayko
Y3VyKSkpDQoJCQlnb3RvIHJldDsNCgkJaW5kZXggPSAwOw0KCQlsYXlvdXQg
PSBnZXRGcmFtZUxheW91dCAocywgKih3b3JkKikgKHRvcCAtIFdPUkRfU0la
RSkpOw0KCQlmcmFtZU9mZnNldHMgPSBsYXlvdXQtPm9mZnNldHM7DQoJCSgo
R0Nfc3RhY2spY3VyKS0+bWFya1RvcCA9IHRvcDsNCm1hcmtJbkZyYW1lOg0K
CQlpZiAoaW5kZXggPT0gZnJhbWVPZmZzZXRzIFswXSkgew0KCQkJdG9wIC09
IGxheW91dC0+bnVtQnl0ZXM7DQoJCQlnb3RvIG1hcmtJblN0YWNrOw0KCQl9
DQoJCXRvZG8gPSB0b3AgLSBsYXlvdXQtPm51bUJ5dGVzICsgZnJhbWVPZmZz
ZXRzIFtpbmRleCArIDFdOw0KCQluZXh0ID0gKihwb2ludGVyKil0b2RvOw0K
CQlpZiAoREVCVUdfTUFSS19DT01QQUNUKQ0KCQkJZnByaW50ZiAoc3RkZXJy
LCANCgkJCQkiICAgIG9mZnNldCAldSAgdG9kbyAweCUwOHggIG5leHQgPSAw
eCUwOHhcbiIsIA0KCQkJCWZyYW1lT2Zmc2V0cyBbaW5kZXggKyAxXSwgDQoJ
CQkJKHVpbnQpdG9kbywgKHVpbnQpbmV4dCk7DQoJCWlmIChub3QgR0NfaXNQ
b2ludGVyIChuZXh0KSkgew0KCQkJaW5kZXgrKzsNCgkJCWdvdG8gbWFya0lu
RnJhbWU7DQoJCX0NCgkJbmV4dEhlYWRlcnAgPSBHQ19nZXRIZWFkZXJwIChu
ZXh0KTsNCgkJbmV4dEhlYWRlciA9ICpuZXh0SGVhZGVycDsNCgkJaWYgKChu
ZXh0SGVhZGVyICYgTUFSS19NQVNLKQ0KCQkJPT0gKE1BUktfTU9ERSA9PSBt
b2RlID8gTUFSS19NQVNLIDogMCkpIHsNCgkJCWluZGV4Kys7DQoJCQlnb3Rv
IG1hcmtJbkZyYW1lOw0KCQl9DQoJCSgoR0Nfc3RhY2spY3VyKS0+bWFya0lu
ZGV4ID0gaW5kZXg7CQkNCgkJaGVhZGVycCA9IG5leHRIZWFkZXJwOw0KCQlo
ZWFkZXIgPSBuZXh0SGVhZGVyOw0KCQlnb3RvIG1hcmtOZXh0Ow0KCX0NCglh
c3NlcnQgKEZBTFNFKTsNCnJldDoNCgkvKiBEb25lIG1hcmtpbmcgY3VyLCBj
b250aW51ZSB3aXRoIHByZXYuDQoJICogTmVlZCB0byBzZXQgdGhlIHBvaW50
ZXIgaW4gdGhlIHByZXYgb2JqZWN0IHRoYXQgcG9pbnRlZCB0byBjdXIgDQoJ
ICogdG8gcG9pbnQgYmFjayB0byBwcmV2LCBhbmQgcmVzdG9yZSBwcmV2Lg0K
IAkgKi8NCglpZiAoREVCVUdfTUFSS19DT01QQUNUKQ0KCQlmcHJpbnRmIChz
dGRlcnIsICJyZXR1cm4gIGN1ciA9IDB4JTA4eCAgcHJldiA9IDB4JTA4eFxu
IiwNCgkJCQkodWludCljdXIsICh1aW50KXByZXYpOw0KCWFzc2VydCAobW9k
ZUVxTWFyayAobW9kZSwgY3VyKSk7DQoJaWYgKE5VTEwgPT0gcHJldikNCgkJ
cmV0dXJuIHNpemU7DQoJaGVhZGVycCA9IEdDX2dldEhlYWRlcnAgKHByZXYp
Ow0KCWhlYWRlciA9ICpoZWFkZXJwOw0KCVNQTElUX0hFQURFUigpOw0KCS8q
IEl0J3MgaW1wb3NzaWJsZSB0byBnZXQgYSBXRUFLX1RBRyBoZXJlLCBzaW5j
ZSB3ZSB3b3VsZCBuZXZlciBmb2xsb3cNCgkgKiB0aGUgd2VhayBvYmplY3Qg
cG9pbnRlci4NCgkgKi8NCglhc3NlcnQgKFdFQUtfVEFHICE9IHRhZyk7DQoJ
aWYgKE5PUk1BTF9UQUcgPT0gdGFnKSB7DQoJCXRvZG8gPSBwcmV2ICsgdG9C
eXRlcyAobnVtTm9uUG9pbnRlcnMpOw0KCQltYXggPSB0b2RvICsgdG9CeXRl
cyAobnVtUG9pbnRlcnMpOw0KCQlpbmRleCA9IChoZWFkZXIgJiBDT1VOVEVS
X01BU0spID4+IENPVU5URVJfU0hJRlQ7DQoJCXRvZG8gKz0gaW5kZXggKiBQ
T0lOVEVSX1NJWkU7DQoJCW5leHQgPSBjdXI7DQoJCWN1ciA9IHByZXY7DQoJ
CXByZXYgPSAqKHBvaW50ZXIqKXRvZG87DQoJCSoocG9pbnRlciopdG9kbyA9
IG5leHQ7DQoJCXRvZG8gKz0gUE9JTlRFUl9TSVpFOw0KCQlpbmRleCsrOw0K
CQlnb3RvIG1hcmtJbk5vcm1hbDsNCgl9IGVsc2UgaWYgKEFSUkFZX1RBRyA9
PSB0YWcpIHsNCgkJbWF4ID0gcHJldiArIGFycmF5TnVtQnl0ZXMgKHMsIHBy
ZXYsIG51bVBvaW50ZXJzLA0KCQkJCQkJbnVtTm9uUG9pbnRlcnMpOw0KCQlp
bmRleCA9IGFycmF5Q291bnRlciAocHJldik7DQoJCXRvZG8gPSBwcmV2ICsg
aW5kZXggKiBQT0lOVEVSX1NJWkU7DQoJCW5leHQgPSBjdXI7DQoJCWN1ciA9
IHByZXY7DQoJCXByZXYgPSAqKHBvaW50ZXIqKXRvZG87DQoJCSoocG9pbnRl
ciopdG9kbyA9IG5leHQ7DQoJCXRvZG8gKz0gUE9JTlRFUl9TSVpFOw0KCQlp
bmRleCsrOw0KCQlnb3RvIG1hcmtJbkFycmF5Ow0KCX0gZWxzZSB7DQoJCWFz
c2VydCAoU1RBQ0tfVEFHID09IHRhZyk7DQoJCW5leHQgPSBjdXI7DQoJCWN1
ciA9IHByZXY7DQoJCWluZGV4ID0gKChHQ19zdGFjayljdXIpLT5tYXJrSW5k
ZXg7DQoJCXRvcCA9ICgoR0Nfc3RhY2spY3VyKS0+bWFya1RvcDsNCgkJbGF5
b3V0ID0gZ2V0RnJhbWVMYXlvdXQgKHMsICood29yZCopICh0b3AgLSBXT1JE
X1NJWkUpKTsNCgkJZnJhbWVPZmZzZXRzID0gbGF5b3V0LT5vZmZzZXRzOw0K
CQl0b2RvID0gdG9wIC0gbGF5b3V0LT5udW1CeXRlcyArIGZyYW1lT2Zmc2V0
cyBbaW5kZXggKyAxXTsNCgkJcHJldiA9ICoocG9pbnRlciopdG9kbzsNCgkJ
Kihwb2ludGVyKil0b2RvID0gbmV4dDsNCgkJaW5kZXgrKzsNCgkJZ290byBt
YXJrSW5GcmFtZTsNCgl9DQoJYXNzZXJ0IChGQUxTRSk7DQp9DQoNCi8qIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgICAgICAgICBKb25r
ZXJzIE1hcmstY29tcGFjdCBDb2xsZWN0aW9uICAgICAgICAgICAgICAgICAg
Ki8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0Kc3RhdGljIGlubGlu
ZSB2b2lkIG1hcmtHbG9iYWwgKEdDX3N0YXRlIHMsIHBvaW50ZXIgKnBwKSB7
DQoJbWFyayAocywgKnBwLCBNQVJLX01PREUpOw0KfQ0KDQpzdGF0aWMgaW5s
aW5lIHZvaWQgdW5tYXJrR2xvYmFsIChHQ19zdGF0ZSBzLCBwb2ludGVyICpw
cCkgew0KICAgICAgIAltYXJrIChzLCAqcHAsIFVOTUFSS19NT0RFKTsNCn0N
Cg0Kc3RhdGljIGlubGluZSB2b2lkIHRocmVhZEludGVybmFsIChHQ19zdGF0
ZSBzLCBwb2ludGVyICpwcCkgew0KCUhlYWRlciAqaGVhZGVycDsNCg0KCWlm
IChGQUxTRSkNCgkJZnByaW50ZiAoc3RkZXJyLCAidGhyZWFkSW50ZXJuYWwg
cHAgPSAweCUwOHggICpwcCA9IDB4JTA4eCAgaGVhZGVyID0gMHglMDh4XG4i
LA0KCQkJCSh1aW50KXBwLCAqKHVpbnQqKXBwLCAodWludClHQ19nZXRIZWFk
ZXIgKCpwcCkpOw0KCWhlYWRlcnAgPSBHQ19nZXRIZWFkZXJwICgqcHApOw0K
CSooSGVhZGVyKilwcCA9ICpoZWFkZXJwOw0KCSpoZWFkZXJwID0gKEhlYWRl
cilwcDsNCn0NCg0KLyogSWYgcCBpcyB3ZWFrLCB0aGUgb2JqZWN0IHBvaW50
ZXIgd2FzIHZhbGlkLCBhbmQgcG9pbnRzIHRvIGFuIHVubWFya2VkIG9iamVj
dCwNCiAqIHRoZW4gY2xlYXIgdGhlIG9iamVjdCBwb2ludGVyLg0KICovDQpz
dGF0aWMgaW5saW5lIHZvaWQgbWF5YmVDbGVhcldlYWsgKEdDX3N0YXRlIHMs
IHBvaW50ZXIgcCkgew0KCUhlYWRlciBoZWFkZXI7DQoJSGVhZGVyICpoZWFk
ZXJwOw0KCXVpbnQgbnVtUG9pbnRlcnM7DQoJdWludCBudW1Ob25Qb2ludGVy
czsNCgl1aW50IHRhZzsNCg0KCWhlYWRlcnAgPSBHQ19nZXRIZWFkZXJwIChw
KTsNCgloZWFkZXIgPSAqaGVhZGVycDsNCglTUExJVF9IRUFERVIoKTsNCglp
ZiAoV0VBS19UQUcgPT0gdGFnIGFuZCAxID09IG51bVBvaW50ZXJzKSB7IA0K
CQlIZWFkZXIgaDI7DQoNCgkJaWYgKERFQlVHX1dFQUspDQoJCQlmcHJpbnRm
IChzdGRlcnIsICJtYXliZUNsZWFyV2VhayAoMHglMDh4KSAgaGVhZGVyID0g
MHglMDh4XG4iLA0KCQkJCQkodWludClwLCAodWludCloZWFkZXIpOw0KCQlo
MiA9IEdDX2dldEhlYWRlciAoKChHQ193ZWFrKXApLT5vYmplY3QpOw0KCQkv
KiBJZiBpdCdzIHVubWFya2VkIG5vdCB0aHJlYWRlZCwgY2xlYXIgdGhlIHdl
YWsgcG9pbnRlci4gKi8NCgkJaWYgKDEgPT0gKChNQVJLX01BU0sgfCAxKSAm
IGgyKSkgew0KCQkJKChHQ193ZWFrKXApLT5vYmplY3QgPSAocG9pbnRlcilC
T0dVU19QT0lOVEVSOw0KCQkJaGVhZGVyID0gV0VBS19HT05FX0hFQURFUiB8
IE1BUktfTUFTSzsNCgkJCWlmIChERUJVR19XRUFLKQ0KCQkJCWZwcmludGYg
KHN0ZGVyciwgImNsZWFyZWQuICBuZXcgaGVhZGVyID0gMHglMDh4XG4iLA0K
CQkJCQkJKHVpbnQpaGVhZGVyKTsNCgkJCSpoZWFkZXJwID0gaGVhZGVyOw0K
CQl9DQoJfQ0KfQ0KDQpzdGF0aWMgdm9pZCB1cGRhdGVGb3J3YXJkUG9pbnRl
cnMgKEdDX3N0YXRlIHMpIHsNCglwb2ludGVyIGJhY2s7DQoJcG9pbnRlciBm
cm9udDsNCgl1aW50IGdhcDsNCglwb2ludGVyIGVuZE9mTGFzdE1hcmtlZDsN
CglIZWFkZXIgaGVhZGVyOw0KCUhlYWRlciAqaGVhZGVycDsNCglwb2ludGVy
IHA7DQoJdWludCBzaXplOw0KDQoJaWYgKERFQlVHX01BUktfQ09NUEFDVCkN
CgkJZnByaW50ZiAoc3RkZXJyLCAiVXBkYXRlIGZvcndhcmQgcG9pbnRlcnMu
XG4iKTsNCglmcm9udCA9IGFsaWduRnJvbnRpZXIgKHMsIHMtPmhlYXAuc3Rh
cnQpOw0KCWJhY2sgPSBzLT5oZWFwLnN0YXJ0ICsgcy0+b2xkR2VuU2l6ZTsN
CgllbmRPZkxhc3RNYXJrZWQgPSBmcm9udDsNCglnYXAgPSAwOw0KdXBkYXRl
T2JqZWN0Og0KCWlmIChERUJVR19NQVJLX0NPTVBBQ1QpDQoJCWZwcmludGYg
KHN0ZGVyciwgInVwZGF0ZU9iamVjdCAgZnJvbnQgPSAweCUwOHggIGJhY2sg
PSAweCUwOHhcbiIsDQoJCQkJKHVpbnQpZnJvbnQsICh1aW50KWJhY2spOw0K
CWlmIChmcm9udCA9PSBiYWNrKQ0KCQlnb3RvIGRvbmU7DQoJaGVhZGVycCA9
IChIZWFkZXIqKWZyb250Ow0KCWhlYWRlciA9ICpoZWFkZXJwOw0KCWlmICgw
ID09IGhlYWRlcikgew0KCQkvKiBXZSdyZSBsb29raW5nIGF0IGFuIGFycmF5
LiAgTW92ZSB0byB0aGUgaGVhZGVyLiAqLw0KCQlwID0gZnJvbnQgKyAzICog
V09SRF9TSVpFOw0KCQloZWFkZXJwID0gKEhlYWRlciopKHAgLSBXT1JEX1NJ
WkUpOw0KCQloZWFkZXIgPSAqaGVhZGVycDsNCgl9IGVsc2UgDQoJCXAgPSBm
cm9udCArIFdPUkRfU0laRTsNCglpZiAoMSA9PSAoMSAmIGhlYWRlcikpIHsN
CgkJLyogSXQncyBhIGhlYWRlciAqLw0KCQlpZiAoTUFSS19NQVNLICYgaGVh
ZGVyKSB7DQoJCQkvKiBJdCBpcyBtYXJrZWQsIGJ1dCBoYXMgbm8gZm9yd2Fy
ZCBwb2ludGVycy4gDQoJCQkgKiBUaHJlYWQgaW50ZXJuYWwgcG9pbnRlcnMu
DQoJCQkgKi8NCnRocmVhZDoNCgkJCW1heWJlQ2xlYXJXZWFrIChzLCBwKTsN
CgkJCXNpemUgPSBvYmplY3RTaXplIChzLCBwKTsNCgkJCWlmIChERUJVR19N
QVJLX0NPTVBBQ1QpDQoJICAgICAgIAkJCWZwcmludGYgKHN0ZGVyciwgInRo
cmVhZGluZyAweCUwOHggb2Ygc2l6ZSAldVxuIiwgDQoJCQkJCQkodWludClw
LCBzaXplKTsNCgkJCWlmIChmcm9udCAtIGVuZE9mTGFzdE1hcmtlZCA+PSA0
ICogV09SRF9TSVpFKSB7DQoJCQkJLyogQ29tcHJlc3MgYWxsIG9mIHRoZSB1
bm1hcmtlZCBpbnRvIG9uZSBzdHJpbmcuDQoJCQkJICogV2UgcmVxdWlyZSA0
ICogV09SRF9TSVpFIHNwYWNlIHRvIGJlIGF2YWlsYWJsZQ0KCQkJCSAqIGJl
Y2F1c2UgdGhhdCBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYXJyYXkuDQoJ
CQkJICogWW91IGNhbm5vdCB1c2UgMyAqIFdPUkRfU0laRSBiZWNhdXNlIGV2
ZW4NCgkJCQkgKiB6ZXJvLWxlbmd0aCBhcnJheXMgcmVxdWlyZSBhbiBleHRy
YSB3b3JkIGZvcg0KCQkJCSAqIHRoZSBmb3J3YXJkaW5nIHBvaW50ZXIuICBJ
ZiB5b3UgZGlkIHVzZQ0KCQkJCSAqIDMgKiBXT1JEX1NJWkUsIHVwZGF0ZUJh
Y2t3YXJkUG9pbnRlcnNBbmRTbGlkZQ0KCQkJCSAqIHdvdWxkIHNraXAgdGhl
IGV4dHJhIHdvcmQgYW5kIGJlIGNvbXBsZXRlbHkNCgkJCQkgKiBidXN0ZWQu
DQoJCQkJICovDQoJCQkJaWYgKERFQlVHX01BUktfQ09NUEFDVCkNCgkJCQkJ
ZnByaW50ZiAoc3RkZXJyLCAiY29tcHJlc3NpbmcgZnJvbSAweCUwOHggdG8g
MHglMDh4IChsZW5ndGggPSAldSlcbiIsDQoJCQkJCQkJKHVpbnQpZW5kT2ZM
YXN0TWFya2VkLA0KCQkJCQkJCSh1aW50KWZyb250LA0KCQkJCQkJCWZyb250
IC0gZW5kT2ZMYXN0TWFya2VkKTsNCgkJCQkqKHVpbnQqKWVuZE9mTGFzdE1h
cmtlZCA9IDA7DQoJCQkJKih1aW50KikoZW5kT2ZMYXN0TWFya2VkICsgV09S
RF9TSVpFKSA9IA0KCQkJCQlmcm9udCAtIGVuZE9mTGFzdE1hcmtlZCAtIDMg
KiBXT1JEX1NJWkU7DQoJCQkJKih1aW50KikoZW5kT2ZMYXN0TWFya2VkICsg
MiAqIFdPUkRfU0laRSkgPQ0KCQkJCQlHQ19vYmplY3RIZWFkZXIgKFNUUklO
R19UWVBFX0lOREVYKTsNCgkJCX0NCgkJCWZyb250ICs9IHNpemU7DQoJCQll
bmRPZkxhc3RNYXJrZWQgPSBmcm9udDsNCgkJCWZvcmVhY2hQb2ludGVySW5P
YmplY3QgKHMsIHAsIEZBTFNFLCB0aHJlYWRJbnRlcm5hbCk7DQoJCQlnb3Rv
IHVwZGF0ZU9iamVjdDsNCgkJfSBlbHNlIHsNCgkJCS8qIEl0J3Mgbm90IG1h
cmtlZC4gKi8NCgkJCXNpemUgPSBvYmplY3RTaXplIChzLCBwKTsNCgkJCWdh
cCArPSBzaXplOw0KCQkJZnJvbnQgKz0gc2l6ZTsNCgkJCWdvdG8gdXBkYXRl
T2JqZWN0Ow0KCQl9DQoJfSBlbHNlIHsNCgkJcG9pbnRlciBuZXc7DQoNCgkJ
YXNzZXJ0ICgwID09ICgzICYgaGVhZGVyKSk7DQoJCS8qIEl0J3MgYSBwb2lu
dGVyLiAgVGhpcyBvYmplY3QgbXVzdCBiZSBsaXZlLiAgRml4IGFsbCB0aGUN
CgkJICogZm9yd2FyZCBwb2ludGVycyB0byBpdCwgc3RvcmUgaXRzIGhlYWRl
ciwgdGhlbiB0aHJlYWQNCiAgICAgICAgICAgICAgICAgKiBpdHMgaW50ZXJu
YWwgcG9pbnRlcnMuDQoJCSAqLw0KCQluZXcgPSBwIC0gZ2FwOw0KCQlkbyB7
DQoJCQlwb2ludGVyIGN1cjsNCg0KCQkJY3VyID0gKHBvaW50ZXIpaGVhZGVy
Ow0KCQkJaGVhZGVyID0gKih3b3JkKiljdXI7DQoJCQkqKHdvcmQqKWN1ciA9
ICh3b3JkKW5ldzsNCgkJfSB3aGlsZSAoMCA9PSAoMSAmIGhlYWRlcikpOw0K
CQkqaGVhZGVycCA9IGhlYWRlcjsNCgkJZ290byB0aHJlYWQ7DQoJfQ0KCWFz
c2VydCAoRkFMU0UpOw0KZG9uZToNCglyZXR1cm47DQp9DQoNCnN0YXRpYyB2
b2lkIHVwZGF0ZUJhY2t3YXJkUG9pbnRlcnNBbmRTbGlkZSAoR0Nfc3RhdGUg
cykgew0KCXBvaW50ZXIgYmFjazsNCglwb2ludGVyIGZyb250Ow0KCXVpbnQg
Z2FwOw0KCUhlYWRlciBoZWFkZXI7DQoJcG9pbnRlciBwOw0KCXVpbnQgc2l6
ZTsNCg0KCWlmIChERUJVR19NQVJLX0NPTVBBQ1QpDQoJCWZwcmludGYgKHN0
ZGVyciwgIlVwZGF0ZSBiYWNrd2FyZCBwb2ludGVycyBhbmQgc2xpZGUuXG4i
KTsNCglmcm9udCA9IGFsaWduRnJvbnRpZXIgKHMsIHMtPmhlYXAuc3RhcnQp
Ow0KCWJhY2sgPSBzLT5oZWFwLnN0YXJ0ICsgcy0+b2xkR2VuU2l6ZTsNCgln
YXAgPSAwOw0KdXBkYXRlT2JqZWN0Og0KCWlmIChERUJVR19NQVJLX0NPTVBB
Q1QpDQoJCWZwcmludGYgKHN0ZGVyciwgInVwZGF0ZU9iamVjdCAgZnJvbnQg
PSAweCUwOHggIGJhY2sgPSAweCUwOHhcbiIsDQoJCQkJKHVpbnQpZnJvbnQs
ICh1aW50KWJhY2spOw0KCWlmIChmcm9udCA9PSBiYWNrKQ0KCQlnb3RvIGRv
bmU7DQoJaGVhZGVyID0gKih3b3JkKilmcm9udDsNCglpZiAoMCA9PSBoZWFk
ZXIpIHsNCgkJLyogV2UncmUgbG9va2luZyBhdCBhbiBhcnJheS4gIE1vdmUg
dG8gdGhlIGhlYWRlci4gKi8NCgkJcCA9IGZyb250ICsgMyAqIFdPUkRfU0la
RTsNCgkJaGVhZGVyID0gKihIZWFkZXIqKShwIC0gV09SRF9TSVpFKTsNCgl9
IGVsc2UgDQoJCXAgPSBmcm9udCArIFdPUkRfU0laRTsNCglpZiAoMSA9PSAo
MSAmIGhlYWRlcikpIHsNCgkJLyogSXQncyBhIGhlYWRlciAqLw0KCQlpZiAo
TUFSS19NQVNLICYgaGVhZGVyKSB7DQoJCQkvKiBJdCBpcyBtYXJrZWQsIGJ1
dCBoYXMgbm8gYmFja3dhcmQgcG9pbnRlcnMgdG8gaXQuDQoJCQkgKiBVbm1h
cmsgaXQuDQoJCQkgKi8NCnVubWFyazoNCgkJCSpHQ19nZXRIZWFkZXJwIChw
KSA9IGhlYWRlciAmIH5NQVJLX01BU0s7DQoJCQlzaXplID0gb2JqZWN0U2l6
ZSAocywgcCk7DQoJCQlpZiAoREVCVUdfTUFSS19DT01QQUNUKQ0KCQkJCWZw
cmludGYgKHN0ZGVyciwgInVubWFya2luZyAweCUwOHggb2Ygc2l6ZSAldVxu
IiwgDQoJCQkJCQkodWludClwLCBzaXplKTsNCgkJCS8qIHNsaWRlICovDQoJ
CQlpZiAoREVCVUdfTUFSS19DT01QQUNUKQ0KCQkJCWZwcmludGYgKHN0ZGVy
ciwgInNsaWRpbmcgMHglMDh4IGRvd24gJXVcbiIsDQoJCQkJCQkodWludClm
cm9udCwgZ2FwKTsNCgkJCWNvcHkgKGZyb250LCBmcm9udCAtIGdhcCwgc2l6
ZSk7DQoJCQlmcm9udCArPSBzaXplOw0KCQkJZ290byB1cGRhdGVPYmplY3Q7
DQoJCX0gZWxzZSB7DQoJCQkvKiBJdCdzIG5vdCBtYXJrZWQuICovDQoJCQlz
aXplID0gb2JqZWN0U2l6ZSAocywgcCk7DQoJCQlpZiAoREVCVUdfTUFSS19D
T01QQUNUKQ0KCQkJCWZwcmludGYgKHN0ZGVyciwgInNraXBwaW5nIDB4JTA4
eCBvZiBzaXplICV1XG4iLA0KCQkJCQkJKHVpbnQpcCwgc2l6ZSk7DQoJCQln
YXAgKz0gc2l6ZTsNCgkJCWZyb250ICs9IHNpemU7DQoJCQlnb3RvIHVwZGF0
ZU9iamVjdDsNCgkJfQ0KCX0gZWxzZSB7DQoJCXBvaW50ZXIgbmV3Ow0KDQoJ
CS8qIEl0J3MgYSBwb2ludGVyLiAgVGhpcyBvYmplY3QgbXVzdCBiZSBsaXZl
LiAgRml4IGFsbCB0aGUNCgkJICogYmFja3dhcmQgcG9pbnRlcnMgdG8gaXQu
ICBUaGVuIHVubWFyayBpdC4NCgkJICovDQoJCW5ldyA9IHAgLSBnYXA7DQoJ
CWRvIHsNCgkJCXBvaW50ZXIgY3VyOw0KDQoJCQlhc3NlcnQgKDAgPT0gKDMg
JiBoZWFkZXIpKTsNCgkJCWN1ciA9IChwb2ludGVyKWhlYWRlcjsNCgkJCWhl
YWRlciA9ICood29yZCopY3VyOw0KCQkJKih3b3JkKiljdXIgPSAod29yZClu
ZXc7DQoJCX0gd2hpbGUgKDAgPT0gKDEgJiBoZWFkZXIpKTsNCgkJLyogVGhl
IGhlYWRlciB3aWxsIGJlIHN0b3JlZCBieSB1bm1hcmsuICovDQoJCWdvdG8g
dW5tYXJrOw0KCX0NCglhc3NlcnQgKEZBTFNFKTsNCmRvbmU6DQoJcy0+b2xk
R2VuU2l6ZSA9IGZyb250IC0gZ2FwIC0gcy0+aGVhcC5zdGFydDsNCglpZiAo
REVCVUdfTUFSS19DT01QQUNUKQ0KCQlmcHJpbnRmIChzdGRlcnIsICJieXRl
c0xpdmUgPSAldVxuIiwgcy0+Ynl0ZXNMaXZlKTsNCglyZXR1cm47DQp9DQoN
CnN0YXRpYyB2b2lkIG1hcmtDb21wYWN0IChHQ19zdGF0ZSBzKSB7DQoJc3Ry
dWN0IHJ1c2FnZSBydV9zdGFydDsNCg0KCWlmIChERUJVRyBvciBzLT5tZXNz
YWdlcykNCgkJZnByaW50ZiAoc3RkZXJyLCAiTWFqb3IgbWFyay1jb21wYWN0
IEdDLlxuIik7DQoJaWYgKGRldGFpbGVkR0NUaW1lIChzKSkNCgkJc3RhcnRU
aW1pbmcgKCZydV9zdGFydCk7CQkNCglzLT5udW1NYXJrQ29tcGFjdEdDcysr
Ow0KCWZvcmVhY2hHbG9iYWwgKHMsIG1hcmtHbG9iYWwpOw0KCWZvcmVhY2hH
bG9iYWwgKHMsIHRocmVhZEludGVybmFsKTsNCgl1cGRhdGVGb3J3YXJkUG9p
bnRlcnMgKHMpOw0KCXVwZGF0ZUJhY2t3YXJkUG9pbnRlcnNBbmRTbGlkZSAo
cyk7DQoJY2xlYXJDcm9zc01hcCAocyk7DQoJcy0+Ynl0ZXNNYXJrQ29tcGFj
dGVkICs9IHMtPm9sZEdlblNpemU7DQoJaWYgKGRldGFpbGVkR0NUaW1lIChz
KSkNCgkJc3RvcFRpbWluZyAoJnJ1X3N0YXJ0LCAmcy0+cnVfZ2NNYXJrQ29t
cGFjdCk7DQoJaWYgKERFQlVHIG9yIHMtPm1lc3NhZ2VzKQ0KCQlmcHJpbnRm
IChzdGRlcnIsICJNYWpvciBtYXJrLWNvbXBhY3QgR0MgZG9uZS5cbiIpOw0K
fQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICAg
ICAgICAgICAgICAgICAgdHJhbnNsYXRlSGVhcCAgICAgICAgICAgICAgICAg
ICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCnN0
YXRpYyB2b2lkIHRyYW5zbGF0ZVBvaW50ZXIgKEdDX3N0YXRlIHMsIHBvaW50
ZXIgKnApIHsNCglpZiAocy0+dHJhbnNsYXRlVXApDQoJCSpwICs9IHMtPnRy
YW5zbGF0ZURpZmY7DQoJZWxzZQ0KCQkqcCAtPSBzLT50cmFuc2xhdGVEaWZm
Ow0KfQ0KDQovKiBUcmFuc2xhdGUgYWxsIHBvaW50ZXJzIHRvIHRoZSBoZWFw
IGZyb20gd2l0aGluIHRoZSBzdGFjayBhbmQgdGhlIGhlYXAgZm9yDQogKiBh
IGhlYXAgdGhhdCBoYXMgbW92ZWQgZnJvbSBmcm9tIHRvIHRvLg0KICovDQpz
dGF0aWMgdm9pZCB0cmFuc2xhdGVIZWFwIChHQ19zdGF0ZSBzLCBwb2ludGVy
IGZyb20sIHBvaW50ZXIgdG8sIHVpbnQgc2l6ZSkgew0KCXBvaW50ZXIgbGlt
aXQ7DQoNCglpZiAoREVCVUcgb3Igcy0+bWVzc2FnZXMpDQoJCWZwcmludGYg
KHN0ZGVyciwgIlRyYW5zbGF0aW5nIGhlYXAgb2Ygc2l6ZSAlcyBmcm9tIDB4
JTA4eCB0byAweCUwOHguXG4iLA0KCQkJCXVpbnRUb0NvbW1hU3RyaW5nIChz
aXplKSwNCgkJCQkodWludClmcm9tLCAodWludCl0byk7DQoJaWYgKGZyb20g
PT0gdG8pDQoJCXJldHVybjsNCgllbHNlIGlmICh0byA+IGZyb20pIHsNCgkJ
cy0+dHJhbnNsYXRlRGlmZiA9IHRvIC0gZnJvbTsNCgkJcy0+dHJhbnNsYXRl
VXAgPSBUUlVFOw0KCX0gZWxzZSB7DQoJCXMtPnRyYW5zbGF0ZURpZmYgPSBm
cm9tIC0gdG87DQoJCXMtPnRyYW5zbGF0ZVVwID0gRkFMU0U7DQoJfQ0KCS8q
IFRyYW5zbGF0ZSBnbG9iYWxzIGFuZCBoZWFwLiAqLw0KCWZvcmVhY2hHbG9i
YWwgKHMsIHRyYW5zbGF0ZVBvaW50ZXIpOw0KCWxpbWl0ID0gdG8gKyBzaXpl
Ow0KCWZvcmVhY2hQb2ludGVySW5SYW5nZSAocywgYWxpZ25Gcm9udGllciAo
cywgdG8pLCAmbGltaXQsIEZBTFNFLA0KCQkJCXRyYW5zbGF0ZVBvaW50ZXIp
Ow0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBoZWFwUmVtYXAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoN
CiNpZiAoZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19GcmVl
QlNEX18pIHx8IGRlZmluZWQgKF9fTmV0QlNEX18pIHx8IGRlZmluZWQgKF9f
c3VuX18pKQ0KDQpzdGF0aWMgYm9vbCBoZWFwUmVtYXAgKEdDX3N0YXRlIHMs
IEdDX2hlYXAgaCwgVzMyIGRlc2lyZWQsIFczMiBtaW5TaXplKSB7DQoJcmV0
dXJuIEZBTFNFOw0KfQ0KDQojZWxpZiAoZGVmaW5lZCAoX19saW51eF9fKSkN
Cg0Kc3RhdGljIGJvb2wgaGVhcFJlbWFwIChHQ19zdGF0ZSBzLCBHQ19oZWFw
IGgsIFczMiBkZXNpcmVkLCBXMzIgbWluU2l6ZSkgew0KCVczMiBiYWNrb2Zm
Ow0KCVczMiBzaXplOw0KDQoJYXNzZXJ0IChtaW5TaXplIDw9IGRlc2lyZWQp
Ow0KCWFzc2VydCAoZGVzaXJlZCA+PSBoLT5zaXplKTsNCglkZXNpcmVkID0g
YWxpZ24gKGRlc2lyZWQsIHMtPnBhZ2VTaXplKTsNCgliYWNrb2ZmID0gKGRl
c2lyZWQgLSBtaW5TaXplKSAvIDIwOw0KCWlmICgwID09IGJhY2tvZmYpDQoJ
CWJhY2tvZmYgPSAxOyAvKiBlbm91Z2ggdG8gdGVybWluYXRlIHRoZSBsb29w
IGJlbG93ICovDQoJYmFja29mZiA9IGFsaWduIChiYWNrb2ZmLCBzLT5wYWdl
U2l6ZSk7DQoJZm9yIChzaXplID0gZGVzaXJlZDsgc2l6ZSA+PSBtaW5TaXpl
OyBzaXplIC09IGJhY2tvZmYpIHsNCgkJcG9pbnRlciBuZXc7DQoNCgkJbmV3
ID0gbXJlbWFwIChoLT5zdGFydCwgaC0+c2l6ZSwgc2l6ZSwgTVJFTUFQX01B
WU1PVkUpOw0KCQl1bmxlc3MgKCh2b2lkKiktMSA9PSBuZXcpIHsNCgkJCWlm
IChERUJVR19SRVNJWklORykNCgkJCQlmcHJpbnRmIChzdGRlcnIsICJSZW1h
cHBpbmcgaGVhcCBhdCAweCUwOHggb2Ygc2l6ZSAlcyB0byBoZWFwIGF0IDB4
JTA4eCBvZiBzaXplICVzLlxuIiwNCgkJCQkJKHVpbnQpaC0+c3RhcnQsDQoJ
CQkJCXVpbnRUb0NvbW1hU3RyaW5nIChoLT5zaXplKSwNCgkJCQkJKHVpbnQp
bmV3LA0KCQkJCQl1aW50VG9Db21tYVN0cmluZyAoc2l6ZSkpOw0KCQkJaC0+
c3RhcnQgPSBuZXc7DQoJCQloLT5zaXplID0gc2l6ZTsNCgkJCWlmIChoLT5z
aXplID4gcy0+bWF4SGVhcFNpemVTZWVuKQ0KCQkJCXMtPm1heEhlYXBTaXpl
U2VlbiA9IGgtPnNpemU7DQoJCQlhc3NlcnQgKG1pblNpemUgPD0gaC0+c2l6
ZSBhbmQgaC0+c2l6ZSA8PSBkZXNpcmVkKTsNCgkJCXJldHVybiBUUlVFOw0K
CQl9DQoJfQ0KCXJldHVybiBGQUxTRTsNCn0NCg0KI2Vsc2UNCg0KI2Vycm9y
IGhlYXBSZW1hcCBub3QgZGVmaW5lZA0KDQojZW5kaWYNCg0KLyogLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSAqLw0KLyogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGhlYXBHcm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0K
LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQpzdGF0aWMgdm9pZCBncm93
SGVhcCAoR0Nfc3RhdGUgcywgVzMyIGRlc2lyZWQsIFczMiBtaW5TaXplKSB7
DQoJR0NfaGVhcCBoOw0KCXN0cnVjdCBHQ19oZWFwIGgyOw0KCXBvaW50ZXIg
b2xkOw0KCXVpbnQgc2l6ZTsNCg0KCWggPSAmcy0+aGVhcDsNCglhc3NlcnQg
KGRlc2lyZWQgPj0gaC0+c2l6ZSk7DQoJaWYgKERFQlVHX1JFU0laSU5HKQ0K
CQlmcHJpbnRmIChzdGRlcnIsICJHcm93aW5nIGhlYXAgYXQgMHglMDh4IG9m
IHNpemUgJXMgdG8gJXMgYnl0ZXMuXG4iLA0KCQkJCSh1aW50KWgtPnN0YXJ0
LA0KCQkJCXVpbnRUb0NvbW1hU3RyaW5nIChoLT5zaXplKSwNCiAgICAgICAJ
CQkJdWludFRvQ29tbWFTdHJpbmcgKGRlc2lyZWQpKTsNCglvbGQgPSBzLT5o
ZWFwLnN0YXJ0Ow0KCXNpemUgPSBzLT5vbGRHZW5TaXplOw0KCWFzc2VydCAo
c2l6ZSA8PSBoLT5zaXplKTsNCglpZiAoaGVhcFJlbWFwIChzLCBoLCBkZXNp
cmVkLCBtaW5TaXplKSkNCgkJZ290byBkb25lOw0KCWhlYXBTaHJpbmsgKHMs
IGgsIHNpemUpOw0KCWhlYXBJbml0ICgmaDIpOw0KCS8qIEFsbG9jYXRlIGEg
c3BhY2Ugb2YgdGhlIGRlc2lyZWQgc2l6ZS4gKi8NCglpZiAoaGVhcENyZWF0
ZSAocywgJmgyLCBkZXNpcmVkLCBtaW5TaXplKSkgew0KCQlwb2ludGVyIGZy
b207DQoJCXVpbnQgcmVtYWluaW5nOw0KCQlwb2ludGVyIHRvOw0KDQoJCWZy
b20gPSBvbGQgKyBzaXplOw0KCQl0byA9IGgyLnN0YXJ0ICsgc2l6ZTsNCgkJ
cmVtYWluaW5nID0gc2l6ZTsNCmNvcHk6CQkJDQoJCWFzc2VydCAocmVtYWlu
aW5nID09IGZyb20gLSBvbGQgDQoJCQkJYW5kIGZyb20gPj0gb2xkIGFuZCB0
byA+PSBoMi5zdGFydCk7DQoJCWlmIChyZW1haW5pbmcgPCBDT1BZX0NIVU5L
X1NJWkUpIHsNCgkJCWNvcHkgKG9sZCwgaDIuc3RhcnQsIHJlbWFpbmluZyk7
DQoJCX0gZWxzZSB7DQoJCQlyZW1haW5pbmcgLT0gQ09QWV9DSFVOS19TSVpF
Ow0KCQkJZnJvbSAtPSBDT1BZX0NIVU5LX1NJWkU7DQoJCQl0byAtPSBDT1BZ
X0NIVU5LX1NJWkU7DQoJCQljb3B5IChmcm9tLCB0bywgQ09QWV9DSFVOS19T
SVpFKTsNCgkJCWhlYXBTaHJpbmsgKHMsIGgsIHJlbWFpbmluZyk7DQoJCQln
b3RvIGNvcHk7DQoJCX0NCgkJaGVhcFJlbGVhc2UgKHMsIGgpOw0KCQkqaCA9
IGgyOw0KCX0gZWxzZSB7DQoJCS8qIFdyaXRlIHRoZSBoZWFwIHRvIGEgZmls
ZSBhbmQgdHJ5IGFnYWluLiAqLw0KCQlpbnQgZmQ7DQoJCUZJTEUgKnN0cmVh
bTsNCgkJY2hhciB0ZW1wbGF0ZVs4MF07DQoJCWNoYXIgKnRtcERpcjsNCg0K
CQl0bXBEaXIgPSBnZXRlbnYgKCJUTVBESVIiKTsNCgkJaWYgKE5VTEwgPT0g
dG1wRGlyKQ0KCQkJdG1wRGlyID0gIi90bXAiOw0KCQlzdHJjcHkgKHRlbXBs
YXRlLCB0bXBEaXIpOw0KCQlzdHJjYXQgKHRlbXBsYXRlLCAiL0Zyb21TcGFj
ZVhYWFhYWCIpOw0KCQlmZCA9IHNta3N0ZW1wICh0ZW1wbGF0ZSk7DQoJCXNj
bG9zZSAoZmQpOw0KCQlpZiAocy0+bWVzc2FnZXMpDQoJCQlmcHJpbnRmIChz
dGRlcnIsICJQYWdpbmcgZnJvbSBzcGFjZSB0byAlcy5cbiIsIA0KCQkJCQl0
ZW1wbGF0ZSk7DQoJCXN0cmVhbSA9IHNmb3BlbiAodGVtcGxhdGUsICJ3YiIp
Ow0KCQlzZndyaXRlIChvbGQsIDEsIHNpemUsIHN0cmVhbSk7DQoJCXNmY2xv
c2UgKHN0cmVhbSk7DQoJCWhlYXBSZWxlYXNlIChzLCBoKTsNCgkJaWYgKGhl
YXBDcmVhdGUgKHMsIGgsIGRlc2lyZWQsIG1pblNpemUpKSB7DQoJCQlzdHJl
YW0gPSBzZm9wZW4gKHRlbXBsYXRlLCAicmIiKTsNCgkJCXNmcmVhZCAoaC0+
c3RhcnQsIDEsIHNpemUsIHN0cmVhbSk7DQoJCQlzZmNsb3NlIChzdHJlYW0p
Ow0KCQkJc3VubGluayAodGVtcGxhdGUpOw0KCQl9IGVsc2Ugew0KCQkJc3Vu
bGluayAodGVtcGxhdGUpOw0KCQkJaWYgKHMtPm1lc3NhZ2VzKQ0KCQkJCXNo
b3dNZW0gKCk7DQoJCQlkaWUgKCJPdXQgb2YgbWVtb3J5LiAgVW5hYmxlIHRv
IGFsbG9jYXRlICVzIGJ5dGVzLlxuIiwNCgkJCQl1aW50VG9Db21tYVN0cmlu
ZyAobWluU2l6ZSkpOw0KCQl9DQoJfQ0KZG9uZToNCgl1bmxlc3MgKG9sZCA9
PSBzLT5oZWFwLnN0YXJ0KSB7DQoJCXRyYW5zbGF0ZUhlYXAgKHMsIG9sZCwg
cy0+aGVhcC5zdGFydCwgcy0+b2xkR2VuU2l6ZSk7DQoJCXNldENhcmRNYXBG
b3JNdXRhdG9yIChzKTsNCgl9DQp9DQoNCg0KLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLw0KLyogICAgICAgICAgICAgICAgICAgICByZXNpemVDYXJkTWFw
QW5kQ3Jvc3NNYXAgICAgICAgICAgICAgICAgICAgICAqLw0KLyogLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSAqLw0KDQpzdGF0aWMgdm9pZCByZXNpemVDYXJkTWFw
QW5kQ3Jvc3NNYXAgKEdDX3N0YXRlIHMpIHsNCglpZiAocy0+bXV0YXRvck1h
cmtzQ2FyZHMgDQoJCWFuZCBzLT5jYXJkTWFwU2l6ZSAhPSANCgkJCWFsaWdu
IChkaXZDYXJkU2l6ZSAocywgcy0+aGVhcC5zaXplKSwgcy0+cGFnZVNpemUp
KSB7DQoJCXBvaW50ZXIgb2xkQ2FyZE1hcDsNCgkJcG9pbnRlciBvbGRDcm9z
c01hcDsNCgkJdWludCBvbGRDYXJkTWFwU2l6ZTsNCgkJdWludCBvbGRDcm9z
c01hcFNpemU7DQoNCgkJb2xkQ2FyZE1hcCA9IHMtPmNhcmRNYXA7DQoJCW9s
ZENhcmRNYXBTaXplID0gcy0+Y2FyZE1hcFNpemU7DQoJCW9sZENyb3NzTWFw
ID0gcy0+Y3Jvc3NNYXA7DQoJCW9sZENyb3NzTWFwU2l6ZSA9IHMtPmNyb3Nz
TWFwU2l6ZTsNCgkJY3JlYXRlQ2FyZE1hcEFuZENyb3NzTWFwIChzKTsNCgkJ
Y29weSAob2xkQ3Jvc3NNYXAsIHMtPmNyb3NzTWFwLA0KCQkJbWluIChzLT5j
cm9zc01hcFNpemUsIG9sZENyb3NzTWFwU2l6ZSkpOw0KCQlpZiAoREVCVUdf
TUVNKQ0KCQkJZnByaW50ZiAoc3RkZXJyLCAiUmVsZWFzaW5nIGNhcmQvY3Jv
c3MgbWFwLlxuIik7DQoJCXJlbGVhc2UgKG9sZENhcmRNYXAsIG9sZENhcmRN
YXBTaXplICsgb2xkQ3Jvc3NNYXBTaXplKTsNCgl9DQp9DQoNCi8qIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJlc2l6ZUhlYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8N
Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qIFJlc2l6ZSBmcm9tIHNw
YWNlIGFuZCB0byBzcGFjZSwgZ3VhcmFudGVlaW5nIHRoYXQgYXQgbGVhc3Qg
J25lZWQnIGJ5dGVzIGFyZQ0KICogYXZhaWxhYmxlIGluIGZyb20gc3BhY2Uu
DQogKi8NCnN0YXRpYyB2b2lkIHJlc2l6ZUhlYXAgKEdDX3N0YXRlIHMsIFc2
NCBuZWVkKSB7DQoJVzMyIGRlc2lyZWQ7DQoNCglpZiAoREVCVUdfUkVTSVpJ
TkcpDQoJCWZwcmludGYgKHN0ZGVyciwgInJlc2l6ZUhlYXAgIG5lZWQgPSAl
cyBmcm9tU2l6ZSA9ICVzXG4iLA0KCQkJCXVsbG9uZ1RvQ29tbWFTdHJpbmcg
KG5lZWQpLCANCgkJCQl1aW50VG9Db21tYVN0cmluZyAocy0+aGVhcC5zaXpl
KSk7DQoJZGVzaXJlZCA9IGhlYXBEZXNpcmVkU2l6ZSAocywgbmVlZCwgcy0+
aGVhcC5zaXplKTsNCglhc3NlcnQgKG5lZWQgPD0gZGVzaXJlZCk7DQoJaWYg
KGRlc2lyZWQgPD0gcy0+aGVhcC5zaXplKQ0KCQloZWFwU2hyaW5rIChzLCAm
cy0+aGVhcCwgZGVzaXJlZCk7DQoJZWxzZSB7DQoJCWhlYXBSZWxlYXNlIChz
LCAmcy0+aGVhcDIpOw0KCQlncm93SGVhcCAocywgZGVzaXJlZCwgbmVlZCk7
DQoJfQ0KCXJlc2l6ZUNhcmRNYXBBbmRDcm9zc01hcCAocyk7DQoJYXNzZXJ0
IChzLT5oZWFwLnNpemUgPj0gbmVlZCk7DQp9DQoNCi8qIEd1YXJhbnRlZSB0
aGF0IGhlYXAyIGlzIGVpdGhlciB0aGUgc2FtZSBzaXplIGFzIGhlYXAgb3Ig
aXMgdW5tYXBwZWQuICovDQpzdGF0aWMgdm9pZCByZXNpemVIZWFwMiAoR0Nf
c3RhdGUgcykgew0KCXVpbnQgc2l6ZTsNCgl1aW50IHNpemUyOw0KDQoJc2l6
ZSA9IHMtPmhlYXAuc2l6ZTsNCglzaXplMiA9IHMtPmhlYXAyLnNpemU7DQoJ
aWYgKERFQlVHX1JFU0laSU5HKQ0KCQlmcHJpbnRmIChzdGRlcnIsICJyZXNp
emVIZWFwMlxuIik7DQoJaWYgKDAgPT0gc2l6ZTIpDQoJCXJldHVybjsNCglp
ZiAoMiAqIHNpemUgPiBzLT5yYW0pDQoJCS8qIEhvbGRpbmcgb24gdG8gaGVh
cDIgbWlnaHQgY2F1c2UgcGFnaW5nLiAgU28gZG9uJ3QuICovDQoJCWhlYXBS
ZWxlYXNlIChzLCAmcy0+aGVhcDIpOw0KCWVsc2UgaWYgKHNpemUyIDwgc2l6
ZSkgew0KCQl1bmxlc3MgKGhlYXBSZW1hcCAocywgJnMtPmhlYXAyLCBzaXpl
LCBzaXplKSkNCgkJCWhlYXBSZWxlYXNlIChzLCAmcy0+aGVhcDIpOw0KICAg
ICAgICB9IGVsc2UgaWYgKHNpemUyID4gc2l6ZSkNCgkJaGVhcFNocmluayAo
cywgJnMtPmhlYXAyLCBzaXplKTsNCglhc3NlcnQgKDAgPT0gcy0+aGVhcDIu
c2l6ZSBvciBzLT5oZWFwLnNpemUgPT0gcy0+aGVhcDIuc2l6ZSk7DQp9DQoN
CnN0YXRpYyB2b2lkIGdyb3dTdGFjayAoR0Nfc3RhdGUgcykgew0KCXVpbnQg
c2l6ZTsNCglHQ19zdGFjayBzdGFjazsNCg0KCXNpemUgPSAyICogcy0+Y3Vy
cmVudFRocmVhZC0+c3RhY2stPnJlc2VydmVkOw0KCWlmIChERUJVR19TVEFD
S1Mgb3Igcy0+bWVzc2FnZXMpDQoJCWZwcmludGYgKHN0ZGVyciwgIkdyb3dp
bmcgc3RhY2sgdG8gc2l6ZSAlcy5cbiIsDQoJCQkJdWludFRvQ29tbWFTdHJp
bmcgKHN0YWNrQnl0ZXMgKHMsIHNpemUpKSk7DQoJYXNzZXJ0IChoYXNCeXRl
c0ZyZWUgKHMsIHN0YWNrQnl0ZXMgKHMsIHNpemUpLCAwKSk7DQoJc3RhY2sg
PSBuZXdTdGFjayAocywgc2l6ZSwgVFJVRSk7DQoJc3RhY2tDb3B5IChzLCBz
LT5jdXJyZW50VGhyZWFkLT5zdGFjaywgc3RhY2spOw0KCXMtPmN1cnJlbnRU
aHJlYWQtPnN0YWNrID0gc3RhY2s7DQoJYXNzZXJ0IChtdXRhdG9yRnJvbnRp
ZXJJbnZhcmlhbnQocykpOw0KCW1hcmtDYXJkIChzLCAocG9pbnRlcilzLT5j
dXJyZW50VGhyZWFkKTsNCn0NCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAq
Lw0KLyogICAgICAgICAgICAgICAgICAgICAgICBHYXJiYWdlIENvbGxlY3Rp
b24gICAgICAgICAgICAgICAgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLw0KDQpzdGF0aWMgYm9vbCBoZWFwQWxsb2NhdGVTZWNvbmRT
ZW1pIChHQ19zdGF0ZSBzLCBXMzIgc2l6ZSkgew0KCWlmICgocy0+Zml4ZWRI
ZWFwID4gMCBhbmQgcy0+aGVhcC5zaXplICsgc2l6ZSA+IHMtPmZpeGVkSGVh
cCkNCgkJb3IgKHMtPm1heEhlYXAgPiAwIGFuZCBzLT5oZWFwLnNpemUgKyBz
aXplID4gcy0+bWF4SGVhcCkpDQoJCXJldHVybiBGQUxTRTsNCglyZXR1cm4g
aGVhcENyZWF0ZSAocywgJnMtPmhlYXAyLCBzaXplLCBzLT5vbGRHZW5TaXpl
KTsNCn0NCg0Kc3RhdGljIHZvaWQgbWFqb3JHQyAoR0Nfc3RhdGUgcywgVzMy
IGJ5dGVzUmVxdWVzdGVkLCBib29sIG1heVJlc2l6ZSkgew0KCXMtPm51bU1p
bm9yc1NpbmNlTGFzdE1ham9yID0gMDsNCiAgICAgICAgaWYgKG5vdCBGT1JD
RV9NQVJLX0NPTVBBQ1QNCiAJCWFuZCBzLT5oZWFwLnNpemUgPCBzLT5yYW0N
CgkJYW5kIChub3QgaGVhcElzSW5pdCAoJnMtPmhlYXAyKQ0KCQkJb3IgaGVh
cEFsbG9jYXRlU2Vjb25kU2VtaSAocywgaGVhcERlc2lyZWRTaXplIChzLCAo
VzY0KXMtPmJ5dGVzTGl2ZSArIGJ5dGVzUmVxdWVzdGVkLCAwKSkpKQ0KCQlj
aGVuZXlDb3B5IChzKTsNCgllbHNlDQoJCW1hcmtDb21wYWN0IChzKTsNCglz
LT5ieXRlc0xpdmUgPSBzLT5vbGRHZW5TaXplOw0KCWlmIChzLT5ieXRlc0xp
dmUgPiBzLT5tYXhCeXRlc0xpdmUpDQoJCXMtPm1heEJ5dGVzTGl2ZSA9IHMt
PmJ5dGVzTGl2ZTsNCgkvKiBOb3RpY2UgdGhhdCB0aGUgcy0+Ynl0ZXNMaXZl
IGJlbG93IGlzIGRpZmZlcmVudCB0aGFuIHRoZSBzLT5ieXRlc0xpdmUNCgkg
KiB1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIGhlYXBDcmVhdGUgYWJvdmUuICBB
Ym92ZSwgaXQgd2FzIGFuIGVzdGltYXRlLg0KCSAqIEhlcmUsIGl0IGlzIGV4
YWN0bHkgaG93IG11Y2ggd2FzIGxpdmUgYWZ0ZXIgdGhlIEdDLg0KCSAqLw0K
CWlmIChtYXlSZXNpemUpDQoJCXJlc2l6ZUhlYXAgKHMsIChXNjQpcy0+Ynl0
ZXNMaXZlICsgYnl0ZXNSZXF1ZXN0ZWQpOw0KCXJlc2l6ZUhlYXAyIChzKTsN
Cglhc3NlcnQgKHMtPm9sZEdlblNpemUgKyBieXRlc1JlcXVlc3RlZCA8PSBz
LT5oZWFwLnNpemUpOw0KfQ0KDQpzdGF0aWMgaW5saW5lIHZvaWQgZW50ZXJH
QyAoR0Nfc3RhdGUgcykgew0KCWlmIChzLT5wcm9maWxpbmdJc09uKSB7DQoJ
CWlmIChzLT5wcm9maWxlU3RhY2spDQoJCQlHQ19wcm9maWxlRW50ZXIgKHMp
Ow0KCQlzLT5hbUluR0MgPSBUUlVFOw0KCX0NCn0NCg0Kc3RhdGljIGlubGlu
ZSB2b2lkIGxlYXZlR0MgKEdDX3N0YXRlIHMpIHsNCglpZiAocy0+cHJvZmls
aW5nSXNPbikgew0KCQlpZiAocy0+cHJvZmlsZVN0YWNrKQ0KCQkJR0NfcHJv
ZmlsZUxlYXZlIChzKTsNCgkJcy0+YW1JbkdDID0gRkFMU0U7DQoJfQ0KfQ0K
DQovKiBNTHRvbl9SdXNhZ2VfcnUgaXMgdGhlIG9ubHkgY29kZSBvdXRzaWRl
IG9mIGdjLmMgdGhhdCB1c2VzIGdjU3RhdGUucnVfZ2MuDQogKiBTbywgd2Ug
b25seSBuZWVkIHRvIGtlZXAgZ2NUaW1lIGlmIGdjLmMgbmVlZHMgaXQgZHVl
IHRvIHMtPnN1bW1hcnkgb3IgDQogKiBzLT5tZXNzYWdlcywgb3IgaWYgTUx0
b25fUnVzYWdlX3J1IGlzIGNhbGxlZC4gIEJlY2F1c2UgTUx0b25fUnVzYWdl
X3J1IGlzDQogKiBkZWZpbmVkIGluIGEgZmlsZSBhbGwgdG8gaXRzZWxmIChi
YXNpcy9NTHRvbi9ydXNhZ2UuYyksIGl0IGlzIGNhbGxlZCBpZmYgaXQNCiAq
IGlzIGxpbmtlZCBpbiwgd2hpY2ggd2UgY2FuIHRlc3QgdmlhIGEgd2VhayBz
eW1ib2wuDQogKi8NCiNpZiBTVVBQT1JUU19XRUFLDQp2b2lkIE1MdG9uX1J1
c2FnZV9ydSAoKSBfX2F0dHJpYnV0ZV9fICgod2VhaykpOw0KI2Vsc2UNCnZv
aWQgTUx0b25fUnVzYWdlX3J1ICgpOw0KI2VuZGlmDQpzdGF0aWMgaW5saW5l
IGJvb2wgbmVlZEdDVGltZSAoR0Nfc3RhdGUgcykgew0KCXJldHVybiBERUJV
RyBvciBzLT5zdW1tYXJ5IG9yIHMtPm1lc3NhZ2VzDQoJCW9yICgwICE9IE1M
dG9uX1J1c2FnZV9ydSAhPSAwKTsNCn0NCg0Kc3RhdGljIHZvaWQgZG9HQyAo
R0Nfc3RhdGUgcywgDQoJCQlXMzIgb2xkR2VuQnl0ZXNSZXF1ZXN0ZWQsDQoJ
CQlXMzIgbnVyc2VyeUJ5dGVzUmVxdWVzdGVkLCANCgkJCWJvb2wgZm9yY2VN
YWpvciwNCgkJCWJvb2wgbWF5UmVzaXplKSB7DQoJdWludCBnY1RpbWU7DQoJ
Ym9vbCBzdGFja1RvcE9rOw0KCVc2NCBzdGFja0J5dGVzUmVxdWVzdGVkOw0K
CXN0cnVjdCBydXNhZ2UgcnVfc3RhcnQ7DQoJVzY0IHRvdGFsQnl0ZXNSZXF1
ZXN0ZWQ7DQoJDQoJZW50ZXJHQyAocyk7DQoJaWYgKERFQlVHIG9yIHMtPm1l
c3NhZ2VzKQ0KCQlmcHJpbnRmIChzdGRlcnIsICJTdGFydGluZyBnYy4gIFJl
cXVlc3QgJXMgbnVyc2VyeSBieXRlcyBhbmQgJXMgb2xkIGdlbiBieXRlcy5c
biIsDQoJCQkJdWludFRvQ29tbWFTdHJpbmcgKG51cnNlcnlCeXRlc1JlcXVl
c3RlZCksDQoJCQkJdWludFRvQ29tbWFTdHJpbmcgKG9sZEdlbkJ5dGVzUmVx
dWVzdGVkKSk7DQoJYXNzZXJ0IChpbnZhcmlhbnQgKHMpKTsNCglpZiAobmVl
ZEdDVGltZSAocykpDQoJCXN0YXJ0VGltaW5nICgmcnVfc3RhcnQpOw0KCW1p
bm9yR0MgKHMpOw0KCXN0YWNrVG9wT2sgPSBtdXRhdG9yU3RhY2tJbnZhcmlh
bnQocyk7DQoJc3RhY2tCeXRlc1JlcXVlc3RlZCA9DQoJCXN0YWNrVG9wT2sN
CgkJPyAwIA0KCQk6IHN0YWNrQnl0ZXMgKHMsIDIgKiBzLT5jdXJyZW50VGhy
ZWFkLT5zdGFjay0+cmVzZXJ2ZWQpOw0KCXRvdGFsQnl0ZXNSZXF1ZXN0ZWQg
PSANCgkJKFc2NClvbGRHZW5CeXRlc1JlcXVlc3RlZCANCgkJKyBzdGFja0J5
dGVzUmVxdWVzdGVkDQoJCSsgbnVyc2VyeUJ5dGVzUmVxdWVzdGVkOw0KCWlm
IChmb3JjZU1ham9yIA0KCQlvciB0b3RhbEJ5dGVzUmVxdWVzdGVkID4gcy0+
aGVhcC5zaXplIC0gcy0+b2xkR2VuU2l6ZSkNCgkJbWFqb3JHQyAocywgdG90
YWxCeXRlc1JlcXVlc3RlZCwgbWF5UmVzaXplKTsNCglzZXROdXJzZXJ5IChz
LCBvbGRHZW5CeXRlc1JlcXVlc3RlZCArIHN0YWNrQnl0ZXNSZXF1ZXN0ZWQs
DQoJCQludXJzZXJ5Qnl0ZXNSZXF1ZXN0ZWQpOw0KCWFzc2VydCAoaGFzQnl0
ZXNGcmVlIChzLCBvbGRHZW5CeXRlc1JlcXVlc3RlZCArIHN0YWNrQnl0ZXNS
ZXF1ZXN0ZWQsDQoJCQkJCW51cnNlcnlCeXRlc1JlcXVlc3RlZCkpOw0KCXVu
bGVzcyAoc3RhY2tUb3BPaykNCgkJZ3Jvd1N0YWNrIChzKTsNCglzZXRTdGFj
ayAocyk7DQoJaWYgKG5lZWRHQ1RpbWUgKHMpKSB7DQoJCWdjVGltZSA9IHN0
b3BUaW1pbmcgKCZydV9zdGFydCwgJnMtPnJ1X2djKTsNCgkJcy0+bWF4UGF1
c2UgPSBtYXggKHMtPm1heFBhdXNlLCBnY1RpbWUpOw0KCX0gZWxzZQ0KCQln
Y1RpbWUgPSAwOyAgLyogQXNzaWduIGdjVGltZSB0byBxdWVsbCBnY2Mgd2Fy
bmluZy4gKi8NCglpZiAoREVCVUcgb3Igcy0+bWVzc2FnZXMpIHsNCgkJZnBy
aW50ZiAoc3RkZXJyLCAiRmluaXNoZWQgZ2MuXG4iKTsNCgkJZnByaW50ZiAo
c3RkZXJyLCAidGltZTogJXMgbXNcbiIsIGludFRvQ29tbWFTdHJpbmcgKGdj
VGltZSkpOw0KCQlmcHJpbnRmIChzdGRlcnIsICJvbGQgZ2VuIHNpemU6ICVz
IGJ5dGVzICglLjFmJSUpXG4iLCANCgkJCQlpbnRUb0NvbW1hU3RyaW5nIChz
LT5vbGRHZW5TaXplKSwNCgkJCQkxMDAuMCAqICgoZG91YmxlKSBzLT5vbGRH
ZW5TaXplKSANCgkJCQkJLyBzLT5oZWFwLnNpemUpOw0KCX0NCgkvKiBTZW5k
IGEgR0Mgc2lnbmFsLiAqLw0KCWlmIChzLT5oYW5kbGVHQ1NpZ25hbCBhbmQg
cy0+c2lnbmFsSGFuZGxlciAhPSBCT0dVU19USFJFQUQpIHsNCgkJaWYgKERF
QlVHX1NJR05BTFMpDQoJCQlmcHJpbnRmIChzdGRlcnIsICJHQyBTaWduYWwg
cGVuZGluZy5cbiIpOw0KCQlzLT5nY1NpZ25hbElzUGVuZGluZyA9IFRSVUU7
DQoJCXVubGVzcyAocy0+aW5TaWduYWxIYW5kbGVyKSANCgkJCXMtPnNpZ25h
bElzUGVuZGluZyA9IFRSVUU7DQoJfQ0KCWlmIChERUJVRykgDQoJCUdDX2Rp
c3BsYXkgKHMsIHN0ZGVycik7DQoJYXNzZXJ0IChoYXNCeXRlc0ZyZWUgKHMs
IG9sZEdlbkJ5dGVzUmVxdWVzdGVkLCBudXJzZXJ5Qnl0ZXNSZXF1ZXN0ZWQp
KTsNCglhc3NlcnQgKGludmFyaWFudCAocykpOw0KCWxlYXZlR0MgKHMpOw0K
fQ0KDQpzdGF0aWMgaW5saW5lIHZvaWQgZW5zdXJlTXV0YXRvckludmFyaWFu
dCAoR0Nfc3RhdGUgcywgYm9vbCBmb3JjZSkgew0KCWlmIChmb3JjZQ0KCQlv
ciBub3QgKG11dGF0b3JGcm9udGllckludmFyaWFudChzKSkNCgkJb3Igbm90
IChtdXRhdG9yU3RhY2tJbnZhcmlhbnQocykpKSB7DQoJCS8qIFRoaXMgR0Mg
d2lsbCBncm93IHRoZSBzdGFjaywgaWYgbmVjZXNzYXJ5LiAqLw0KCQlkb0dD
IChzLCAwLCBzLT5jdXJyZW50VGhyZWFkLT5ieXRlc05lZWRlZCwgZm9yY2Us
IFRSVUUpOw0KCX0NCglhc3NlcnQgKG11dGF0b3JGcm9udGllckludmFyaWFu
dChzKSk7DQoJYXNzZXJ0IChtdXRhdG9yU3RhY2tJbnZhcmlhbnQocykpOw0K
fQ0KDQovKiBlbnN1cmVGcmVlIChzLCBiKSBlbnN1cmVzIHRoYXQgdXBvbiBy
ZXR1cm4NCiAqICAgICAgYiA8PSBzLT5saW1pdFBsdXNTbG9wIC0gcy0+ZnJv
bnRpZXINCiAqLw0Kc3RhdGljIGlubGluZSB2b2lkIGVuc3VyZUZyZWUgKEdD
X3N0YXRlIHMsIHVpbnQgYikgew0KCWFzc2VydCAocy0+ZnJvbnRpZXIgPD0g
cy0+bGltaXRQbHVzU2xvcCk7DQoJaWYgKGIgPiBzLT5saW1pdFBsdXNTbG9w
IC0gcy0+ZnJvbnRpZXIpDQoJCWRvR0MgKHMsIDAsIGIsIEZBTFNFLCBUUlVF
KTsNCglhc3NlcnQgKGIgPD0gcy0+bGltaXRQbHVzU2xvcCAtIHMtPmZyb250
aWVyKTsNCn0NCg0Kc3RhdGljIHZvaWQgc3dpdGNoVG9UaHJlYWQgKEdDX3N0
YXRlIHMsIEdDX3RocmVhZCB0KSB7DQoJaWYgKERFQlVHX1RIUkVBRFMpDQoJ
CWZwcmludGYgKHN0ZGVyciwgInN3aXRjaFRvVGhyZWFkICgweCUwOHgpICB1
c2VkID0gJXUgIHJlc2VydmVkID0gJXVcbiIsIA0KCQkJCSh1aW50KXQsIHQt
PnN0YWNrLT51c2VkLCB0LT5zdGFjay0+cmVzZXJ2ZWQpOw0KCXMtPmN1cnJl
bnRUaHJlYWQgPSB0Ow0KCXNldFN0YWNrIChzKTsNCn0NCg0Kc3RhdGljIHZv
aWQgc3RhcnRIYW5kbGVyIChHQ19zdGF0ZSBzKSB7DQoJLyogU3dpdGNoIHRv
IHRoZSBzaWduYWwgaGFuZGxlciB0aHJlYWQuICovDQoJaWYgKERFQlVHX1NJ
R05BTFMpIHsNCgkJZnByaW50ZiAoc3RkZXJyLCAic3dpdGNoaW5nIHRvIHNp
Z25hbCBoYW5kbGVyXG4iKTsNCgkJR0NfZGlzcGxheSAocywgc3RkZXJyKTsN
Cgl9DQoJYXNzZXJ0IChzLT5jYW5IYW5kbGUgPT0gMCk7DQoJYXNzZXJ0IChz
LT5zaWduYWxJc1BlbmRpbmcpOw0KCXMtPnNpZ25hbElzUGVuZGluZyA9IEZB
TFNFOw0KCXMtPmluU2lnbmFsSGFuZGxlciA9IFRSVUU7DQoJcy0+c2F2ZWRU
aHJlYWQgPSBzLT5jdXJyZW50VGhyZWFkOw0KCS8qIFNldCBzLT5jYW5IYW5k
bGUgdG8gMSB3aGVuIHN3aXRjaGluZyB0byB0aGUgc2lnbmFsIGhhbmRsZXIg
dGhyZWFkLCANCgkgKiB3aGljaCB3aWxsIHRoZW4gcnVuIGF0b21pY2FsbHkg
YW5kIHdpbGwgZmluaXNoIGJ5IHN3aXRjaGluZyB0byANCgkgKiB0aGUgdGhy
ZWFkIHRvIGNvbnRpbnVlIHdpdGgsIHdoaWNoIHdpbGwgZGVjcmVtZW50IHMt
PmNhbkhhbmRsZSB0byAwLg0KIAkgKi8NCglzLT5jYW5IYW5kbGUgPSAxOw0K
fQ0KDQp2b2lkIEdDX3N3aXRjaFRvVGhyZWFkIChHQ19zdGF0ZSBzLCBHQ190
aHJlYWQgdCkgew0KCWlmIChERUJVR19USFJFQURTKQ0KCQlmcHJpbnRmIChz
dGRlcnIsICJHQ19zd2l0Y2hUb1RocmVhZCAoMHglMDh4KVxuIiwgKHVpbnQp
dCk7DQoJaWYgKFRSVUUpIHsNCgkJLyogVGhpcyBicmFuY2ggaXMgc2xvd2Vy
IHRoYW4gdGhlIGVsc2UgYnJhbmNoLCBlc3BlY2lhbGx5IA0KCQkgKiB3aGVu
IGRlYnVnZ2luZyBpcyB0dXJuZWQgb24sIGJlY2F1c2UgaXQgZG9lcyBhbiBp
bnZhcmlhbnQNCgkJICogY2hlY2sgb24gZXZlcnkgdGhyZWFkIHN3aXRjaC4N
CgkJICogU28sIHdlJ2xsIHN0aWNrIHdpdGggdGhlIGVsc2UgYnJhbmNoIGZv
ciBub3cuDQoJCSAqLw0KCSAJZW50ZXIgKHMpOw0KCQlzd2l0Y2hUb1RocmVh
ZCAocywgdCk7DQoJCXMtPmNhbkhhbmRsZS0tOw0KCQlpZiAoMCA9PSBzLT5j
YW5IYW5kbGUgYW5kIHMtPnNpZ25hbElzUGVuZGluZykgew0KCQkJc3RhcnRI
YW5kbGVyKHMpOw0KCQkJc3dpdGNoVG9UaHJlYWQgKHMsIHMtPnNpZ25hbEhh
bmRsZXIpOw0KCQl9DQoJCWVuc3VyZU11dGF0b3JJbnZhcmlhbnQgKHMsIEZB
TFNFKTsNCgkJYXNzZXJ0IChtdXRhdG9yRnJvbnRpZXJJbnZhcmlhbnQocykp
Ow0KCQlhc3NlcnQgKG11dGF0b3JTdGFja0ludmFyaWFudChzKSk7DQoJIAls
ZWF2ZSAocyk7DQoJfSBlbHNlIHsNCgkJcy0+Y3VycmVudFRocmVhZC0+c3Rh
Y2stPnVzZWQgPSBjdXJyZW50U3RhY2tVc2VkIChzKTsNCgkJcy0+Y3VycmVu
dFRocmVhZCA9IHQ7DQoJCXNldFN0YWNrIChzKTsNCgkJaWYgKHQtPmJ5dGVz
TmVlZGVkID4gcy0+bGltaXRQbHVzU2xvcCAtIHMtPmZyb250aWVyKSAgew0K
CQkJZW50ZXIgKHMpOw0KCQkJZG9HQyAocywgMCwgdC0+Ynl0ZXNOZWVkZWQs
IEZBTFNFLCBUUlVFKTsNCgkJCWxlYXZlIChzKTsNCgkJfQ0KCX0NCgkvKiBD
YW4gbm90IHJlZmVyIHRvIHQsIGJlY2F1c2Ugd2UgbWF5IGhhdmUgR0MnZWQu
ICovDQoJYXNzZXJ0IChzLT5jdXJyZW50VGhyZWFkLT5ieXRlc05lZWRlZCA8
PSBzLT5saW1pdFBsdXNTbG9wIC0gcy0+ZnJvbnRpZXIpOw0KfQ0KDQovKiBH
Q19zdGFydEhhbmRsZXIgZG9lcyBub3QgZG8gYW4gZW50ZXIoKS9sZWF2ZSgp
LCBldmVuIHRob3VnaCBpdCBpcyBleHBvcnRlZC4NCiAqIFRoZSBiYXNpcyBs
aWJyYXJ5IHVzZXMgaXQgdmlhIF9mZmksIG5vdCBfcHJpbSwgYW5kIHNvIGRv
ZXMgbm90IHRyZWF0IGl0IGFzIGENCiAqIHJ1bnRpbWUgY2FsbCAtLSBzbyB0
aGUgaW52YXJpYW50IGluIGVudGVyIHdvdWxkIGZhaWwgbWlzZXJhYmx5LiBJ
dCBzaW11bGF0ZXMNCiAqIHRoZSByZWxldmFudCBwYXJ0IG9mIGVudGVyKCkg
YnkgYmxvY2tpbmcgc2lnbmFscyBhbmQgcmVzZXR0aW5nIHRoZSBsaW1pdC4N
CiAqIFRoZSBsZWF2ZSgpIHdvdWxkbid0IGRvIGFueXRoaW5nIHVwb24gZXhp
dCBiZWNhdXNlIHdlIGFyZSBpbiBhIHNpZ25hbA0KICogaGFuZGxlci4NCiAq
Lw0Kdm9pZCBHQ19zdGFydEhhbmRsZXIgKEdDX3N0YXRlIHMpIHsNCglibG9j
a1NpZ25hbHMgKHMpOw0KCWlmICgwID09IHMtPmxpbWl0KQ0KCQlzLT5saW1p
dCA9IHMtPmxpbWl0UGx1c1Nsb3AgLSBMSU1JVF9TTE9QOw0KCXN0YXJ0SGFu
ZGxlciAocyk7DQp9DQoNCnZvaWQgR0NfZ2MgKEdDX3N0YXRlIHMsIHVpbnQg
Ynl0ZXNSZXF1ZXN0ZWQsIGJvb2wgZm9yY2UsDQoJCXN0cmluZyBmaWxlLCBp
bnQgbGluZSkgew0KCWlmIChERUJVRyBvciBzLT5tZXNzYWdlcykNCgkJZnBy
aW50ZiAoc3RkZXJyLCAiJXMgJWQ6IEdDX2djXG4iLCBmaWxlLCBsaW5lKTsN
CgllbnRlciAocyk7DQoJLyogV2hlbiB0aGUgbXV0YXRvciByZXF1ZXN0cyB6
ZXJvIGJ5dGVzLCBpdCBtYXkgYWN0dWFsbHkgbmVlZCBhcyBtdWNoDQoJICog
YXMgTElNSVRfU0xPUC4NCgkgKi8NCglpZiAoMCA9PSBieXRlc1JlcXVlc3Rl
ZCkNCgkJYnl0ZXNSZXF1ZXN0ZWQgPSBMSU1JVF9TTE9QOw0KCXMtPmN1cnJl
bnRUaHJlYWQtPmJ5dGVzTmVlZGVkID0gYnl0ZXNSZXF1ZXN0ZWQ7DQoJaWYg
KHMtPnNpZ25hbElzUGVuZGluZyBhbmQgcy0+Y2FuSGFuZGxlID09IDApIHsN
CgkJc3RhcnRIYW5kbGVyKHMpOw0KCQlzd2l0Y2hUb1RocmVhZCAocywgcy0+
c2lnbmFsSGFuZGxlcik7DQoJfQ0KCWVuc3VyZU11dGF0b3JJbnZhcmlhbnQg
KHMsIGZvcmNlKTsNCglhc3NlcnQgKG11dGF0b3JGcm9udGllckludmFyaWFu
dChzKSk7DQoJYXNzZXJ0IChtdXRhdG9yU3RhY2tJbnZhcmlhbnQocykpOw0K
CWxlYXZlIChzKTsNCn0NCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0K
LyogICAgICAgICAgICAgICAgICAgICAgICAgR0NfYXJyYXlBbGxvY2F0ZSAg
ICAgICAgICAgICAgICAgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLw0KDQpwb2ludGVyIEdDX2FycmF5QWxsb2NhdGUgKEdDX3N0YXRl
IHMsIFczMiBlbnN1cmVCeXRlc0ZyZWUsIFczMiBudW1FbHRzLCANCgkJCQlX
MzIgaGVhZGVyKSB7DQoJdWludCBudW1Qb2ludGVyczsNCgl1aW50IG51bU5v
blBvaW50ZXJzOw0KCXVpbnQgdGFnOw0KCXVpbnQgZWx0U2l6ZTsNCglXNjQg
YXJyYXlTaXplNjQ7DQoJVzMyIGFycmF5U2l6ZTsNCglXMzIgKmZyb250aWVy
Ow0KCVczMiAqbGFzdDsNCglwb2ludGVyIHJlczsNCg0KCVNQTElUX0hFQURF
UigpOw0KCWFzc2VydCAoKG51bVBvaW50ZXJzID09IDEgYW5kIG51bU5vblBv
aW50ZXJzID09IDApDQoJCQlvciAobnVtUG9pbnRlcnMgPT0gMCBhbmQgbnVt
Tm9uUG9pbnRlcnMgPiAwKSk7DQoJZWx0U2l6ZSA9IG51bVBvaW50ZXJzICog
UE9JTlRFUl9TSVpFICsgbnVtTm9uUG9pbnRlcnM7DQoJYXJyYXlTaXplNjQg
PSANCgkJdzY0YWxpZ24gKChXNjQpZWx0U2l6ZSAqIChXNjQpbnVtRWx0cyAr
IEdDX0FSUkFZX0hFQURFUl9TSVpFLA0KCQkJCXMtPmFsaWdubWVudCk7DQoJ
aWYgKGFycmF5U2l6ZTY0ID49IDB4MTAwMDAwMDAwbGx1KQ0KCQlkaWUgKCJP
dXQgb2YgbWVtb3J5OiBjYW5ub3QgYWxsb2NhdGUgYXJyYXkgd2l0aCAlcyBi
eXRlcy4iLA0KCQkJdWxsb25nVG9Db21tYVN0cmluZyAoYXJyYXlTaXplNjQp
KTsNCglhcnJheVNpemUgPSAoVzMyKWFycmF5U2l6ZTY0Ow0KCWlmIChhcnJh
eVNpemUgPCBHQ19BUlJBWV9IRUFERVJfU0laRSArIFdPUkRfU0laRSkNCgkJ
LyogQ3JlYXRlIHNwYWNlIGZvciBmb3J3YXJkaW5nIHBvaW50ZXIuICovDQog
CQlhcnJheVNpemUgPSBHQ19BUlJBWV9IRUFERVJfU0laRSArIFdPUkRfU0la
RTsNCglpZiAoREVCVUdfQVJSQVkpDQoJCWZwcmludGYgKHN0ZGVyciwgImFy
cmF5IHdpdGggJXMgZWx0cyBvZiBzaXplICV1IGFuZCB0b3RhbCBzaXplICVz
LiAgZW5zdXJlICVzIGJ5dGVzIGZyZWUuXG4iLA0KCQkJdWludFRvQ29tbWFT
dHJpbmcgKG51bUVsdHMpLCANCgkJCSh1aW50KWVsdFNpemUsIA0KCQkJdWlu
dFRvQ29tbWFTdHJpbmcgKGFycmF5U2l6ZSksDQoJCQl1aW50VG9Db21tYVN0
cmluZyAoZW5zdXJlQnl0ZXNGcmVlKSk7DQoJaWYgKGFycmF5U2l6ZSA+PSBz
LT5vbGRHZW5BcnJheVNpemUpIHsNCgkJZW50ZXIgKHMpOw0KCQlkb0dDIChz
LCAgYXJyYXlTaXplLCBlbnN1cmVCeXRlc0ZyZWUsIEZBTFNFLCBUUlVFKTsN
CgkJbGVhdmUgKHMpOw0KCQlmcm9udGllciA9IChXMzIqKShzLT5oZWFwLnN0
YXJ0ICsgcy0+b2xkR2VuU2l6ZSk7DQoJCWxhc3QgPSAoVzMyKikoKHBvaW50
ZXIpZnJvbnRpZXIgKyBhcnJheVNpemUpOw0KCQlzLT5vbGRHZW5TaXplICs9
IGFycmF5U2l6ZTsNCgkJcy0+Ynl0ZXNBbGxvY2F0ZWQgKz0gYXJyYXlTaXpl
Ow0KCX0gZWxzZSB7DQoJCVczMiByZXF1aXJlOw0KDQoJCXJlcXVpcmUgPSBh
cnJheVNpemUgKyBlbnN1cmVCeXRlc0ZyZWU7DQoJCWlmIChyZXF1aXJlID4g
cy0+bGltaXRQbHVzU2xvcCAtIHMtPmZyb250aWVyKSB7DQoJCQllbnRlciAo
cyk7DQoJCQlkb0dDIChzLCAwLCByZXF1aXJlLCBGQUxTRSwgVFJVRSk7DQoJ
CQlsZWF2ZSAocyk7DQoJCX0NCgkJZnJvbnRpZXIgPSAoVzMyKilzLT5mcm9u
dGllcjsNCgkJbGFzdCA9IChXMzIqKSgocG9pbnRlcilmcm9udGllciArIGFy
cmF5U2l6ZSk7DQoJCWFzc2VydCAoaXNBbGlnbmVkRnJvbnRpZXIgKHMsIChw
b2ludGVyKWxhc3QpKTsNCgkJcy0+ZnJvbnRpZXIgPSAocG9pbnRlcilsYXN0
Ow0KCX0NCgkqZnJvbnRpZXIrKyA9IDA7IC8qIGNvdW50ZXIgd29yZCAqLw0K
CSpmcm9udGllcisrID0gbnVtRWx0czsNCgkqZnJvbnRpZXIrKyA9IGhlYWRl
cjsNCglyZXMgPSAocG9pbnRlcilmcm9udGllcjsNCglpZiAoMSA9PSBudW1Q
b2ludGVycykNCgkJZm9yICggOyBmcm9udGllciA8IGxhc3Q7IGZyb250aWVy
KyspDQoJCQkqZnJvbnRpZXIgPSBCT0dVU19QT0lOVEVSOw0KCUdDX3Byb2Zp
bGVBbGxvY0luYyAocywgYXJyYXlTaXplKTsNCglpZiAoREVCVUdfQVJSQVkp
IHsNCgkJZnByaW50ZiAoc3RkZXJyLCAiR0NfYXJyYXlBbGxvY2F0ZSBkb25l
LiAgcmVzID0gMHgleCAgZnJvbnRpZXIgPSAweCV4XG4iLA0KCQkJCSh1aW50
KXJlcywgKHVpbnQpcy0+ZnJvbnRpZXIpOw0KCQlHQ19kaXNwbGF5IChzLCBz
dGRlcnIpOw0KCX0NCglhc3NlcnQgKGVuc3VyZUJ5dGVzRnJlZSA8PSBzLT5s
aW1pdFBsdXNTbG9wIC0gcy0+ZnJvbnRpZXIpOw0KCS8qIFVuZm9ydHVuYXRl
bHksIHRoZSBpbnZhcmlhbnQgaXNuJ3QgcXVpdGUgdHJ1ZSBoZXJlLCBiZWNh
dXNlIHVubGVzcyB3ZQ0KIAkgKiBkaWQgdGhlIEdDLCB3ZSBuZXZlciBzZXQg
cy0+Y3VycmVudFRocmVhZC0+c3RhY2stPnVzZWQgdG8gcmVmbGVjdA0KCSAq
IHdoYXQgdGhlIG11dGF0b3IgZGlkIHdpdGggc3RhY2tUb3AuDQogCSAqLw0K
CXJldHVybiByZXM7DQp9CQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICov
DQovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkcyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovDQoNCnN0YXRpYyBpbmxpbmUgdWludCB0aHJlYWRCeXRlcyAo
R0Nfc3RhdGUgcykgew0KCXVpbnQgcmVzOw0KDQoJcmVzID0gR0NfTk9STUFM
X0hFQURFUl9TSVpFICsgc2l6ZW9mIChzdHJ1Y3QgR0NfdGhyZWFkKTsNCgkv
KiBUaGUgZm9sbG93aW5nIGFzc2VydCBkZXBlbmRzIG9uIHN0cnVjdCBHQ190
aHJlYWQgYmVpbmcgdGhlIHJpZ2h0DQogCSAqIHNpemUuICBSaWdodCBub3cs
IGl0IGhhcHBlbnMgdGhhdCByZXMgPSAxNiwgd2hpY2ggaXMgYWxpZ25lZCBt
b2QgNA0KCSAqIGFuZCBtb2QgOCwgd2hpY2ggaXMgYWxsIHRoYXQgd2UgbmVl
ZC4gIElmIHRoZSBzdHJ1Y3QgZXZlcnkgY2hhbmdlcw0KCSAqIChwb3NzaWJs
ZSkgb3Igd2UgbmVlZCBtb3JlIGFsaWdubWVudCAoZG91YnRmdWwpLCB3ZSBt
YXkgbmVlZCB0byBwdXQNCgkgKiBzb21lIHBhZGRpbmcgYXQgdGhlIGJlZ2lu
bmluZy4NCgkgKi8NCglhc3NlcnQgKGlzQWxpZ25lZCAocmVzLCBzLT5hbGln
bm1lbnQpKTsNCglyZXR1cm4gcmVzOw0KfQ0KDQpzdGF0aWMgaW5saW5lIHVp
bnQgaW5pdGlhbFRocmVhZEJ5dGVzIChHQ19zdGF0ZSBzKSB7DQoJcmV0dXJu
IHRocmVhZEJ5dGVzIChzKSArIHN0YWNrQnl0ZXMgKHMsIGluaXRpYWxTdGFj
a1NpemUgKHMpKTsNCn0NCg0Kc3RhdGljIEdDX3RocmVhZCBuZXdUaHJlYWRP
ZlNpemUgKEdDX3N0YXRlIHMsIHVpbnQgc3RhY2tTaXplKSB7DQoJR0Nfc3Rh
Y2sgc3RhY2s7DQoJR0NfdGhyZWFkIHQ7DQoNCgllbnN1cmVGcmVlIChzLCBz
dGFja0J5dGVzIChzLCBzdGFja1NpemUpICsgdGhyZWFkQnl0ZXMgKHMpKTsN
CglzdGFjayA9IG5ld1N0YWNrIChzLCBzdGFja1NpemUsIEZBTFNFKTsNCgl0
ID0gKEdDX3RocmVhZCkgb2JqZWN0IChzLCBUSFJFQURfSEVBREVSLCB0aHJl
YWRCeXRlcyAocyksIEZBTFNFLCBGQUxTRSk7DQoJdC0+Ynl0ZXNOZWVkZWQg
PSAwOw0KCXQtPmV4blN0YWNrID0gQk9HVVNfRVhOX1NUQUNLOw0KCXQtPnN0
YWNrID0gc3RhY2s7DQoJaWYgKERFQlVHX1RIUkVBRFMpDQoJCWZwcmludGYg
KHN0ZGVyciwgIjB4JXggPSBuZXdUaHJlYWRPZlNpemUgKCV1KVxuIiwNCgkJ
CQkodWludCl0LCBzdGFja1NpemUpOzsNCglyZXR1cm4gdDsNCn0NCg0Kc3Rh
dGljIEdDX3RocmVhZCBjb3B5VGhyZWFkIChHQ19zdGF0ZSBzLCBHQ190aHJl
YWQgZnJvbSwgdWludCBzaXplKSB7DQoJR0NfdGhyZWFkIHRvOw0KDQoJaWYg
KERFQlVHX1RIUkVBRFMpDQoJCWZwcmludGYgKHN0ZGVyciwgImNvcHlUaHJl
YWQgKDB4JTA4eClcbiIsICh1aW50KWZyb20pOw0KCS8qIG5ld1RocmVhZE9m
U2l6ZSBtYXkgZG8gYSBHQywgd2hpY2ggaW52YWxpZGF0ZXMgZnJvbS4gIA0K
CSAqIEhlbmNlIHdlIG5lZWQgdG8gc3Rhc2ggZnJvbSB3aGVyZSB0aGUgR0Mg
Y2FuIGZpbmQgaXQuDQoJICovDQoJcy0+c2F2ZWRUaHJlYWQgPSBmcm9tOw0K
CXRvID0gbmV3VGhyZWFkT2ZTaXplIChzLCBzaXplKTsJDQoJZnJvbSA9IHMt
PnNhdmVkVGhyZWFkOw0KCXMtPnNhdmVkVGhyZWFkID0gQk9HVVNfVEhSRUFE
Ow0KCWlmIChERUJVR19USFJFQURTKSB7DQoJCWZwcmludGYgKHN0ZGVyciwg
ImZyZWUgc3BhY2UgPSAldVxuIiwNCgkJCQlzLT5saW1pdFBsdXNTbG9wIC0g
cy0+ZnJvbnRpZXIpOw0KCQlmcHJpbnRmIChzdGRlcnIsICIweCUwOHggPSBj
b3B5VGhyZWFkICgweCUwOHgpXG4iLCANCgkJCQkodWludCl0bywgKHVpbnQp
ZnJvbSk7DQoJfQ0KCXN0YWNrQ29weSAocywgZnJvbS0+c3RhY2ssIHRvLT5z
dGFjayk7DQoJdG8tPmV4blN0YWNrID0gZnJvbS0+ZXhuU3RhY2s7DQoJcmV0
dXJuIHRvOw0KfQ0KDQp2b2lkIEdDX2NvcHlDdXJyZW50VGhyZWFkIChHQ19z
dGF0ZSBzKSB7DQoJR0NfdGhyZWFkIHQ7DQoJR0NfdGhyZWFkIHJlczsNCgkN
CglpZiAoREVCVUdfVEhSRUFEUykNCgkJZnByaW50ZiAoc3RkZXJyLCAiR0Nf
Y29weUN1cnJlbnRUaHJlYWRcbiIpOw0KCWVudGVyIChzKTsNCgl0ID0gcy0+
Y3VycmVudFRocmVhZDsNCglyZXMgPSBjb3B5VGhyZWFkIChzLCB0LCB0LT5z
dGFjay0+dXNlZCk7DQovKiBUaGUgZm9sbG93aW5nIGFzc2VydCBpcyBubyBs
b25nZXIgdHJ1ZSwgc2luY2UgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBjYW4g
Zm9yY2UNCiAqIHRoZSByZXNlcnZlZCB0byBiZSBzbGlnaHRseSBsYXJnZXIg
dGhhbiB0aGUgdXNlZC4NCiAqLw0KLyoJYXNzZXJ0IChyZXMtPnN0YWNrLT5y
ZXNlcnZlZCA9PSByZXMtPnN0YWNrLT51c2VkKTsgKi8NCglsZWF2ZSAocyk7
DQoJaWYgKERFQlVHX1RIUkVBRFMpDQoJCWZwcmludGYgKHN0ZGVyciwgIjB4
JTA4eCA9IEdDX2NvcHlDdXJyZW50VGhyZWFkXG4iLCAodWludClyZXMpOw0K
CXMtPnNhdmVkVGhyZWFkID0gcmVzOw0KfQ0KDQpwb2ludGVyIEdDX2NvcHlU
aHJlYWQgKEdDX3N0YXRlIHMsIHBvaW50ZXIgdGhyZWFkKSB7DQoJR0NfdGhy
ZWFkIHJlczsNCglHQ190aHJlYWQgdDsNCg0KCXQgPSAoR0NfdGhyZWFkKXRo
cmVhZDsNCglpZiAoREVCVUdfVEhSRUFEUykNCgkJZnByaW50ZiAoc3RkZXJy
LCAiR0NfY29weVRocmVhZCAoMHglMDh4KVxuIiwgKHVpbnQpdCk7DQoJZW50
ZXIgKHMpOw0KLyogVGhlIGZvbGxvd2luZyBhc3NlcnQgaXMgbm8gbG9uZ2Vy
IHRydWUsIHNpbmNlIGFsaWdubWVudCByZXN0cmljdGlvbnMgY2FuIGZvcmNl
DQogKiB0aGUgcmVzZXJ2ZWQgdG8gYmUgc2xpZ2h0bHkgbGFyZ2VyIHRoYW4g
dGhlIHVzZWQuDQogKi8NCi8qCWFzc2VydCAodC0+c3RhY2stPnJlc2VydmVk
ID09IHQtPnN0YWNrLT51c2VkKTsgKi8NCglyZXMgPSBjb3B5VGhyZWFkIChz
LCB0LCBzdGFja05lZWRzUmVzZXJ2ZWQgKHMsIHQtPnN0YWNrKSk7DQoJYXNz
ZXJ0IChzdGFja1RvcElzT2sgKHMsIHJlcy0+c3RhY2spKTsNCglsZWF2ZSAo
cyk7DQoJcmV0dXJuIChwb2ludGVyKXJlczsNCn0NCg0KLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSAqLw0KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAg
UHJvZmlsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovKiBBcHBseSBmIHRvIHRoZSBm
cmFtZSBpbmRleCBvZiBlYWNoIGZyYW1lIGluIHRoZSBjdXJyZW50IHRocmVh
ZCdzIHN0YWNrLiAqLw0Kdm9pZCBHQ19mb3JlYWNoU3RhY2tGcmFtZSAoR0Nf
c3RhdGUgcywgdm9pZCAoKmYpIChHQ19zdGF0ZSBzLCB1aW50IGkpKSB7DQoJ
cG9pbnRlciBib3R0b207DQoJd29yZCBpbmRleDsNCglHQ19mcmFtZUxheW91
dCAqbGF5b3V0Ow0KCXdvcmQgcmV0dXJuQWRkcmVzczsNCglwb2ludGVyIHRv
cDsNCg0KCWlmIChERUJVR19QUk9GSUxFKQ0KCQlmcHJpbnRmIChzdGRlcnIs
ICJ3YWxraW5nIHN0YWNrIik7DQoJYXNzZXJ0IChzLT5uYXRpdmUpOw0KCWJv
dHRvbSA9IHN0YWNrQm90dG9tIChzLCBzLT5jdXJyZW50VGhyZWFkLT5zdGFj
ayk7DQoJaWYgKERFQlVHX1BST0ZJTEUpDQoJCWZwcmludGYgKHN0ZGVyciwg
IiAgYm90dG9tID0gMHglMDh4ICB0b3AgPSAweCUwOHguXG4iLA0KCQkJCSh1
aW50KWJvdHRvbSwgKHVpbnQpcy0+c3RhY2tUb3ApOw0KCWZvciAodG9wID0g
cy0+c3RhY2tUb3A7IHRvcCA+IGJvdHRvbTsgdG9wIC09IGxheW91dC0+bnVt
Qnl0ZXMpIHsNCgkJcmV0dXJuQWRkcmVzcyA9ICood29yZCopKHRvcCAtIFdP
UkRfU0laRSk7DQoJCWluZGV4ID0gZ2V0RnJhbWVJbmRleCAocywgcmV0dXJu
QWRkcmVzcyk7DQoJCWlmIChERUJVR19QUk9GSUxFKQ0KCQkJZnByaW50ZiAo
c3RkZXJyLCAidG9wID0gMHglMDh4ICBpbmRleCA9ICV1XG4iLA0KCQkJCQko
dWludCl0b3AsIGluZGV4KTsNCgkJdW5sZXNzICgwIDw9IGluZGV4IGFuZCBp
bmRleCA8IHMtPmZyYW1lTGF5b3V0c1NpemUpDQoJCQlkaWUgKCJ0b3AgPSAw
eCUwOHggIHJldHVybkFkZHJlc3MgPSAweCUwOHggIGluZGV4ID0gJXVcbiIs
DQoJCQkJCSh1aW50KXRvcCwgcmV0dXJuQWRkcmVzcywgaW5kZXgpOw0KCQlm
IChzLCBpbmRleCk7DQoJCWxheW91dCA9ICYocy0+ZnJhbWVMYXlvdXRzW2lu
ZGV4XSk7DQoJCWFzc2VydCAobGF5b3V0LT5udW1CeXRlcyA+IDApOw0KCX0N
CglpZiAoREVCVUdfUFJPRklMRSkNCgkJZnByaW50ZiAoc3RkZXJyLCAiZG9u
ZSB3YWxraW5nIHN0YWNrXG4iKTsNCn0NCg0Kc3RhdGljIGlubGluZSBzdHJp
bmcgc291cmNlTmFtZSAoR0Nfc3RhdGUgcywgdWludCBpKSB7DQoJaWYgKGkg
PCBzLT5zb3VyY2VzU2l6ZSkNCgkJcmV0dXJuIHMtPnNvdXJjZU5hbWVzW3Mt
PnNvdXJjZXNbaV0ubmFtZUluZGV4XTsNCgllbHNlDQoJCXJldHVybiBzLT5z
b3VyY2VOYW1lc1tpIC0gcy0+c291cmNlc1NpemVdOw0KfQ0KDQpzdGF0aWMg
aW5saW5lIEdDX3Byb2ZpbGVTdGFjayBwcm9maWxlU3RhY2tJbmZvIChHQ19z
dGF0ZSBzLCB1aW50IGkpIHsNCglyZXR1cm4gJihzLT5wcm9maWxlLT5zdGFj
a1tpXSk7DQp9DQoNCnN0YXRpYyBpbmxpbmUgdWludCBwcm9maWxlTWFzdGVy
IChHQ19zdGF0ZSBzLCB1aW50IGkpIHsNCglyZXR1cm4gcy0+c291cmNlc1tp
XS5uYW1lSW5kZXggKyBzLT5zb3VyY2VzU2l6ZTsNCn0NCg0Kc3RhdGljIGlu
bGluZSB2b2lkIHJlbW92ZUZyb21TdGFjayAoR0Nfc3RhdGUgcywgdWludCBp
KSB7DQoJR0NfcHJvZmlsZSBwOw0KCUdDX3Byb2ZpbGVTdGFjayBwczsNCgl1
bGxvbmcgdG90YWxJbmM7DQoNCglwID0gcy0+cHJvZmlsZTsNCglwcyA9IHBy
b2ZpbGVTdGFja0luZm8gKHMsIGkpOw0KCXRvdGFsSW5jID0gcC0+dG90YWwg
LSBwcy0+bGFzdFRvdGFsOw0KCWlmIChERUJVR19QUk9GSUxFKQ0KCQlmcHJp
bnRmIChzdGRlcnIsICJyZW1vdmluZyAlcyBmcm9tIHN0YWNrICB0aWNrc0lu
YyA9ICVsbHUgIHRpY2tzSW5HQ0luYyA9ICVsbHVcbiIsDQoJCQkJc291cmNl
TmFtZSAocywgaSksIHRvdGFsSW5jLA0KCQkJCXAtPnRvdGFsR0MgLSBwcy0+
bGFzdFRvdGFsR0MpOw0KCXBzLT50aWNrcyArPSB0b3RhbEluYzsNCglwcy0+
dGlja3NJbkdDICs9IHAtPnRvdGFsR0MgLSBwcy0+bGFzdFRvdGFsR0M7DQp9
DQoNCnN0YXRpYyB2b2lkIHNldFByb2ZUaW1lciAobG9uZyB1c2VjKSB7DQoJ
c3RydWN0IGl0aW1lcnZhbCBpdjsNCg0KCWl2Lml0X2ludGVydmFsLnR2X3Nl
YyA9IDA7DQoJaXYuaXRfaW50ZXJ2YWwudHZfdXNlYyA9IHVzZWM7DQoJaXYu
aXRfdmFsdWUudHZfc2VjID0gMDsNCglpdi5pdF92YWx1ZS50dl91c2VjID0g
dXNlYzsNCgl1bmxlc3MgKDAgPT0gc2V0aXRpbWVyIChJVElNRVJfUFJPRiwg
Jml2LCBOVUxMKSkNCgkJZGllICgic2V0UHJvZlRpbWVyIGZhaWxlZCIpOw0K
fQ0KDQp2b2lkIEdDX3Byb2ZpbGVEb25lIChHQ19zdGF0ZSBzKSB7DQoJR0Nf
cHJvZmlsZSBwOw0KCXVpbnQgc291cmNlSW5kZXg7DQoNCglpZiAoREVCVUdf
UFJPRklMRSkgDQoJCWZwcmludGYgKHN0ZGVyciwgIkdDX3Byb2ZpbGVEb25l
ICgpXG4iKTsNCglhc3NlcnQgKHMtPnByb2ZpbGluZ0lzT24pOw0KCWlmIChQ
Uk9GSUxFX1RJTUUgPT0gcy0+cHJvZmlsZUtpbmQpDQoJCXNldFByb2ZUaW1l
ciAoMCk7DQoJcy0+cHJvZmlsaW5nSXNPbiA9IEZBTFNFOw0KCXAgPSBzLT5w
cm9maWxlOw0KCWlmIChzLT5wcm9maWxlU3RhY2spIHsNCgkJZm9yIChzb3Vy
Y2VJbmRleCA9IDA7IA0KCQkJc291cmNlSW5kZXggPCBzLT5zb3VyY2VzU2l6
ZSArIHMtPnNvdXJjZU5hbWVzU2l6ZTsNCgkJCSsrc291cmNlSW5kZXgpIHsN
CgkJCWlmIChwLT5zdGFja1tzb3VyY2VJbmRleF0ubnVtT2NjdXJyZW5jZXMg
PiAwKSB7DQoJCQkJaWYgKERFQlVHX1BST0ZJTEUpDQoJCQkJCWZwcmludGYg
KHN0ZGVyciwgImRvbmUgbGVhdmluZyAlc1xuIiwgDQoJCQkJCQkJc291cmNl
TmFtZSAocywgc291cmNlSW5kZXgpKTsNCgkJCQlyZW1vdmVGcm9tU3RhY2sg
KHMsIHNvdXJjZUluZGV4KTsNCgkJCX0NCgkJfQ0KCX0NCn0NCg0Kc3RhdGlj
IGlubGluZSB2b2lkIHByb2ZpbGVFbnRlclNvdXJjZSAoR0Nfc3RhdGUgcywg
dWludCBpKSB7DQoJR0NfcHJvZmlsZSBwOw0KCUdDX3Byb2ZpbGVTdGFjayBw
czsNCg0KCXAgPSBzLT5wcm9maWxlOw0KCXBzID0gcHJvZmlsZVN0YWNrSW5m
byAocywgaSk7DQoJaWYgKDAgPT0gcHMtPm51bU9jY3VycmVuY2VzKSB7DQoJ
CXBzLT5sYXN0VG90YWwgPSBwLT50b3RhbDsNCgkJcHMtPmxhc3RUb3RhbEdD
ID0gcC0+dG90YWxHQzsNCgl9DQoJcHMtPm51bU9jY3VycmVuY2VzKys7DQp9
DQoNCnN0YXRpYyB2b2lkIHByb2ZpbGVFbnRlciAoR0Nfc3RhdGUgcywgdWlu
dCBzb3VyY2VTZXFJbmRleCkgew0KCWludCBpOw0KCUdDX3Byb2ZpbGUgcDsN
Cgl1aW50IHNvdXJjZUluZGV4Ow0KCXVpbnQgKnNvdXJjZVNlcTsNCg0KCWlm
IChERUJVR19QUk9GSUxFKQ0KCQlmcHJpbnRmIChzdGRlcnIsICJwcm9maWxl
RW50ZXIgKCV1KVxuIiwgc291cmNlU2VxSW5kZXgpOw0KCWFzc2VydCAocy0+
cHJvZmlsZVN0YWNrKTsNCglhc3NlcnQgKHNvdXJjZVNlcUluZGV4IDwgcy0+
c291cmNlU2Vxc1NpemUpOw0KCXAgPSBzLT5wcm9maWxlOw0KCXNvdXJjZVNl
cSA9IHMtPnNvdXJjZVNlcXNbc291cmNlU2VxSW5kZXhdOw0KCWZvciAoaSA9
IDE7IGkgPD0gc291cmNlU2VxWzBdOyArK2kpIHsNCgkJc291cmNlSW5kZXgg
PSBzb3VyY2VTZXFbaV07DQoJCWlmIChERUJVR19QUk9GSUxFKQ0KCQkJZnBy
aW50ZiAoc3RkZXJyLCAiZW50ZXJpbmcgJXNcbiIsIA0KCQkJCQlzb3VyY2VO
YW1lIChzLCBzb3VyY2VJbmRleCkpOw0KCQlwcm9maWxlRW50ZXJTb3VyY2Ug
KHMsIHNvdXJjZUluZGV4KTsNCgkJcHJvZmlsZUVudGVyU291cmNlIChzLCBw
cm9maWxlTWFzdGVyIChzLCBzb3VyY2VJbmRleCkpOw0KCX0NCn0NCg0Kc3Rh
dGljIHZvaWQgZW50ZXJGcmFtZSAoR0Nfc3RhdGUgcywgdWludCBpKSB7DQoJ
cHJvZmlsZUVudGVyIChzLCBzLT5mcmFtZVNvdXJjZXNbaV0pOw0KfQ0KDQpz
dGF0aWMgaW5saW5lIHZvaWQgcHJvZmlsZUxlYXZlU291cmNlIChHQ19zdGF0
ZSBzLCB1aW50IGkpIHsNCglHQ19wcm9maWxlIHA7DQoJR0NfcHJvZmlsZVN0
YWNrIHBzOw0KDQoJaWYgKERFQlVHX1BST0ZJTEUpDQoJCWZwcmludGYgKHN0
ZGVyciwgInByb2ZpbGVMZWF2ZVNvdXJjZSAoJXUpXG4iLCBpKTsNCglwID0g
cy0+cHJvZmlsZTsNCglwcyA9IHByb2ZpbGVTdGFja0luZm8gKHMsIGkpOw0K
CWFzc2VydCAocHMtPm51bU9jY3VycmVuY2VzID4gMCk7DQoJcHMtPm51bU9j
Y3VycmVuY2VzLS07DQoJaWYgKDAgPT0gcHMtPm51bU9jY3VycmVuY2VzKQ0K
CQlyZW1vdmVGcm9tU3RhY2sgKHMsIGkpOw0KfQ0KDQpzdGF0aWMgdm9pZCBw
cm9maWxlTGVhdmUgKEdDX3N0YXRlIHMsIHVpbnQgc291cmNlU2VxSW5kZXgp
IHsNCglpbnQgaTsNCglHQ19wcm9maWxlIHA7DQoJdWludCBzb3VyY2VJbmRl
eDsNCgl1aW50ICpzb3VyY2VTZXE7DQoNCglpZiAoREVCVUdfUFJPRklMRSkN
CgkJZnByaW50ZiAoc3RkZXJyLCAicHJvZmlsZUxlYXZlICgldSlcbiIsIHNv
dXJjZVNlcUluZGV4KTsNCglhc3NlcnQgKHMtPnByb2ZpbGVTdGFjayk7DQoJ
YXNzZXJ0IChzb3VyY2VTZXFJbmRleCA8IHMtPnNvdXJjZVNlcXNTaXplKTsN
CglwID0gcy0+cHJvZmlsZTsNCglzb3VyY2VTZXEgPSBzLT5zb3VyY2VTZXFz
W3NvdXJjZVNlcUluZGV4XTsNCglmb3IgKGkgPSBzb3VyY2VTZXFbMF07IGkg
PiAwOyAtLWkpIHsNCgkJc291cmNlSW5kZXggPSBzb3VyY2VTZXFbaV07DQoJ
CWlmIChERUJVR19QUk9GSUxFKQ0KCQkJZnByaW50ZiAoc3RkZXJyLCAibGVh
dmluZyAlc1xuIiwNCgkJCQkJc291cmNlTmFtZSAocywgc291cmNlSW5kZXgp
KTsNCgkJcHJvZmlsZUxlYXZlU291cmNlIChzLCBzb3VyY2VJbmRleCk7DQoJ
CXByb2ZpbGVMZWF2ZVNvdXJjZSAocywgcHJvZmlsZU1hc3RlciAocywgc291
cmNlSW5kZXgpKTsNCgl9DQp9DQoNCnN0YXRpYyBpbmxpbmUgdm9pZCBwcm9m
aWxlSW5jIChHQ19zdGF0ZSBzLCBXMzIgYW1vdW50LCB1aW50IHNvdXJjZVNl
cUluZGV4KSB7DQoJdWludCAqc291cmNlU2VxOw0KCXVpbnQgdG9wU291cmNl
SW5kZXg7DQoNCglpZiAoREVCVUdfUFJPRklMRSkNCgkJZnByaW50ZiAoc3Rk
ZXJyLCAicHJvZmlsZUluYyAoJXUsICV1KVxuIiwgDQoJCQkJKHVpbnQpYW1v
dW50LCBzb3VyY2VTZXFJbmRleCk7DQoJYXNzZXJ0IChzb3VyY2VTZXFJbmRl
eCA8IHMtPnNvdXJjZVNlcXNTaXplKTsNCglzb3VyY2VTZXEgPSBzLT5zb3Vy
Y2VTZXFzW3NvdXJjZVNlcUluZGV4XTsNCgl0b3BTb3VyY2VJbmRleCA9IHNv
dXJjZVNlcVswXSA+IDANCgkJPyBzb3VyY2VTZXFbc291cmNlU2VxWzBdXQ0K
CQk6IFNPVVJDRVNfSU5ERVhfVU5LTk9XTjsNCglpZiAoREVCVUdfUFJPRklM
RSkNCgkJZnByaW50ZiAoc3RkZXJyLCAiYnVtcGluZyAlcyBieSAldVxuIiwN
CgkJCQlzb3VyY2VOYW1lIChzLCB0b3BTb3VyY2VJbmRleCksICh1aW50KWFt
b3VudCk7DQoJcy0+cHJvZmlsZS0+Y291bnRUb3BbdG9wU291cmNlSW5kZXhd
ICs9IGFtb3VudDsNCglzLT5wcm9maWxlLT5jb3VudFRvcFtwcm9maWxlTWFz
dGVyIChzLCB0b3BTb3VyY2VJbmRleCldICs9IGFtb3VudDsNCglpZiAocy0+
cHJvZmlsZVN0YWNrKQ0KCQlwcm9maWxlRW50ZXIgKHMsIHNvdXJjZVNlcUlu
ZGV4KTsNCglpZiAoU09VUkNFU19JTkRFWF9HQyA9PSB0b3BTb3VyY2VJbmRl
eCkNCgkJcy0+cHJvZmlsZS0+dG90YWxHQyArPSBhbW91bnQ7DQoJZWxzZQ0K
CQlzLT5wcm9maWxlLT50b3RhbCArPSBhbW91bnQ7DQoJaWYgKHMtPnByb2Zp
bGVTdGFjaykNCgkJcHJvZmlsZUxlYXZlIChzLCBzb3VyY2VTZXFJbmRleCk7
DQp9DQoNCnZvaWQgR0NfcHJvZmlsZUVudGVyIChHQ19zdGF0ZSBzKSB7DQoJ
cHJvZmlsZUVudGVyIChzLCB0b3BGcmFtZVNvdXJjZVNlcUluZGV4IChzKSk7
DQp9DQoNCnZvaWQgR0NfcHJvZmlsZUxlYXZlIChHQ19zdGF0ZSBzKSB7DQoJ
cHJvZmlsZUxlYXZlIChzLCB0b3BGcmFtZVNvdXJjZVNlcUluZGV4IChzKSk7
DQp9DQoNCnZvaWQgR0NfcHJvZmlsZUluYyAoR0Nfc3RhdGUgcywgVzMyIGFt
b3VudCkgew0KCWlmIChERUJVR19QUk9GSUxFKQ0KCQlmcHJpbnRmIChzdGRl
cnIsICJHQ19wcm9maWxlSW5jICgldSlcbiIsICh1aW50KWFtb3VudCk7DQoJ
cHJvZmlsZUluYyAocywgYW1vdW50LCANCgkJCSBzLT5hbUluR0MNCgkJCQk/
IFNPVVJDRV9TRVFfR0MgDQoJCQkJOiB0b3BGcmFtZVNvdXJjZVNlcUluZGV4
IChzKSk7DQp9DQoNCnZvaWQgR0NfcHJvZmlsZUFsbG9jSW5jIChHQ19zdGF0
ZSBzLCBXMzIgYW1vdW50KSB7DQoJaWYgKERFQlVHX1BST0ZJTEUpDQoJCWZw
cmludGYgKHN0ZGVyciwgIkdDX3Byb2ZpbGVBbGxvY0luYyAoJXUpXG4iLCAo
dWludClhbW91bnQpOw0KCWlmIChzLT5wcm9maWxpbmdJc09uIGFuZCAoUFJP
RklMRV9BTExPQyA9PSBzLT5wcm9maWxlS2luZCkpDQoJCUdDX3Byb2ZpbGVJ
bmMgKHMsIGFtb3VudCk7DQp9DQoNCnN0YXRpYyB2b2lkIHNob3dQcm9mIChH
Q19zdGF0ZSBzKSB7DQoJaW50IGk7DQoJaW50IGo7DQoNCglmcHJpbnRmIChz
dGRvdXQsICIweCUwOHhcbiIsIHMtPm1hZ2ljKTsNCglmcHJpbnRmIChzdGRv
dXQsICIldVxuIiwgcy0+c291cmNlTmFtZXNTaXplKTsNCglmb3IgKGkgPSAw
OyBpIDwgcy0+c291cmNlTmFtZXNTaXplOyArK2kpDQoJCWZwcmludGYgKHN0
ZG91dCwgIiVzXG4iLCBzLT5zb3VyY2VOYW1lc1tpXSk7DQoJZnByaW50ZiAo
c3Rkb3V0LCAiJXVcbiIsIHMtPnNvdXJjZXNTaXplKTsNCglmb3IgKGkgPSAw
OyBpIDwgcy0+c291cmNlc1NpemU7ICsraSkNCgkJZnByaW50ZiAoc3Rkb3V0
LCAiJXUgJXVcbiIsIA0KCQkJCXMtPnNvdXJjZXNbaV0ubmFtZUluZGV4LA0K
CQkJCXMtPnNvdXJjZXNbaV0uc3VjY2Vzc29yc0luZGV4KTsNCglmcHJpbnRm
IChzdGRvdXQsICIldVxuIiwgcy0+c291cmNlU2Vxc1NpemUpOw0KCWZvciAo
aSA9IDA7IGkgPCBzLT5zb3VyY2VTZXFzU2l6ZTsgKytpKSB7DQoJCXVpbnQg
KnNvdXJjZVNlcTsNCg0KCQlzb3VyY2VTZXEgPSBzLT5zb3VyY2VTZXFzW2ld
Ow0KCQlmb3IgKGogPSAxOyBqIDw9IHNvdXJjZVNlcVswXTsgKytqKQ0KCQkJ
ZnByaW50ZiAoc3Rkb3V0LCAiJXUgIiwgc291cmNlU2VxW2pdKTsNCgkJZnBy
aW50ZiAoc3Rkb3V0LCAiXG4iKTsNCgl9DQp9DQoNCkdDX3Byb2ZpbGUgR0Nf
cHJvZmlsZU5ldyAoR0Nfc3RhdGUgcykgew0KCUdDX3Byb2ZpbGUgcDsNCgl1
aW50IHNpemU7DQoNCglORVcgKHApOw0KCXAtPnRvdGFsID0gMDsNCglwLT50
b3RhbEdDID0gMDsNCglzaXplID0gcy0+c291cmNlc1NpemUgKyBzLT5zb3Vy
Y2VOYW1lc1NpemU7DQoJQVJSQVkgKHAtPmNvdW50VG9wLCBzaXplKTsNCglp
ZiAocy0+cHJvZmlsZVN0YWNrKQ0KCQlBUlJBWSAocC0+c3RhY2ssIHNpemUp
Ow0KCWlmIChERUJVR19QUk9GSUxFKQ0KCQlmcHJpbnRmIChzdGRlcnIsICIw
eCUwOHggPSBHQ19wcm9maWxlTmV3ICgpXG4iLCAodWludClwKTsNCglyZXR1
cm4gcDsNCn0NCg0Kdm9pZCBHQ19wcm9maWxlRnJlZSAoR0Nfc3RhdGUgcywg
R0NfcHJvZmlsZSBwKSB7DQoJZnJlZSAocC0+Y291bnRUb3ApOw0KCWlmIChz
LT5wcm9maWxlU3RhY2spDQoJCWZyZWUgKHAtPnN0YWNrKTsNCglmcmVlIChw
KTsNCn0NCg0Kc3RhdGljIHZvaWQgd3JpdGVTdHJpbmcgKGludCBmZCwgc3Ry
aW5nIHMpIHsNCglzd3JpdGUgKGZkLCBzLCBzdHJsZW4ocykpOw0KfQ0KDQpz
dGF0aWMgdm9pZCB3cml0ZVVpbnQgKGludCBmZCwgdWludCB1KSB7DQoJY2hh
ciBidWZbMjBdOw0KDQoJc3ByaW50ZiAoYnVmLCAiJXUiLCB1KTsNCgl3cml0
ZVN0cmluZyAoZmQsIGJ1Zik7DQp9DQoNCnN0YXRpYyB2b2lkIHdyaXRlVWxs
b25nIChpbnQgZmQsIHVsbG9uZyB1KSB7DQoJY2hhciBidWZbMjBdOw0KDQoJ
c3ByaW50ZiAoYnVmLCAiJWxsdSIsIHUpOw0KCXdyaXRlU3RyaW5nIChmZCwg
YnVmKTsNCn0NCg0Kc3RhdGljIHZvaWQgd3JpdGVXb3JkIChpbnQgZmQsIHdv
cmQgdykgew0KCWNoYXIgYnVmWzIwXTsNCg0KCXNwcmludGYgKGJ1ZiwgIjB4
JTA4eCIsIHcpOw0KCXdyaXRlU3RyaW5nIChmZCwgYnVmKTsNCn0NCg0Kc3Rh
dGljIGlubGluZSB2b2lkIG5ld2xpbmUgKGludCBmZCkgew0KCXdyaXRlU3Ry
aW5nIChmZCwgIlxuIik7DQp9DQoNCnN0YXRpYyB2b2lkIHByb2ZpbGVXcml0
ZUNvdW50IChHQ19zdGF0ZSBzLCBHQ19wcm9maWxlIHAsIGludCBmZCwgdWlu
dCBpKSB7DQoJd3JpdGVVbGxvbmcgKGZkLCBwLT5jb3VudFRvcFtpXSk7DQoJ
aWYgKHMtPnByb2ZpbGVTdGFjaykgew0KCQlHQ19wcm9maWxlU3RhY2sgcHM7
DQoJDQoJCXBzID0gJihwLT5zdGFja1tpXSk7DQoJCXdyaXRlU3RyaW5nIChm
ZCwgIiAiKTsNCgkJd3JpdGVVbGxvbmcgKGZkLCBwcy0+dGlja3MpOw0KCQl3
cml0ZVN0cmluZyAoZmQsICIgIik7DQoJCXdyaXRlVWxsb25nIChmZCwgcHMt
PnRpY2tzSW5HQyk7DQoJfQ0KCW5ld2xpbmUgKGZkKTsNCn0NCg0Kdm9pZCBH
Q19wcm9maWxlV3JpdGUgKEdDX3N0YXRlIHMsIEdDX3Byb2ZpbGUgcCwgaW50
IGZkKSB7DQoJaW50IGk7DQoNCglpZiAoREVCVUdfUFJPRklMRSkNCgkJZnBy
aW50ZiAoc3RkZXJyLCAiR0NfcHJvZmlsZVdyaXRlXG4iKTsNCgl3cml0ZVN0
cmluZyAoZmQsICJNTHRvbiBwcm9mXG4iKTsNCgl3cml0ZVN0cmluZyAoZmQs
IChQUk9GSUxFX0FMTE9DID09IHMtPnByb2ZpbGVLaW5kKSANCgkJCQk/ICJh
bGxvY1xuIiA6ICJ0aW1lXG4iKTsNCgl3cml0ZVN0cmluZyAoZmQsIHMtPnBy
b2ZpbGVTdGFjayANCgkJCQk/ICJzdGFja1xuIiA6ICJjdXJyZW50XG4iKTsN
Cgl3cml0ZVdvcmQgKGZkLCBzLT5tYWdpYyk7DQoJbmV3bGluZSAoZmQpOw0K
CXdyaXRlVWxsb25nIChmZCwgcC0+dG90YWwpOw0KCXdyaXRlU3RyaW5nIChm
ZCwgIiAiKTsNCgl3cml0ZVVsbG9uZyAoZmQsIHAtPnRvdGFsR0MpOw0KCW5l
d2xpbmUgKGZkKTsNCgl3cml0ZVVpbnQgKGZkLCBzLT5zb3VyY2VzU2l6ZSk7
DQoJbmV3bGluZSAoZmQpOw0KCWZvciAoaSA9IDA7IGkgPCBzLT5zb3VyY2Vz
U2l6ZTsgKytpKQ0KCQlwcm9maWxlV3JpdGVDb3VudCAocywgcCwgZmQsIGkp
Ow0KCXdyaXRlVWludCAoZmQsIHMtPnNvdXJjZU5hbWVzU2l6ZSk7DQoJbmV3
bGluZSAoZmQpOw0KCWZvciAoaSA9IDA7IGkgPCBzLT5zb3VyY2VOYW1lc1Np
emU7ICsraSkNCgkJcHJvZmlsZVdyaXRlQ291bnQgKHMsIHAsIGZkLCBpICsg
cy0+c291cmNlc1NpemUpOw0KfQ0KDQojaWYgKGRlZmluZWQgKF9fbGludXhf
XykgfHwgZGVmaW5lZCAoX19GcmVlQlNEX18pIHx8IGRlZmluZWQgKF9fTmV0
QlNEX18pIHx8IGRlZmluZWQgKF9fc3VuX18pKQ0KDQojaWZuZGVmIEVJUA0K
I2RlZmluZSBFSVAJMTQNCiNlbmRpZg0KDQpzdGF0aWMgR0Nfc3RhdGUgY2F0
Y2hlclN0YXRlOw0KDQovKg0KICogQ2FsbGVkIG9uIGVhY2ggU0lHUFJPRiBp
bnRlcnJ1cHQuDQogKi8NCiNpZiAoZGVmaW5lZCAoX19saW51eF9fKSB8fCBk
ZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZCAoX19zdW5fXykpDQpz
dGF0aWMgdm9pZCBjYXRjaGVyIChpbnQgc2lnLCBzaWdpbmZvX3QgKnNpcCwg
dWNvbnRleHRfdCAqdWNwKSB7DQojZWxpZiAoZGVmaW5lZCAoX19OZXRCU0Rf
XykpDQpzdGF0aWMgdm9pZCBjYXRjaGVyIChpbnQgc2lnLCBpbnQgY29kZSwg
c3RydWN0IHNpZ2NvbnRleHQgKnVjcCkgew0KI2Vsc2UNCiNlcnJvciBjYXRj
aGVyIHByb3RvdHlwZSBub3QgZGVmaW5lZA0KI2VuZGlmDQoJdWludCBmcmFt
ZUluZGV4Ow0KCXBvaW50ZXIgcGM7DQoJR0Nfc3RhdGUgczsNCgl1aW50IHNv
dXJjZVNlcUluZGV4Ow0KDQoJcyA9IGNhdGNoZXJTdGF0ZTsNCiNpZiAoZGVm
aW5lZCAoX19saW51eF9fKSkNCiAgICAgICAgcGMgPSAocG9pbnRlcikgdWNw
LT51Y19tY29udGV4dC5ncmVnc1tFSVBdOw0KI2VsaWYgKGRlZmluZWQgKF9f
RnJlZUJTRF9fKSkNCglwYyA9IChwb2ludGVyKSB1Y3AtPnVjX21jb250ZXh0
Lm1jX2VpcDsNCiNlbGlmIChkZWZpbmVkIChfX05ldEJTRF9fKSkNCglwYyA9
IChwb2ludGVyKSB1Y3AtPnNjX2VpcDsNCiNlbGlmIChkZWZpbmVkIChfX3N1
bl9fKSkNCglwYyA9IChwb2ludGVyKSB1Y3AtPnVjX21jb250ZXh0LmdyZWdz
W1JFR19QQ107DQojZWxzZQ0KI2Vycm9yIHBjIG5vdCBkZWZpbmVkDQojZW5k
aWYNCglpZiAoREVCVUdfUFJPRklMRSkNCgkJZnByaW50ZiAoc3RkZXJyLCAi
Y2F0Y2hlciAgcGMgPSAweCUwOHhcbiIsICh1aW50KXBjKTsNCglpZiAocy0+
YW1JbkdDKQ0KCQlzb3VyY2VTZXFJbmRleCA9IFNPVVJDRV9TRVFfR0M7DQoJ
ZWxzZSB7DQoJCWZyYW1lSW5kZXggPSB0b3BGcmFtZUluZGV4IChzKTsNCgkJ
aWYgKHMtPmZyYW1lTGF5b3V0c1tmcmFtZUluZGV4XS5pc0MpDQoJCQlzb3Vy
Y2VTZXFJbmRleCA9IHMtPmZyYW1lU291cmNlc1tmcmFtZUluZGV4XTsNCgkJ
ZWxzZSB7DQoJCQlpZiAocy0+dGV4dFN0YXJ0IDw9IHBjIGFuZCBwYyA8IHMt
PnRleHRFbmQpDQoJCQkJc291cmNlU2VxSW5kZXggPSBzLT50ZXh0U291cmNl
cyBbcGMgLSBzLT50ZXh0U3RhcnRdOw0KCQkJZWxzZSB7DQoJCQkJaWYgKERF
QlVHX1BST0ZJTEUpDQoJCQkJCWZwcmludGYgKHN0ZGVyciwgInBjIG91dCBv
ZiBib3VuZHNcbiIpOw0KCQkgICAgICAgCQlzb3VyY2VTZXFJbmRleCA9IFNP
VVJDRV9TRVFfVU5LTk9XTjsNCgkJCX0NCgkJfQ0KCX0NCglwcm9maWxlSW5j
IChzLCAxLCBzb3VyY2VTZXFJbmRleCk7DQp9DQoNCi8qIFRvIGdldCB0aGUg
YmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIHRleHQgc2VnbWVudC4gKi8NCmV4
dGVybiB2b2lkCV9zdGFydCh2b2lkKSwNCgkJZXRleHQodm9pZCk7DQoNCnN0
YXRpYyBpbnQgY29tcGFyZVByb2ZpbGVMYWJlbHMgKGNvbnN0IHZvaWQgKnYx
LCBjb25zdCB2b2lkICp2Mikgew0KCUdDX3Byb2ZpbGVMYWJlbCBsMTsNCglH
Q19wcm9maWxlTGFiZWwgbDI7DQoNCglsMSA9IChHQ19wcm9maWxlTGFiZWwp
djE7DQoJbDIgPSAoR0NfcHJvZmlsZUxhYmVsKXYyOw0KCXJldHVybiAoaW50
KWwxLT5sYWJlbCAtIChpbnQpbDItPmxhYmVsOw0KfQ0KDQpzdGF0aWMgdm9p
ZCBwcm9maWxlVGltZUluaXQgKEdDX3N0YXRlIHMpIHsNCglpbnQgaTsNCglw
b2ludGVyIHA7DQoJc3RydWN0IHNpZ2FjdGlvbiBzYTsNCgl1aW50IHNvdXJj
ZVNlcXNJbmRleDsNCg0KCXMtPnByb2ZpbGUgPSBHQ19wcm9maWxlTmV3IChz
KTsNCgkvKiBTb3J0IHNvdXJjZUxhYmVscyBieSBhZGRyZXNzLiAqLw0KCXFz
b3J0IChzLT5zb3VyY2VMYWJlbHMsIHMtPnNvdXJjZUxhYmVsc1NpemUsIHNp
emVvZiAoKnMtPnNvdXJjZUxhYmVscyksDQoJCWNvbXBhcmVQcm9maWxlTGFi
ZWxzKTsNCglpZiAoMCA9PSBzLT5zb3VyY2VMYWJlbHNbcy0+c291cmNlTGFi
ZWxzU2l6ZSAtIDFdLmxhYmVsKQ0KCQlkaWUgKCJNYXggcHJvZmlsZSBsYWJl
bCBpcyAwIC0tIHNvbWV0aGluZyBpcyB3cm9uZy4iKTsNCglpZiAoREVCVUdf
UFJPRklMRSkNCgkJZm9yIChpID0gMDsgaSA8IHMtPnNvdXJjZUxhYmVsc1Np
emU7ICsraSkNCgkJCWZwcmludGYgKHN0ZGVyciwgIjB4JTA4eCAgJXVcbiIs
DQoJCQkJCSh1aW50KXMtPnNvdXJjZUxhYmVsc1tpXS5sYWJlbCwNCgkJCQkJ
cy0+c291cmNlTGFiZWxzW2ldLnNvdXJjZVNlcXNJbmRleCk7DQoJaWYgKEFT
U0VSVCkNCgkJZm9yIChpID0gMTsgaSA8IHMtPnNvdXJjZUxhYmVsc1NpemU7
ICsraSkNCgkJCWFzc2VydCAocy0+c291cmNlTGFiZWxzW2ktMV0ubGFiZWwN
CgkJCQk8PSBzLT5zb3VyY2VMYWJlbHNbaV0ubGFiZWwpOw0KCS8qIEluaXRp
YWxpemUgcy0+dGV4dFNvdXJjZXMuICovDQoJcy0+dGV4dEVuZCA9IChwb2lu
dGVyKSZldGV4dDsNCglzLT50ZXh0U3RhcnQgPSAocG9pbnRlcikmX3N0YXJ0
Ow0KCWlmIChBU1NFUlQpDQoJCWZvciAoaSA9IDA7IGkgPCBzLT5zb3VyY2VM
YWJlbHNTaXplOyArK2kpIHsNCgkJCXBvaW50ZXIgbGFiZWw7DQoNCgkJCWxh
YmVsID0gcy0+c291cmNlTGFiZWxzW2ldLmxhYmVsOw0KCQkJYXNzZXJ0ICgw
ID09IGxhYmVsDQoJCQkJb3IgKHMtPnRleHRTdGFydCA8PSBsYWJlbCANCgkJ
CQkJYW5kIGxhYmVsIDwgcy0+dGV4dEVuZCkpOw0KCQl9DQoJQVJSQVkgKHMt
PnRleHRTb3VyY2VzLCBzLT50ZXh0RW5kIC0gcy0+dGV4dFN0YXJ0KTsNCglw
ID0gcy0+dGV4dFN0YXJ0Ow0KCXNvdXJjZVNlcXNJbmRleCA9IFNPVVJDRV9T
RVFfVU5LTk9XTjsNCglmb3IgKGkgPSAwOyBpIDwgcy0+c291cmNlTGFiZWxz
U2l6ZTsgKytpKSB7DQoJCWZvciAoIDsgcCA8IHMtPnNvdXJjZUxhYmVsc1tp
XS5sYWJlbDsgKytwKQ0KCQkJcy0+dGV4dFNvdXJjZXNbcCAtIHMtPnRleHRT
dGFydF0gPSBzb3VyY2VTZXFzSW5kZXg7DQoJCXNvdXJjZVNlcXNJbmRleCA9
IHMtPnNvdXJjZUxhYmVsc1tpXS5zb3VyY2VTZXFzSW5kZXg7DQoJfQ0KCWZv
ciAoIDsgcCA8IHMtPnRleHRFbmQ7ICsrcCkNCgkJcy0+dGV4dFNvdXJjZXNb
cCAtIHMtPnRleHRTdGFydF0gPSBzb3VyY2VTZXFzSW5kZXg7DQogCS8qDQoJ
ICogSW5zdGFsbCBjYXRjaGVyLCB3aGljaCBoYW5kbGVzIFNJR1BST0YgYW5k
IGNhbGxzIE1MdG9uX1Byb2ZpbGVfaW5jLg0KCSAqIA0KCSAqIE9uZSB0aGlu
ZyBJIHNob3VsZCBwb2ludCBvdXQgdGhhdCBJIGRpc2NvdmVyZWQgdGhlIGhh
cmQgd2F5OiBJZg0KCSAqIHRoZSBjYWxsIHRvIHNpZ2FjdGlvbiBkb2VzIE5P
VCBzcGVjaWZ5IHRoZSBTQV9PTlNUQUNLIGZsYWcsIHRoZW4NCgkgKiBldmVu
IGlmIHlvdSBoYXZlIGNhbGxlZCBzaWdhbHRzdGFjaygpLCBpdCB3aWxsIE5P
VCBzd2l0Y2ggc3RhY2tzLA0KCSAqIHNvIHlvdSB3aWxsIHByb2JhYmx5IGRp
ZS4gIFdvcnNlLCBpZiB0aGUgY2FsbCB0byBzaWdhY3Rpb24gRE9FUw0KCSAq
IGhhdmUgU0FfT05TVEFDSyBhbmQgeW91IGhhdmUgTk9UIGNhbGxlZCBzaWdh
bHRzdGFjaygpLCBpdCBzdGlsbA0KCSAqIHN3aXRjaGVzIHN0YWNrcyAodG8g
bG9jYXRpb24gMCkgYW5kIHlvdSBkaWUgb2YgYSBTRUdWLiAgVGh1cyB0aGUN
CgkgKiBzaWdhY3Rpb24oKSBjYWxsIE1VU1Qgb2NjdXIgYWZ0ZXIgdGhlIGNh
bGwgdG8gc2lnYWx0c3RhY2soKSwgYW5kDQoJICogaW4gb3JkZXIgdG8gaGF2
ZSBwcm9maWxpbmcgY292ZXIgYXMgbXVjaCBhcyBwb3NzaWJsZSwgeW91IHdh
bnQgaXQNCgkgKiB0byBvY2N1ciByaWdodCBhZnRlciB0aGUgc2lnYWx0c3Rh
Y2soKSBjYWxsLg0KCSAqLw0KCWNhdGNoZXJTdGF0ZSA9IHM7DQoJc2Euc2Ff
aGFuZGxlciA9ICh2b2lkICgqKShpbnQpKWNhdGNoZXI7DQoJc2lnZW1wdHlz
ZXQgKCZzYS5zYV9tYXNrKTsNCiNpZiAoZGVmaW5lZCAoX19saW51eF9fKSB8
fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fc3VuX18pKQ0K
CXNhLnNhX2ZsYWdzID0gU0FfT05TVEFDSyB8IFNBX1JFU1RBUlQgfCBTQV9T
SUdJTkZPOw0KI2VsaWYgKGRlZmluZWQgKF9fTmV0QlNEX18pKQ0KCXNhLnNh
X2ZsYWdzID0gU0FfT05TVEFDSyB8IFNBX1JFU1RBUlQ7DQojZWxzZQ0KI2Vy
cm9yIHNhX2ZsYWdzIG5vdCBzZXQNCiNlbmRpZg0KCXVubGVzcyAoc2lnYWN0
aW9uIChTSUdQUk9GLCAmc2EsIE5VTEwpID09IDApDQoJCWRpZWUgKCJzaWdh
Y3Rpb24oKSBmYWlsZWQiKTsNCgkvKiBTdGFydCB0aGUgU0lHUFJPRiB0aW1l
ci4gKi8NCglzZXRQcm9mVGltZXIgKDEwMDAwKTsNCn0NCg0KI2VsaWYgKGRl
ZmluZWQgKF9fQ1lHV0lOX18pKQ0KDQovKiBObyB0aW1lIHByb2ZpbGluZyBv
biBDeWd3aW4uIA0KICogVGhlcmUgaXMgYSBjaGVjayBpbiBtbHRvbi9tYWlu
L21haW4uc21sIHRvIG1ha2Ugc3VyZSB0aGF0IHRpbWUgcHJvZmlsaW5nIGlz
DQogKiBuZXZlciB0dXJuZWQgb24gb24gQ3lnd2luLg0KICovDQpzdGF0aWMg
dm9pZCBwcm9maWxlVGltZUluaXQgKEdDX3N0YXRlIHMpIHsNCglkaWUgKCJu
byB0aW1lIHByb2ZpbGluZyBvbiBDeWd3aW4iKTsNCn0NCg0KI2Vsc2UNCg0K
I2Vycm9yIHRpbWUgcHJvZmlsaW5nIG5vdCBpbXBsZW1lbnRlZA0KDQojZW5k
aWYNCg0KLyogcHJvZmlsZUVuZCBpcyBmb3Igd3JpdGluZyBvdXQgYW4gbWxt
b24ub3V0IGZpbGUgZXZlbiBpZiB0aGUgQyBjb2RlIHRlcm1pbmF0ZXMNCiAq
IGFibm9ybWFsbHksIGUuZy4gZHVlIHRvIHJ1bm5pbmcgb3V0IG9mIG1lbW9y
eS4gIEl0IHdpbGwgb25seSBydW4gaWYgdGhlIHVzdWFsDQogKiBTTUwgcHJv
ZmlsZSBhdEV4aXQgY2xlYW51cCBjb2RlIGRpZCBub3QgbWFuYWdlIHRvIHJ1
bi4NCiAqLw0Kc3RhdGljIEdDX3N0YXRlIHByb2ZpbGVFbmRTdGF0ZTsNCg0K
c3RhdGljIHZvaWQgcHJvZmlsZUVuZCAoKSB7DQoJaW50IGZkOw0KCUdDX3N0
YXRlIHM7DQoNCglpZiAoREVCVUdfUFJPRklMRSkNCgkJZnByaW50ZiAoc3Rk
ZXJyLCAicHJvZmlsZUVuZCAoKVxuIik7DQoJcyA9IHByb2ZpbGVFbmRTdGF0
ZTsNCglpZiAocy0+cHJvZmlsaW5nSXNPbikgew0KCQlmZCA9IGNyZWF0ICgi
bWxtb24ub3V0IiwgMDY2Nik7DQoJCWlmIChmZCA8IDApDQoJCQlkaWVlICgi
Q2Fubm90IGNyZWF0ZSBtbG1vbi5vdXQiKTsNCgkJR0NfcHJvZmlsZVdyaXRl
IChzLCBzLT5wcm9maWxlLCBmZCk7DQoJfQ0KfQ0KDQovKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tICovDQovKiAgICAgICAgICAgICAgICAgICAgICAgICAgSW5p
dGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICovDQovKiAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCnN0YXRpYyB2b2lkIGluaXRTaWdu
YWxTdGFjayAoR0Nfc3RhdGUgcykgew0KI2lmIChkZWZpbmVkIChfX0NZR1dJ
Tl9fKSkNCg0KCS8qIE5vdGhpbmcgKi8NCg0KI2VsaWYgKGRlZmluZWQgKF9f
RnJlZUJTRF9fKSB8fCBkZWZpbmVkIChfX2xpbnV4X18pIHx8IGRlZmluZWQg
KF9fTmV0QlNEX18pIHx8IGRlZmluZWQgKF9fc3VuX18pKQ0KDQogICAgICAg
IHN0YXRpYyBzdGFja190IGFsdHN0YWNrOw0KCXNpemVfdCBzc19zaXplID0g
YWxpZ24gKFNJR1NUS1NaLCBzLT5wYWdlU2l6ZSk7DQoJc2l6ZV90IHBzaXpl
ID0gcy0+cGFnZVNpemU7DQoJdm9pZCAqc3Nfc3AgPSBzc21tYXAgKDIgKiBz
c19zaXplLCBwc2l6ZSwgcHNpemUpOw0KCWFsdHN0YWNrLnNzX3NwID0gc3Nf
c3AgKyBzc19zaXplOw0KCWFsdHN0YWNrLnNzX3NpemUgPSBzc19zaXplOw0K
CWFsdHN0YWNrLnNzX2ZsYWdzID0gMDsNCglzaWdhbHRzdGFjayAoJmFsdHN0
YWNrLCBOVUxMKTsNCg0KI2Vsc2UNCg0KI2Vycm9yIGluaXRTaWduYWxTdGFj
ayBub3QgZGVmaW5lZA0KDQojZW5kaWYNCn0NCg0Kc3RhdGljIGludCBwcm9j
ZXNzb3JfaGFzX3NzZTI9MDsNCg0Kc3RhdGljIHZvaWQgcmVhZFByb2Nlc3Nv
cigpIHsNCiNpZiAwDQoJaW50IHN0YXR1cyA9IHN5c3RlbSgiL2Jpbi9jYXQg
L3Byb2MvY3B1aW5mbyB8IC9iaW4vZWdyZXAgLXEgJ15mbGFncy4qOi4qIG1t
eCAuKnhtbSciKTsNCiAgDQoJaWYgKHN0YXR1cz09MCkNCgkJcHJvY2Vzc29y
X2hhc19zc2UyPTE7DQoJZWxzZQ0KCQlwcm9jZXNzb3JfaGFzX3NzZTI9MDsN
CiNlbmRpZg0KCXByb2Nlc3Nvcl9oYXNfc3NlMj0wOw0KfQ0KDQovKg0KICog
dG90YWxSYW0gcmV0dXJucyB0aGUgYW1vdW50IG9mIHBoeXNpY2FsIG1lbW9y
eSBvbiB0aGUgbWFjaGluZS4gIFRoaXMgaXMNCiAqIGxhdGVyIG11bHRpcGxp
ZWQgYnkgcmFtU2xvcCB0byBjdXQgZG93biBvbiB1c2luZyBhbGwgbWVtb3J5
IGFuZCBwYWdpbmcuDQogKi8NCg0KI2lmIChkZWZpbmVkIChfX0NZR1dJTl9f
KSB8fCBkZWZpbmVkIChfX2xpbnV4X18pIHx8IGRlZmluZWQgKF9fc3VuX18p
KQ0KDQpzdGF0aWMgVzMyIHRvdGFsUmFtIChHQ19zdGF0ZSBzKSB7DQoJVzMy
IG1heE1lbTsNCglXNjQgdG1wOw0KDQoJbWF4TWVtID0gMHgxMDAwMDAwMDBs
bHUgLSBzLT5wYWdlU2l6ZTsNCgl0bXAgPSBzeXNjb25mIChfU0NfUEhZU19Q
QUdFUykgKiAoVzY0KXMtPnBhZ2VTaXplOw0KCXJldHVybiAodG1wID49IG1h
eE1lbSkgPyBtYXhNZW06IChXMzIpdG1wOw0KfQ0KDQojZWxpZiAoZGVmaW5l
ZCAoX19GcmVlQlNEX18pKQ0KDQpzdGF0aWMgVzMyIHRvdGFsUmFtIChHQ19z
dGF0ZSBzKSB7DQoJaW50IG1lbSwgbGVuOw0KDQoJbGVuID0gc2l6ZW9mIChp
bnQpOw0KCWlmICgtMSA9PSBzeXNjdGxieW5hbWUgKCJody5waHlzbWVtIiwg
Jm1lbSwgJmxlbiwgTlVMTCwgMCkpDQoJCWRpZWUgKCJzeXNjdGwgZmFpbGVk
Iik7DQoJcmV0dXJuIG1lbTsNCn0NCg0KI2VsaWYgKGRlZmluZWQgKF9fTmV0
QlNEX18pKQ0KDQpzdGF0aWMgVzMyIHRvdGFsUmFtIChHQ19zdGF0ZSBzKSB7
DQoJdWludCBtZW07DQoJaW50IGxlbiwgbWliWzJdOw0KCQ0KCW1pYlswXSA9
IENUTF9IVzsNCgltaWJbMV0gPSBIV19QSFlTTUVNOw0KCWxlbiA9IHNpemVv
ZihtZW0pOw0KCWlmICgtMSA9PSBzeXNjdGwgKG1pYiwgMiwgJm1lbSwgJmxl
biwgTlVMTCwgMCkpDQoJCWRpZWUgKCJzeXNjdGwgZmFpbGVkIik7DQogCXJl
dHVybiBtZW07DQp9DQoNCiNlbHNlDQoNCiNlcnJvciB0b3RhbFJhbSBub3Qg
ZGVmaW5lZA0KDQojZW5kaWYgLyogZGVmaW5pdGlvbiBvZiB0b3RhbFJhbSAq
Lw0KDQojaWYgRkFMU0UNCnN0YXRpYyBib29sIHN0cmluZ1RvQm9vbCAoc3Ry
aW5nIHMpIHsNCglpZiAoMCA9PSBzdHJjbXAgKHMsICJmYWxzZSIpKQ0KCQly
ZXR1cm4gRkFMU0U7DQoJaWYgKDAgPT0gc3RyY21wIChzLCAidHJ1ZSIpKQ0K
CQlyZXR1cm4gVFJVRTsNCglkaWUgKCJJbnZhbGlkIEBNTHRvbiBib29sOiAl
cy4iLCBzKTsNCn0NCiNlbmRpZg0KDQpzdGF0aWMgZmxvYXQgc3RyaW5nVG9G
bG9hdCAoc3RyaW5nIHMpIHsNCglmbG9hdCBmOw0KDQoJdW5sZXNzICgxID09
IHNzY2FuZiAocywgIiVmIiwgJmYpKQ0KCQlkaWUgKCJJbnZhbGlkIEBNTHRv
biBmbG9hdDogJXMuIiwgcyk7DQoJcmV0dXJuIGY7DQp9DQoNCnN0YXRpYyB1
aW50IHN0cmluZ1RvQnl0ZXMgKHN0cmluZyBzKSB7DQoJY2hhciBjOw0KCXVp
bnQgcmVzdWx0Ow0KCWludCBpOw0KCQ0KCXJlc3VsdCA9IDA7DQoJaSA9IDA7
DQoJd2hpbGUgKChjID0gc1tpKytdKSAhPSAnXDAwMCcpIHsNCgkJc3dpdGNo
IChjKSB7DQoJCWNhc2UgJ20nOg0KCQkJaWYgKHNbaV0gPT0gJ1wwMDAnKSAN
CgkJCQlyZXR1cm4gcmVzdWx0ICogMTA0ODU3NjsNCgkJCWVsc2UgDQoJCQkJ
Z290byBiYWQ7DQoJCQlicmVhazsNCgkJY2FzZSAnayc6DQoJCQlpZiAoc1tp
XSA9PSAnXDAwMCcpIA0KCQkJCXJldHVybiByZXN1bHQgKiAxMDI0Ow0KCQkJ
ZWxzZSANCgkJCQlnb3RvIGJhZDsNCgkJCWJyZWFrOw0KCQlkZWZhdWx0Og0K
CQkJaWYgKCcwJyA8PSBjIGFuZCBjIDw9ICc5JykNCgkJCQlyZXN1bHQgPSBy
ZXN1bHQgKiAxMCArIChjIC0gJzAnKTsNCgkJCWVsc2UgDQoJCQkJZ290byBi
YWQ7DQoJCX0NCgl9DQoJYXNzZXJ0IChGQUxTRSk7DQpiYWQ6DQoJZGllICgi
SW52YWxpZCBATUx0b24gbWVtb3J5IGFtb3VudDogJXMuIiwgcyk7DQp9DQoN
CnN0YXRpYyB2b2lkIHNldEluaXRpYWxCeXRlc0xpdmUgKEdDX3N0YXRlIHMp
IHsNCglpbnQgaTsNCglpbnQgbnVtRWxlbWVudHM7DQoNCglzLT5ieXRlc0xp
dmUgPSAwOw0KCWZvciAoaSA9IDA7IGkgPCBzLT5pbnRJbmZJbml0c1NpemU7
ICsraSkgew0KCQludW1FbGVtZW50cyA9IHN0cmxlbiAocy0+aW50SW5mSW5p
dHNbaV0ubWxzdHIpOw0KCQlzLT5ieXRlc0xpdmUgKz0NCgkJCWFsaWduIChH
Q19BUlJBWV9IRUFERVJfU0laRSANCgkJCQkrIFdPUkRfU0laRSAvLyBmb3Ig
dGhlIHNpZ24NCgkJCQkrIG51bUVsZW1lbnRzLA0KCQkJCXMtPmFsaWdubWVu
dCk7DQoJfQ0KCWZvciAoaSA9IDA7IGkgPCBzLT5zdHJpbmdJbml0c1NpemU7
ICsraSkgew0KCQludW1FbGVtZW50cyA9IHMtPnN0cmluZ0luaXRzW2ldLnNp
emU7DQoJCXMtPmJ5dGVzTGl2ZSArPQ0KCQkJYWxpZ24gKEdDX0FSUkFZX0hF
QURFUl9TSVpFDQoJCQkJKyAoKDAgPT0gbnVtRWxlbWVudHMpIA0KCQkJCQk/
IFBPSU5URVJfU0laRQ0KCQkJCQk6IG51bUVsZW1lbnRzKSwNCgkJCQlzLT5h
bGlnbm1lbnQpOw0KCX0NCn0NCg0KLyoNCiAqIEZvciBlYWNoIGVudHJ5IHsg
Z2xvYmFsSW5kZXgsIG1sc3RyIH0gaW4gdGhlIGluaXRzIGFycmF5ICh3aGlj
aCBpcyB0ZXJtaW5hdGVkDQogKiBieSBvbmUgd2l0aCBhbiBtbHN0ciBvZiBO
VUxMKSwgc2V0DQogKglzdGF0ZS0+Z2xvYmFsc1tnbG9iYWxJbmRleF0NCiAq
IHRvIHRoZSBjb3JyZXNwb25kaW5nIEludEluZi5pbnQgdmFsdWUuDQogKiBP
biBleGl0LCB0aGUgR0Nfc3RhdGUgcG9pbnRlZCB0byBieSBzdGF0ZSBpcyBh
ZGp1c3RlZCB0byBhY2NvdW50IGZvciBhbnkNCiAqIHNwYWNlIHVzZWQuDQog
Ki8NCnN0YXRpYyB2b2lkIGluaXRJbnRJbmZzIChHQ19zdGF0ZSBzKSB7DQoJ
c3RydWN0IEdDX2ludEluZkluaXQgKmluaXRzOw0KCXBvaW50ZXIgZnJvbnRp
ZXI7DQoJY2hhcgkqc3RyOw0KCXVpbnQJc2xlbiwNCgkJbGxlbiwNCgkJYWxl
biwNCgkJaSwNCgkJaW5kZXg7DQoJYm9vbAluZWcsDQoJCWhleDsNCgliaWdu
dW0JKmJwOw0KCWNoYXIJKmNwOw0KDQoJYXNzZXJ0IChpc0FsaWduZWRGcm9u
dGllciAocywgcy0+ZnJvbnRpZXIpKTsNCglmcm9udGllciA9IHMtPmZyb250
aWVyOw0KCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHMtPmludEluZkluaXRz
U2l6ZTsgKytpbmRleCkgew0KCQlpbml0cyA9ICZzLT5pbnRJbmZJbml0c1tp
bmRleF07DQoJCXN0ciA9IGluaXRzLT5tbHN0cjsNCgkJYXNzZXJ0IChpbml0
cy0+Z2xvYmFsSW5kZXggPCBzLT5nbG9iYWxzU2l6ZSk7DQoJCW5lZyA9ICpz
dHIgPT0gJ34nOw0KCQlpZiAobmVnKQ0KCQkJKytzdHI7DQoJCXNsZW4gPSBz
dHJsZW4gKHN0cik7DQoJCWhleCA9IHN0clswXSA9PSAnMCcgJiYgc3RyWzFd
ID09ICd4JzsNCgkJaWYgKGhleCkgew0KCQkJc3RyICs9IDI7DQoJCQlzbGVu
IC09IDI7DQoJCQlsbGVuID0gKHNsZW4gKyA3KSAvIDg7DQoJCX0gZWxzZQ0K
CQkJbGxlbiA9IChzbGVuICsgOCkgLyA5Ow0KCQlhc3NlcnQgKHNsZW4gPiAw
KTsNCgkJYnAgPSAoYmlnbnVtICopZnJvbnRpZXI7DQoJCWNwID0gKGNoYXIg
KikmYnAtPmxpbWJzW2xsZW5dOw0KCQlmb3IgKGkgPSAwOyBpICE9IHNsZW47
ICsraSkNCgkJCWlmICgnMCcgPD0gc3RyW2ldICYmIHN0cltpXSA8PSAnOScp
DQoJCQkJY3BbaV0gPSBzdHJbaV0gLSAnMCcgKyAwOw0KCQkJZWxzZSBpZiAo
J2EnIDw9IHN0cltpXSAmJiBzdHJbaV0gPD0gJ2YnKQ0KCQkJCWNwW2ldID0g
c3RyW2ldIC0gJ2EnICsgMHhhOw0KCQkJZWxzZSB7DQoJCQkJYXNzZXJ0KCdB
JyA8PSBzdHJbaV0gJiYgc3RyW2ldIDw9ICdGJyk7DQoJCQkJY3BbaV0gPSBz
dHJbaV0gLSAnQScgKyAweEE7DQoJCQl9DQoJCWFsZW4gPSBtcG5fc2V0X3N0
ciAoYnAtPmxpbWJzLCBjcCwgc2xlbiwgaGV4ID8gMHgxMCA6IDEwKTsNCgkJ
YXNzZXJ0IChhbGVuIDw9IGxsZW4pOw0KCQlpZiAoYWxlbiA8PSAxKSB7DQoJ
CQl1aW50CXZhbCwNCgkJCQlhbnM7DQoNCgkJCWlmIChhbGVuID09IDApDQoJ
CQkJdmFsID0gMDsNCgkJCWVsc2UNCgkJCQl2YWwgPSBicC0+bGltYnNbMF07
DQoJCQlpZiAobmVnKSB7DQoJCQkJLyoNCgkJCQkgKiBXZSBvbmx5IGZpdCBp
ZiB2YWwgaW4gWzEsIDJeMzBdLg0KCQkJCSAqLw0KCQkJCWFucyA9IC0gdmFs
Ow0KCQkJCXZhbCA9IHZhbCAtIDE7DQoJCQl9IGVsc2UNCgkJCQkvKg0KCQkJ
CSAqIFdlIG9ubHkgZml0IGlmIHZhbCBpbiBbMCwgMl4zMCAtIDFdLg0KCQkJ
CSAqLw0KCQkJCWFucyA9IHZhbDsNCgkJCWlmICh2YWwgPCAodWludCkxPDwz
MCkgew0KCQkJCXMtPmdsb2JhbHNbaW5pdHMtPmdsb2JhbEluZGV4XSA9IA0K
CQkJCQkocG9pbnRlcikoYW5zPDwxIHwgMSk7DQoJCQkJY29udGludWU7DQoJ
CQl9DQoJCX0NCgkJcy0+Z2xvYmFsc1tpbml0cy0+Z2xvYmFsSW5kZXhdID0g
KHBvaW50ZXIpJmJwLT5pc25lZzsNCgkJYnAtPmNvdW50ZXIgPSAwOw0KCQli
cC0+Y2FyZCA9IGFsZW4gKyAxOw0KCQlicC0+bWFnaWMgPSBCSUdNQUdJQzsN
CgkJYnAtPmlzbmVnID0gbmVnOw0KCQlmcm9udGllciA9IGFsaWduRnJvbnRp
ZXIgKHMsIChwb2ludGVyKSZicC0+bGltYnNbYWxlbl0pOw0KCX0NCglhc3Nl
cnQgKGlzQWxpZ25lZEZyb250aWVyIChzLCBmcm9udGllcikpOw0KCXMtPmZy
b250aWVyID0gZnJvbnRpZXI7DQoJR0NfcHJvZmlsZUFsbG9jSW5jIChzLCBm
cm9udGllciAtIHMtPmZyb250aWVyKTsNCglzLT5ieXRlc0FsbG9jYXRlZCAr
PSBmcm9udGllciAtIHMtPmZyb250aWVyOw0KfQ0KDQpzdGF0aWMgdm9pZCBp
bml0U3RyaW5ncyAoR0Nfc3RhdGUgcykgew0KCXN0cnVjdCBHQ19zdHJpbmdJ
bml0ICppbml0czsNCglwb2ludGVyIGZyb250aWVyOw0KCWludCBpOw0KDQoJ
YXNzZXJ0IChpc0FsaWduZWRGcm9udGllciAocywgcy0+ZnJvbnRpZXIpKTsN
Cglpbml0cyA9IHMtPnN0cmluZ0luaXRzOw0KCWZyb250aWVyID0gcy0+ZnJv
bnRpZXI7DQoJZm9yIChpID0gMDsgaSA8IHMtPnN0cmluZ0luaXRzU2l6ZTsg
KytpKSB7DQoJCXVpbnQgbnVtRWxlbWVudHMsIG51bUJ5dGVzOw0KDQoJCW51
bUVsZW1lbnRzID0gaW5pdHNbaV0uc2l6ZTsNCgkJbnVtQnl0ZXMgPSBhbGln
biAoR0NfQVJSQVlfSEVBREVSX1NJWkUNCgkJCQkJKyAoKDAgPT0gbnVtRWxl
bWVudHMpIA0KCQkJCQkJPyBQT0lOVEVSX1NJWkUNCgkJCQkJCTogbnVtRWxl
bWVudHMpLA0KCQkJCQlzLT5hbGlnbm1lbnQpOw0KCQlhc3NlcnQgKG51bUJ5
dGVzIDw9IHMtPmhlYXAuc3RhcnQgKyBzLT5oZWFwLnNpemUgLSBmcm9udGll
cik7DQoJCSood29yZCopZnJvbnRpZXIgPSAwOyAvKiBjb3VudGVyIHdvcmQg
Ki8NCgkJKih3b3JkKikoZnJvbnRpZXIgKyBXT1JEX1NJWkUpID0gbnVtRWxl
bWVudHM7DQoJCSood29yZCopKGZyb250aWVyICsgMiAqIFdPUkRfU0laRSkg
PSBTVFJJTkdfSEVBREVSOw0KCQlzLT5nbG9iYWxzW2luaXRzW2ldLmdsb2Jh
bEluZGV4XSA9IA0KCQkJZnJvbnRpZXIgKyBHQ19BUlJBWV9IRUFERVJfU0la
RTsNCgkJaWYgKERFQlVHX0RFVEFJTEVEKQ0KCQkJZnByaW50ZiAoc3RkZXJy
LCAiYWxsb2NhdGVkIHN0cmluZyBhdCAweCV4XG4iLA0KCQkJCQkodWludClz
LT5nbG9iYWxzW2luaXRzW2ldLmdsb2JhbEluZGV4XSk7DQoJCXsNCgkJCWlu
dCBqOw0KDQoJCQlmb3IgKGogPSAwOyBqIDwgbnVtRWxlbWVudHM7ICsraikN
CgkJCQkqKGZyb250aWVyICsgR0NfQVJSQVlfSEVBREVSX1NJWkUgKyBqKSAN
CgkJCQkJPSBpbml0c1tpXS5zdHJbal07DQoJCX0NCgkJZnJvbnRpZXIgKz0g
bnVtQnl0ZXM7DQoJfQ0KCWlmIChERUJVR19ERVRBSUxFRCkNCgkJZnByaW50
ZiAoc3RkZXJyLCAiZnJvbnRpZXIgYWZ0ZXIgc3RyaW5nIGFsbG9jYXRpb24g
aXMgMHglMDh4XG4iLA0KCQkJCSh1aW50KWZyb250aWVyKTsNCglHQ19wcm9m
aWxlQWxsb2NJbmMgKHMsIGZyb250aWVyIC0gcy0+ZnJvbnRpZXIpOw0KCXMt
PmJ5dGVzQWxsb2NhdGVkICs9IGZyb250aWVyIC0gcy0+ZnJvbnRpZXI7DQoJ
YXNzZXJ0IChpc0FsaWduZWRGcm9udGllciAocywgZnJvbnRpZXIpKTsNCglz
LT5mcm9udGllciA9IGZyb250aWVyOw0KfQ0KDQpzdGF0aWMgdm9pZCBuZXdX
b3JsZCAoR0Nfc3RhdGUgcykgew0KCWludCBpOw0KCXBvaW50ZXIgc3RhcnQ7
DQoNCglmb3IgKGkgPSAwOyBpIDwgcy0+Z2xvYmFsc1NpemU7ICsraSkNCgkJ
cy0+Z2xvYmFsc1tpXSA9IChwb2ludGVyKUJPR1VTX1BPSU5URVI7DQoJc2V0
SW5pdGlhbEJ5dGVzTGl2ZSAocyk7DQoJaGVhcENyZWF0ZSAocywgJnMtPmhl
YXAsIGhlYXBEZXNpcmVkU2l6ZSAocywgcy0+Ynl0ZXNMaXZlLCAwKSwNCgkJ
CXMtPmJ5dGVzTGl2ZSk7DQoJY3JlYXRlQ2FyZE1hcEFuZENyb3NzTWFwIChz
KTsNCglzdGFydCA9IGFsaWduRnJvbnRpZXIgKHMsIHMtPmhlYXAuc3RhcnQp
Ow0KCXMtPmZyb250aWVyID0gc3RhcnQ7DQoJaW5pdEludEluZnMgKHMpOw0K
CWluaXRTdHJpbmdzIChzKTsNCglhc3NlcnQgKHMtPmZyb250aWVyIC0gc3Rh
cnQgPD0gcy0+Ynl0ZXNMaXZlKTsNCglzLT5vbGRHZW5TaXplID0gcy0+ZnJv
bnRpZXIgLSBzLT5oZWFwLnN0YXJ0Ow0KCXNldE51cnNlcnkgKHMsIDAsIDAp
Ow0KCXN3aXRjaFRvVGhyZWFkIChzLCBuZXdUaHJlYWRPZlNpemUgKHMsIGlu
aXRpYWxTdGFja1NpemUgKHMpKSk7DQp9DQoNCi8qIHdvcmxkVGVybWluYXRv
ciBpcyB1c2VkIHRvIHNlcGFyYXRlIHRoZSBodW1hbiByZWFkYWJsZSBtZXNz
YWdlcyBhdCB0aGUgDQogKiBiZWdpbm5pbmcgb2YgdGhlIHdvcmxkIGZpbGUg
ZnJvbSB0aGUgbWFjaGluZSByZWFkYWJsZSBkYXRhLg0KICovDQpzdGF0aWMg
Y29uc3QgY2hhciB3b3JsZFRlcm1pbmF0b3IgPSAnXDAwMCc7DQoNCnN0YXRp
YyB2b2lkIGxvYWRXb3JsZCAoR0Nfc3RhdGUgcywgY2hhciAqZmlsZU5hbWUp
IHsNCglGSUxFICpmaWxlOw0KCXVpbnQgbWFnaWM7DQoJcG9pbnRlciBvbGRH
ZW47DQoJY2hhciBjOw0KCQ0KCWlmIChERUJVR19XT1JMRCkNCgkJZnByaW50
ZiAoc3RkZXJyLCAibG9hZFdvcmxkICglcylcbiIsIGZpbGVOYW1lKTsNCglm
aWxlID0gc2ZvcGVuIChmaWxlTmFtZSwgInJiIik7DQoJdW50aWwgKChjID0g
ZmdldGMgKGZpbGUpKSA9PSB3b3JsZFRlcm1pbmF0b3Igb3IgRU9GID09IGMp
Ow0KCWlmIChFT0YgPT0gYykgZGllICgiSW52YWxpZCB3b3JsZC4iKTsNCglt
YWdpYyA9IHNmcmVhZFVpbnQgKGZpbGUpOw0KCXVubGVzcyAocy0+bWFnaWMg
PT0gbWFnaWMpDQoJCWRpZSAoIkludmFsaWQgd29ybGQ6IHdyb25nIG1hZ2lj
IG51bWJlci4iKTsNCglvbGRHZW4gPSAocG9pbnRlcikgc2ZyZWFkVWludCAo
ZmlsZSk7DQoJcy0+b2xkR2VuU2l6ZSA9IHNmcmVhZFVpbnQgKGZpbGUpOw0K
CXMtPmNhbGxGcm9tQ0hhbmRsZXIgPSAoR0NfdGhyZWFkKSBzZnJlYWRVaW50
IChmaWxlKTsNCglzLT5jYW5IYW5kbGUgPSBzZnJlYWRVaW50IChmaWxlKTsN
CglzLT5jdXJyZW50VGhyZWFkID0gKEdDX3RocmVhZCkgc2ZyZWFkVWludCAo
ZmlsZSk7DQoJcy0+c2lnbmFsSGFuZGxlciA9IChHQ190aHJlYWQpIHNmcmVh
ZFVpbnQgKGZpbGUpOw0KICAgICAgIAloZWFwQ3JlYXRlIChzLCAmcy0+aGVh
cCwgaGVhcERlc2lyZWRTaXplIChzLCBzLT5vbGRHZW5TaXplLCAwKSwNCgkJ
CXMtPm9sZEdlblNpemUpOw0KCWNyZWF0ZUNhcmRNYXBBbmRDcm9zc01hcCAo
cyk7DQoJc2ZyZWFkIChzLT5oZWFwLnN0YXJ0LCAxLCBzLT5vbGRHZW5TaXpl
LCBmaWxlKTsNCgkoKnMtPmxvYWRHbG9iYWxzKSAoZmlsZSk7DQoJdW5sZXNz
IChFT0YgPT0gZmdldGMgKGZpbGUpKQ0KCQlkaWUgKCJJbnZhbGlkIHdvcmxk
OiBqdW5rIGF0IGVuZCBvZiBmaWxlLiIpOw0KCWZjbG9zZSAoZmlsZSk7DQoJ
LyogdHJhbnNsYXRlSGVhcCBtdXN0IG9jY3VyIGFmdGVyIGxvYWRpbmcgdGhl
IGhlYXAgYW5kIGdsb2JhbHMsIHNpbmNlIGl0DQoJICogY2hhbmdlcyBwb2lu
dGVycyBpbiBhbGwgb2YgdGhlbS4NCgkgKi8NCgl0cmFuc2xhdGVIZWFwIChz
LCBvbGRHZW4sIHMtPmhlYXAuc3RhcnQsIHMtPm9sZEdlblNpemUpOw0KCXNl
dE51cnNlcnkgKHMsIDAsIDApOw0KCXNldFN0YWNrIChzKTsNCn0NCg0KLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIEdDX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAqLw0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQpzdGF0aWMgaW50
IHByb2Nlc3NBdE1MdG9uIChHQ19zdGF0ZSBzLCBpbnQgYXJnYywgY2hhciAq
KmFyZ3YsIA0KCQkJCXN0cmluZyAqd29ybGRGaWxlKSB7DQoJaW50IGk7DQoN
CglpID0gMTsNCgl3aGlsZSAocy0+bWF5UHJvY2Vzc0F0TUx0b24gDQoJCWFu
ZCBpIDwgYXJnYyANCgkJYW5kICgwID09IHN0cmNtcCAoYXJndiBbaV0sICJA
TUx0b24iKSkpIHsNCgkJYm9vbCBkb25lOw0KDQoJCWkrKzsNCgkJZG9uZSA9
IEZBTFNFOw0KCQl3aGlsZSAoIWRvbmUpIHsNCgkJCWlmIChpID09IGFyZ2Mp
DQoJCQkJZGllICgiTWlzc2luZyAtLSBhdCBlbmQgb2YgQE1MdG9uIGFyZ3Mu
Iik7DQoJCQllbHNlIHsNCgkJCQlzdHJpbmcgYXJnOw0KDQoJCQkJYXJnID0g
YXJndltpXTsNCgkJCQlpZiAoMCA9PSBzdHJjbXAgKGFyZywgImNvcHktcmF0
aW8iKSkgew0KCQkJCQkrK2k7DQoJCQkJCWlmIChpID09IGFyZ2MpDQoJCQkJ
CQlkaWUgKCJATUx0b24gY29weS1yYXRpbyBtaXNzaW5nIGFyZ3VtZW50LiIp
Ow0KCQkJCQlzLT5jb3B5UmF0aW8gPQ0KCQkJCQkJc3RyaW5nVG9GbG9hdCAo
YXJndltpKytdKTsNCgkJCQl9IGVsc2UgaWYgKDAgPT0gc3RyY21wKGFyZywg
ImZpeGVkLWhlYXAiKSkgew0KCQkJCQkrK2k7DQoJCQkJCWlmIChpID09IGFy
Z2MpDQoJCQkJCQlkaWUgKCJATUx0b24gZml4ZWQtaGVhcCBtaXNzaW5nIGFy
Z3VtZW50LiIpOw0KCQkJCQlzLT5maXhlZEhlYXAgPSANCgkJCQkJCWFsaWdu
IChzdHJpbmdUb0J5dGVzIChhcmd2W2krK10pLA0KCQkJCQkJCTIgKiBzLT5w
YWdlU2l6ZSk7DQoJCQkJfSBlbHNlIGlmICgwID09IHN0cmNtcCAoYXJnLCAi
Z2MtbWVzc2FnZXMiKSkgew0KCQkJCQkrK2k7DQoJCQkJCXMtPm1lc3NhZ2Vz
ID0gVFJVRTsNCgkJCQl9IGVsc2UgaWYgKDAgPT0gc3RyY21wIChhcmcsICJn
Yy1zdW1tYXJ5IikpIHsNCgkJCQkJKytpOw0KCQkJCQlzLT5zdW1tYXJ5ID0g
VFJVRTsNCgkJCQl9IGVsc2UgaWYgKDAgPT0gc3RyY21wIChhcmcsICJjb3B5
LWdlbmVyYXRpb25hbC1yYXRpbyIpKSB7DQoJCQkJCSsraTsNCgkJCQkJaWYg
KGkgPT0gYXJnYykNCgkJCQkJCWRpZSAoIkBNTHRvbiBjb3B5LWdlbmVyYXRp
b25hbC1yYXRpbyBtaXNzaW5nIGFyZ3VtZW50LiIpOw0KCQkJCQlzLT5jb3B5
R2VuZXJhdGlvbmFsUmF0aW8gPQ0KCQkJCQkJc3RyaW5nVG9GbG9hdCAoYXJn
dltpKytdKTsNCgkJCQl9IGVsc2UgaWYgKDAgPT0gc3RyY21wIChhcmcsICJn
cm93LXJhdGlvIikpIHsNCgkJCQkJKytpOw0KCQkJCQlpZiAoaSA9PSBhcmdj
KQ0KCQkJCQkJZGllICgiQE1MdG9uIGdyb3ctcmF0aW8gbWlzc2luZyBhcmd1
bWVudC4iKTsNCgkJCQkJcy0+Z3Jvd1JhdGlvID0NCgkJCQkJCXN0cmluZ1Rv
RmxvYXQgKGFyZ3ZbaSsrXSk7DQoJCQkJfSBlbHNlIGlmICgwID09IHN0cmNt
cCAoYXJnLCAibGl2ZS1yYXRpbyIpKSB7DQoJCQkJCSsraTsNCgkJCQkJaWYg
KGkgPT0gYXJnYykNCgkJCQkJCWRpZSAoIkBNTHRvbiBsaXZlLXJhdGlvIG1p
c3NpbmcgYXJndW1lbnQuIik7DQoJCQkJCXMtPmxpdmVSYXRpbyA9DQoJCQkJ
CQlzdHJpbmdUb0Zsb2F0IChhcmd2W2krK10pOw0KCQkJCX0gZWxzZSBpZiAo
MCA9PSBzdHJjbXAgKGFyZywgImxvYWQtd29ybGQiKSkgew0KCQkJCQl1bmxl
c3MgKHMtPm1heUxvYWRXb3JsZCkNCgkJCQkJCWRpZSAoIk1heSBub3QgbG9h
ZCB3b3JsZC4iKTsNCgkJCQkJKytpOw0KCQkJCQlzLT5pc09yaWdpbmFsID0g
RkFMU0U7DQoJCQkJCWlmIChpID09IGFyZ2MpIA0KCQkJCQkJZGllICgiQE1M
dG9uIGxvYWQtd29ybGQgbWlzc2luZyBhcmd1bWVudC4iKTsNCgkJCQkJKndv
cmxkRmlsZSA9IGFyZ3ZbaSsrXTsNCgkJCQl9IGVsc2UgaWYgKDAgPT0gc3Ry
Y21wIChhcmcsICJtYXgtaGVhcCIpKSB7DQoJCQkJCSsraTsNCgkJCQkJaWYg
KGkgPT0gYXJnYykgDQoJCQkJCQlkaWUgKCJATUx0b24gbWF4LWhlYXAgbWlz
c2luZyBhcmd1bWVudC4iKTsNCgkJCQkJcy0+bWF4SGVhcCA9IGFsaWduIChz
dHJpbmdUb0J5dGVzIChhcmd2W2krK10pLA0KCQkJCQkJCQkyICogcy0+cGFn
ZVNpemUpOw0KCQkJCX0gZWxzZSBpZiAoMCA9PSBzdHJjbXAgKGFyZywgIm1h
cmstY29tcGFjdC1nZW5lcmF0aW9uYWwtcmF0aW8iKSkgew0KCQkJCQkrK2k7
DQoJCQkJCWlmIChpID09IGFyZ2MpDQoJCQkJCQlkaWUgKCJATUx0b24gbWFy
ay1jb21wYWN0LWdlbmVyYXRpb25hbC1yYXRpbyBtaXNzaW5nIGFyZ3VtZW50
LiIpOw0KCQkJCQlzLT5tYXJrQ29tcGFjdEdlbmVyYXRpb25hbFJhdGlvID0N
CgkJCQkJCXN0cmluZ1RvRmxvYXQgKGFyZ3ZbaSsrXSk7DQoJCQkJfSBlbHNl
IGlmICgwID09IHN0cmNtcCAoYXJnLCAibWFyay1jb21wYWN0LXJhdGlvIikp
IHsNCgkJCQkJKytpOw0KCQkJCQlpZiAoaSA9PSBhcmdjKQ0KCQkJCQkJZGll
ICgiQE1MdG9uIG1hcmstY29tcGFjdC1yYXRpbyBtaXNzaW5nIGFyZ3VtZW50
LiIpOw0KCQkJCQlzLT5tYXJrQ29tcGFjdFJhdGlvID0NCgkJCQkJCXN0cmlu
Z1RvRmxvYXQgKGFyZ3ZbaSsrXSk7DQoJCQkJfSBlbHNlIGlmICgwID09IHN0
cmNtcCAoYXJnLCAibm8tbG9hZC13b3JsZCIpKSB7DQoJCQkJCSsraTsNCgkJ
CQkJcy0+bWF5TG9hZFdvcmxkID0gRkFMU0U7DQoJCQkJfSBlbHNlIGlmICgw
ID09IHN0cmNtcCAoYXJnLCAibnVyc2VyeS1yYXRpbyIpKSB7DQoJCQkJCSsr
aTsNCgkJCQkJaWYgKGkgPT0gYXJnYykNCgkJCQkJCWRpZSAoIkBNTHRvbiBu
dXJzZXJ5LXJhdGlvIG1pc3NpbmcgYXJndW1lbnQuIik7DQoJCQkJCXMtPm51
cnNlcnlSYXRpbyA9DQoJCQkJCQlzdHJpbmdUb0Zsb2F0IChhcmd2W2krK10p
Ow0KCQkJCX0gZWxzZSBpZiAoMCA9PSBzdHJjbXAgKGFyZywgInJhbS1zbG9w
IikpIHsNCgkJCQkJKytpOw0KCQkJCQlpZiAoaSA9PSBhcmdjKQ0KCQkJCQkJ
ZGllICgiQE1MdG9uIHJhbS1zbG9wIG1pc3NpbmcgYXJndW1lbnQuIik7DQoJ
CQkJCXMtPnJhbVNsb3AgPQ0KCQkJCQkJc3RyaW5nVG9GbG9hdCAoYXJndltp
KytdKTsNCgkJCQl9IGVsc2UgaWYgKDAgPT0gc3RyY21wIChhcmcsICJzaG93
LXByb2YiKSkgew0KCQkJCQlzaG93UHJvZiAocyk7DQoJCQkJCWV4aXQgKDAp
Ow0KCQkJCX0gZWxzZSBpZiAoMCA9PSBzdHJjbXAgKGFyZywgInN0b3AiKSkg
ew0KCQkJCQkrK2k7DQoJCQkJCXMtPm1heVByb2Nlc3NBdE1MdG9uID0gRkFM
U0U7DQoJCQkJfSBlbHNlIGlmICgwID09IHN0cmNtcCAoYXJnLCAiLS0iKSkg
ew0KCQkJCQkrK2k7DQoJCQkJCWRvbmUgPSBUUlVFOw0KCQkJCX0gZWxzZSBp
ZiAoaSA+IDEpDQoJCQkJCWRpZSAoIlN0cmFuZ2UgQE1MdG9uIGFyZzogJXMi
LCBhcmd2W2ldKTsNCgkJCSAgICAgICAgZWxzZSBkb25lID0gVFJVRTsNCgkJ
CX0NCgkJfQ0KCX0NCglyZXR1cm4gaTsNCn0NCg0KaW50IEdDX2luaXQgKEdD
X3N0YXRlIHMsIGludCBhcmdjLCBjaGFyICoqYXJndikgew0KCWNoYXIgKndv
cmxkRmlsZTsNCglpbnQgaTsNCg0KCWFzc2VydCAoaXNBbGlnbmVkIChzaXpl
b2YgKHN0cnVjdCBHQ19zdGFjayksIHMtPmFsaWdubWVudCkpOw0KCWFzc2Vy
dCAoaXNBbGlnbmVkIChHQ19OT1JNQUxfSEVBREVSX1NJWkUgKyBzaXplb2Yg
KHN0cnVjdCBHQ190aHJlYWQpLA0KCQkJCXMtPmFsaWdubWVudCkpOw0KCWFz
c2VydCAoaXNBbGlnbmVkIChHQ19OT1JNQUxfSEVBREVSX1NJWkUgKyBzaXpl
b2YgKHN0cnVjdCBHQ193ZWFrKSwNCgkJCQlzLT5hbGlnbm1lbnQpKTsNCglz
LT5hbUluR0MgPSBUUlVFOw0KCXMtPmFtSW5NaW5vckdDID0gRkFMU0U7DQoJ
cy0+Ynl0ZXNBbGxvY2F0ZWQgPSAwOw0KCXMtPmJ5dGVzQ29waWVkID0gMDsN
CglzLT5ieXRlc0NvcGllZE1pbm9yID0gMDsNCglzLT5ieXRlc01hcmtDb21w
YWN0ZWQgPSAwOw0KCXMtPmNhbGxGcm9tQ0hhbmRsZXIgPSBCT0dVU19USFJF
QUQ7DQoJcy0+Y2FuSGFuZGxlID0gMDsNCglzLT5jYXJkU2l6ZSA9IDB4MSA8
PCBzLT5jYXJkU2l6ZUxvZzI7DQoJcy0+Y29weVJhdGlvID0gNC4wOw0KCXMt
PmNvcHlHZW5lcmF0aW9uYWxSYXRpbyA9IDQuMDsNCglzLT5jdXJyZW50VGhy
ZWFkID0gQk9HVVNfVEhSRUFEOw0KCXMtPmZpeGVkSGVhcCA9IDAuMDsNCglz
LT5nY1NpZ25hbElzUGVuZGluZyA9IEZBTFNFOw0KCXMtPmdyb3dSYXRpbyA9
IDguMDsNCglzLT5oYW5kbGVHQ1NpZ25hbCA9IEZBTFNFOw0KCXMtPmluU2ln
bmFsSGFuZGxlciA9IEZBTFNFOw0KCXMtPmlzT3JpZ2luYWwgPSBUUlVFOw0K
CXMtPmxpdmVSYXRpbyA9IDguMDsNCglzLT5tYXJrQ29tcGFjdFJhdGlvID0g
MS4wNDsNCglzLT5tYXJrQ29tcGFjdEdlbmVyYXRpb25hbFJhdGlvID0gOC4w
Ow0KCXMtPm1hcmtlZENhcmRzID0gMDsNCglzLT5tYXhCeXRlc0xpdmUgPSAw
Ow0KCXMtPm1heEhlYXAgPSAwOw0KCXMtPm1heEhlYXBTaXplU2VlbiA9IDA7
DQoJcy0+bWF4UGF1c2UgPSAwOw0KCXMtPm1heFN0YWNrU2l6ZVNlZW4gPSAw
Ow0KCXMtPm1heUxvYWRXb3JsZCA9IFRSVUU7DQoJcy0+bWF5UHJvY2Vzc0F0
TUx0b24gPSBUUlVFOw0KCXMtPm1lc3NhZ2VzID0gRkFMU0U7DQoJcy0+bWlu
b3JCeXRlc1NjYW5uZWQgPSAwOw0KCXMtPm1pbm9yQnl0ZXNTa2lwcGVkID0g
MDsNCglzLT5udW1Db3B5aW5nR0NzID0gMDsNCglzLT5udW1MQ3MgPSAwOw0K
CXMtPm51bU1hcmtDb21wYWN0R0NzID0gMDsNCglzLT5udW1NaW5vckdDcyA9
IDA7DQoJcy0+bnVtTWlub3JzU2luY2VMYXN0TWFqb3IgPSAwOw0KCXMtPm51
cnNlcnlSYXRpbyA9IDEwLjA7DQoJcy0+b2xkR2VuQXJyYXlTaXplID0gMHgx
MDAwMDA7DQoJcy0+cGFnZVNpemUgPSBnZXRwYWdlc2l6ZSAoKTsNCglzLT5y
YW1TbG9wID0gMC41Ow0KCXMtPnNhdmVkVGhyZWFkID0gQk9HVVNfVEhSRUFE
Ow0KCXMtPnNpZ25hbEhhbmRsZXIgPSBCT0dVU19USFJFQUQ7DQoJcy0+c2ln
bmFsSXNQZW5kaW5nID0gRkFMU0U7DQoJcy0+c3RhcnRUaW1lID0gY3VycmVu
dFRpbWUgKCk7DQoJcy0+c3VtbWFyeSA9IEZBTFNFOw0KCXMtPndlYWtzID0g
TlVMTDsNCgloZWFwSW5pdCAoJnMtPmhlYXApOw0KCWhlYXBJbml0ICgmcy0+
aGVhcDIpOw0KCXNpZ2VtcHR5c2V0ICgmcy0+c2lnbmFsc0hhbmRsZWQpOw0K
CWluaXRTaWduYWxTdGFjayAocyk7DQoJc2lnZW1wdHlzZXQgKCZzLT5zaWdu
YWxzUGVuZGluZyk7DQoJcnVzYWdlWmVybyAoJnMtPnJ1X2djKTsNCglydXNh
Z2VaZXJvICgmcy0+cnVfZ2NDb3B5KTsNCglydXNhZ2VaZXJvICgmcy0+cnVf
Z2NNYXJrQ29tcGFjdCk7DQoJcnVzYWdlWmVybyAoJnMtPnJ1X2djTWlub3Ip
Ow0KIAlyZWFkUHJvY2Vzc29yICgpOw0KCXdvcmxkRmlsZSA9IE5VTEw7DQoJ
dW5sZXNzIChpc0FsaWduZWQgKHMtPnBhZ2VTaXplLCBzLT5jYXJkU2l6ZSkp
DQoJCWRpZSAoIlBhZ2Ugc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgY2Fy
ZCBzaXplLiIpOw0KCXByb2Nlc3NBdE1MdG9uIChzLCBzLT5hdE1MdG9uc1Np
emUsIHMtPmF0TUx0b25zLCAmd29ybGRGaWxlKTsNCglpID0gcHJvY2Vzc0F0
TUx0b24gKHMsIGFyZ2MsIGFyZ3YsICZ3b3JsZEZpbGUpOw0KCWlmIChzLT5m
aXhlZEhlYXAgPiAwIGFuZCBzLT5tYXhIZWFwID4gMCkNCgkJZGllICgiQ2Fu
bm90IHVzZSBib3RoIGZpeGVkLWhlYXAgYW5kIG1heC1oZWFwLlxuIik7DQoJ
dW5sZXNzIChyYXRpb3NPayAocykpDQoJCWRpZSAoImludmFsaWQgcmF0aW9z
Iik7DQoJcy0+dG90YWxSYW0gPSB0b3RhbFJhbSAocyk7DQoJLyogV2UgYWxp
Z24gcy0+cmFtIGJ5IHBhZ2VTaXplIHNvIHRoYXQgd2UgY2FuIHRlc3Qgd2hl
dGhlciBvciBub3Qgd2UNCgkgKiB3ZSBhcmUgdXNpbmcgbWFyay1jb21wYWN0
IGJ5IGNvbXBhcmluZyBoZWFwIHNpemUgdG8gcmFtIHNpemUuICBJZiANCgkg
KiB3ZSBkaWRuJ3Qgcm91bmQsIHRoZSBzaXplIG1pZ2h0IGJlIHNsaWdodGx5
IG9mZi4NCiAgICAgICAgICovDQoJcy0+cmFtID0gYWxpZ24gKHMtPnJhbVNs
b3AgKiBzLT50b3RhbFJhbSwgcy0+cGFnZVNpemUpOw0KCWlmIChERUJVRyBv
ciBERUJVR19SRVNJWklORyBvciBzLT5tZXNzYWdlcykNCgkJZnByaW50ZiAo
c3RkZXJyLCAidG90YWwgUkFNID0gJXMgIFJBTSA9ICVzXG4iLA0KCQkJCXVp
bnRUb0NvbW1hU3RyaW5nIChzLT50b3RhbFJhbSksIA0KCQkJCXVpbnRUb0Nv
bW1hU3RyaW5nIChzLT5yYW0pKTsNCgkvKiBJbml0aWFsaXplIHByb2ZpbGlu
Zy4gIFRoaXMgbXVzdCBvY2N1ciBhZnRlciBwcm9jZXNzaW5nIGNvbW1hbmQt
bGluZSANCiAgICAgICAgICogYXJndW1lbnRzLCBiZWNhdXNlIHRob3NlIG1h
eSBqdXN0IGJlIGRvaW5nIGEgc2hvdyBwcm9mLCBpbiB3aGljaCANCiAgICAg
ICAgICogY2FzZSB3ZSBkb24ndCB3YW50IHRvIGluaXRpYWxpemUgdGhlIGF0
RXhpdC4NCiAgICAgICAgICovDQoJaWYgKHMtPnNvdXJjZXNTaXplID4gMCkg
ew0KCQlzLT5wcm9maWxpbmdJc09uID0gVFJVRTsNCgkJYXNzZXJ0IChzLT5m
cmFtZVNvdXJjZXNTaXplID09IHMtPmZyYW1lTGF5b3V0c1NpemUpOw0KCQlp
ZiAocy0+c291cmNlTGFiZWxzU2l6ZSA+IDApIHsNCgkJCXMtPnByb2ZpbGVL
aW5kID0gUFJPRklMRV9USU1FOw0KCQkJcHJvZmlsZVRpbWVJbml0IChzKTsN
CgkJfSBlbHNlIHsNCgkJCXMtPnByb2ZpbGVLaW5kID0gUFJPRklMRV9BTExP
QzsNCgkJCXMtPnByb2ZpbGUgPSBHQ19wcm9maWxlTmV3IChzKTsNCgkJfQ0K
CQlwcm9maWxlRW5kU3RhdGUgPSBzOw0KCQlhdGV4aXQgKHByb2ZpbGVFbmQp
Ow0KCX0gZWxzZQ0KCQlzLT5wcm9maWxpbmdJc09uID0gRkFMU0U7DQoJaWYg
KHMtPmlzT3JpZ2luYWwpDQoJCW5ld1dvcmxkIChzKTsNCgllbHNlIHsNCgkJ
bG9hZFdvcmxkIChzLCB3b3JsZEZpbGUpOw0KCQlpZiAocy0+cHJvZmlsaW5n
SXNPbiBhbmQgcy0+cHJvZmlsZVN0YWNrKQ0KCQkJR0NfZm9yZWFjaFN0YWNr
RnJhbWUgKHMsIGVudGVyRnJhbWUpOw0KCX0NCglhc3NlcnQgKG11dGF0b3JJ
bnZhcmlhbnQgKHMpKTsNCglzLT5hbUluR0MgPSBGQUxTRTsNCglyZXR1cm4g
aTsNCn0NCg0Kc3RhdGljIHZvaWQgZGlzcGxheUNvbCAoRklMRSAqb3V0LCBp
bnQgd2lkdGgsIHN0cmluZyBzKSB7DQoJaW50IGV4dHJhOw0KCWludCBpOw0K
CWludCBsZW47DQoNCglsZW4gPSBzdHJsZW4gKHMpOw0KCWlmIChsZW4gPCB3
aWR0aCkgew0KCSAgICAgICAgZXh0cmEgPSB3aWR0aCAtIGxlbjsNCgkJZm9y
IChpID0gMDsgaSA8IGV4dHJhOyArK2kpDQoJCQlmcHJpbnRmIChvdXQsICIg
Iik7DQoJfQ0KCWZwcmludGYgKG91dCwgIiVzXHQiLCBzKTsNCn0NCg0Kc3Rh
dGljIHZvaWQgZGlzcGxheUNvbGxlY3Rpb25TdGF0cyAoRklMRSAqb3V0LCBz
dHJpbmcgbmFtZSwgc3RydWN0IHJ1c2FnZSAqcnUsIA0KCQkJCQl1aW50IG51
bSwgdWxsb25nIGJ5dGVzKSB7DQoJdWludCBtczsNCg0KCW1zID0gcnVzYWdl
VGltZSAocnUpOw0KCWZwcmludGYgKG91dCwgIiVzIiwgbmFtZSk7DQoJZGlz
cGxheUNvbCAob3V0LCA3LCB1aW50VG9Db21tYVN0cmluZyAobXMpKTsNCglk
aXNwbGF5Q29sIChvdXQsIDcsIHVpbnRUb0NvbW1hU3RyaW5nIChudW0pKTsN
CglkaXNwbGF5Q29sIChvdXQsIDE1LCB1bGxvbmdUb0NvbW1hU3RyaW5nIChi
eXRlcykpOw0KCWRpc3BsYXlDb2wgKG91dCwgMTUsIA0KCQkJKG1zID4gMCkN
CgkJCT8gdWludFRvQ29tbWFTdHJpbmcgKDEwMDAuMCAqIChmbG9hdClieXRl
cy8oZmxvYXQpbXMpDQoJCQk6ICItIik7DQoJZnByaW50ZiAob3V0LCAiXG4i
KTsNCn0NCg0Kdm9pZCBHQ19kb25lIChHQ19zdGF0ZSBzKSB7DQoJRklMRSAq
b3V0Ow0KDQoJZW50ZXIgKHMpOw0KCW1pbm9yR0MgKHMpOw0KCW91dCA9IHN0
ZGVycjsNCglpZiAocy0+c3VtbWFyeSkgew0KCQlkb3VibGUgdGltZTsNCgkJ
dWludCBnY1RpbWU7DQoNCgkJZ2NUaW1lID0gcnVzYWdlVGltZSAoJnMtPnJ1
X2djKTsNCgkJZnByaW50ZiAob3V0LCAiR0MgdHlwZVx0XHR0aW1lIG1zXHQg
bnVtYmVyXHRcdCAgYnl0ZXNcdCAgICAgIGJ5dGVzL3NlY1xuIik7DQoJCWZw
cmludGYgKG91dCwgIi0tLS0tLS0tLS0tLS1cdC0tLS0tLS1cdC0tLS0tLS1c
dC0tLS0tLS0tLS0tLS0tLVx0LS0tLS0tLS0tLS0tLS0tXG4iKTsNCgkJZGlz
cGxheUNvbGxlY3Rpb25TdGF0cw0KCQkJKG91dCwgImNvcHlpbmdcdFx0Iiwg
JnMtPnJ1X2djQ29weSwgcy0+bnVtQ29weWluZ0dDcywgDQoJCQkJcy0+Ynl0
ZXNDb3BpZWQpOw0KCQlkaXNwbGF5Q29sbGVjdGlvblN0YXRzDQoJCQkob3V0
LCAibWFyay1jb21wYWN0XHQiLCAmcy0+cnVfZ2NNYXJrQ29tcGFjdCwgDQoJ
CQkJcy0+bnVtTWFya0NvbXBhY3RHQ3MsIHMtPmJ5dGVzTWFya0NvbXBhY3Rl
ZCk7DQoJCWRpc3BsYXlDb2xsZWN0aW9uU3RhdHMNCgkJCShvdXQsICJtaW5v
clx0XHQiLCAmcy0+cnVfZ2NNaW5vciwgcy0+bnVtTWlub3JHQ3MsIA0KCQkJ
CXMtPmJ5dGVzQ29waWVkTWlub3IpOw0KCQl0aW1lID0gKGRvdWJsZSkoY3Vy
cmVudFRpbWUgKCkgLSBzLT5zdGFydFRpbWUpOw0KCQlmcHJpbnRmIChvdXQs
ICJ0b3RhbCBHQyB0aW1lOiAlcyBtcyAoJS4xZiUlKVxuIiwNCgkJCQlpbnRU
b0NvbW1hU3RyaW5nIChnY1RpbWUpLCANCgkJCQkoMC4wID09IHRpbWUpIA0K
CQkJCQk/IDAuMCANCgkJCQkJOiAxMDAuMCAqICgoZG91YmxlKSBnY1RpbWUp
IC8gdGltZSk7DQoJCWZwcmludGYgKG91dCwgIm1heCBwYXVzZTogJXMgbXNc
biIsDQoJCQkJdWludFRvQ29tbWFTdHJpbmcgKHMtPm1heFBhdXNlKSk7DQoJ
CWZwcmludGYgKG91dCwgInRvdGFsIGFsbG9jYXRlZDogJXMgYnl0ZXNcbiIs
DQoJIAkJCXVsbG9uZ1RvQ29tbWFTdHJpbmcgKHMtPmJ5dGVzQWxsb2NhdGVk
KSk7DQoJCWZwcmludGYgKG91dCwgIm1heCBsaXZlOiAlcyBieXRlc1xuIiwN
CgkJCQl1aW50VG9Db21tYVN0cmluZyAocy0+bWF4Qnl0ZXNMaXZlKSk7DQoJ
CWZwcmludGYgKG91dCwgIm1heCBzZW1pc3BhY2U6ICVzIGJ5dGVzXG4iLCAN
CgkJCQl1aW50VG9Db21tYVN0cmluZyAocy0+bWF4SGVhcFNpemVTZWVuKSk7
DQoJCWZwcmludGYgKG91dCwgIm1heCBzdGFjayBzaXplOiAlcyBieXRlc1xu
IiwgDQoJCQkJdWludFRvQ29tbWFTdHJpbmcgKHMtPm1heFN0YWNrU2l6ZVNl
ZW4pKTsNCgkJZnByaW50ZiAob3V0LCAibWFya2VkIGNhcmRzOiAlc1xuIiwg
DQoJCQkJdWxsb25nVG9Db21tYVN0cmluZyAocy0+bWFya2VkQ2FyZHMpKTsN
CgkJZnByaW50ZiAob3V0LCAibWlub3Igc2Nhbm5lZDogJXMgYnl0ZXNcbiIs
DQoJCQkJdWludFRvQ29tbWFTdHJpbmcgKHMtPm1pbm9yQnl0ZXNTY2FubmVk
KSk7DQoJCWZwcmludGYgKG91dCwgIm1pbm9yIHNraXBwZWQ6ICVzIGJ5dGVz
XG4iLCANCgkJCQl1aW50VG9Db21tYVN0cmluZyAocy0+bWlub3JCeXRlc1Nr
aXBwZWQpKTsNCgl9DQoJaGVhcFJlbGVhc2UgKHMsICZzLT5oZWFwKTsNCglo
ZWFwUmVsZWFzZSAocywgJnMtPmhlYXAyKTsNCn0NCg0Kdm9pZCBHQ19maW5p
c2hIYW5kbGVyIChHQ19zdGF0ZSBzKSB7DQoJaWYgKERFQlVHX1NJR05BTFMp
DQoJCWZwcmludGYgKHN0ZGVyciwgIkdDX2ZpbmlzaEhhbmRsZXIgKClcbiIp
Ow0KCWFzc2VydCAocy0+Y2FuSGFuZGxlID09IDEpOw0KCXMtPmluU2lnbmFs
SGFuZGxlciA9IEZBTFNFOwkNCglzaWdlbXB0eXNldCAoJnMtPnNpZ25hbHNQ
ZW5kaW5nKTsNCglzLT5nY1NpZ25hbElzUGVuZGluZyA9IEZBTFNFOw0KCXVu
YmxvY2tTaWduYWxzIChzKTsNCn0NCg0KLyogR0NfaGFuZGxlciBzZXRzIHMt
PmxpbWl0ID0gMCBzbyB0aGF0IHRoZSBuZXh0IGxpbWl0IGNoZWNrIHdpbGwg
ZmFpbC4gDQogKiBTaWduYWxzIG5lZWQgdG8gYmUgYmxvY2tlZCBkdXJpbmcg
dGhlIGhhbmRsZXIgKGkuZS4gaXQgc2hvdWxkIHJ1biBhdG9taWNhbGx5KQ0K
ICogYmVjYXVzZSBzaWdhZGRzZXQgZG9lcyBib3RoIGEgcmVhZCBhbmQgYSB3
cml0ZSBvZiBzLT5zaWduYWxzUGVuZGluZy4NCiAqIFRoZSBzaWduYWxzIGFy
ZSBibG9ja2VkIGJ5IFBvc2l4X1NpZ25hbF9oYW5kbGUgKHNlZSBQb3NpeC9T
aWduYWwvU2lnbmFsLmMpLg0KICovDQp2b2lkIEdDX2hhbmRsZXIgKEdDX3N0
YXRlIHMsIGludCBzaWdudW0pIHsNCglpZiAoREVCVUdfU0lHTkFMUykNCgkJ
ZnByaW50ZiAoc3RkZXJyLCAiR0NfaGFuZGxlciBzaWdudW0gPSAlZFxuIiwg
c2lnbnVtKTsNCglhc3NlcnQgKHNpZ2lzbWVtYmVyICgmcy0+c2lnbmFsc0hh
bmRsZWQsIHNpZ251bSkpOw0KCWlmICgwID09IHMtPmNhbkhhbmRsZSkNCgkJ
cy0+bGltaXQgPSAwOw0KCXMtPnNpZ25hbElzUGVuZGluZyA9IFRSVUU7DQoJ
c2lnYWRkc2V0ICgmcy0+c2lnbmFsc1BlbmRpbmcsIHNpZ251bSk7DQoJaWYg
KERFQlVHX1NJR05BTFMpDQoJCWZwcmludGYgKHN0ZGVyciwgIkdDX2hhbmRs
ZXIgZG9uZVxuIik7DQp9DQoNCnVpbnQgR0Nfc2l6ZSAoR0Nfc3RhdGUgcywg
cG9pbnRlciByb290KSB7DQoJdWludCByZXM7DQoNCglpZiAoREVCVUdfTUFS
S19DT01QQUNUKQ0KCQlmcHJpbnRmIChzdGRlcnIsICJHQ19zaXplIG1hcmtp
bmdcbiIpOw0KCXJlcyA9IG1hcmsgKHMsIHJvb3QsIE1BUktfTU9ERSk7DQoJ
aWYgKERFQlVHX01BUktfQ09NUEFDVCkNCgkJZnByaW50ZiAoc3RkZXJyLCAi
R0Nfc2l6ZSB1bm1hcmtpbmdcbiIpOw0KCW1hcmsgKHMsIHJvb3QsIFVOTUFS
S19NT0RFKTsNCglyZXR1cm4gcmVzOw0KfQ0KDQp2b2lkIEdDX3NhdmVXb3Js
ZCAoR0Nfc3RhdGUgcywgaW50IGZkKSB7DQoJY2hhciBidWZbODBdOw0KDQoJ
aWYgKERFQlVHX1dPUkxEKQ0KCQlmcHJpbnRmIChzdGRlcnIsICJHQ19zYXZl
V29ybGQgKCVkKS5cbiIsIGZkKTsNCgllbnRlciAocyk7DQoJLyogQ29tcGFj
dCB0aGUgaGVhcC4gKi8NCglkb0dDIChzLCAwLCAwLCBUUlVFLCBUUlVFKTsN
CglzcHJpbnRmIChidWYsDQoJCSJIZWFwIGZpbGUgY3JlYXRlZCBieSBNTHRv
bi5cbmhlYXAuc3RhcnQgPSAweCUwOHhcbmJ5dGVzTGl2ZSA9ICV1XG4iLA0K
CQkodWludClzLT5oZWFwLnN0YXJ0LCAodWludClzLT5ieXRlc0xpdmUpOw0K
CXN3cml0ZSAoZmQsIGJ1ZiwgMSArIHN0cmxlbihidWYpKTsgLyogKzEgdG8g
Z2V0IHRoZSAnXDAwMCcgKi8NCglzd3JpdGVVaW50IChmZCwgcy0+bWFnaWMp
Ow0KCXN3cml0ZVVpbnQgKGZkLCAodWludClzLT5oZWFwLnN0YXJ0KTsNCglz
d3JpdGVVaW50IChmZCwgKHVpbnQpcy0+b2xkR2VuU2l6ZSk7DQoJc3dyaXRl
VWludCAoZmQsICh1aW50KXMtPmNhbGxGcm9tQ0hhbmRsZXIpOw0KCS8qIGNh
bkhhbmRsZSBtdXN0IGJlIHNhdmVkIGluIHRoZSBoZWFwLCBiZWNhdXNlIHRo
ZSBzYXZlV29ybGQgbWF5IGJlDQoJICogcnVuIGluIHRoZSBjb250ZXh0IG9m
IGEgY3JpdGljYWwgc2VjdGlvbiwgd2hpY2ggd2lsbCBleHBlY3QgdG8gYmUg
aW4JDQoJICogdGhlIHNhbWUgY29udGV4dCB3aGVuIGl0IGlzIHJlc3RvcmVk
Lg0KCSAqLw0KCXN3cml0ZVVpbnQgKGZkLCBzLT5jYW5IYW5kbGUpOw0KCXN3
cml0ZVVpbnQgKGZkLCAodWludClzLT5jdXJyZW50VGhyZWFkKTsNCglzd3Jp
dGVVaW50IChmZCwgKHVpbnQpcy0+c2lnbmFsSGFuZGxlcik7DQogCXN3cml0
ZSAoZmQsIHMtPmhlYXAuc3RhcnQsIHMtPm9sZEdlblNpemUpOw0KCSgqcy0+
c2F2ZUdsb2JhbHMpIChmZCk7DQoJbGVhdmUgKHMpOw0KfQ0KDQp2b2lkIEdD
X3BhY2sgKEdDX3N0YXRlIHMpIHsNCgl1aW50IGtlZXA7DQoNCgllbnRlciAo
cyk7DQoJaWYgKERFQlVHIG9yIHMtPm1lc3NhZ2VzKQ0KCQlmcHJpbnRmIChz
dGRlcnIsICJQYWNraW5nIGhlYXAgb2Ygc2l6ZSAlcy5cbiIsDQoJCQkJdWlu
dFRvQ29tbWFTdHJpbmcgKHMtPmhlYXAuc2l6ZSkpOw0KCS8qIENvdWxkIHB1
dCBzb21lIGNvZGUgaGVyZSB0byBza2lwIHRoZSBHQyBpZiB0aGVyZSBoYXNu
J3QgYmVlbiBtdWNoDQoJICogYWxsb2NhdGVkIHNpbmNlIHRoZSBsYXN0IGNv
bGxlY3Rpb24uICBCdXQgeW91IHdvdWxkIHN0aWxsIG5lZWQgdG8gDQoJICog
ZG8gYSBtaW5vciBHQyB0byBtYWtlIGFsbCBvYmplY3RzIGNvbnRpZ3VvdXMu
DQogCSAqLw0KCWRvR0MgKHMsIDAsIDAsIFRSVUUsIEZBTFNFKTsNCglrZWVw
ID0gcy0+b2xkR2VuU2l6ZSAqIDEuMTsNCglpZiAoa2VlcCA8PSBzLT5oZWFw
LnNpemUpIHsNCgkJaGVhcFNocmluayAocywgJnMtPmhlYXAsIGtlZXApOw0K
CQlzZXROdXJzZXJ5IChzLCAwLCAwKTsNCgkJc2V0U3RhY2sgKHMpOw0KCX0N
CgloZWFwUmVsZWFzZSAocywgJnMtPmhlYXAyKTsNCglpZiAoREVCVUcgb3Ig
cy0+bWVzc2FnZXMpDQoJCWZwcmludGYgKHN0ZGVyciwgIlBhY2tlZCBoZWFw
IHRvIHNpemUgJXMuXG4iLA0KCQkJCXVpbnRUb0NvbW1hU3RyaW5nIChzLT5o
ZWFwLnNpemUpKTsNCglsZWF2ZSAocyk7DQp9DQoNCnZvaWQgR0NfdW5wYWNr
IChHQ19zdGF0ZSBzKSB7DQoJZW50ZXIgKHMpOw0KCWlmIChERUJVRyBvciBz
LT5tZXNzYWdlcykNCgkJZnByaW50ZiAoc3RkZXJyLCAiVW5wYWNraW5nIGhl
YXAgb2Ygc2l6ZSAlcy5cbiIsDQoJCQkJdWludFRvQ29tbWFTdHJpbmcgKHMt
PmhlYXAuc2l6ZSkpOw0KCS8qIFRoZSBlbnRlckdDIGlzIG5lZWRlZCBoZXJl
IGJlY2F1c2UgbWlub3JHQyBhbmQgcmVzaXplSGVhcCBtaWdodCBtb3ZlDQoJ
ICogdGhlIHN0YWNrLCBhbmQgdGhlIFNJR1BST0YgY2F0Y2hlciB3b3VsZCB0
aGVuIHNlZSBhIGJvZ3VzIHN0YWNrLiAgVGhlDQogCSAqIGxlYXZlR0MgaGFz
IHRvIGhhcHBlbiBhZnRlciB0aGUgc2V0U3RhY2suDQoJICovDQoJZW50ZXJH
QyAocyk7DQoJbWlub3JHQyAocyk7DQoJcmVzaXplSGVhcCAocywgcy0+b2xk
R2VuU2l6ZSk7DQoJcmVzaXplSGVhcDIgKHMpOw0KCXNldE51cnNlcnkgKHMs
IDAsIDApOw0KCXNldFN0YWNrIChzKTsNCglsZWF2ZUdDIChzKTsNCglpZiAo
REVCVUcgb3Igcy0+bWVzc2FnZXMpDQoJCWZwcmludGYgKHN0ZGVyciwgIlVu
cGFja2VkIGhlYXAgdG8gc2l6ZSAlcy5cbiIsDQoJCQkJdWludFRvQ29tbWFT
dHJpbmcgKHMtPmhlYXAuc2l6ZSkpOw0KCWxlYXZlIChzKTsNCn0NCg0KLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLw0KLyogICAgICAgICAgICAgICAgICAgICBHQ193ZWFrKiAgICAg
ICAgICAgICAgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovKiBBIHdlYWsg
b2JqZWN0IGlzIGEgaGVhZGVyIGZvbGxvd2VkIGJ5IHR3byB3b3Jkcy4NCiAq
DQogKiBUaGUgb2JqZWN0IHR5cGUgaW5kZXhlZCBieSB0aGUgaGVhZGVyIGRl
dGVybWluZXMgd2hldGhlciB0aGUgd2VhayBpcyB2YWxpZA0KICogb3Igbm90
LiAgSWYgdGhlIHR5cGUgaGFzIG51bVBvaW50ZXJzID09IDEsIHRoZW4gdGhl
IHdlYWsgcG9pbnRlciBpcyB2YWxpZC4gIA0KICogT3RoZXJ3aXNlLCB0aGUg
dHlwZSBoYXMgbnVtUG9pbnRlcnMgPT0gMCBhbmQgdGhlIHdlYWsgcG9pbnRl
ciBpcyBub3QgdmFsaWQuDQogKg0KICogVGhlIGZpcnN0IHdvcmQgaXMgdXNl
ZCB0byBjaGFpbiB0aGUgbGl2ZSB3ZWFrcyB0b2dldGhlciBkdXJpbmcgYSBj
b3B5aW5nIGdjDQogKiBhbmQgaXMgb3RoZXJ3aXNlIHVudXNlZC4NCiAqDQog
KiBUaGUgc2Vjb25kIHdvcmQgaXMgdGhlIHdlYWsgcG9pbnRlci4NCiAqLyAN
Cg0KYm9vbCBHQ193ZWFrQ2FuR2V0IChwb2ludGVyIHApIHsNCglCb29sIHJl
czsNCg0KCXJlcyA9IFdFQUtfR09ORV9IRUFERVIgIT0gR0NfZ2V0SGVhZGVy
IChwKTsNCglpZiAoREVCVUdfV0VBSykNCgkJZnByaW50ZiAoc3RkZXJyLCAi
JXMgPSBHQ193ZWFrQ2FuR2V0ICgweCUwOHgpXG4iLA0KCQkJCWJvb2xUb1N0
cmluZyAocmVzKSwgKHVpbnQpcCk7DQoJcmV0dXJuIHJlczsNCn0NCg0KUG9p
bnRlciBHQ193ZWFrR2V0IChQb2ludGVyIHApIHsNCglwb2ludGVyIHJlczsN
Cg0KCXJlcyA9ICgoR0Nfd2VhaylwKS0+b2JqZWN0Ow0KCWlmIChERUJVR19X
RUFLKQ0KCQlmcHJpbnRmIChzdGRlcnIsICIweCUwOHggPSBHQ193ZWFrR2V0
ICgweCUwOHgpXG4iLA0KCQkJCSh1aW50KXJlcywgKHVpbnQpcCk7DQoJcmV0
dXJuIHJlczsNCn0NCg0KUG9pbnRlciBHQ193ZWFrTmV3IChHQ19zdGF0ZSBz
LCBXb3JkMzIgaGVhZGVyLCBQb2ludGVyIHApIHsNCglwb2ludGVyIHJlczsN
Cg0KCXJlcyA9IG9iamVjdCAocywgaGVhZGVyLCBHQ19OT1JNQUxfSEVBREVS
X1NJWkUgKyAzICogV09SRF9TSVpFLCANCgkJCUZBTFNFLCBGQUxTRSk7DQoJ
KChHQ193ZWFrKXJlcyktPm9iamVjdCA9IHA7DQoJaWYgKERFQlVHX1dFQUsp
DQoJCWZwcmludGYgKHN0ZGVyciwgIjB4JTA4eCA9IEdDX3dlYWtOZXcgKDB4
JTA4eCwgMHglMDh4KVxuIiwNCgkJCQkodWludClyZXMsICh1aW50KWhlYWRl
ciwgKHVpbnQpcCk7DQoJcmV0dXJuIHJlczsNCn0NCg==
---559023410-959030623-1081130579=:25682--