[Patches] Slightly cleaned-up cycle-gc patch

Charles G Waldman cgw@alum.mit.edu
Tue, 25 Apr 2000 09:51:04 -0500 (CDT)


DQpUaGUgcHJvYmxlbXMgSSB3YXMgaGF2aW5nIGdldHRpbmcgTmVpbCdzIGN5Y2xpYy1nYyBz
dHVmZiB0byB3b3JrIHdpdGgNCnRoZSBsYXRlc3QgQ1ZTIFB5dGhvbiBoYWQgbm90aGluZyB0
byBkbyB3aXRoIFRyYXNoY2FuIC0gc29ycnksDQpDaHJpc3RpYW4hICBJdCB3YXMgbXkgb3du
IGNoYW5nZXMgdG8gdHVwbGVvYmplY3QuYy4gIEl0IHR1cm5lZCBvdXQgdG8NCmJlIGEgbGl0
dGxlIHRyaWNreSB0byBnZXQgdGhlIEdDIGluZm8gaGFuZGxlZCBjb3JyZWN0bHkgZHVyaW5n
DQpfUHlUdXBsZV9SZXNpemUuICBCZWxvdyBpcyBhIHZlcnNpb24gb2YgTmVpbCdzIHBhdGNo
IHRoYXQgYXBwbGllcw0KY2xlYW5seSB0byBjdXJyZW50IENWUyBhbmQgc2VlbXMgdG8gd29y
ayBjb3JyZWN0bHkuICBBbGwgY3JlZGl0IGlzIGR1ZQ0KdG8gTmVpbCwgSSBqdXN0IGRpZCBh
IHRpbnkgYW1vdW50IG9mIGNsZWFudXAgd29yayBpbiBhIGZldyBwbGFjZXMuDQoNCkRpZmZl
cmVuY2VzOiAgDQoNCiAgKDEpIFRoZSBhYm92ZS1tZW50aW9uZWQgX1B5VHVwbGVfUmVzaXpl
IGZpeA0KDQogICgyKSBBIGZldyBwcm9ibGVtcyB3ZXJlIGV4cG9zZWQgYnkgYnVpbGRpbmcg
d2l0aCBQeV9UUkFDRV9SRUZTDQpkZWZpbmVkLiAgU3BlY2lmaWFsbHksIFB5T2JqZWN0X05l
dyBhbmQgUHlPYmplY3RfTmV3VmFyIGFscmVhZHkgZG8gYQ0KX1B5X05ld1JlZmVyZW5jZSBp
bnRlcm5hbGx5LCBidXQgaW4gYSBmZXcgcGxhY2VzIFB5T2JqZWN0X05ldyBpcw0KdXNlZCB0
byBjcmVhdGUgYSBuZXcgb2JqZWN0IHdoaWNoIGlzIHRoZW4gX1B5X05ld1JlZmVyZW5jZSdk
LiAgSWYNClB5X1RSQUNFX1JFRlMgaXMgbm90IHNldCwgdGhpcyBpcyBtZXJlbHkgcmVkdW5k
YW50OyB3aXRoDQpQeV9UUkFDRV9SRUZTIHNldCBpdCBjYXVzZXMgc2VyaW91cyBwcm9ibGVt
cyBiZWNhdXNlIHRoZSBvYmplY3QgaXMNCmFkZGVkIHRvIHRoZSByZWZlcmVuY2UgY2hhaW4g
dHdpY2UuDQoNCg0KICAgICAgICAgICAgICAgICAgSSBjb25maXJtIHRoYXQsIHRvIHRoZSBi
ZXN0IG9mIG15IGtub3dsZWRnZSBhbmQgYmVsaWVmLCB0aGlzDQogICAgICAgICAgICAgICAg
ICBjb250cmlidXRpb24gaXMgZnJlZSBvZiBhbnkgY2xhaW1zIG9mIHRoaXJkIHBhcnRpZXMg
dW5kZXINCiAgICAgICAgICAgICAgICAgIGNvcHlyaWdodCwgcGF0ZW50IG9yIG90aGVyIHJp
Z2h0cyBvciBpbnRlcmVzdHMgKCJjbGFpbXMiKS4gIFRvDQogICAgICAgICAgICAgICAgICB0
aGUgZXh0ZW50IHRoYXQgSSBoYXZlIGFueSBzdWNoIGNsYWltcywgSSBoZXJlYnkgZ3JhbnQg
dG8gQ05SSSBhDQogICAgICAgICAgICAgICAgICBub25leGNsdXNpdmUsIGlycmV2b2NhYmxl
LCByb3lhbHR5LWZyZWUsIHdvcmxkd2lkZSBsaWNlbnNlIHRvDQogICAgICAgICAgICAgICAg
ICByZXByb2R1Y2UsIGRpc3RyaWJ1dGUsIHBlcmZvcm0gYW5kL29yIGRpc3BsYXkgcHVibGlj
bHksIHByZXBhcmUNCiAgICAgICAgICAgICAgICAgIGRlcml2YXRpdmUgdmVyc2lvbnMsIGFu
ZCBvdGhlcndpc2UgdXNlIHRoaXMgY29udHJpYnV0aW9uIGFzIHBhcnQNCiAgICAgICAgICAg
ICAgICAgIG9mIHRoZSBQeXRob24gc29mdHdhcmUgYW5kIGl0cyByZWxhdGVkIGRvY3VtZW50
YXRpb24sIG9yIGFueQ0KICAgICAgICAgICAgICAgICAgZGVyaXZhdGl2ZSB2ZXJzaW9ucyB0
aGVyZW9mLCBhdCBubyBjb3N0IHRvIENOUkkgb3IgaXRzIGxpY2Vuc2VkDQogICAgICAgICAg
ICAgICAgICB1c2VycywgYW5kIHRvIGF1dGhvcml6ZSBvdGhlcnMgdG8gZG8gc28uDQoNCiAg
ICAgICAgICAgICAgICAgIEkgYWNrbm93bGVkZ2UgdGhhdCBDTlJJIG1heSwgYXQgaXRzIHNv
bGUgZGlzY3JldGlvbiwgZGVjaWRlDQogICAgICAgICAgICAgICAgICB3aGV0aGVyIG9yIG5v
dCB0byBpbmNvcnBvcmF0ZSB0aGlzIGNvbnRyaWJ1dGlvbiBpbiB0aGUgUHl0aG9uDQogICAg
ICAgICAgICAgICAgICBzb2Z0d2FyZSBhbmQgaXRzIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbi4g
IEkgZnVydGhlciBncmFudCBDTlJJDQogICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uIHRv
IHVzZSBteSBuYW1lIGFuZCBvdGhlciBpZGVudGlmeWluZyBpbmZvcm1hdGlvbg0KICAgICAg
ICAgICAgICAgICAgcHJvdmlkZWQgdG8gQ05SSSBieSBtZSBmb3IgdXNlIGluIGNvbm5lY3Rp
b24gd2l0aCB0aGUgUHl0aG9uDQogICAgICAgICAgICAgICAgICBzb2Z0d2FyZSBhbmQgaXRz
IHJlbGF0ZWQgZG9jdW1lbnRhdGlvbi4NCg0KCQ0KLS0tIFB5dGhvbi1jdnMvSW5jbHVkZS9v
YmplY3QuaAlGcmkgTWFyIDI0IDIyOjMyOjE2IDIwMDANCisrKyBQeXRob24tZ2MvSW5jbHVk
ZS9vYmplY3QuaAlTYXQgQXByICA4IDAxOjM4OjI1IDIwMDANCkBAIC0xNDUsNiArMTQ1LDEw
IEBADQogdHlwZWRlZiBpbnQgKCpnZXRzZWdjb3VudHByb2MpIFB5X1BST1RPKChQeU9iamVj
dCAqLCBpbnQgKikpOw0KIHR5cGVkZWYgaW50ICgqZ2V0Y2hhcmJ1ZmZlcnByb2MpIFB5X1BS
T1RPKChQeU9iamVjdCAqLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsNCiB0eXBlZGVmIGludCAo
Km9iam9ianByb2MpIFB5X1BST1RPKChQeU9iamVjdCAqLCBQeU9iamVjdCAqKSk7DQorI2lm
ZGVmIFdJVEhfQ1lDTEVfR0MNCit0eXBlZGVmIGludCAoKnZpc2l0cHJvYykgUHlfUFJPVE8o
KFB5T2JqZWN0ICosIHZvaWQgKikpOw0KK3R5cGVkZWYgaW50ICgqcmVjdXJzZXByb2MpIFB5
X1BST1RPKChQeU9iamVjdCAqLCB2aXNpdHByb2MsIHZvaWQgKikpOw0KKyNlbmRpZg0KIA0K
IHR5cGVkZWYgc3RydWN0IHsNCiAJYmluYXJ5ZnVuYyBuYl9hZGQ7DQpAQCAtMjQzLDkgKzI0
NywxOCBAQA0KIA0KIAljaGFyICp0cF9kb2M7IC8qIERvY3VtZW50YXRpb24gc3RyaW5nICov
DQogDQotCS8qIE1vcmUgc3BhcmVzICovDQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJLyog
Y2FsbCBmdW5jdGlvbiBmb3IgYWxsIGFjY2Vzc2libGUgb2JqZWN0cyAqLw0KKwlyZWN1cnNl
cHJvYyB0cF9yZWN1cnNlOw0KKwkNCisJLyogZGVsZXRlIHJlZmVyZW5jZXMgdG8gY29udGFp
bmVkIG9iamVjdHMgKi8NCisJaW5xdWlyeSB0cF9jbGVhcjsNCisjZWxzZQ0KIAlsb25nIHRw
X3h4eDU7DQogCWxvbmcgdHBfeHh4NjsNCisjZW5kaWYNCisNCisJLyogTW9yZSBzcGFyZXMg
Ki8NCiAJbG9uZyB0cF94eHg3Ow0KIAlsb25nIHRwX3h4eDg7DQogDQpAQCAtMzE1LDYgKzMy
OCw5IEBADQogDQogLyogUHlTZXF1ZW5jZU1ldGhvZHMgY29udGFpbnMgc3FfY29udGFpbnMg
Ki8NCiAjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTiAoMUw8PDEpDQorDQor
LyogT2JqZWN0cyB3aXRoIGEgR0MgaW5mbyBwcmVmaXggKGFsbG9jYXRlZCAqYmVmb3JlKiB0
aGUgb2JqZWN0IGl0c2VsZiEpICovDQorI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfR0NJTkZP
ICgxTDw8MikNCiANCiAjZGVmaW5lIFB5X1RQRkxBR1NfREVGQVVMVCAgKFB5X1RQRkxBR1Nf
SEFWRV9HRVRDSEFSQlVGRkVSIHwgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
UHlfVFBGTEFHU19IQVZFX1NFUVVFTkNFX0lOKQ0KLS0tIFB5dGhvbi1jdnMvSW5jbHVkZS9v
YmppbXBsLmgJVGh1IE1hciAgMiAxNzowMjoyMyAyMDAwDQorKysgUHl0aG9uLWdjL0luY2x1
ZGUvb2JqaW1wbC5oCVNhdCBBcHIgIDggMDM6MTg6MjIgMjAwMA0KQEAgLTM4LDggKzM4LDQy
IEBADQogLyoNCiBBZGRpdGlvbmFsIG1hY3JvcyBmb3IgbW9kdWxlcyB0aGF0IGltcGxlbWVu
dCBuZXcgb2JqZWN0IHR5cGVzLg0KIFlvdSBtdXN0IGZpcnN0IGluY2x1ZGUgIm9iamVjdC5o
Ii4NCisqLw0KKw0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDIA0KKw0KKy8qIFN0cnVjdHVyZSAq
cHJlZml4ZWQqIHRvIGNvbnRhaW5lciBvYmplY3RzIHBhcnRpY2lwYXRpbmcgaW4gR0MgKi8g
DQordHlwZWRlZiBzdHJ1Y3QgX2djaW5mbyB7DQorCXN0cnVjdCBfZ2NpbmZvICpnY19uZXh0
Ow0KKwlzdHJ1Y3QgX2djaW5mbyAqZ2NfcHJldjsNCisJaW50IGdjX3JlZnM7DQorfSBQeUdD
SW5mbzsNCisNCisvKiBUZXN0IGlmIGEgdHlwZSBoYXMgR0MgaW5mbyAqLw0KKyNkZWZpbmUg
UFlfVFlQRUlTR0ModCkgUHlUeXBlX0hhc0ZlYXR1cmUoKHQpLCBQeV9UUEZMQUdTX0hBVkVf
R0NJTkZPKQ0KKw0KKy8qIFRlc3QgaWYgYW4gb2JqZWN0IGhhcyBHQyBpbmZvICovDQorI2Rl
ZmluZSBQWV9JU0dDKG8pIFBZX1RZUEVJU0dDKChvKS0+b2JfdHlwZSkNCisNCisvKiBHZXQg
YW4gb2JqZWN0J3MgR0MgaW5mbyAtLSBOVUxMIGlmIHRoZSBvYmplY3QgaGFzIG5vbmUgKi8N
CisjZGVmaW5lIFBZX0dDSU5GTyhvKSAoUFlfSVNHQyhvKSA/ICgoUHlHQ0luZm8gKikobykt
MSkgOiBOVUxMKQ0KKw0KKy8qIFVuc2FmZSB2ZXJzaW9uIG9mIFBZX0dDSU5GTygpIC0tIG9u
bHkgY2FsbCBpZiBQWV9JU0dDKHApIGlzIHRydWUgKi8NCisjZGVmaW5lIFBZX0dDSU5GT19V
TlNBRkUobykgKChQeUdDSW5mbyAqKShvKS0xKQ0KKw0KKy8qIEdldCB0aGUgb2JqZWN0IGdp
dmVuIHRoZSBQeUdDSW5mbyAqLw0KKyNkZWZpbmUgUFlfR0NPQkooZykgKChQeU9iamVjdCAq
KSgoZykrMSkpDQogDQotUHlPYmplY3RfTkVXKHR5cGUsIHR5cGVvYmopIGFsbG9jYXRlcyBt
ZW1vcnkgZm9yIGEgbmV3IG9iamVjdCBvZiB0aGUgZ2l2ZW4NCisvKiBBZGQgdGhlIG9iamVj
dCBpbnRvIHRoZSBjb250YWluZXIgc2V0ICovDQorZXh0ZXJuIERMX0lNUE9SVCh2b2lkKSBQ
eUdDX0luc2VydCBQeV9QUk9UTygoUHlPYmplY3QgKikpOw0KKw0KKy8qIFJlbW92ZSB0aGUg
b2JqZWN0IGZyb20gdGhlIGNvbnRhaW5lciBzZXQgKi8NCitleHRlcm4gRExfSU1QT1JUKHZv
aWQpIFB5R0NfUmVtb3ZlIFB5X1BST1RPKChQeU9iamVjdCAqKSk7DQorDQorI2VuZGlmDQor
DQorLyoNCitQeU9iamVjdF9OZXcodHlwZSwgdHlwZW9iaikgYWxsb2NhdGVzIG1lbW9yeSBm
b3IgYSBuZXcgb2JqZWN0IG9mIHRoZSBnaXZlbg0KIHR5cGU7IGhlcmUgJ3R5cGUnIG11c3Qg
YmUgdGhlIEMgc3RydWN0dXJlIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlDQogb2JqZWN0
IGFuZCAndHlwZW9iaicgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBv
YmplY3QuDQogUmVmZXJlbmNlIGNvdW50IGFuZCB0eXBlIHBvaW50ZXIgYXJlIGZpbGxlZCBp
bjsgdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIG9mDQpAQCAtNDcsMzAgKzgxLDI5IEBADQogVGhl
IHNpemUgb2YgdGhlIG9iamVjdCBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSB0cF9i
YXNpY3NpemUgZmllbGQNCiBvZiB0aGUgdHlwZSBvYmplY3QuDQogDQotUHlPYmplY3RfTkVX
X1ZBUih0eXBlLCB0eXBlb2JqLCBuKSBpcyBzaW1pbGFyIGJ1dCBhbGxvY2F0ZXMgYSB2YXJp
YWJsZS1zaXplDQorUHlPYmplY3RfTmV3VmFyKHR5cGUsIHR5cGVvYmosIG4pIGlzIHNpbWls
YXIgYnV0IGFsbG9jYXRlcyBhIHZhcmlhYmxlLXNpemUNCiBvYmplY3Qgd2l0aCBuIGV4dHJh
IGl0ZW1zLiAgVGhlIHNpemUgaXMgY29tcHV0ZWQgYXMgdHBfYmFzaWNzaXplIHBsdXMNCiBu
ICogdHBfaXRlbXNpemUuICBUaGlzIGZpbGxzIGluIHRoZSBvYl9zaXplIGZpZWxkIGFzIHdl
bGwuDQogKi8NCiANCi0jaWZuZGVmIE1TX0NPUkVETEwNCiBleHRlcm4gRExfSU1QT1JUKFB5
T2JqZWN0ICopIF9QeU9iamVjdF9OZXcgUHlfUFJPVE8oKFB5VHlwZU9iamVjdCAqKSk7DQog
ZXh0ZXJuIERMX0lNUE9SVChQeVZhck9iamVjdCAqKSBfUHlPYmplY3RfTmV3VmFyIFB5X1BS
T1RPKChQeVR5cGVPYmplY3QgKiwgaW50KSk7DQorZXh0ZXJuIERMX0lNUE9SVCh2b2lkKSBQ
eU9iamVjdF9EZWwgUHlfUFJPVE8oKFB5T2JqZWN0ICopKTsNCiANCi0jZGVmaW5lIFB5T2Jq
ZWN0X05FVyh0eXBlLCB0eXBlb2JqKSAoKHR5cGUgKikgX1B5T2JqZWN0X05ldyh0eXBlb2Jq
KSkNCi0jZGVmaW5lIFB5T2JqZWN0X05FV19WQVIodHlwZSwgdHlwZW9iaiwgbikgKCh0eXBl
ICopIF9QeU9iamVjdF9OZXdWYXIodHlwZW9iaiwgbikpDQotDQotI2Vsc2UNCi0vKiBGb3Ig
YW4gTVMtV2luZG93cyBETEwsIHdlIGNoYW5nZSB0aGUgd2F5IGFuIG9iamVjdCBpcyBjcmVh
dGVkLCBzbyB0aGF0IHRoZQ0KLSAgIGV4dGVuc2lvbiBtb2R1bGUncyBtYWxsb2MgaXMgdXNl
ZCwgcmF0aGVyIHRoYW4gdGhlIGNvcmUgRExMIG1hbGxvYywgYXMgdGhlcmUgaXMNCi0gICBu
byBndWFyYW50ZWUgdGhleSB3aWxsIHVzZSB0aGUgc2FtZSBoZWFwDQotKi8NCi1leHRlcm4g
RExfSU1QT1JUKFB5T2JqZWN0ICopIF9QeU9iamVjdF9OZXcgUHlfUFJPVE8oKFB5VHlwZU9i
amVjdCAqLCBQeU9iamVjdCAqKSk7DQotZXh0ZXJuIERMX0lNUE9SVChQeVZhck9iamVjdCAq
KSBfUHlPYmplY3RfTmV3VmFyIFB5X1BST1RPKChQeVR5cGVPYmplY3QgKiwgaW50LCBQeVZh
ck9iamVjdCAqKSk7DQotDQotI2RlZmluZSBQeU9iamVjdF9ORVcodHlwZSwgdHlwZW9iaikg
KCh0eXBlICopIF9QeU9iamVjdF9OZXcodHlwZW9iaiwoUHlPYmplY3QgKiltYWxsb2MoKHR5
cGVvYmopLT50cF9iYXNpY3NpemUpKSkNCi0jZGVmaW5lIFB5T2JqZWN0X05FV19WQVIodHlw
ZSwgdHlwZW9iaiwgbikgKCh0eXBlICopIF9QeU9iamVjdF9OZXdWYXIodHlwZW9iaiwgbiwg
KFB5VmFyT2JqZWN0ICopbWFsbG9jKCh0eXBlb2JqKS0+dHBfYmFzaWNzaXplICsgbiAqICh0
eXBlb2JqKS0+dHBfaXRlbXNpemUpKSkNCi0NCi0jZW5kaWYgLyogTVNfQ09SRURMTCAqLw0K
Ky8qIEZ1bmN0aW9ucyAqLw0KKyNkZWZpbmUgUHlPYmplY3RfTmV3KHR5cGUsIHR5cGVvYmop
IFwNCisJCSgodHlwZSAqKSBfUHlPYmplY3RfTmV3KHR5cGVvYmopKQ0KKyNkZWZpbmUgUHlP
YmplY3RfTmV3VmFyKHR5cGUsIHR5cGVvYmosIG4pIFwNCisgICAgICAgICAgICAgICAgKCh0
eXBlICopIF9QeU9iamVjdF9OZXdWYXIoKHR5cGVvYmopLCAobikpKQ0KKw0KKw0KK2V4dGVy
biBETF9JTVBPUlQoUHlPYmplY3QgKikgX1B5T2JqZWN0X0Zyb21UeXBlIFB5X1BST1RPKChQ
eVR5cGVPYmplY3QgKiwgUHlPYmplY3QgKikpOw0KK2V4dGVybiBETF9JTVBPUlQoUHlWYXJP
YmplY3QgKikgX1B5T2JqZWN0X1ZhckZyb21UeXBlIFB5X1BST1RPKChQeVR5cGVPYmplY3Qg
KiwgaW50LCBQeVZhck9iamVjdCAqKSk7DQorDQorLyogVGhlc2UgbWFjcm9zIG1heSBub3Qg
dXNlIHRoZSBzYW1lIG1hbGxvYyBhcyBQeXRob24uIFRoZXkgY2Fubm90IGJlIHVzZWQNCisg
KiBvYmplY3RzIHRoYXQgYXJlIGludm9sdmVkIGluIGdhcmJhZ2UgY29sbGVjdGlvbiAqLw0K
KyNkZWZpbmUgUHlPYmplY3RfTkVXKHR5cGUsIHR5cGVvYmopICgodHlwZSAqKSBfUHlPYmpl
Y3RfRnJvbVR5cGUodHlwZW9iaiwoUHlPYmplY3QgKiltYWxsb2MoKHR5cGVvYmopLT50cF9i
YXNpY3NpemUpKSkNCisjZGVmaW5lIFB5T2JqZWN0X05FV19WQVIodHlwZSwgdHlwZW9iaiwg
bikgKCh0eXBlICopIF9QeU9iamVjdF9WYXJGcm9tVHlwZSh0eXBlb2JqLCBuLCAoUHlWYXJP
YmplY3QgKiltYWxsb2MoKHR5cGVvYmopLT50cF9iYXNpY3NpemUgKyBuICogKHR5cGVvYmop
LT50cF9pdGVtc2l6ZSkpKQ0KIA0KICNpZmRlZiBfX2NwbHVzcGx1cw0KIH0NCi0tLSBQeXRo
b24tY3ZzL01vZHVsZXMvY1BpY2tsZS5jCUZyaSBNYXIgMjQgMjI6MzI6MjUgMjAwMA0KKysr
IFB5dGhvbi1nYy9Nb2R1bGVzL2NQaWNrbGUuYwlTYXQgQXByICA4IDAyOjEzOjExIDIwMDAN
CkBAIC0yODg2LDcgKzI4ODYsNyBAQA0KICAgICAgICAgICAgICAgUHlJbnN0YW5jZU9iamVj
dCAqaW5zdDsNCiANCiAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7DQotICAgICAgICAg
ICAgICBVTkxFU1MgKGluc3Q9UHlPYmplY3RfTkVXKFB5SW5zdGFuY2VPYmplY3QsICZQeUlu
c3RhbmNlX1R5cGUpKQ0KKyAgICAgICAgICAgICAgVU5MRVNTIChpbnN0PVB5T2JqZWN0X05l
dyhQeUluc3RhbmNlT2JqZWN0LCAmUHlJbnN0YW5jZV9UeXBlKSkNCiAgICAgICAgICAgICAg
ICAgZ290byBlcnI7DQogICAgICAgICAgICAgICBpbnN0LT5pbl9jbGFzcz0oUHlDbGFzc09i
amVjdCopY2xzOw0KICAgICAgICAgICAgICAgUHlfSU5DUkVGKGNscyk7DQpAQCAtMjg5NCw3
ICsyODk0LDkgQEANCiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGluc3QpOw0KICAgICAg
ICAgICAgICAgICBnb3RvIGVycjsNCiAgICAgICAgICAgICAgIH0NCi0NCisjaWZkZWYgV0lU
SF9DWUNMRV9HQw0KKyAgICAgICAgICAgICAgUHlHQ19JbnNlcnQoKFB5T2JqZWN0ICopaW5z
dCk7DQorI2VuZGlmDQogICAgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopaW5zdDsN
CiAgICAgICAgICAgICB9DQogICAgICAgICAgIFB5X0RFQ1JFRihfX2dldGluaXRhcmdzX18p
Ow0KLS0tIFB5dGhvbi1jdnMvTW9kdWxlcy9uZXdtb2R1bGUuYwlUdWUgRmViIDI5IDE0OjU1
OjA5IDIwMDANCisrKyBQeXRob24tZ2MvTW9kdWxlcy9uZXdtb2R1bGUuYwlTYXQgQXByICA4
IDAyOjEzOjI2IDIwMDANCkBAIC00OSwxMyArNDksMTYgQEANCiAJCQkgICAgICAmUHlDbGFz
c19UeXBlLCAma2xhc3MsDQogCQkJICAgICAgJlB5RGljdF9UeXBlLCAmZGljdCkpDQogCQly
ZXR1cm4gTlVMTDsNCi0JaW5zdCA9IFB5T2JqZWN0X05FVyhQeUluc3RhbmNlT2JqZWN0LCAm
UHlJbnN0YW5jZV9UeXBlKTsNCisJaW5zdCA9IFB5T2JqZWN0X05ldyhQeUluc3RhbmNlT2Jq
ZWN0LCAmUHlJbnN0YW5jZV9UeXBlKTsNCiAJaWYgKGluc3QgPT0gTlVMTCkNCiAJCXJldHVy
biBOVUxMOw0KIAlQeV9JTkNSRUYoa2xhc3MpOw0KIAlQeV9JTkNSRUYoZGljdCk7DQogCWlu
c3QtPmluX2NsYXNzID0gKFB5Q2xhc3NPYmplY3QgKilrbGFzczsNCiAJaW5zdC0+aW5fZGlj
dCA9IGRpY3Q7DQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJUHlHQ19JbnNlcnQoKFB5T2Jq
ZWN0ICopaW5zdCk7DQorI2VuZGlmDQogCXJldHVybiAoUHlPYmplY3QgKilpbnN0Ow0KIH0N
CiANCi0tLSBQeXRob24tY3ZzL01vZHVsZXMvZ2Ntb2R1bGUuYw0KKysrIFB5dGhvbi1nYy9N
b2R1bGVzL2djbW9kdWxlLmMJU2F0IEFwciAgOCAwMzoyNTo1NyAyMDAwDQpAQCAtMCwwICsx
LDY3NyBAQA0KKy8qDQorIA0KKyAgUmVmZXJlbmNlIEN5Y2xlIEdhcmJhZ2UgQ29sbGVjdGlv
bg0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyAgTmVpbCBT
Y2hlbWVuYXVlciA8bmFzY2hlbWVAZW5tZS51Y2FsZ2FyeS5jYT4NCisNCisgIEJhc2VkIG9u
IGEgcG9zdCBvbiB0aGUgcHl0aG9uLWRldiBsaXN0LiAgSWRlYXMgZnJvbSBHdWlkbyB2YW4g
Um9zc3VtLA0KKyAgRXJpYyBUaWVkZW1hbm4sIGFuZCB2YXJpb3VzIG90aGVycy4NCisNCisg
IGh0dHA6Ly93d3cuZW5tZS5jYWxnYXJ5LmNhL35uYXNjaGVtZS9weXRob24vZ2MuaHRtbA0K
KyAgaHR0cDovL3d3dy5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDAtTWFy
Y2gvMDAzODY5Lmh0bWwNCisgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0
aG9uLWRldi8yMDAwLU1hcmNoLzAwNDAxMC5odG1sDQorICBodHRwOi8vd3d3LnB5dGhvbi5v
cmcvcGlwZXJtYWlsL3B5dGhvbi1kZXYvMjAwMC1NYXJjaC8wMDQwMjIuaHRtbA0KKw0KKyAg
Rm9yIGEgaGlnaGxldmVsIHZpZXcgb2YgdGhlIGNvbGxlY3Rpb24gcHJvY2VzcywgcmVhZCB0
aGUgY29sbGVjdA0KKyAgZnVuY3Rpb24uDQorDQorICBUT0RPOg0KKwl1c2UgYSBkaWZmZXJl
bnQgaW50ZXJmYWNlIGZvciBzZXRfZGVidWcoKSAoa2V5d29yZHMpPw0KKwlpbmxpbmUgUHlH
Q19JbnNlcnQgYW5kIFB5R0NfUmVtb3ZlIGNhbGxzPw0KKwl0dW5lIHBhcmFtZXRlcnMNCisN
CisqLw0KKw0KKyNpbmNsdWRlICJQeXRob24uaCINCisNCisjaWZuZGVmIFdJVEhfQ1lDTEVf
R0MNCisjZXJyb3IgIllvdSBtdXN0IGRlZmluZSBXSVRIX0NZQ0xFX0dDIHRvIGluY2x1ZGUg
dGhpcyBtb2R1bGUiDQorI2VuZGlmDQorDQorLyogbWFnaWMgZ2NfcmVmcyB2YWx1ZSAqLw0K
KyNkZWZpbmUgR0NfTU9WRUQgLTENCisNCisNCisvKioqIEdsb2JhbCBHQyBzdGF0ZSAqKiov
DQorDQorLyogbGlua2VkIGxpc3RzIG9mIGNvbnRhaW5lciBvYmplY3RzICovDQorc3RhdGlj
IFB5R0NJbmZvIGdlbmVyYXRpb24wID0geyZnZW5lcmF0aW9uMCwgJmdlbmVyYXRpb24wLCAw
fTsNCitzdGF0aWMgUHlHQ0luZm8gZ2VuZXJhdGlvbjEgPSB7JmdlbmVyYXRpb24xLCAmZ2Vu
ZXJhdGlvbjEsIDB9Ow0KK3N0YXRpYyBQeUdDSW5mbyBnZW5lcmF0aW9uMiA9IHsmZ2VuZXJh
dGlvbjIsICZnZW5lcmF0aW9uMiwgMH07DQorc3RhdGljIGludCBnZW5lcmF0aW9uID0gMDsg
LyogY3VycmVudCBnZW5lcmF0aW9uIGJlaW5nIGNvbGxlY3RlZCAqLw0KKw0KKy8qIGNvbGxl
Y3Rpb24gZnJlcXVlbmNpZXMsIFhYWCB0dW5lIHRoZXNlICovDQorc3RhdGljIGludCB0aHJl
c2hvbGQwID0gMTAwOyAvKiBuZXQgbmV3IGNvbnRhaW5lcnMgYmVmb3JlIGNvbGxlY3Rpb24g
Ki8NCitzdGF0aWMgaW50IHRocmVzaG9sZDEgPSAxMDsgIC8qIGdlbmVyYXRpb24wIGNvbGxl
Y3Rpb25zIGJlZm9yZSBjb2xsZWN0aW5nIDEgKi8NCitzdGF0aWMgaW50IHRocmVzaG9sZDIg
PSAxMDsgIC8qIGdlbmVyYXRpb24xIGNvbGxlY3Rpb25zIGJlZm9yZSBjb2xsZWN0aW5nIDIg
Ki8NCisNCisvKiBuZXQgbmV3IG9iamVjdHMgYWxsb2NhdGVkIHNpbmNlIGxhc3QgY29sbGVj
dGlvbiAqLw0KK3N0YXRpYyBpbnQgYWxsb2NhdGVkID0gMDsNCisNCisvKiBzZXQgZm9yIGRl
YnVnZ2luZyBpbmZvcm1hdGlvbiAqLw0KKyNkZWZpbmUgREVCVUdfU1RBVFMJCSgxPDwwKSAv
KiBwcmludCBjb2xsZWN0aW9uIHN0YXRpc3RpY3MgKi8NCisjZGVmaW5lIERFQlVHX0NPTExF
Q1RBQkxFCSgxPDwxKSAvKiBwcmludCBjb2xsZWN0YWJsZSBvYmplY3RzICovDQorI2RlZmlu
ZSBERUJVR19VTkNPTExFQ1RBQkxFCSgxPDwyKSAvKiBwcmludCB1bmNvbGxlY3RhYmxlIG9i
amVjdHMgKi8NCisjZGVmaW5lIERFQlVHX0lOU1RBTkNFUwkJKDE8PDMpIC8qIHByaW50IGlu
c3RhbmNlcyAqLw0KKyNkZWZpbmUgREVCVUdfT0JKRUNUUwkJKDE8PDQpIC8qIHByaW50IG90
aGVyIG9iamVjdHMgKi8NCisjZGVmaW5lIERFQlVHX0xFQUsJCURFQlVHX0NPTExFQ1RBQkxF
IHwgXA0KKwkJCQlERUJVR19VTkNPTExFQ1RBQkxFIHwgXA0KKwkJCQlERUJVR19JTlNUQU5D
RVMgfCBcDQorCQkJCURFQlVHX09CSkVDVFMNCitzdGF0aWMgaW50IGRlYnVnID0gREVCVUdf
TEVBSzsNCisNCisvKiBsaXN0IG9mIHVuY29sbGVjdGFibGUgb2JqZWN0cyAqLw0KK3N0YXRp
YyBQeU9iamVjdCAqZ2FyYmFnZSA9IE5VTEw7DQorDQorDQorLyoqKiBsaXN0IGZ1bmN0aW9u
cyAoc2hvdWxkIHByb2JhYmx5IGJlIG1hY3Jvcywgc3R1cGlkIGNvbXBpbGVycykgKioqLw0K
Kw0KK3N0YXRpYyB2b2lkDQorTElTVF9JTklUKFB5R0NJbmZvICpsaXN0KQ0KK3sNCisJbGlz
dC0+Z2NfcHJldiA9IGxpc3Q7DQorCWxpc3QtPmdjX25leHQgPSBsaXN0Ow0KK30NCisNCitz
dGF0aWMgdm9pZA0KK0xJU1RfQVBQRU5EKFB5R0NJbmZvICpub2RlLCBQeUdDSW5mbyAqbGlz
dCkNCit7DQorCW5vZGUtPmdjX25leHQgPSBsaXN0Ow0KKwlub2RlLT5nY19wcmV2ID0gbGlz
dC0+Z2NfcHJldjsNCisJbm9kZS0+Z2NfcHJldi0+Z2NfbmV4dCA9IG5vZGU7DQorCWxpc3Qt
PmdjX3ByZXYgPSBub2RlOw0KK30NCisNCitzdGF0aWMgdm9pZA0KK0xJU1RfUkVNT1ZFKFB5
R0NJbmZvICpub2RlKQ0KK3sNCisJbm9kZS0+Z2NfcHJldi0+Z2NfbmV4dCA9IG5vZGUtPmdj
X25leHQ7DQorCW5vZGUtPmdjX25leHQtPmdjX3ByZXYgPSBub2RlLT5nY19wcmV2Ow0KK30N
CisNCitzdGF0aWMgdm9pZCANCitMSVNUX01PVkUoUHlHQ0luZm8gKmZyb20sIFB5R0NJbmZv
ICp0bykNCit7DQorCWlmIChmcm9tLT5nY19uZXh0ID09IGZyb20pIHsNCisJCS8qIGVtcHR5
IGZyb20gbGlzdCAqLw0KKwkJTElTVF9JTklUKHRvKTsNCisJfSBlbHNlIHsNCisJCXRvLT5n
Y19uZXh0ID0gZnJvbS0+Z2NfbmV4dDsNCisJCXRvLT5nY19uZXh0LT5nY19wcmV2ID0gdG87
DQorCQl0by0+Z2NfcHJldiA9IGZyb20tPmdjX3ByZXY7DQorCQl0by0+Z2NfcHJldi0+Z2Nf
bmV4dCA9IHRvOw0KKwl9DQorCUxJU1RfSU5JVChmcm9tKTsNCit9DQorDQorLyogYXBwZW5k
IGEgbGlzdCBvbnRvIGFub3RoZXIgbGlzdCAqLw0KK3N0YXRpYyB2b2lkDQorTElTVF9MQVBQ
RU5EKFB5R0NJbmZvICpmcm9tLCBQeUdDSW5mbyAqdG8pDQorew0KKwlQeUdDSW5mbyAqdGFp
bDsNCisJaWYgKGZyb20tPmdjX25leHQgIT0gZnJvbSkgew0KKwkJdGFpbCA9IHRvLT5nY19w
cmV2Ow0KKwkJdGFpbC0+Z2NfbmV4dCA9IGZyb20tPmdjX25leHQ7DQorCQl0YWlsLT5nY19u
ZXh0LT5nY19wcmV2ID0gdGFpbDsNCisJCXRvLT5nY19wcmV2ID0gZnJvbS0+Z2NfcHJldjsN
CisJCXRvLT5nY19wcmV2LT5nY19uZXh0ID0gdG87DQorCX0NCisJTElTVF9JTklUKGZyb20p
Ow0KK30NCisNCitzdGF0aWMgbG9uZw0KK0xJU1RfU0laRShQeUdDSW5mbyAqbGlzdCkNCit7
DQorCVB5R0NJbmZvICpnYzsNCisJbG9uZyBuID0gMDsNCisJZm9yIChnYyA9IGxpc3QtPmdj
X25leHQ7IGdjICE9IGxpc3Q7IGdjID0gZ2MtPmdjX25leHQpIHsNCisJCW4rKzsNCisJfQ0K
KwlyZXR1cm4gbjsNCit9DQorDQorDQorI2lmZGVmIERFQlVHDQorc3RhdGljIHZvaWQNCits
aXN0X3ByaW50KFB5R0NJbmZvICpsaXN0KSB7DQorCVB5R0NJbmZvICpvcCA9IGxpc3Q7DQor
CWRvIHsNCisJCXByaW50ZigiJXggJXggJXggJWRcbiIsIChsb25nKW9wLCAobG9uZylvcC0+
Z2NfcHJldiwgDQorCQkJCShsb25nKW9wLT5nY19uZXh0LCAobG9uZylvcC0+Z2NfcmVmcyk7
DQorDQorCQlvcCA9IG9wLT5nY19uZXh0Ow0KKwl9IHdoaWxlIChvcCAhPSBsaXN0KTsNCit9
DQorI2VuZGlmDQorDQorLyoqKiBlbmQgb2YgbGlzdCBzdHVmZiAqKiovDQorDQorDQorLyog
U2V0IGFsbCBnY19yZWZzID0gb2JfcmVmY250ICovDQorc3RhdGljIHZvaWQNCit1cGRhdGVf
cmVmcyhQeUdDSW5mbyAqY29udGFpbmVycykNCit7DQorCVB5R0NJbmZvICpnYyA9IGNvbnRh
aW5lcnMtPmdjX25leHQ7DQorCWZvciAoOyBnYyAhPSBjb250YWluZXJzOyBnYz1nYy0+Z2Nf
bmV4dCkgew0KKwkJZ2MtPmdjX3JlZnMgPSBQWV9HQ09CSihnYyktPm9iX3JlZmNudDsNCisJ
fQ0KK30NCisNCitzdGF0aWMgaW50DQordmlzaXRfZGVjcmVmKFB5T2JqZWN0ICpvcCwgdm9p
ZCAqZGF0YSkNCit7DQorCWlmIChvcCAmJiBQWV9JU0dDKG9wKSkgew0KKwkJUFlfR0NJTkZP
X1VOU0FGRShvcCktPmdjX3JlZnMtLTsNCisJfQ0KKwlyZXR1cm4gMTsNCit9DQorDQorLyog
U3VidHJhY3QgaW50ZXJuYWwgcmVmZXJlbmNlcyBmcm9tIGdjX3JlZnMgKi8NCitzdGF0aWMg
dm9pZA0KK3N1YnRyYWN0X3JlZnMoUHlHQ0luZm8gKmNvbnRhaW5lcnMpDQorew0KKwlyZWN1
cnNlcHJvYyByZWN1cnNlOw0KKwlQeUdDSW5mbyAqZ2MgPSBjb250YWluZXJzLT5nY19uZXh0
Ow0KKwlmb3IgKDsgZ2MgIT0gY29udGFpbmVyczsgZ2M9Z2MtPmdjX25leHQpIHsNCisJCXJl
Y3Vyc2UgPSBQWV9HQ09CSihnYyktPm9iX3R5cGUtPnRwX3JlY3Vyc2U7DQorCQkodm9pZCkg
cmVjdXJzZShQWV9HQ09CSihnYyksDQorCQkJICAgICAgICh2aXNpdHByb2MpdmlzaXRfZGVj
cmVmLA0KKwkJCSAgICAgICBOVUxMKTsNCisJfQ0KK30NCisNCisvKiBBcHBlbmQgb2JqZWN0
cyB3aXRoIGdjX3JlZnMgPiAwIHRvIHJvb3RzIGxpc3QgKi8NCitzdGF0aWMgdm9pZA0KK21v
dmVfcm9vdHMoUHlHQ0luZm8gKmNvbnRhaW5lcnMsIFB5R0NJbmZvICpyb290cykNCit7DQor
CVB5R0NJbmZvICpuZXh0Ow0KKwlQeUdDSW5mbyAqZ2MgPSBjb250YWluZXJzLT5nY19uZXh0
Ow0KKwl3aGlsZSAoZ2MgIT0gY29udGFpbmVycykgew0KKwkJbmV4dCA9IGdjLT5nY19uZXh0
Ow0KKwkJaWYgKGdjLT5nY19yZWZzID4gMCkgew0KKwkJCUxJU1RfUkVNT1ZFKGdjKTsNCisJ
CQlMSVNUX0FQUEVORChnYywgcm9vdHMpOw0KKwkJCWdjLT5nY19yZWZzID0gR0NfTU9WRUQ7
DQorCQl9DQorCQlnYyA9IG5leHQ7DQorCX0NCit9DQorDQorc3RhdGljIGludA0KK3Zpc2l0
X3JlYWNoYWJsZShQeU9iamVjdCAqb3AsIFB5R0NJbmZvICpyb290cykNCit7DQorCVB5R0NJ
bmZvICpnYyA9IFBZX0dDSU5GTyhvcCk7DQorCWlmIChnYyAmJiBnYy0+Z2NfcmVmcyAhPSBH
Q19NT1ZFRCkgew0KKwkJTElTVF9SRU1PVkUoZ2MpOw0KKwkJTElTVF9BUFBFTkQoZ2MsIHJv
b3RzKTsNCisJCWdjLT5nY19yZWZzID0gR0NfTU9WRUQ7DQorCX0NCisJcmV0dXJuIDE7DQor
fQ0KKw0KKy8qIE1vdmUgb2JqZWN0cyByZWZlcmVuY2VkIGZyb20gcmVhY2hhYmxlIHRvIHJl
YWNoYWJsZSBzZXQuICovDQorc3RhdGljIHZvaWQNCittb3ZlX3Jvb3RfcmVhY2hhYmxlKFB5
R0NJbmZvICpyZWFjaGFibGUpDQorew0KKwlyZWN1cnNlcHJvYyByZWN1cnNlOw0KKwlQeUdD
SW5mbyAqZ2MgPSByZWFjaGFibGUtPmdjX25leHQ7DQorCWZvciAoOyBnYyAhPSByZWFjaGFi
bGU7IGdjPWdjLT5nY19uZXh0KSB7DQorCQkvKiBjYXJlZnVsLCByZWFjaGFibGUgbGlzdCBp
cyBncm93aW5nIGhlcmUgKi8NCisJCVB5T2JqZWN0ICpvcCA9IFBZX0dDT0JKKGdjKTsNCisJ
CXJlY3Vyc2UgPSBvcC0+b2JfdHlwZS0+dHBfcmVjdXJzZTsNCisJCSh2b2lkKSByZWN1cnNl
KG9wLA0KKwkJCSAgICAgICAodmlzaXRwcm9jKXZpc2l0X3JlYWNoYWJsZSwNCisJCQkgICAg
ICAgKHZvaWQgKilyZWFjaGFibGUpOw0KKwl9DQorfQ0KKw0KKy8qIG1vdmUgYWxsIG9iamVj
dHMgd2l0aCBmaW5hbGl6ZXJzIChpbnN0YW5jZXMgd2l0aCBfX2RlbF9fKSAqLw0KK3N0YXRp
YyB2b2lkDQorbW92ZV9maW5hbGl6ZXJzKFB5R0NJbmZvICp1bnJlYWNoYWJsZSwgUHlHQ0lu
Zm8gKmZpbmFsaXplcnMpDQorew0KKwlQeUdDSW5mbyAqbmV4dDsNCisJUHlHQ0luZm8gKmdj
ID0gdW5yZWFjaGFibGUtPmdjX25leHQ7DQorCXN0YXRpYyBQeU9iamVjdCAqZGVsc3RyOw0K
KwlpZiAoZGVsc3RyID09IE5VTEwpIHsNCisJCWRlbHN0ciA9IFB5U3RyaW5nX0ludGVybkZy
b21TdHJpbmcoIl9fZGVsX18iKTsNCisJfQ0KKwlmb3IgKDsgZ2MgIT0gdW5yZWFjaGFibGU7
IGdjPW5leHQpIHsNCisJCVB5T2JqZWN0ICpvcCA9IFBZX0dDT0JKKGdjKTsNCisJCW5leHQg
PSBnYy0+Z2NfbmV4dDsNCisJCWlmIChQeUluc3RhbmNlX0NoZWNrKG9wKSAmJiBQeU9iamVj
dF9IYXNBdHRyKG9wLCBkZWxzdHIpKSB7DQorCQkJTElTVF9SRU1PVkUoZ2MpOw0KKwkJCUxJ
U1RfQVBQRU5EKGdjLCBmaW5hbGl6ZXJzKTsNCisJCX0NCisJfQ0KK30NCisNCisNCisvKiBj
YWxsZWQgYnkgdHBfcmVjdXJzZSAqLw0KK3N0YXRpYyBpbnQNCit2aXNpdF9maW5hbGl6ZXJf
cmVhY2hhYmxlKFB5T2JqZWN0ICpvcCwgUHlHQ0luZm8gKmZpbmFsaXplcnMpDQorew0KKwlQ
eUdDSW5mbyAqZ2MgPSBQWV9HQ0lORk8ob3ApOw0KKwlpZiAoZ2MgJiYgZ2MtPmdjX3JlZnMg
IT0gR0NfTU9WRUQpIHsNCisJCUxJU1RfUkVNT1ZFKGdjKTsNCisJCUxJU1RfQVBQRU5EKGdj
LCBmaW5hbGl6ZXJzKTsNCisJCWdjLT5nY19yZWZzID0gR0NfTU9WRUQ7DQorCX0NCisJcmV0
dXJuIDE7DQorfQ0KKw0KKy8qIE1vdmUgb2JqZWN0cyByZWZlcmVuY2VkIGZyb20gcm9vdHMg
dG8gcm9vdHMgKi8NCitzdGF0aWMgdm9pZA0KK21vdmVfZmluYWxpemVyX3JlYWNoYWJsZShQ
eUdDSW5mbyAqZmluYWxpemVycykNCit7DQorCXJlY3Vyc2Vwcm9jIHJlY3Vyc2U7DQorCVB5
R0NJbmZvICpnYyA9IGZpbmFsaXplcnMtPmdjX25leHQ7DQorCWZvciAoOyBnYyAhPSBmaW5h
bGl6ZXJzOyBnYz1nYy0+Z2NfbmV4dCkgew0KKwkJLyogY2FyZWZ1bCwgZmluYWxpemVycyBs
aXN0IGlzIGdyb3dpbmcgaGVyZSAqLw0KKwkJcmVjdXJzZSA9IFBZX0dDT0JKKGdjKS0+b2Jf
dHlwZS0+dHBfcmVjdXJzZTsNCisJCSh2b2lkKSByZWN1cnNlKFBZX0dDT0JKKGdjKSwgDQor
CQkJICAgICAgICh2aXNpdHByb2MpdmlzaXRfZmluYWxpemVyX3JlYWNoYWJsZSwNCisJCQkg
ICAgICAgKHZvaWQgKilmaW5hbGl6ZXJzKTsNCisJfQ0KK30NCisNCitzdGF0aWMgdm9pZA0K
K2RlYnVnX2luc3RhbmNlKFB5T2JqZWN0ICpvdXRwdXQsIGNoYXIgKm1zZywgUHlJbnN0YW5j
ZU9iamVjdCAqaW5zdCkNCit7DQorCWNoYXIgYnVmWzIwMF07DQorCWNoYXIgKmNuYW1lOw0K
KwkvKiBiZSBjYXJlZnVsIG5vdCB0byBjcmVhdGUgbmV3IGRpY3Rpb25hcmllcyAqLw0KKwlQ
eU9iamVjdCAqY2xhc3NuYW1lID0gaW5zdC0+aW5fY2xhc3MtPmNsX25hbWU7DQorCWlmIChj
bGFzc25hbWUgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhjbGFzc25hbWUpKQ0KKwkJY25h
bWUgPSBQeVN0cmluZ19Bc1N0cmluZyhjbGFzc25hbWUpOw0KKwllbHNlDQorCQljbmFtZSA9
ICI/IjsNCisJc3ByaW50ZihidWYsICJnYzogJXM8JS4xMDBzIGluc3RhbmNlIGF0ICVseD5c
biIsIA0KKwkJCW1zZywgY25hbWUsIChsb25nKWluc3QpOw0KKwlQeUZpbGVfV3JpdGVTdHJp
bmcoYnVmLCBvdXRwdXQpOw0KK30NCisNCitzdGF0aWMgdm9pZA0KK2RlYnVnX2N5Y2xlKFB5
T2JqZWN0ICpvdXRwdXQsIGNoYXIgKm1zZywgUHlPYmplY3QgKm9wKQ0KK3sNCisJaWYgKChk
ZWJ1ZyAmIERFQlVHX0lOU1RBTkNFUykgJiYgUHlJbnN0YW5jZV9DaGVjayhvcCkpIHsNCisJ
CWRlYnVnX2luc3RhbmNlKG91dHB1dCwgbXNnLCAoUHlJbnN0YW5jZU9iamVjdCAqKW9wKTsN
CisJfSBlbHNlIGlmIChkZWJ1ZyAmIERFQlVHX09CSkVDVFMpIHsNCisJCWNoYXIgYnVmWzIw
MF07DQorCQlzcHJpbnRmKGJ1ZiwgImdjOiAlczxPYmplY3QgMHgleD5cbiIsIG1zZywgKGxv
bmcpb3ApOw0KKwkJUHlGaWxlX1dyaXRlU3RyaW5nKGJ1Ziwgb3V0cHV0KTsNCisJfQ0KK30N
CisNCisvKiBIYW5kbGUgdW5jb2xsZWN0YWJsZSBnYXJiYWdlIChjeWNsZXMgd2l0aCBmaW5h
bGl6ZXJzKS4gKi8NCitzdGF0aWMgdm9pZA0KK2hhbmRsZV9maW5hbGl6ZXJzKFB5R0NJbmZv
ICpmaW5hbGl6ZXJzLCBQeUdDSW5mbyAqb2xkKQ0KK3sNCisJUHlHQ0luZm8gKmdjOw0KKwlp
ZiAoZ2FyYmFnZSA9PSBOVUxMKSB7DQorCQlnYXJiYWdlID0gUHlMaXN0X05ldygwKTsNCisJ
fQ0KKwlmb3IgKGdjID0gZmluYWxpemVycy0+Z2NfbmV4dDsgZ2MgIT0gZmluYWxpemVyczsN
CisJCQlnYyA9IGZpbmFsaXplcnMtPmdjX25leHQpIHsNCisJCVB5T2JqZWN0ICpvcCA9IFBZ
X0dDT0JKKGdjKTsNCisJCS8qIEFkZCBhbGwgaW5zdGFuY2VzIHRvIGEgUHl0aG9uIGFjY2Vz
c2libGUgbGlzdCBvZiBnYXJiYWdlICovDQorCQlpZiAoUHlJbnN0YW5jZV9DaGVjayhvcCkp
IHsNCisJCQlQeUxpc3RfQXBwZW5kKGdhcmJhZ2UsIG9wKTsNCisJCX0NCisJCS8qIFdlIGFz
c3VtZSB0aGF0IGFsbCBvYmplY3RzIGluIGZpbmFsaXplcnMgYXJlIHJlYWNoYWJsZSBmcm9t
DQorCQkgKiBpbnN0YW5jZXMuICBPbmNlIHdlIGFkZCB0aGUgaW5zdGFuY2VzIHRvIHRoZSBn
YXJiYWdlIGxpc3QNCisJCSAqIGV2ZXJ5dGhpbmcgaXMgcmVhY2hhYmxlIGZyb20gUHl0aG9u
IGFnYWluLiAqLw0KKwkJTElTVF9SRU1PVkUoZ2MpOw0KKwkJTElTVF9BUFBFTkQoZ2MsIG9s
ZCk7DQorCX0NCit9DQorDQorLyogQnJlYWsgcmVmZXJlbmNlIGN5Y2xlcyBieSBjbGVhcmlu
ZyB0aGUgY29udGFpbmVycyBpbnZvbHZlZC4gIFRoaXMgaXMNCisgKiB0cmlja3kgYnVzaW5l
c3MgYXMgdGhlIGxpc3RzIGNhbiBiZSBjaGFuZ2luZyBhbmQgd2UgZG9uJ3Qga25vdyB3aGlj
aA0KKyAqIG9iamVjdHMgbWF5IGJlIGZyZWVkLiAgSXQgaXMgcG9zc2libGUgSSBzY3Jld2Vk
IHNvbWV0aGluZyB1cCBoZXJlLiAqLw0KK3N0YXRpYyB2b2lkDQorZGVsZXRlX2dhcmJhZ2Uo
UHlHQ0luZm8gKnVucmVhY2hhYmxlLCBQeUdDSW5mbyAqb2xkKQ0KK3sNCisJaW5xdWlyeSBj
bGVhcjsNCisNCisJd2hpbGUgKHVucmVhY2hhYmxlLT5nY19uZXh0ICE9IHVucmVhY2hhYmxl
KSB7DQorCQlQeUdDSW5mbyAqZ2MgPSB1bnJlYWNoYWJsZS0+Z2NfbmV4dDsNCisJCVB5T2Jq
ZWN0ICpvcCA9IFBZX0dDT0JKKGdjKTsNCisJCWlmICgoY2xlYXIgPSBvcC0+b2JfdHlwZS0+
dHBfY2xlYXIpICE9IE5VTEwpIHsNCisJCQlQeV9JTkNSRUYob3ApOw0KKwkJCWNsZWFyKChQ
eU9iamVjdCAqKW9wKTsNCisJCQlQeV9ERUNSRUYob3ApOw0KKwkJfQ0KKwkJLyogb25seSB0
cnkgdG8gY2FsbCB0cF9jbGVhciBvbmNlIGZvciBlYWNoIG9iamVjdCAqLw0KKwkJaWYgKHVu
cmVhY2hhYmxlLT5nY19uZXh0ID09IGdjKSB7DQorCQkJLyogc3RpbGwgYWxpdmUsIG1vdmUg
aXQsIGl0IG1heSBkaWUgbGF0ZXIgKi8NCisJCQlMSVNUX1JFTU9WRShnYyk7DQorCQkJTElT
VF9BUFBFTkQoZ2MsIG9sZCk7DQorCQl9DQorCX0NCit9DQorDQorLyogVGhpcyBpcyB0aGUg
bWFpbiBmdW5jdGlvbi4gIFJlYWQgdGhpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGUNCisgKiBj
b2xsZWN0aW9uIHByb2Nlc3Mgd29ya3MuICovDQorc3RhdGljIGxvbmcNCitjb2xsZWN0KFB5
R0NJbmZvICp5b3VuZywgUHlHQ0luZm8gKm9sZCkNCit7DQorCWxvbmcgbiA9IDA7DQorCWxv
bmcgbSA9IDA7DQorCVB5R0NJbmZvIHJlYWNoYWJsZTsNCisJUHlHQ0luZm8gdW5yZWFjaGFi
bGU7DQorCVB5R0NJbmZvIGZpbmFsaXplcnM7DQorCVB5R0NJbmZvICpnYzsNCisJUHlPYmpl
Y3QgKm91dHB1dCA9IE5VTEw7DQorDQorCWlmIChkZWJ1Zykgew0KKwkJb3V0cHV0ID0gUHlT
eXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsNCisJfQ0KKwlpZiAoZGVidWcgJiBERUJVR19TVEFU
Uykgew0KKwkJY2hhciBidWZbMTAwXTsNCisJCXNwcmludGYoYnVmLCAiZ2M6IGNvbGxlY3Rp
bmcgZ2VuZXJhdGlvbiAlZC4uLlxuIiwgZ2VuZXJhdGlvbik7DQorCQlQeUZpbGVfV3JpdGVT
dHJpbmcoYnVmLG91dHB1dCk7DQorCQlzcHJpbnRmKGJ1ZiwgImdjOiBvYmplY3RzIGluIGVh
Y2ggZ2VuZXJhdGlvbjogJWQgJWQgJWRcbiIsDQorCQkJTElTVF9TSVpFKCZnZW5lcmF0aW9u
MCksDQorCQkJTElTVF9TSVpFKCZnZW5lcmF0aW9uMSksDQorCQkJTElTVF9TSVpFKCZnZW5l
cmF0aW9uMikpOw0KKwkJUHlGaWxlX1dyaXRlU3RyaW5nKGJ1ZixvdXRwdXQpOw0KKwl9DQor
DQorCS8qIFVzaW5nIG9iX3JlZmNudCBhbmQgZ2NfcmVmcywgY2FsY3VsYXRlIHdoaWNoIG9i
amVjdHMgaW4gdGhlDQorCSAqIGNvbnRhaW5lciBzZXQgYXJlIHJlYWNoYWJsZSBmcm9tIG91
dHNpZGUgdGhlIHNldCAoaWUuIGhhdmUgYQ0KKwkgKiByZWZjb3VudCBncmVhdGVyIHRoYW4g
MCB3aGVuIGFsbCB0aGUgcmVmZXJlbmNlcyB3aXRoaW4gdGhlDQorCSAqIHNldCBhcmUgdGFr
ZW4gaW50byBhY2NvdW50ICovDQorCXVwZGF0ZV9yZWZzKHlvdW5nKTsNCisJc3VidHJhY3Rf
cmVmcyh5b3VuZyk7DQorDQorCS8qIE1vdmUgZXZlcnl0aGluZyByZWFjaGFibGUgZnJvbSBv
dXRzaWRlIHRoZSBzZXQgaW50byB0aGUNCisJICogcmVhY2hhYmxlIHNldCAoaWUuIGdjX3Jl
ZnMgPiAwKS4gIE5leHQsIG1vdmUgZXZlcnl0aGluZw0KKwkgKiByZWFjaGFibGUgZnJvbSBv
YmplY3RzIGluIHRoZSByZWFjaGFibGUgc2V0LiAqLw0KKwlMSVNUX0lOSVQoJnJlYWNoYWJs
ZSk7DQorCW1vdmVfcm9vdHMoeW91bmcsICZyZWFjaGFibGUpOw0KKwltb3ZlX3Jvb3RfcmVh
Y2hhYmxlKCZyZWFjaGFibGUpOw0KKw0KKwkvKiBtb3ZlIHVucmVhY2hhYmxlIG9iamVjdHMg
dG8gYSB0ZW1wb3JhcnkgbGlzdCwgbmV3IG9iamVjdHMgY2FuIGJlDQorCSAqIGFsbG9jYXRl
ZCBhZnRlciB0aGlzIHBvaW50ICovDQorCUxJU1RfSU5JVCgmdW5yZWFjaGFibGUpOw0KKwlM
SVNUX01PVkUoeW91bmcsICZ1bnJlYWNoYWJsZSk7DQorCS8vTElTVF9JTklUKHlvdW5nKTsN
CisNCisJLyogbW92ZSByZWFjaGFibGUgb2JqZWN0cyB0byBuZXh0IGdlbmVyYXRpb24gKi8N
CisJTElTVF9MQVBQRU5EKCZyZWFjaGFibGUsIG9sZCk7DQorDQorCS8qIE1vdmUgb2JqZWN0
cyByZWFjaGFibGUgZnJvbSBmaW5hbGl6ZXJzLCB3ZSBjYW4ndCBzYWZlbHkgZGVsZXRlDQor
CSAqIHRoZW0uICBQeXRob24gcHJvZ3JhbW1lcnMgc2hvdWxkIHRha2UgY2FyZSBub3QgdG8g
Y3JlYXRlIHN1Y2gNCisJICogdGhpbmdzLiAgRm9yIFB5dGhvbiBmaW5hbGl6ZXJzIG1lYW5z
IGluc3RhbmNlIG9iamVjdHMgd2l0aA0KKwkgKiBfX2RlbF9fIG1ldGhvZHMuICovDQorCUxJ
U1RfSU5JVCgmZmluYWxpemVycyk7DQorCW1vdmVfZmluYWxpemVycygmdW5yZWFjaGFibGUs
ICZmaW5hbGl6ZXJzKTsNCisJbW92ZV9maW5hbGl6ZXJfcmVhY2hhYmxlKCZmaW5hbGl6ZXJz
KTsNCisNCisJLyogQ29sbGVjdCBzdGF0aXN0aWNzIG9uIGNvbGxlY3RhYmxlIG9iamVjdHMg
Zm91bmQgYW5kIHByaW50DQorCSAqIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gKi8NCisJZm9y
IChnYyA9IHVucmVhY2hhYmxlLmdjX25leHQ7IGdjICE9ICZ1bnJlYWNoYWJsZTsNCisJCQln
YyA9IGdjLT5nY19uZXh0KSB7DQorCQltKys7DQorCQlpZiAob3V0cHV0ICE9IE5VTEwgJiYg
KGRlYnVnICYgREVCVUdfQ09MTEVDVEFCTEUpKSB7DQorCQkJZGVidWdfY3ljbGUob3V0cHV0
LCAiY29sbGVjdGFibGUgIiwgUFlfR0NPQkooZ2MpKTsNCisJCX0NCisJfQ0KKwkvKiBjYWxs
IHRwX2NsZWFyIG9uIG9iamVjdHMgaW4gdGhlIGNvbGxlY3RhYmxlIHNldC4gIFRoaXMgd2ls
bCBjYXVzZQ0KKwkgKiB0aGUgcmVmZXJlbmNlIGN5Y2xlcyB0byBiZSBicm9rZW4uIEl0IG1h
eSBhbHNvIGNhdXNlIHNvbWUgb2JqZWN0cyBpbg0KKwkgKiBmaW5hbGl6ZXJzIHRvIGJlIGZy
ZWVkICovDQorCWRlbGV0ZV9nYXJiYWdlKCZ1bnJlYWNoYWJsZSwgb2xkKTsNCisNCisJLyog
Q29sbGVjdCBzdGF0aXN0aWNzIG9uIHVuY29sbGVjdGFibGUgb2JqZWN0cyBmb3VuZCBhbmQg
cHJpbnQNCisJICogZGVidWdnaW5nIGluZm9ybWF0aW9uLiAqLw0KKwlmb3IgKGdjID0gZmlu
YWxpemVycy5nY19uZXh0OyBnYyAhPSAmZmluYWxpemVyczsNCisJCQlnYyA9IGdjLT5nY19u
ZXh0KSB7DQorCQluKys7DQorCQlpZiAob3V0cHV0ICE9IE5VTEwgJiYgKGRlYnVnICYgREVC
VUdfVU5DT0xMRUNUQUJMRSkpIHsNCisJCQlkZWJ1Z19jeWNsZShvdXRwdXQsICJ1bmNvbGxl
Y3RhYmxlICIsIFBZX0dDT0JKKGdjKSk7DQorCQl9DQorCX0NCisJaWYgKG91dHB1dCAhPSBO
VUxMICYmIChkZWJ1ZyAmIERFQlVHX1NUQVRTKSkgew0KKwkJaWYgKG0gPT0gMCAmJiBuID09
IDApIHsNCisJCQlQeUZpbGVfV3JpdGVTdHJpbmcoImdjOiBkb25lLlxuIiwgb3V0cHV0KTsN
CisJCX0gZWxzZSB7DQorCQkJY2hhciBidWZbMjAwXTsNCisJCQlzcHJpbnRmKGJ1ZiwNCisJ
CQkJImdjOiBkb25lLCAlZCB1bnJlYWNoYWJsZSwgJWQgdW5jb2xsZWN0YWJsZS5cbiIsDQor
CQkJCW4rbSwgbik7DQorCQkJUHlGaWxlX1dyaXRlU3RyaW5nKGJ1Ziwgb3V0cHV0KTsNCisJ
CX0NCisJfQ0KKw0KKwkvKiBBcHBlbmQgaW5zdGFuY2VzIGluIHRoZSB1bmNvbGxlY3RhYmxl
IHNldCB0byBhIFB5dGhvbg0KKwkgKiByZWFjaGFibGUgbGlzdCBvZiBnYXJiYWdlLiAgVGhl
IHByb2dyYW1tZXIgaGFzIHRvIGRlYWwgd2l0aA0KKwkgKiB0aGlzIGlmIHRoZXkgaW5zaXN0
IG9uIGNyZWF0aW5nIHRoaXMgdHlwZSBvZiBzdHJ1Y3R1cmUuICovDQorCWhhbmRsZV9maW5h
bGl6ZXJzKCZmaW5hbGl6ZXJzLCBvbGQpOw0KKw0KKwlhbGxvY2F0ZWQgPSAwOw0KKwlQeUVy
cl9DbGVhcigpOyAvKiBpbiBjYXNlIHdyaXRpbmcgdG8gc3lzLnN0ZGVyciBmYWlsZWQgKi8N
CisJcmV0dXJuIG4rbTsNCit9DQorDQorc3RhdGljIGxvbmcNCitjb2xsZWN0X2dlbmVyYXRp
b25zKHZvaWQpDQorew0KKwlzdGF0aWMgbG9uZyBjb2xsZWN0aW9uczAgPSAwOw0KKwlzdGF0
aWMgbG9uZyBjb2xsZWN0aW9uczEgPSAwOw0KKwlsb25nIG47DQorDQorDQorCWlmIChjb2xs
ZWN0aW9uczEgPiB0aHJlc2hvbGQyKSB7DQorCQlnZW5lcmF0aW9uID0gMjsNCisJCUxJU1Rf
TEFQUEVORCgmZ2VuZXJhdGlvbjAsICZnZW5lcmF0aW9uMik7DQorCQlMSVNUX0xBUFBFTkQo
JmdlbmVyYXRpb24xLCAmZ2VuZXJhdGlvbjIpOw0KKwkJaWYgKGdlbmVyYXRpb24yLmdjX25l
eHQgIT0gJmdlbmVyYXRpb24yKSB7DQorCQkJbiA9IGNvbGxlY3QoJmdlbmVyYXRpb24yLCAm
Z2VuZXJhdGlvbjIpOw0KKwkJfQ0KKwkJY29sbGVjdGlvbnMxID0gMDsNCisJfSBlbHNlIGlm
IChjb2xsZWN0aW9uczAgPiB0aHJlc2hvbGQxKSB7DQorCQlnZW5lcmF0aW9uID0gMTsNCisJ
CWNvbGxlY3Rpb25zMSsrOw0KKwkJTElTVF9MQVBQRU5EKCZnZW5lcmF0aW9uMCwgJmdlbmVy
YXRpb24xKTsNCisJCWlmIChnZW5lcmF0aW9uMS5nY19uZXh0ICE9ICZnZW5lcmF0aW9uMSkg
ew0KKwkJCW4gPSBjb2xsZWN0KCZnZW5lcmF0aW9uMSwgJmdlbmVyYXRpb24yKTsNCisJCX0N
CisJCWNvbGxlY3Rpb25zMCA9IDA7DQorCX0gZWxzZSB7DQorCQlnZW5lcmF0aW9uID0gMDsN
CisJCWNvbGxlY3Rpb25zMCsrOw0KKwkJaWYgKGdlbmVyYXRpb24wLmdjX25leHQgIT0gJmdl
bmVyYXRpb24wKSB7DQorCQkJbiA9IGNvbGxlY3QoJmdlbmVyYXRpb24wLCAmZ2VuZXJhdGlv
bjEpOw0KKwkJfQ0KKwl9DQorCXJldHVybiBuOw0KK30NCisNCit2b2lkDQorUHlHQ19JbnNl
cnQoUHlPYmplY3QgKm9wKQ0KK3sNCisJLyogY29sbGVjdGlvbiBsb2NrIHNpbmNlIGNvbGxl
Y3RpbmcgbWF5IGNhdXNlIGFsbG9jYXRpb25zICovDQorCXN0YXRpYyBpbnQgY29sbGVjdGlu
ZyA9IDA7DQorDQorI2lmZGVmIERFQlVHDQorCS8qZnByaW50ZihzdGRlcnIsICJJbnNlcnQg
MHgleFxuIiwgb3ApOyovDQorI2VuZGlmDQorCWlmICh0aHJlc2hvbGQwICYmIGFsbG9jYXRl
ZCA+IHRocmVzaG9sZDAgJiYgIWNvbGxlY3RpbmcpIHsNCisJCWNvbGxlY3RpbmcrKzsNCisJ
CWNvbGxlY3RfZ2VuZXJhdGlvbnMoKTsNCisJCWNvbGxlY3RpbmctLTsNCisJfQ0KKwlhbGxv
Y2F0ZWQrKzsNCisJTElTVF9BUFBFTkQoUFlfR0NJTkZPKG9wKSwgJmdlbmVyYXRpb24wKTsN
Cit9DQorDQordm9pZA0KK1B5R0NfUmVtb3ZlKFB5T2JqZWN0ICpvcCkNCit7DQorI2lmZGVm
IERFQlVHDQorCS8qZnByaW50ZihzdGRlcnIsICJSZW1vdmUgMHgleFxuIiwgb3ApOyovDQor
I2VuZGlmDQorCWlmIChhbGxvY2F0ZWQgPiAwKSB7DQorCQlhbGxvY2F0ZWQtLTsNCisJfQ0K
KwlMSVNUX1JFTU9WRShQWV9HQ0lORk8ob3ApKTsNCit9DQorDQorDQorc3RhdGljIGNoYXIg
Y29sbGVjdF9fZG9jX19bXSA9DQorImNvbGxlY3QoKSAtPiBuXG4iDQorIlxuIg0KKyJSdW4g
YSBmdWxsIGNvbGxlY3Rpb24uICBUaGUgbnVtYmVyIG9mIHVucmVhY2hhYmxlIG9iamVjdHMg
aXMgcmV0dXJuZWQuXG4iDQorOw0KKw0KK3N0YXRpYyBQeU9iamVjdCAqDQorUHlfY29sbGVj
dChzZWxmLCBhcmdzKQ0KKwlQeU9iamVjdCAqc2VsZjsNCisJUHlPYmplY3QgKmFyZ3M7DQor
ew0KKwlsb25nIG47DQorDQorCWlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkJLyog
Y2hlY2sgbm8gYXJncyAqLw0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWdlbmVyYXRpb24gPSAy
Ow0KKwlMSVNUX0xBUFBFTkQoJmdlbmVyYXRpb24wLCAmZ2VuZXJhdGlvbjIpOw0KKwlMSVNU
X0xBUFBFTkQoJmdlbmVyYXRpb24xLCAmZ2VuZXJhdGlvbjIpOw0KKwluID0gY29sbGVjdCgm
Z2VuZXJhdGlvbjIsICZnZW5lcmF0aW9uMik7DQorDQorCXJldHVybiBQeV9CdWlsZFZhbHVl
KCJpIiwgbik7DQorfQ0KKw0KK3N0YXRpYyBjaGFyIHNldF9kZWJ1Z19fZG9jX19bXSA9IA0K
KyJzZXRfZGVidWcoZmxhZ3MpIC0+IE5vbmVcbiINCisiXG4iDQorIlNldCB0aGUgZ2FyYmFn
ZSBjb2xsZWN0aW9uIGRlYnVnZ2luZyBmbGFncy4gRGVidWdnaW5nIGluZm9ybWF0aW9uIGlz
XG4iDQorIndyaXR0ZW4gdG8gc3lzLnN0ZGVyci5cbiINCisiXG4iDQorImZsYWdzIGlzIGFu
IGludGVnZXIgYW5kIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgYml0cyB0dXJuZWQgb246XG4i
DQorIlxuIg0KKyIgIERFQlVHX1NUQVRTIC0gUHJpbnQgc3RhdGlzdGljcyBkdXJpbmcgY29s
bGVjdGlvbi5cbiINCisiICBERUJVR19DT0xMRUNUQUJMRSAtIFByaW50IGNvbGxlY3RhYmxl
IG9iamVjdHMgZm91bmQuXG4iDQorIiAgREVCVUdfVU5DT0xMRUNUQUJMRSAtIFByaW50IHVu
cmVhY2hhYmxlIGJ1dCB1bmNvbGxlY3RhYmxlIG9iamVjdHMgZm91bmQuXG4iDQorIiAgREVC
VUdfSU5TVEFOQ0VTIC0gUHJpbnQgaW5zdGFuY2Ugb2JqZWN0cy5cbiINCisiICBERUJVR19P
QkpFQ1RTIC0gUHJpbnQgb2JqZWN0cyBvdGhlciB0aGFuIGluc3RhbmNlcy5cbiINCisiICBE
RUJVR19MRUFLIC0gRGVidWcgbGVha2luZyBwcm9ncmFtcyAoZXZlcnl0aGluZyBidXQgU1RB
VFMpLlxuIg0KKzsNCisNCitzdGF0aWMgUHlPYmplY3QgKg0KK1B5X3NldF9kZWJ1ZyhzZWxm
LCBhcmdzKQ0KKwlQeU9iamVjdCAqc2VsZjsNCisJUHlPYmplY3QgKmFyZ3M7DQorew0KKwlp
ZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmZGVidWcpKQ0KKwkJcmV0dXJuIE5V
TEw7DQorDQorCVB5X0lOQ1JFRihQeV9Ob25lKTsNCisJcmV0dXJuIFB5X05vbmU7DQorfQ0K
Kw0KK3N0YXRpYyBjaGFyIGdldF9kZWJ1Z19fZG9jX19bXSA9IA0KKyJnZXRfZGVidWcoKSAt
PiBmbGFnc1xuIg0KKyJcbiINCisiR2V0IHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gZGVidWdn
aW5nIGZsYWdzLlxuIg0KKzsNCisNCitzdGF0aWMgUHlPYmplY3QgKg0KK1B5X2dldF9kZWJ1
ZyhzZWxmLCBhcmdzKQ0KKwlQeU9iamVjdCAqc2VsZjsNCisJUHlPYmplY3QgKmFyZ3M7DQor
ew0KKwlpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCS8qIG5vIGFyZ3MgKi8NCisJ
CXJldHVybiBOVUxMOw0KKw0KKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGRlYnVnKTsN
Cit9DQorDQorc3RhdGljIGNoYXIgc2V0X3RocmVzaF9fZG9jX19bXSA9DQorInNldF90aHJl
c2hvbGQodGhyZXNob2xkMCwgW3RocmVob2xkMSwgdGhyZXNob2xkMl0pIC0+IE5vbmVcbiIN
CisiXG4iDQorIlNldHMgdGhlIGNvbGxlY3Rpb24gdGhyZXNob2xkcy4gIFNldHRpbmcgdGhy
ZXNob2xkMCB0byB6ZXJvIGRpc2FibGVzXG4iDQorImNvbGxlY3Rpb24uXG4iDQorOw0KKw0K
K3N0YXRpYyBQeU9iamVjdCAqDQorUHlfc2V0X3RocmVzaChzZWxmLCBhcmdzKQ0KKwlQeU9i
amVjdCAqc2VsZjsNCisJUHlPYmplY3QgKmFyZ3M7DQorew0KKwlpZiAoIVB5QXJnX1BhcnNl
VHVwbGUoYXJncywgIml8aWkiLCAmdGhyZXNob2xkMCwgDQorCQkJCSZ0aHJlc2hvbGQxLCAm
dGhyZXNob2xkMikpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJUHlfSU5DUkVGKFB5X05vbmUp
Ow0KKwlyZXR1cm4gUHlfTm9uZTsNCit9DQorDQorc3RhdGljIGNoYXIgZ2V0X3RocmVzaF9f
ZG9jX19bXSA9DQorImdldF90cmVzaG9sZCgpIC0+ICh0aHJlc2hvbGQwLCB0aHJlc2hvbGQx
LCB0aHJlc2hvbGQyKVxuIg0KKyJcbiINCisiUmV0dXJuIHRoZSBjdXJyZW50IGNvbGxlY3Rp
b24gdGhyZXNob2xkc1xuIg0KKzsNCisNCitzdGF0aWMgUHlPYmplY3QgKg0KK1B5X2dldF90
aHJlc2goc2VsZiwgYXJncykNCisJUHlPYmplY3QgKnNlbGY7DQorCVB5T2JqZWN0ICphcmdz
Ow0KK3sNCisJaWYoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQkvKiBubyBhcmdzICov
DQorCQlyZXR1cm4gTlVMTDsNCisNCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaWkpIiwg
dGhyZXNob2xkMCwgdGhyZXNob2xkMSwgdGhyZXNob2xkMik7DQorfQ0KKw0KKw0KK3N0YXRp
YyBjaGFyIGdjX19kb2NfXyBbXSA9DQorIlRoaXMgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0
byB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgZm9yIHJlZmVyZW5jZSBjeWNsZXMuXG4iDQorIlxu
Ig0KKyJjb2xsZWN0KCkgLS0gRG8gYSBmdWxsIGNvbGxlY3Rpb24gcmlnaHQgbm93LlxuIg0K
KyJzZXRfZGVidWcoKSAtLSBTZXQgZGVidWdnaW5nIGZsYWdzLlxuIg0KKyJnZXRfZGVidWco
KSAtLSBHZXQgZGVidWdnaW5nIGZsYWdzLlxuIg0KKyJzZXRfdGhyZXNob2xkKCkgLS0gU2V0
IHRoZSBjb2xsZWN0aW9uIHRocmVzaG9sZHMuXG4iDQorImdldF90aHJlc2hvbGQoKSAtLSBS
ZXR1cm4gdGhlIGN1cnJlbnQgdGhlIGNvbGxlY3Rpb24gdGhyZXNob2xkcy5cbiINCis7DQor
DQorc3RhdGljIFB5TWV0aG9kRGVmIEdjTWV0aG9kc1tdID0gew0KKwl7InNldF9kZWJ1ZyIs
CQlQeV9zZXRfZGVidWcsICBNRVRIX1ZBUkFSR1MsIHNldF9kZWJ1Z19fZG9jX199LA0KKwl7
ImdldF9kZWJ1ZyIsCQlQeV9nZXRfZGVidWcsICBNRVRIX1ZBUkFSR1MsIGdldF9kZWJ1Z19f
ZG9jX199LA0KKwl7InNldF90aHJlc2hvbGQiLAlQeV9zZXRfdGhyZXNoLCBNRVRIX1ZBUkFS
R1MsIHNldF90aHJlc2hfX2RvY19ffSwNCisJeyJnZXRfdGhyZXNob2xkIiwJUHlfZ2V0X3Ro
cmVzaCwgTUVUSF9WQVJBUkdTLCBnZXRfdGhyZXNoX19kb2NfX30sDQorCXsiY29sbGVjdCIs
CQlQeV9jb2xsZWN0LCAgICBNRVRIX1ZBUkFSR1MsIGNvbGxlY3RfX2RvY19ffSwNCisJe05V
TEwsCU5VTEx9CQkvKiBTZW50aW5lbCAqLw0KK307DQorDQordm9pZA0KK2luaXRnYyh2b2lk
KQ0KK3sNCisJUHlPYmplY3QgKm07DQorCVB5T2JqZWN0ICpkOw0KKw0KKwltID0gUHlfSW5p
dE1vZHVsZTQoImdjIiwNCisJCQkgICAgICBHY01ldGhvZHMsDQorCQkJICAgICAgZ2NfX2Rv
Y19fLA0KKwkJCSAgICAgIE5VTEwsDQorCQkJICAgICAgUFlUSE9OX0FQSV9WRVJTSU9OKTsN
CisJZCA9IFB5TW9kdWxlX0dldERpY3QobSk7DQorCWlmIChnYXJiYWdlID09IE5VTEwpIHsN
CisJCWdhcmJhZ2UgPSBQeUxpc3RfTmV3KDApOw0KKwl9DQorCVB5RGljdF9TZXRJdGVtU3Ry
aW5nKGQsICJnYXJiYWdlIiwgZ2FyYmFnZSk7DQorCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQs
ICJERUJVR19TVEFUUyIsDQorCQkJUHlJbnRfRnJvbUxvbmcoREVCVUdfU1RBVFMpKTsNCisJ
UHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFQlVHX0NPTExFQ1RBQkxFIiwNCisJCQlQeUlu
dF9Gcm9tTG9uZyhERUJVR19DT0xMRUNUQUJMRSkpOw0KKwlQeURpY3RfU2V0SXRlbVN0cmlu
ZyhkLCAiREVCVUdfVU5DT0xMRUNUQUJMRSIsDQorCQkJUHlJbnRfRnJvbUxvbmcoREVCVUdf
VU5DT0xMRUNUQUJMRSkpOw0KKwlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVCVUdfSU5T
VEFOQ0VTIiwNCisJCQlQeUludF9Gcm9tTG9uZyhERUJVR19JTlNUQU5DRVMpKTsNCisJUHlE
aWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFQlVHX09CSkVDVFMiLA0KKwkJCVB5SW50X0Zyb21M
b25nKERFQlVHX09CSkVDVFMpKTsNCisJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFQlVH
X0xFQUsiLA0KKwkJCVB5SW50X0Zyb21Mb25nKERFQlVHX0xFQUspKTsNCit9DQorDQotLS0g
UHl0aG9uLWN2cy9PYmplY3RzL2NsYXNzb2JqZWN0LmMJVHVlIEZlYiAyOSAxNDo1NToxNSAy
MDAwDQorKysgUHl0aG9uLWdjL09iamVjdHMvY2xhc3NvYmplY3QuYwlNb24gQXByIDI0IDIx
OjE5OjE4IDIwMDANCkBAIC0xMTAsNyArMTEwLDcgQEANCiAJCX0NCiAJCVB5X0lOQ1JFRihi
YXNlcyk7DQogCX0NCi0Jb3AgPSBQeU9iamVjdF9ORVcoUHlDbGFzc09iamVjdCwgJlB5Q2xh
c3NfVHlwZSk7DQorCW9wID0gUHlPYmplY3RfTmV3KFB5Q2xhc3NPYmplY3QsICZQeUNsYXNz
X1R5cGUpOw0KIAlpZiAob3AgPT0gTlVMTCkgew0KIAkJUHlfREVDUkVGKGJhc2VzKTsNCiAJ
CXJldHVybiBOVUxMOw0KQEAgLTEzMSw2ICsxMzEsOSBAQA0KIAlQeV9YSU5DUkVGKG9wLT5j
bF9nZXRhdHRyKTsNCiAJUHlfWElOQ1JFRihvcC0+Y2xfc2V0YXR0cik7DQogCVB5X1hJTkNS
RUYob3AtPmNsX2RlbGF0dHIpOw0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorCVB5R0NfSW5z
ZXJ0KChQeU9iamVjdCAqKW9wKTsNCisjZW5kaWYNCiAJcmV0dXJuIChQeU9iamVjdCAqKSBv
cDsNCiB9DQogDQpAQCAtMTQwLDEzICsxNDMsMTYgQEANCiBjbGFzc19kZWFsbG9jKG9wKQ0K
IAlQeUNsYXNzT2JqZWN0ICpvcDsNCiB7DQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJUHlH
Q19SZW1vdmUoKFB5T2JqZWN0ICopb3ApOw0KKyNlbmRpZg0KIAlQeV9ERUNSRUYob3AtPmNs
X2Jhc2VzKTsNCiAJUHlfREVDUkVGKG9wLT5jbF9kaWN0KTsNCiAJUHlfWERFQ1JFRihvcC0+
Y2xfbmFtZSk7DQogCVB5X1hERUNSRUYob3AtPmNsX2dldGF0dHIpOw0KIAlQeV9YREVDUkVG
KG9wLT5jbF9zZXRhdHRyKTsNCiAJUHlfWERFQ1JFRihvcC0+Y2xfZGVsYXR0cik7DQotCWZy
ZWUoKEFOWSAqKW9wKTsNCisJUHlPYmplY3RfRGVsKChQeU9iamVjdCAqKW9wKTsNCiB9DQog
DQogc3RhdGljIFB5T2JqZWN0ICoNCkBAIC0zODYsNiArMzkyLDIxIEBADQogCXJldHVybiBy
ZXM7DQogfQ0KIA0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorc3RhdGljIGludA0KK2NsYXNz
X3JlY3Vyc2UoUHlDbGFzc09iamVjdCAqbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICpjbG9z
dXJlKQ0KK3sNCisJaWYgKG8tPmNsX2Jhc2VzKSB2aXNpdChvLT5jbF9iYXNlcywgY2xvc3Vy
ZSk7DQorCWlmIChvLT5jbF9kaWN0KSB2aXNpdChvLT5jbF9kaWN0LCBjbG9zdXJlKTsNCisJ
aWYgKG8tPmNsX25hbWUpIHZpc2l0KG8tPmNsX25hbWUsIGNsb3N1cmUpOw0KKwlpZiAoby0+
Y2xfZ2V0YXR0cikgdmlzaXQoby0+Y2xfZ2V0YXR0ciwgY2xvc3VyZSk7DQorCWlmIChvLT5j
bF9zZXRhdHRyKSB2aXNpdChvLT5jbF9zZXRhdHRyLCBjbG9zdXJlKTsNCisJaWYgKG8tPmNs
X2RlbGF0dHIpIHZpc2l0KG8tPmNsX2RlbGF0dHIsIGNsb3N1cmUpOw0KKwlyZXR1cm4gMTsN
Cit9DQorI2VuZGlmIC8qIFdJVEhfQ1lDTEVfR0MgKi8NCisNCisNCiBQeVR5cGVPYmplY3Qg
UHlDbGFzc19UeXBlID0gew0KIAlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQ0K
IAkwLA0KQEAgLTQwNiw2ICs0MjcsMTIgQEANCiAJKHJlcHJmdW5jKWNsYXNzX3N0ciwgLyp0
cF9zdHIqLw0KIAkoZ2V0YXR0cm9mdW5jKWNsYXNzX2dldGF0dHIsIC8qdHBfZ2V0YXR0cm8q
Lw0KIAkoc2V0YXR0cm9mdW5jKWNsYXNzX3NldGF0dHIsIC8qdHBfc2V0YXR0cm8qLw0KKyNp
ZmRlZiBXSVRIX0NZQ0xFX0dDDQorCTAsCQkvKiB0cF9hc19idWZmZXIgKi8NCisJUHlfVFBG
TEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDSU5GTywgLyp0cF9mbGFncyovDQor
CTAsCQkvKiB0cF9kb2MgKi8NCisJKHJlY3Vyc2Vwcm9jKWNsYXNzX3JlY3Vyc2UsCS8qIHRw
X3JlY3Vyc2UgKi8NCisjZW5kaWYNCiB9Ow0KIA0KIGludA0KQEAgLTQ0NCwxMiArNDcxLDE1
IEBADQogCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsNCiAJCXJldHVybiBOVUxMOw0KIAl9
DQotCWluc3QgPSBQeU9iamVjdF9ORVcoUHlJbnN0YW5jZU9iamVjdCwgJlB5SW5zdGFuY2Vf
VHlwZSk7DQorCWluc3QgPSBQeU9iamVjdF9OZXcoUHlJbnN0YW5jZU9iamVjdCwgJlB5SW5z
dGFuY2VfVHlwZSk7DQogCWlmIChpbnN0ID09IE5VTEwpDQogCQlyZXR1cm4gTlVMTDsNCiAJ
UHlfSU5DUkVGKGNsYXNzKTsNCiAJaW5zdC0+aW5fY2xhc3MgPSAoUHlDbGFzc09iamVjdCAq
KWNsYXNzOw0KIAlpbnN0LT5pbl9kaWN0ID0gUHlEaWN0X05ldygpOw0KKyNpZmRlZiBXSVRI
X0NZQ0xFX0dDDQorCVB5R0NfSW5zZXJ0KChQeU9iamVjdCAqKWluc3QpOw0KKyNlbmRpZg0K
IAlpZiAoaW5zdC0+aW5fZGljdCA9PSBOVUxMKSB7DQogCQlQeV9ERUNSRUYoaW5zdCk7DQog
CQlyZXR1cm4gTlVMTDsNCkBAIC00OTgsMTEgKzUyOCwxNCBAQA0KIAlQeU9iamVjdCAqZXJy
b3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOw0KIAlQeU9iamVjdCAq
ZGVsOw0KIAlzdGF0aWMgUHlPYmplY3QgKmRlbHN0cjsNCisJZXh0ZXJuIGxvbmcgX1B5X1Jl
ZlRvdGFsOw0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorCVB5R0NfUmVtb3ZlKChQeU9iamVj
dCAqKWluc3QpOw0KKyNlbmRpZg0KIAkvKiBDYWxsIHRoZSBfX2RlbF9fIG1ldGhvZCBpZiBp
dCBleGlzdHMuICBGaXJzdCB0ZW1wb3JhcmlseQ0KIAkgICByZXZpdmUgdGhlIG9iamVjdCBh
bmQgc2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8NCiAjaWZkZWYgUHlf
VFJBQ0VfUkVGUw0KIAkvKiBtdWNoIHRvbyBjb21wbGljYXRlZCBpZiBQeV9UUkFDRV9SRUZT
IGRlZmluZWQgKi8NCi0JZXh0ZXJuIGxvbmcgX1B5X1JlZlRvdGFsOw0KIAlpbnN0LT5vYl90
eXBlID0gJlB5SW5zdGFuY2VfVHlwZTsNCiAJX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3Qg
KilpbnN0KTsNCiAJX1B5X1JlZlRvdGFsLS07CQkvKiBjb21wZW5zYXRlIGZvciBpbmNyZW1l
bnQgaW4gTkVXUkVGICovDQpAQCAtNTUwLDYgKzU4Myw5IEBADQogI2lmZGVmIENPVU5UX0FM
TE9DUw0KIAkJaW5zdC0+b2JfdHlwZS0+dHBfZnJlZS0tOw0KICNlbmRpZg0KKyNpZmRlZiBX
SVRIX0NZQ0xFX0dDDQorCQlQeUdDX0luc2VydCgoUHlPYmplY3QgKilpbnN0KTsNCisjZW5k
aWYNCiAJCXJldHVybjsgLyogX19kZWxfXyBhZGRlZCBhIHJlZmVyZW5jZTsgZG9uJ3QgZGVs
ZXRlIG5vdyAqLw0KIAl9DQogI2lmZGVmIFB5X1RSQUNFX1JFRlMNCkBAIC01NTcsMTEgKzU5
MywxMCBAQA0KIAlpbnN0LT5vYl90eXBlLT50cF9mcmVlLS07CS8qIGNvbXBlbnNhdGUgZm9y
IGluY3JlbWVudCBpbiBVTlJFRiAqLw0KICNlbmRpZg0KIAlfUHlfRm9yZ2V0UmVmZXJlbmNl
KChQeU9iamVjdCAqKWluc3QpOw0KLQlpbnN0LT5vYl90eXBlID0gTlVMTDsNCiAjZW5kaWYg
LyogUHlfVFJBQ0VfUkVGUyAqLw0KIAlQeV9ERUNSRUYoaW5zdC0+aW5fY2xhc3MpOw0KIAlQ
eV9YREVDUkVGKGluc3QtPmluX2RpY3QpOw0KLQlmcmVlKChBTlkgKilpbnN0KTsNCisJUHlP
YmplY3RfRGVsKChQeU9iamVjdCAqKWluc3QpOw0KIH0NCiANCiBzdGF0aWMgUHlPYmplY3Qg
Kg0KQEAgLTg0MCw2ICs4NzUsMTYgQEANCiAJcmV0dXJuIG91dGNvbWU7DQogfQ0KIA0KKyNp
ZmRlZiBXSVRIX0NZQ0xFX0dDDQorc3RhdGljIGludA0KK2luc3RhbmNlX3JlY3Vyc2UoUHlJ
bnN0YW5jZU9iamVjdCAqbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICpjbG9zdXJlKQ0KK3sN
CisJaWYgKG8tPmluX2NsYXNzKSB2aXNpdCgoUHlPYmplY3QgKikoby0+aW5fY2xhc3MpLCBj
bG9zdXJlKTsNCisJaWYgKG8tPmluX2RpY3QpIHZpc2l0KG8tPmluX2RpY3QsIGNsb3N1cmUp
Ow0KKwlyZXR1cm4gMTsNCit9DQorI2VuZGlmIC8qIFdJVEhfQ1lDTEVfR0MgKi8NCisNCiBz
dGF0aWMgUHlPYmplY3QgKmdldGl0ZW1zdHIsICpzZXRpdGVtc3RyLCAqZGVsaXRlbXN0ciwg
KmxlbnN0cjsNCiANCiBzdGF0aWMgaW50DQpAQCAtMTQ2Myw3ICsxNTA4LDExIEBADQogCShn
ZXRhdHRyb2Z1bmMpaW5zdGFuY2VfZ2V0YXR0ciwgLyp0cF9nZXRhdHRybyovDQogCShzZXRh
dHRyb2Z1bmMpaW5zdGFuY2Vfc2V0YXR0ciwgLyp0cF9zZXRhdHRybyovDQogICAgICAgICAw
LCAvKiB0cF9hc19idWZmZXIgKi8NCi0JUHlfVFBGTEFHU19ERUZBVUxULCAvKnRwX2ZsYWdz
ICovDQorCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQ0lORk8sIC8q
dHBfZmxhZ3MqLw0KKwkwLAkJLyogdHBfZG9jICovDQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MN
CisJKHJlY3Vyc2Vwcm9jKWluc3RhbmNlX3JlY3Vyc2UsCS8qIHRwX3JlY3Vyc2UgKi8NCisj
ZW5kaWYNCiB9Ow0KIA0KIA0KQEAgLTE0OTMsNyArMTU0Miw3IEBADQogCQlfUHlfTmV3UmVm
ZXJlbmNlKChQeU9iamVjdCAqKWltKTsNCiAJfQ0KIAllbHNlIHsNCi0JCWltID0gUHlPYmpl
Y3RfTkVXKFB5TWV0aG9kT2JqZWN0LCAmUHlNZXRob2RfVHlwZSk7DQorCQlpbSA9IFB5T2Jq
ZWN0X05ldyhQeU1ldGhvZE9iamVjdCwgJlB5TWV0aG9kX1R5cGUpOw0KIAkJaWYgKGltID09
IE5VTEwpDQogCQkJcmV0dXJuIE5VTEw7DQogCX0NCi0tLSBQeXRob24tY3ZzL09iamVjdHMv
ZGljdG9iamVjdC5jCVRodSBNYXIgMzAgMjI6MDI6NTIgMjAwMA0KKysrIFB5dGhvbi1nYy9P
YmplY3RzL2RpY3RvYmplY3QuYwlTYXQgQXByICA4IDAyOjA5OjU5IDIwMDANCkBAIC0xMjEs
NyArMTIxLDcgQEANCiAJCWlmIChkdW1teSA9PSBOVUxMKQ0KIAkJCXJldHVybiBOVUxMOw0K
IAl9DQotCW1wID0gUHlPYmplY3RfTkVXKGRpY3RvYmplY3QsICZQeURpY3RfVHlwZSk7DQor
CW1wID0gUHlPYmplY3RfTmV3KGRpY3RvYmplY3QsICZQeURpY3RfVHlwZSk7DQogCWlmICht
cCA9PSBOVUxMKQ0KIAkJcmV0dXJuIE5VTEw7DQogCW1wLT5tYV9zaXplID0gMDsNCkBAIC0x
MjksNiArMTI5LDkgQEANCiAJbXAtPm1hX3RhYmxlID0gTlVMTDsNCiAJbXAtPm1hX2ZpbGwg
PSAwOw0KIAltcC0+bWFfdXNlZCA9IDA7DQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJUHlH
Q19JbnNlcnQoKFB5T2JqZWN0ICopbXApOw0KKyNlbmRpZg0KIAlyZXR1cm4gKFB5T2JqZWN0
ICopbXA7DQogfQ0KIA0KQEAgLTQ4MCw2ICs0ODMsOSBAQA0KIAlyZWdpc3RlciBpbnQgaTsN
CiAJcmVnaXN0ZXIgZGljdGVudHJ5ICplcDsNCiAJUHlfVFJBU0hDQU5fU0FGRV9CRUdJTiht
cCkNCisjaWZkZWYgV0lUSF9DWUNMRV9HQw0KKwlQeUdDX1JlbW92ZSgoUHlPYmplY3QgKilt
cCk7DQorI2VuZGlmDQogCWZvciAoaSA9IDAsIGVwID0gbXAtPm1hX3RhYmxlOyBpIDwgbXAt
Pm1hX3NpemU7IGkrKywgZXArKykgew0KIAkJaWYgKGVwLT5tZV9rZXkgIT0gTlVMTCkgew0K
IAkJCVB5X0RFQ1JFRihlcC0+bWVfa2V5KTsNCkBAIC00ODksNyArNDk1LDcgQEANCiAJCX0N
CiAJfQ0KIAlQeU1lbV9YREVMKG1wLT5tYV90YWJsZSk7DQotCVB5TWVtX0RFTChtcCk7DQor
CVB5T2JqZWN0X0RlbCgoUHlPYmplY3QgKiltcCk7DQogCVB5X1RSQVNIQ0FOX1NBRkVfRU5E
KG1wKQ0KIH0NCiANCkBAIC0xMDM2LDYgKzEwNDIsMzMgQEANCiAJcmV0dXJuIFB5X05vbmU7
DQogfQ0KIA0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorc3RhdGljIGludA0KK2RpY3RfcmVj
dXJzZShQeU9iamVjdCAqb3AsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqY2xvc3VyZSkNCit7
DQorCWludCBpID0gMDsNCisJUHlPYmplY3QgKnBrOw0KKwlQeU9iamVjdCAqcHY7DQorDQor
CXdoaWxlIChQeURpY3RfTmV4dChvcCwgJmksICZwaywgJnB2KSkgew0KKwkJaWYgKCF2aXNp
dChwaywgY2xvc3VyZSkpIHsNCisJCQlyZXR1cm4gMDsNCisJCX0NCisJCWlmICghdmlzaXQo
cHYsIGNsb3N1cmUpKSB7DQorCQkJcmV0dXJuIDA7DQorCQl9DQorCX0NCisJcmV0dXJuIDE7
DQorfQ0KKw0KK3N0YXRpYyBpbnQNCitkaWN0X2djX2NsZWFyKFB5T2JqZWN0ICpvcCkNCit7
DQorCVB5RGljdF9DbGVhcihvcCk7DQorCXJldHVybiAwOw0KK30NCisjZW5kaWYgLyogV0lU
SF9DWUNMRV9HQyAqLw0KKw0KIHN0YXRpYyBQeU1ldGhvZERlZiBtYXBwX21ldGhvZHNbXSA9
IHsNCiAJeyJoYXNfa2V5IiwJKFB5Q0Z1bmN0aW9uKWRpY3RfaGFzX2tleSwgICAgICBNRVRI
X1ZBUkFSR1N9LA0KIAl7ImtleXMiLAkoUHlDRnVuY3Rpb24pZGljdF9rZXlzfSwNCkBAIC0x
MDcxLDYgKzExMDQsMTggQEANCiAJMCwJCQkvKnRwX2FzX251bWJlciovDQogCTAsCQkJLyp0
cF9hc19zZXF1ZW5jZSovDQogCSZkaWN0X2FzX21hcHBpbmcsCS8qdHBfYXNfbWFwcGluZyov
DQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJMCwJCS8qIHRwX2hhc2ggKi8NCisJMCwJCS8q
IHRwX2NhbGwgKi8NCisJMCwJCS8qIHRwX3N0ciAqLw0KKwkwLAkJLyogdHBfZ2V0YXR0cm8g
Ki8NCisJMCwJCS8qIHRwX3NldGF0dHJvICovDQorCTAsCQkvKiB0cF9hc19idWZmZXIgKi8N
CisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDSU5GTywgLyp0cF9m
bGFncyovDQorCTAsCQkvKiB0cF9kb2MgKi8NCisJKHJlY3Vyc2Vwcm9jKWRpY3RfcmVjdXJz
ZSwJLyogdHBfcmVjdXJzZSAqLw0KKwkoaW5xdWlyeSlkaWN0X2djX2NsZWFyLAkJLyogdHBf
Y2xlYXIgKi8NCisjZW5kaWYNCiB9Ow0KIA0KIC8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmls
aXR5IHdpdGggb2xkIGRpY3Rpb25hcnkgaW50ZXJmYWNlICovDQotLS0gUHl0aG9uLWN2cy9P
YmplY3RzL2Z1bmNvYmplY3QuYwlUaHUgTWF5IDIxIDE4OjU1OjM0IDE5OTgNCisrKyBQeXRo
b24tZ2MvT2JqZWN0cy9mdW5jb2JqZWN0LmMJU2F0IEFwciAgOCAwMjowOTo1MCAyMDAwDQpA
QCAtNDAsNyArNDAsNyBAQA0KIAlQeU9iamVjdCAqY29kZTsNCiAJUHlPYmplY3QgKmdsb2Jh
bHM7DQogew0KLQlQeUZ1bmN0aW9uT2JqZWN0ICpvcCA9IFB5T2JqZWN0X05FVyhQeUZ1bmN0
aW9uT2JqZWN0LA0KKwlQeUZ1bmN0aW9uT2JqZWN0ICpvcCA9IFB5T2JqZWN0X05ldyhQeUZ1
bmN0aW9uT2JqZWN0LA0KIAkJCQkJICAgICZQeUZ1bmN0aW9uX1R5cGUpOw0KIAlpZiAob3Ag
IT0gTlVMTCkgew0KIAkJUHlPYmplY3QgKmRvYzsNCkBAIC02Myw2ICs2Myw5IEBADQogCQlQ
eV9JTkNSRUYoZG9jKTsNCiAJCW9wLT5mdW5jX2RvYyA9IGRvYzsNCiAJfQ0KKyNpZmRlZiBX
SVRIX0NZQ0xFX0dDDQorCVB5R0NfSW5zZXJ0KChQeU9iamVjdCAqKW9wKTsNCisjZW5kaWYN
CiAJcmV0dXJuIChQeU9iamVjdCAqKW9wOw0KIH0NCiANCkBAIC0xODYsMTIgKzE4OSwxNSBA
QA0KIGZ1bmNfZGVhbGxvYyhvcCkNCiAJUHlGdW5jdGlvbk9iamVjdCAqb3A7DQogew0KKyNp
ZmRlZiBXSVRIX0NZQ0xFX0dDDQorCVB5R0NfUmVtb3ZlKChQeU9iamVjdCAqKW9wKTsNCisj
ZW5kaWYNCiAJUHlfREVDUkVGKG9wLT5mdW5jX2NvZGUpOw0KIAlQeV9ERUNSRUYob3AtPmZ1
bmNfZ2xvYmFscyk7DQogCVB5X0RFQ1JFRihvcC0+ZnVuY19uYW1lKTsNCiAJUHlfWERFQ1JF
RihvcC0+ZnVuY19kZWZhdWx0cyk7DQogCVB5X1hERUNSRUYob3AtPmZ1bmNfZG9jKTsNCi0J
UHlNZW1fREVMKG9wKTsNCisJUHlPYmplY3RfRGVsKChQeU9iamVjdCAqKW9wKTsNCiB9DQog
DQogc3RhdGljIFB5T2JqZWN0Kg0KQEAgLTIzOSw2ICsyNDUsMTkgQEANCiAJcmV0dXJuIGg7
DQogfQ0KIA0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorc3RhdGljIGludA0KK2Z1bmNfcmVj
dXJzZShQeUZ1bmN0aW9uT2JqZWN0ICpmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmNsb3N1
cmUpDQorew0KKwlpZiAoZi0+ZnVuY19jb2RlKSB2aXNpdChmLT5mdW5jX2NvZGUsIGNsb3N1
cmUpOw0KKwlpZiAoZi0+ZnVuY19nbG9iYWxzKSB2aXNpdChmLT5mdW5jX2dsb2JhbHMsIGNs
b3N1cmUpOw0KKwlpZiAoZi0+ZnVuY19kZWZhdWx0cykgdmlzaXQoZi0+ZnVuY19kZWZhdWx0
cywgY2xvc3VyZSk7DQorCWlmIChmLT5mdW5jX2RvYykgdmlzaXQoZi0+ZnVuY19kb2MsIGNs
b3N1cmUpOw0KKwlpZiAoZi0+ZnVuY19uYW1lKSB2aXNpdChmLT5mdW5jX25hbWUsIGNsb3N1
cmUpOw0KKwlyZXR1cm4gMTsNCit9DQorI2VuZGlmIC8qIFdJVEhfQ1lDTEVfR0MgKi8NCisN
CiBQeVR5cGVPYmplY3QgUHlGdW5jdGlvbl9UeXBlID0gew0KIAlQeU9iamVjdF9IRUFEX0lO
SVQoJlB5VHlwZV9UeXBlKQ0KIAkwLA0KQEAgLTI1NSw0ICsyNzQsMTQgQEANCiAJMCwJCS8q
dHBfYXNfc2VxdWVuY2UqLw0KIAkwLAkJLyp0cF9hc19tYXBwaW5nKi8NCiAJKGhhc2hmdW5j
KWZ1bmNfaGFzaCwgLyp0cF9oYXNoKi8NCisjaWZkZWYgV0lUSF9DWUNMRV9HQw0KKwkwLAkJ
Lyp0cF9jYWxsKi8NCisJMCwJCS8qdHBfc3RyKi8NCisJMCwJCS8qdHBfZ2V0YXR0cm8qLw0K
KwkwLAkJLyp0cF9zZXRhdHRybyovDQorCTAsCQkvKiB0cF9hc19idWZmZXIgKi8NCisJUHlf
VFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDSU5GTywgLyp0cF9mbGFncyov
DQorCTAsCQkvKiB0cF9kb2MgKi8NCisJKHJlY3Vyc2Vwcm9jKWZ1bmNfcmVjdXJzZSwJLyog
dHBfcmVjdXJzZSAqLw0KKyNlbmRpZg0KIH07DQotLS0gUHl0aG9uLWN2cy9PYmplY3RzL2xp
c3RvYmplY3QuYwlGcmkgTWFyIDI0IDIyOjMyOjMwIDIwMDANCisrKyBQeXRob24tZ2MvT2Jq
ZWN0cy9saXN0b2JqZWN0LmMJU2F0IEFwciAgOCAwMjowMjozNiAyMDAwDQpAQCAtNjEsMzQg
KzYxLDM4IEBADQogCWludCBpOw0KIAlQeUxpc3RPYmplY3QgKm9wOw0KIAlzaXplX3QgbmJ5
dGVzOw0KKwlQeU9iamVjdCAqKml0ZW07DQorDQogCWlmIChzaXplIDwgMCkgew0KIAkJUHlF
cnJfQmFkSW50ZXJuYWxDYWxsKCk7DQogCQlyZXR1cm4gTlVMTDsNCiAJfQ0KLQluYnl0ZXMg
PSBzaXplICogc2l6ZW9mKFB5T2JqZWN0ICopOw0KLQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cg
Ki8NCi0JaWYgKG5ieXRlcyAvIHNpemVvZihQeU9iamVjdCAqKSAhPSAoc2l6ZV90KXNpemUp
IHsNCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOw0KLQl9DQotCW9wID0gKFB5TGlzdE9i
amVjdCAqKSBtYWxsb2Moc2l6ZW9mKFB5TGlzdE9iamVjdCkpOw0KLQlpZiAob3AgPT0gTlVM
TCkgew0KLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7DQotCX0NCi0JaWYgKHNpemUgPD0g
MCkgew0KLQkJb3AtPm9iX2l0ZW0gPSBOVUxMOw0KLQl9DQorCWlmIChzaXplID09IDApDQor
CQlpdGVtID0gTlVMTDsNCiAJZWxzZSB7DQotCQlvcC0+b2JfaXRlbSA9IChQeU9iamVjdCAq
KikgbWFsbG9jKG5ieXRlcyk7DQotCQlpZiAob3AtPm9iX2l0ZW0gPT0gTlVMTCkgew0KLQkJ
CWZyZWUoKEFOWSAqKW9wKTsNCisJCW5ieXRlcyA9IHNpemUgKiBzaXplb2YoUHlPYmplY3Qg
Kik7DQorCQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8NCisJCWlmIChuYnl0ZXMgLyBzaXpl
b2YoUHlPYmplY3QgKikgIT0gKHNpemVfdClzaXplKSB7DQogCQkJcmV0dXJuIFB5RXJyX05v
TWVtb3J5KCk7DQogCQl9DQorCQlpdGVtID0gKFB5T2JqZWN0ICoqKSBtYWxsb2MobmJ5dGVz
KTsNCisJCWlmIChpdGVtID09IE5VTEwpDQorCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7
DQorCX0NCisJb3AgPSBQeU9iamVjdF9OZXcoUHlMaXN0T2JqZWN0LCAmUHlMaXN0X1R5cGUp
Ow0KKwlpZiAob3AgPT0gTlVMTCkgew0KKwkJaWYgKGl0ZW0gIT0gTlVMTCkNCisJCQlmcmVl
KChBTlkgKilpdGVtKTsNCisJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOw0KIAl9DQotCW9w
LT5vYl90eXBlID0gJlB5TGlzdF9UeXBlOw0KIAlvcC0+b2Jfc2l6ZSA9IHNpemU7DQorCW9w
LT5vYl9pdGVtID0gaXRlbTsNCiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykNCiAJCW9w
LT5vYl9pdGVtW2ldID0gTlVMTDsNCiAJX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilv
cCk7DQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJUHlHQ19JbnNlcnQoKFB5T2JqZWN0ICop
b3ApOw0KKyNlbmRpZg0KIAlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOw0KIH0NCiANCkBAIC0y
MTYsNiArMjIwLDkgQEANCiB7DQogCWludCBpOw0KIAlQeV9UUkFTSENBTl9TQUZFX0JFR0lO
KG9wKQ0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorCVB5R0NfUmVtb3ZlKChQeU9iamVjdCAq
KW9wKTsNCisjZW5kaWYNCiAJaWYgKG9wLT5vYl9pdGVtICE9IE5VTEwpIHsNCiAJCS8qIERv
IGl0IGJhY2t3YXJkcywgZm9yIENocmlzdGlhbiBUaXNtZXIuDQogCQkgICBUaGVyZSdzIGEg
c2ltcGxlIHRlc3QgY2FzZSB3aGVyZSBzb21laG93IHRoaXMgcmVkdWNlcw0KQEAgLTIyNyw3
ICsyMzQsNyBAQA0KIAkJfQ0KIAkJZnJlZSgoQU5ZICopb3AtPm9iX2l0ZW0pOw0KIAl9DQot
CWZyZWUoKEFOWSAqKW9wKTsNCisJUHlPYmplY3RfRGVsKChQeU9iamVjdCAqKW9wKTsNCiAJ
UHlfVFJBU0hDQU5fU0FGRV9FTkQob3ApDQogfQ0KIA0KQEAgLTEzOTksNiArMTQwNiwyOSBA
QA0KIAlyZXR1cm4gTlVMTDsNCiB9DQogDQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCitzdGF0
aWMgaW50DQorbGlzdF9yZWN1cnNlKFB5TGlzdE9iamVjdCAqbywgdmlzaXRwcm9jIHZpc2l0
LCB2b2lkICpjbG9zdXJlKQ0KK3sNCisJaW50IGk7DQorCVB5T2JqZWN0ICp4Ow0KKw0KKwlm
b3IgKGkgPSBvLT5vYl9zaXplOyAtLWkgPj0gMDsgKSB7DQorCQl4ID0gby0+b2JfaXRlbVtp
XTsNCisJCWlmICh4ICE9IE5VTEwgJiYgIXZpc2l0KHgsIGNsb3N1cmUpKQ0KKwkJCXJldHVy
biAwOw0KKwl9DQorCXJldHVybiAxOw0KK30NCisNCitzdGF0aWMgaW50DQorbGlzdF9jbGVh
cihQeUxpc3RPYmplY3QgKmxwKQ0KK3sNCisJKHZvaWQpIFB5TGlzdF9TZXRTbGljZSgoUHlP
YmplY3QgKilscCwgMCwgbHAtPm9iX3NpemUsIDApOw0KKwlyZXR1cm4gMDsNCit9DQorI2Vu
ZGlmIC8qIFdJVEhfQ1lDTEVfR0MgKi8NCisNCiBzdGF0aWMgY2hhciBhcHBlbmRfZG9jW10g
PQ0KICJMLmFwcGVuZChvYmplY3QpIC0tIGFwcGVuZCBvYmplY3QgdG8gZW5kIjsNCiBzdGF0
aWMgY2hhciBleHRlbmRfZG9jW10gPQ0KQEAgLTE0NjQsNiArMTQ5NCwxOCBAQA0KIAkwLAkJ
Lyp0cF9hc19udW1iZXIqLw0KIAkmbGlzdF9hc19zZXF1ZW5jZSwJLyp0cF9hc19zZXF1ZW5j
ZSovDQogCTAsCQkvKnRwX2FzX21hcHBpbmcqLw0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQor
CTAsCQkvKiB0cF9oYXNoICovDQorCTAsCQkvKiB0cF9jYWxsICovDQorCTAsCQkvKiB0cF9z
dHIgKi8NCisJMCwJCS8qIHRwX2dldGF0dHJvICovDQorCTAsCQkvKiB0cF9zZXRhdHRybyAq
Lw0KKwkwLAkJLyogdHBfYXNfYnVmZmVyICovDQorCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5
X1RQRkxBR1NfSEFWRV9HQ0lORk8sCS8qIHRwX2ZsYWdzICovDQorCTAsCQkvKiB0cF9kb2Mg
Ki8NCisJKHJlY3Vyc2Vwcm9jKWxpc3RfcmVjdXJzZSwJLyogdHBfcmVjdXJzZSAqLw0KKwko
aW5xdWlyeSlsaXN0X2NsZWFyLAkvKiB0cF9jbGVhciAqLw0KKyNlbmRpZg0KIH07DQogDQog
DQpAQCAtMTUzMiw1ICsxNTc0LDE2IEBADQogCTAsCQkvKnRwX2FzX251bWJlciovDQogCSZp
bW11dGFibGVfbGlzdF9hc19zZXF1ZW5jZSwJLyp0cF9hc19zZXF1ZW5jZSovDQogCTAsCQkv
KnRwX2FzX21hcHBpbmcqLw0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorCTAsCQkvKiB0cF9o
YXNoICovDQorCTAsCQkvKiB0cF9jYWxsICovDQorCTAsCQkvKiB0cF9zdHIgKi8NCisJMCwJ
CS8qIHRwX2dldGF0dHJvICovDQorCTAsCQkvKiB0cF9zZXRhdHRybyAqLw0KKwkwLAkJLyog
dHBfYXNfYnVmZmVyICovDQorCVB5X1RQRkxBR1NfREVGQVVMVCwJLyogdHBfZmxhZ3MgKi8N
CisJMCwJCS8qIHRwX2RvYyAqLw0KKwkocmVjdXJzZXByb2MpbGlzdF9yZWN1cnNlLAkvKiB0
cF9yZWN1cnNlICovDQorI2VuZGlmDQogfTsNCiANCi0tLSBQeXRob24tY3ZzL09iamVjdHMv
b2JqZWN0LmMJVHVlIE1hciAyOCAwODoxMTowOSAyMDAwDQorKysgUHl0aG9uLWdjL09iamVj
dHMvb2JqZWN0LmMJU2F0IEFwciAgOCAwMjoxMDowNiAyMDAwDQpAQCAtMTA3LDIwICsxMDcs
MTIgQEANCiB9DQogI2VuZGlmDQogDQotI2lmbmRlZiBNU19DT1JFRExMDQotUHlPYmplY3Qg
Kg0KLV9QeU9iamVjdF9OZXcodHApDQotCVB5VHlwZU9iamVjdCAqdHA7DQotI2Vsc2UNCisN
CiBQeU9iamVjdCAqDQotX1B5T2JqZWN0X05ldyh0cCxvcCkNCitfUHlPYmplY3RfRnJvbVR5
cGUodHAsb3ApDQogCVB5VHlwZU9iamVjdCAqdHA7DQogCVB5T2JqZWN0ICpvcDsNCi0jZW5k
aWYNCiB7DQotI2lmbmRlZiBNU19DT1JFRExMDQotCVB5T2JqZWN0ICpvcCA9IChQeU9iamVj
dCAqKSBtYWxsb2ModHAtPnRwX2Jhc2ljc2l6ZSk7DQotI2VuZGlmDQogCWlmIChvcCA9PSBO
VUxMKQ0KIAkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7DQogCW9wLT5vYl90eXBlID0gdHA7
DQpAQCAtMTI4LDI5ICsxMjAsNzggQEANCiAJcmV0dXJuIG9wOw0KIH0NCiANCi0jaWZuZGVm
IE1TX0NPUkVETEwNCi1QeVZhck9iamVjdCAqDQotX1B5T2JqZWN0X05ld1Zhcih0cCwgc2l6
ZSkNCi0JUHlUeXBlT2JqZWN0ICp0cDsNCi0JaW50IHNpemU7DQotI2Vsc2UNCiBQeVZhck9i
amVjdCAqDQotX1B5T2JqZWN0X05ld1Zhcih0cCwgc2l6ZSwgb3ApDQorX1B5T2JqZWN0X1Zh
ckZyb21UeXBlKHRwLCBzaXplLCBvcCkNCiAJUHlUeXBlT2JqZWN0ICp0cDsNCiAJaW50IHNp
emU7DQogCVB5VmFyT2JqZWN0ICpvcDsNCi0jZW5kaWYNCiB7DQotI2lmbmRlZiBNU19DT1JF
RExMDQotCVB5VmFyT2JqZWN0ICpvcCA9IChQeVZhck9iamVjdCAqKQ0KLQkJbWFsbG9jKHRw
LT50cF9iYXNpY3NpemUgKyBzaXplICogdHAtPnRwX2l0ZW1zaXplKTsNCi0jZW5kaWYNCiAJ
aWYgKG9wID09IE5VTEwpDQogCQlyZXR1cm4gKFB5VmFyT2JqZWN0ICopUHlFcnJfTm9NZW1v
cnkoKTsNCiAJb3AtPm9iX3R5cGUgPSB0cDsNCiAJb3AtPm9iX3NpemUgPSBzaXplOw0KIAlf
UHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKW9wKTsNCiAJcmV0dXJuIG9wOw0KK30NCisN
CitQeU9iamVjdCAqDQorX1B5T2JqZWN0X05ldyh0cCkNCisJUHlUeXBlT2JqZWN0ICp0cDsN
Cit7DQorCVB5T2JqZWN0ICpvcDsNCisjaWZkZWYgV0lUSF9DWUNMRV9HQw0KKwlpZiAoUFlf
VFlQRUlTR0ModHApKSB7DQorCQlQeUdDSW5mbyAqZzsNCisJCWcgPSAoUHlHQ0luZm8gKikg
bWFsbG9jKHNpemVvZigqZykgKyB0cC0+dHBfYmFzaWNzaXplKTsNCisJCWlmIChnID09IE5V
TEwpIHsNCisJCQlvcCA9IE5VTEw7DQorCQl9IGVsc2Ugew0KKwkJCW9wID0gUFlfR0NPQkoo
Zyk7DQorCQl9DQorCX0gZWxzZQ0KKyNlbmRpZiAvKiBXSVRIX0NZQ0xFX0dDICovDQorCXsN
CisJCW9wID0gKFB5T2JqZWN0ICopIG1hbGxvYyh0cC0+dHBfYmFzaWNzaXplKTsNCisJfQ0K
KwlyZXR1cm4gX1B5T2JqZWN0X0Zyb21UeXBlKHRwLCBvcCk7DQorfQ0KKw0KK1B5VmFyT2Jq
ZWN0ICoNCitfUHlPYmplY3RfTmV3VmFyKHRwLCBzaXplKQ0KKwlQeVR5cGVPYmplY3QgKnRw
Ow0KKwlpbnQgc2l6ZTsNCit7DQorCVB5VmFyT2JqZWN0ICpvcDsNCisjaWZkZWYgV0lUSF9D
WUNMRV9HQw0KKwlpZiAoUFlfVFlQRUlTR0ModHApKSB7DQorCQlQeUdDSW5mbyAqZzsNCisJ
CWcgPSAoUHlHQ0luZm8gKikgbWFsbG9jKHNpemVvZigqZykgKyANCisJCQkJCXRwLT50cF9i
YXNpY3NpemUgKw0KKwkJCQkJc2l6ZSAqIHRwLT50cF9pdGVtc2l6ZSk7DQorCQlpZiAoZyA9
PSBOVUxMKSB7DQorCQkJb3AgPSBOVUxMOw0KKwkJfSBlbHNlIHsNCisJCQlvcCA9IChQeVZh
ck9iamVjdCAqKVBZX0dDT0JKKGcpOw0KKwkJfQ0KKwl9IGVsc2UNCisjZW5kaWYgLyogV0lU
SF9DWUNMRV9HQyAqLw0KKwl7DQorCQlvcCA9IChQeVZhck9iamVjdCAqKQ0KKwkJCW1hbGxv
Yyh0cC0+dHBfYmFzaWNzaXplICsgc2l6ZSAqIHRwLT50cF9pdGVtc2l6ZSk7DQorCX0NCisJ
cmV0dXJuIF9QeU9iamVjdF9WYXJGcm9tVHlwZSh0cCwgc2l6ZSwgb3ApOw0KK30NCisNCit2
b2lkDQorUHlPYmplY3RfRGVsKG9wKQ0KKwlQeU9iamVjdCAqb3A7DQorew0KKyNpZmRlZiBX
SVRIX0NZQ0xFX0dDDQorCWlmIChQWV9JU0dDKG9wKSkgew0KKwkJb3AgPSAoUHlPYmplY3Qg
KilQWV9HQ0lORk9fVU5TQUZFKG9wKTsNCisJfQ0KKyNlbmRpZg0KKwlmcmVlKG9wKTsNCiB9
DQogDQogaW50DQotLS0gUHl0aG9uLWN2cy9PYmplY3RzL3R1cGxlb2JqZWN0LmMJRnJpIE1h
ciAyNCAyMjozMjozMCAyMDAwDQorKysgUHl0aG9uLWdjL09iamVjdHMvdHVwbGVvYmplY3Qu
YwlNb24gQXByIDI0IDIwOjQ4OjA1IDIwMDANCkBAIC05NywxMiArOTcsMTAgQEANCiAJCQly
ZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsNCiAJCX0NCiAJCTsNCi0JCW9wID0gKFB5VHVwbGVP
YmplY3QgKikgbWFsbG9jKG5ieXRlcyk7DQorCQlvcCA9IFB5T2JqZWN0X05ld1ZhcihQeVR1
cGxlT2JqZWN0LCAmUHlUdXBsZV9UeXBlLCBzaXplKTsNCiAJCWlmIChvcCA9PSBOVUxMKQ0K
IAkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOw0KIA0KLQkJb3AtPm9iX3R5cGUgPSAmUHlU
dXBsZV9UeXBlOw0KLQkJb3AtPm9iX3NpemUgPSBzaXplOw0KIAl9DQogCWZvciAoaSA9IDA7
IGkgPCBzaXplOyBpKyspDQogCQlvcC0+b2JfaXRlbVtpXSA9IE5VTEw7DQpAQCAtMTEwLDEw
ICsxMDgsMTIgQEANCiAjaWYgTUFYU0FWRVNJWkUgPiAwDQogCWlmIChzaXplID09IDApIHsN
CiAJCWZyZWVfdHVwbGVzWzBdID0gb3A7DQotCQkrK251bV9mcmVlX3R1cGxlc1swXTsNCiAJ
CVB5X0lOQ1JFRihvcCk7CS8qIGV4dHJhIElOQ1JFRiBzbyB0aGF0IHRoaXMgaXMgbmV2ZXIg
ZnJlZWQgKi8NCiAJfQ0KICNlbmRpZg0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorCVB5R0Nf
SW5zZXJ0KChQeU9iamVjdCAqKW9wKTsNCisjZW5kaWYNCiAJcmV0dXJuIChQeU9iamVjdCAq
KSBvcDsNCiB9DQogDQpAQCAtMTgwLDYgKzE4MCw5IEBADQogCXJlZ2lzdGVyIGludCBpOw0K
IAlyZWdpc3RlciBpbnQgbGVuID0gIG9wLT5vYl9zaXplOw0KIAlQeV9UUkFTSENBTl9TQUZF
X0JFR0lOKG9wKQ0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorCVB5R0NfUmVtb3ZlKChQeU9i
amVjdCAqKW9wKTsNCisjZW5kaWYNCiAJaWYgKGxlbiA+IDApIHsNCiAJCWkgPSBsZW47DQog
CQl3aGlsZSAoLS1pID49IDApDQpAQCAtMTkzLDcgKzE5Niw3IEBADQogCQl9DQogI2VuZGlm
DQogCX0NCi0JZnJlZSgoQU5ZICopb3ApOw0KKwlQeU9iamVjdF9EZWwoKFB5T2JqZWN0ICop
b3ApOw0KIGRvbmU6DQogCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKG9wKQ0KIH0NCkBAIC00MDEs
NiArNDA0LDIyIEBADQogCXJldHVybiAoUHlPYmplY3QgKikgbnA7DQogfQ0KIA0KKyNpZmRl
ZiBXSVRIX0NZQ0xFX0dDDQorc3RhdGljIGludA0KK3R1cGxlcmVjdXJzZShQeVR1cGxlT2Jq
ZWN0ICpvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmNsb3N1cmUpDQorew0KKwlpbnQgaTsN
CisJUHlPYmplY3QgKng7DQorDQorCWZvciAoaSA9IG8tPm9iX3NpemU7IC0taSA+PSAwOyAp
IHsNCisJCXggPSBvLT5vYl9pdGVtW2ldOw0KKwkJaWYgKHggIT0gTlVMTCAmJiAhdmlzaXQo
eCwgY2xvc3VyZSkpDQorCQkJcmV0dXJuIDA7DQorCX0NCisJcmV0dXJuIDE7DQorfQ0KKyNl
bmRpZiAvKiBXSVRIX0NZQ0xFX0dDICovDQorDQogc3RhdGljIFB5U2VxdWVuY2VNZXRob2Rz
IHR1cGxlX2FzX3NlcXVlbmNlID0gew0KIAkoaW5xdWlyeSl0dXBsZWxlbmd0aCwgLypzcV9s
ZW5ndGgqLw0KIAkoYmluYXJ5ZnVuYyl0dXBsZWNvbmNhdCwgLypzcV9jb25jYXQqLw0KQEAg
LTQyNyw2ICs0NDYsMTYgQEANCiAJJnR1cGxlX2FzX3NlcXVlbmNlLAkvKnRwX2FzX3NlcXVl
bmNlKi8NCiAJMCwJCS8qdHBfYXNfbWFwcGluZyovDQogCShoYXNoZnVuYyl0dXBsZWhhc2gs
IC8qdHBfaGFzaCovDQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJMCwJCS8qIHRwX2NhbGwg
Ki8NCisJMCwJCS8qIHRwX3N0ciAqLw0KKwkwLAkJLyogdHBfZ2V0YXR0cm8gKi8NCisJMCwJ
CS8qIHRwX3NldGF0dHJvICovDQorCTAsCQkvKiB0cF9hc19idWZmZXIgKi8NCisJUHlfVFBG
TEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDSU5GTywJLyogdHBfZmxhZ3MgKi8N
CisJMCwJCS8qIHRwX2RvYyAqLw0KKwkocmVjdXJzZXByb2MpdHVwbGVyZWN1cnNlLAkvKiB0
cF9yZWN1cnNlICovDQorI2VuZGlmDQogfTsNCiANCiAvKiBUaGUgZm9sbG93aW5nIGZ1bmN0
aW9uIGJyZWFrcyB0aGUgbm90aW9uIHRoYXQgdHVwbGVzIGFyZSBpbW11dGFibGU6DQpAQCAt
NDQ5LDYgKzQ3OCw5IEBADQogCWludCBpOw0KIAlpbnQgc2l6ZWRpZmY7DQogDQorI2lmZGVm
IFdJVEhfQ1lDTEVfR0MNCisJUHlHQ0luZm8gKmcgPSBQWV9HQ0lORk8oKnB2KTsgDQorI2Vu
ZGlmDQogCXYgPSAoUHlUdXBsZU9iamVjdCAqKSAqcHY7DQogCWlmICh2ID09IE5VTEwgfHwg
IVB5VHVwbGVfQ2hlY2sodikgfHwgdi0+b2JfcmVmY250ICE9IDEpIHsNCiAJCSpwdiA9IDA7
DQpAQCAtNDc5LDcgKzUxMSw2IEBADQogCX0NCiAjaWYgTUFYU0FWRVNJWkUgPiAwDQogCWlm
IChuZXdzaXplID09IDAgJiYgZnJlZV90dXBsZXNbMF0pIHsNCi0JCW51bV9mcmVlX3R1cGxl
c1swXS0tOw0KIAkJc3YgPSBmcmVlX3R1cGxlc1swXTsNCiAJCXN2LT5vYl9zaXplID0gMDsN
CiAJCVB5X0lOQ1JFRihzdik7DQpAQCAtNTExLDkgKzU0MiwyMiBAQA0KIAl9IGVsc2UgDQog
I2VuZGlmCQkNCiAJew0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorCQlQeUdDX1JlbW92ZSh2
KTsNCisNCisJCWcgPSAoUHlHQ0luZm8gKikgcmVhbGxvYygoY2hhciAqKWcsIHNpemVvZigq
ZykgKyANCisJCQkJc2l6ZW9mKFB5VHVwbGVPYmplY3QpICsgDQorCQkJCW5ld3NpemUgKiBz
aXplb2YoUHlPYmplY3QgKikpOw0KKwkJaWYgKGcgPT0gTlVMTCkgew0KKwkJCXN2ID09IE5V
TEw7DQorCQl9IGVsc2Ugew0KKwkJCXN2ID0gKFB5VHVwbGVPYmplY3QgKikgUFlfR0NPQkoo
Zyk7DQorCQl9DQorI2Vsc2UNCiAJCXN2ID0gKFB5VHVwbGVPYmplY3QgKikNCiAJCQlyZWFs
bG9jKChjaGFyICopdiwNCiAJCQkJc2l6ZW9mKFB5VHVwbGVPYmplY3QpICsgbmV3c2l6ZSAq
IHNpemVvZihQeU9iamVjdCAqKSk7DQorI2VuZGlmDQogCQkqcHYgPSAoUHlPYmplY3QgKikg
c3Y7DQogCQlpZiAoc3YgPT0gTlVMTCkgew0KIAkJCVB5TWVtX0RFTCh2KTsNCkBAIC01MjIs
NiArNTY2LDkgQEANCiAJCX0NCiAJfQ0KIAlfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAq
KXN2KTsNCisjaWZkZWYgV0lUSF9DWUNMRV9HQw0KKwlQeUdDX0luc2VydCgoUHlPYmplY3Qg
Kilzdik7DQorI2VuZGlmDQogCWZvciAoaSA9IHN2LT5vYl9zaXplOyBpIDwgbmV3c2l6ZTsg
aSsrKQ0KIAkJc3YtPm9iX2l0ZW1baV0gPSBOVUxMOw0KIAlpZiAobGFzdF9pc19zdGlja3kg
JiYgc2l6ZWRpZmYgPiAwKSB7DQpAQCAtNTUxLDcgKzU5OCw3IEBADQogCQl3aGlsZSAocCkg
ew0KIAkJCXEgPSBwOw0KIAkJCXAgPSAoUHlUdXBsZU9iamVjdCAqKShwLT5vYl9pdGVtWzBd
KTsNCi0JCQlQeU1lbV9ERUwocSk7DQorCQkJUHlPYmplY3RfRGVsKChQeU9iamVjdCAqKXEp
Ow0KIAkJfQ0KIAl9DQogI2VuZGlmDQotLS0gUHl0aG9uLWN2cy9QQy9jb25maWcuYwlGcmkg
QXByICA3IDE1OjI3OjA0IDIwMDANCisrKyBQeXRob24tZ2MvUEMvY29uZmlnLmMJU2F0IEFw
ciAgOCAwMzoxMjo1OCAyMDAwDQpAQCAtNDEsNiArNDEsOSBAQA0KIGV4dGVybiB2b2lkIGlu
aXRiaW5hc2NpaSgpOw0KIGV4dGVybiB2b2lkIGluaXRjbWF0aCgpOw0KIGV4dGVybiB2b2lk
IGluaXRlcnJubygpOw0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorZXh0ZXJuIHZvaWQgaW5p
dGdjKCk7DQorI2VuZGlmDQogZXh0ZXJuIHZvaWQgaW5pdGltYWdlb3AoKTsNCiBleHRlcm4g
dm9pZCBpbml0bWF0aCgpOw0KIGV4dGVybiB2b2lkIGluaXRtZDUoKTsNCkBAIC04MCw2ICs4
Myw5IEBADQogICAgICAgICB7ImJpbmFzY2lpIiwgaW5pdGJpbmFzY2lpfSwNCiAgICAgICAg
IHsiY21hdGgiLCBpbml0Y21hdGh9LA0KICAgICAgICAgeyJlcnJubyIsIGluaXRlcnJub30s
DQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisgICAgICAgIHsiZ2MiLCBpbml0Z2N9LA0KKyNl
bmRpZg0KICAgICAgICAgeyJpbWFnZW9wIiwgaW5pdGltYWdlb3B9LA0KICAgICAgICAgeyJt
YXRoIiwgaW5pdG1hdGh9LA0KICAgICAgICAgeyJtZDUiLCBpbml0bWQ1fSwNCi0tLSBQeXRo
b24tY3ZzL1BDL2NvbmZpZy5oCVRodSBNYXIgMzAgMjI6MDI6NTMgMjAwMA0KKysrIFB5dGhv
bi1nYy9QQy9jb25maWcuaAlTYXQgQXByICA4IDAyOjI0OjAwIDIwMDANCkBAIC0zODEsNiAr
MzgxLDkgQEANCiAvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBHTlUgcmVhZGxp
bmUgbGlicmFyeSAqLw0KIC8qICNkZWZpbmUgV0lUSF9SRUFETElORSAxICovDQogDQorLyog
RGVmaW5lIGlmIHlvdSB3YW50IGN5Y2xlIGdhcmJhZ2UgY29sbGVjdGlvbiAqLw0KKyNkZWZp
bmUgV0lUSF9DWUNMRV9HQyAxDQorDQogLyogRGVmaW5lIGlmIHlvdSBoYXZlIGNsb2NrLiAg
Ki8NCiAvKiAjZGVmaW5lIEhBVkVfQ0xPQ0sgKi8NCiANCi0tLSBQeXRob24tY3ZzL01ha2Vm
aWxlLmluCVN1biBBcHIgIDIgMjI6NTY6MjUgMjAwMA0KKysrIFB5dGhvbi1nYy9NYWtlZmls
ZS5pbglTYXQgQXByICA4IDAxOjM4OjI1IDIwMDANCkBAIC00MDEsNyArNDAxLDcgQEANCiAJ
CSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL01ha2VmaWxlICQoTElCUEwpL01ha2VmaWxlDQog
CQkkKElOU1RBTExfREFUQSkgTW9kdWxlcy9TZXR1cCAkKExJQlBMKS9TZXR1cA0KIAkJJChJ
TlNUQUxMX0RBVEEpIE1vZHVsZXMvU2V0dXAubG9jYWwgJChMSUJQTCkvU2V0dXAubG9jYWwN
Ci0JCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL1NldHVwLnRocmVhZCAkKExJQlBMKS9TZXR1
cC50aHJlYWQNCisJCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL1NldHVwLmF1dG8gJChMSUJQ
TCkvU2V0dXAuYXV0bw0KIAkJJChJTlNUQUxMX1BST0dSQU0pICQoc3JjZGlyKS9Nb2R1bGVz
L21ha2VzZXR1cCAkKExJQlBMKS9tYWtlc2V0dXANCiAJCSQoSU5TVEFMTF9QUk9HUkFNKSAk
KHNyY2RpcikvaW5zdGFsbC1zaCAkKExJQlBMKS9pbnN0YWxsLXNoDQogCQkkKElOU1RBTExf
REFUQSkgJChzcmNkaXIpL01pc2MvTWFrZWZpbGUucHJlLmluICQoTElCUEwpL01ha2VmaWxl
LnByZS5pbg0KLS0tIFB5dGhvbi1jdnMvY29uZmlnLmguaW4JRnJpIE1hciAyNCAyMjozMTo0
MiAyMDAwDQorKysgUHl0aG9uLWdjL2NvbmZpZy5oLmluCVNhdCBBcHIgIDggMDE6Mzg6MjUg
MjAwMA0KQEAgLTIwNCw2ICsyMDQsOSBAQA0KICAgIChzaGFyZWQgbGlicmFyeSBwbHVzIGFj
Y2Vzc29yeSBmaWxlcykuICovDQogI3VuZGVmIFdJVEhfTkVYVF9GUkFNRVdPUksNCiANCisv
KiBEZWZpbmUgaWYgeW91IHdhbnQgY3ljbGUgZ2FyYmFnZSBjb2xsZWN0aW9uICovDQorI3Vu
ZGVmIFdJVEhfQ1lDTEVfR0MNCisNCiAvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGFuIG9m
Zl90LiAqLw0KICN1bmRlZiBTSVpFT0ZfT0ZGX1QNCiANCi0tLSBQeXRob24tY3ZzL2NvbmZp
Z3VyZS5pbglTdW4gQXByICAyIDIyOjU2OjI1IDIwMDANCisrKyBQeXRob24tZ2MvY29uZmln
dXJlLmluCVNhdCBBcHIgIDggMDE6Mzg6MjUgMjAwMA0KQEAgLTEwNjksMTAgKzEwNjksMjEg
QEANCiBmaV0sDQogW0FDX01TR19SRVNVTFQobm8pXSkNCiANCitBQ19TVUJTVChVU0VfR0Nf
TU9EVUxFKQ0KK1VTRV9HQ19NT0RVTEU9IiMiDQorDQorQUNfTVNHX0NIRUNLSU5HKGZvciAt
LXdpdGgtY3ljbGUtZ2MpDQorQUNfQVJHX1dJVEgoY3ljbGUtZ2MsIFstLXdpdGgtY3ljbGUt
Z2MgICAgICAgICAgIGVuYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb25dLCBbDQorQUNfTVNHX1JF
U1VMVCgkd2l0aHZhbCkNCitBQ19ERUZJTkUoV0lUSF9DWUNMRV9HQykNCitVU0VfR0NfTU9E
VUxFPQ0KK10sDQorQUNfTVNHX1JFU1VMVChubykpDQorDQogIyBnZW5lcmF0ZSBvdXRwdXQg
ZmlsZXMNCiBBQ19PVVRQVVQoTWFrZWZpbGUgXA0KICBPYmplY3RzL01ha2VmaWxlIFwNCiAg
UGFyc2VyL01ha2VmaWxlIFwNCiAgUHl0aG9uL01ha2VmaWxlIFwNCiAgTW9kdWxlcy9NYWtl
ZmlsZS5wcmUgXA0KLSBNb2R1bGVzL1NldHVwLnRocmVhZCkNCisgTW9kdWxlcy9TZXR1cC5h
dXRvKQ0KLS0tIFB5dGhvbi1jdnMvTWlzYy9NYWtlZmlsZS5wcmUuaW4JV2VkIERlYyAgOSAx
MDowNTozMyAxOTk4DQorKysgUHl0aG9uLWdjL01pc2MvTWFrZWZpbGUucHJlLmluCVNhdCBB
cHIgIDggMDE6Mzg6MjUgMjAwMA0KQEAgLTE2OCw3ICsxNjgsNyBAQA0KIE1BS0VGSUxFPQkk
KExJQlBMKS9NYWtlZmlsZQ0KIENPTkZJR0M9CSQoTElCUEwpL2NvbmZpZy5jDQogQ09ORklH
Q0lOPQkkKExJQlBMKS9jb25maWcuYy5pbg0KLVNFVFVQPQkJJChMSUJQTCkvU2V0dXAudGhy
ZWFkICQoTElCUEwpL1NldHVwLmxvY2FsICQoTElCUEwpL1NldHVwDQorU0VUVVA9CQkkKExJ
QlBMKS9TZXR1cC5hdXRvICQoTElCUEwpL1NldHVwLmxvY2FsICQoTElCUEwpL1NldHVwDQog
DQogU1lTTElCUz0JJChMSUJNKSAkKExJQkMpDQogDQotLS0gUHl0aG9uLWN2cy9Nb2R1bGVz
L01ha2VmaWxlLnByZS5pbglGcmkgTWFyIDI0IDIyOjMyOjI1IDIwMDANCisrKyBQeXRob24t
Z2MvTW9kdWxlcy9NYWtlZmlsZS5wcmUuaW4JU2F0IEFwciAgOCAwMTozODoyNSAyMDAwDQpA
QCAtMTQ3LDEwICsxNDcsMTAgQEANCiAjIGdldHMgcmVtYWRlIGZyb20gc2NyYXRjaDsgdGhp
cyBlbnN1cmVzIHRvIHJlbW92ZSBtb2R1bGVzIHRoYXQgYXJlIG5vDQogIyBsb25nZXIgcGVy
dGluZW50IChidXQgdGhhdCB3ZXJlIGluIGEgcHJldmlvdXMgY29uZmlndXJhdGlvbikuDQog
Y29uZmlnLmMgTWFrZWZpbGU6IE1ha2VmaWxlLnByZSBjb25maWcuYy5pbiAkKE1BS0VTRVRV
UCkNCi1jb25maWcuYyBNYWtlZmlsZTogU2V0dXAudGhyZWFkIFNldHVwIFNldHVwLmxvY2Fs
DQorY29uZmlnLmMgTWFrZWZpbGU6IFNldHVwLmF1dG8gU2V0dXAgU2V0dXAubG9jYWwNCiBj
b25maWcuYyBNYWtlZmlsZToNCiAJCS1ybSAtZiAkKExJQlJBUlkpDQotCQkkKFNIRUxMKSAk
KE1BS0VTRVRVUCkgU2V0dXAudGhyZWFkIFNldHVwLmxvY2FsIFNldHVwDQorCQkkKFNIRUxM
KSAkKE1BS0VTRVRVUCkgU2V0dXAuYXV0byBTZXR1cC5sb2NhbCBTZXR1cA0KIA0KIGhhc3Np
Z25hbDoNCiAJCS1ybSAtZiBoYXNzaWduYWwNCi0tLSBQeXRob24tY3ZzL01vZHVsZXMvU2V0
dXAuaW4JU3VuIEFwciAgMiAyMjo1NjozNyAyMDAwDQorKysgUHl0aG9uLWdjL01vZHVsZXMv
U2V0dXAuaW4JU2F0IEFwciAgOCAwMTozODoyNSAyMDAwDQpAQCAtMTAwLDcgKzEwMCw3IEBA
DQogR0xIQUNLPS1EY2xlYXI9X19HTGNsZWFyDQogI2dsIGdsbW9kdWxlLmMgY2dlbnN1cHBv
cnQuYyAtSSQoc3JjZGlyKSAkKEdMSEFDSykgLWxnbCAtbFgxMQ0KIA0KLSMgVGhlIHRocmVh
ZCBtb2R1bGUgaXMgbm93IGF1dG9tYXRpY2FsbHkgZW5hYmxlZCwgc2VlIFNldHVwLnRocmVh
ZC4NCisjIFRoZSB0aHJlYWQgbW9kdWxlIGlzIG5vdyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQs
IHNlZSBTZXR1cC5hdXRvLg0KIA0KICMgUHVyZSBtb2R1bGUuICBDYW5ub3QgYmUgbGlua2Vk
IGR5bmFtaWNhbGx5Lg0KICMgLURXSVRIX1FVQU5USUZZLCAtRFdJVEhfUFVSSUZZLCBvciAt
RFdJVEhfQUxMX1BVUkUNCi0tLSBQeXRob24tY3ZzL01vZHVsZXMvU2V0dXAuYXV0by5pbg0K
KysrIFB5dGhvbi1nYy9Nb2R1bGVzL1NldHVwLmF1dG8uaW4JU2F0IEFwciAgOCAwMTozODoy
NSAyMDAwDQpAQCAtMCwwICsxLDE2IEBADQorIyBUaGlzIGZpbGUgaXMgdHJhbnNtb2dyaWZp
ZWQgaW50byBTZXR1cC5hdXRvIGJ5IGNvbmZpZy5zdGF0dXMuICBJdHMNCisjIHB1cnBvc2Ug
aXMgdG8gYXV0b21hdGljYWxseSBlbmFibGUgbW9kdWxlcyBnaXZlbiB3aGVuIGNlcnRhaW4N
CisjIGFyZ3VtZW50cyBhcmUgZ2l2ZW4gdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuICBJdCBy
ZXBsYWNlcyB0aGUgb2xkDQorIyBTZXR1cC50aHJlYWQuaW4gZmlsZS4NCisNCisjIEluY2x1
ZGUgdGhlIHRocmVhZCBtb2R1bGUgd2hlbiB0aGUgLS13aXRoLXRocmVhZCBhcmd1bWVudCBp
cyBnaXZlbiB0bw0KKyMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuDQorIw0KKyMgKk5PVEUqOiBp
ZiB0aGUgY29uZmlndXJlIHNjcmlwdCBkZWNpZGVzIGl0IGNhbid0IHN1cHBvcnQgdGhyZWFk
cywgdGhlDQorIyB0aHJlYWQgbW9kdWxlIHdpbGwgc3RpbGwgYmUgZW5hYmxlZCBhbmQgY2F1
c2UgY29tcGlsZSBlcnJvcnMuICBUaGUNCisjIHNvbHV0aW9uIGlzIG5vdCB0byB1c2UgLS13
aXRoLXRocmVhZCBvbiBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0DQorIyB0aHJlYWRz
Lg0KK0BVU0VfVEhSRUFEX01PRFVMRUB0aHJlYWQgdGhyZWFkbW9kdWxlLmMNCisNCisjIEdh
cmJhZ2UgY29sbGVjdGlvbiBlbmFibGVkIHdpdGggLS13aXRoLWN5Y2xlLWdjDQorQFVTRV9H
Q19NT0RVTEVAZ2MgZ2Ntb2R1bGUuYw0KLS0tIFB5dGhvbi1jdnMvTGliL3Rlc3QvdGVzdF9n
Yy5weQ0KKysrIFB5dGhvbi1nYy9MaWIvdGVzdC90ZXN0X2djLnB5CVNhdCBBcHIgIDggMDM6
MjU6MjUgMjAwMA0KQEAgLTAsMCArMSw5MCBAQA0KK2ltcG9ydCBnYw0KKw0KK2RlZiB0ZXN0
X2xpc3QoKToNCisgICAgbCA9IFtdDQorICAgIGwuYXBwZW5kKGwpDQorICAgIHByaW50ICds
aXN0IDB4JXgnICUgaWQobCkNCisgICAgZ2MuY29sbGVjdCgpDQorICAgIGRlbCBsDQorICAg
IGFzc2VydCBnYy5jb2xsZWN0KCkgPT0gMQ0KKw0KK2RlZiB0ZXN0X2RpY3QoKToNCisgICAg
ZCA9IHt9DQorICAgIGRbMV0gPSBkDQorICAgIHByaW50ICdkaWN0IDB4JXgnICUgaWQoZCkN
CisgICAgZ2MuY29sbGVjdCgpDQorICAgIGRlbCBkDQorICAgIGFzc2VydCBnYy5jb2xsZWN0
KCkgPT0gMQ0KKw0KK2RlZiB0ZXN0X3R1cGxlKCk6DQorICAgIGwgPSBbXQ0KKyAgICB0ID0g
KGwsKQ0KKyAgICBsLmFwcGVuZCh0KQ0KKyAgICBwcmludCAnbGlzdCAweCV4JyAlIGlkKGwp
DQorICAgIHByaW50ICd0dXBsZSAweCV4JyAlIGlkKHQpDQorICAgIGdjLmNvbGxlY3QoKQ0K
KyAgICBkZWwgdA0KKyAgICBkZWwgbA0KKyAgICBhc3NlcnQgZ2MuY29sbGVjdCgpID09IDIN
CisNCitkZWYgdGVzdF9jbGFzcygpOg0KKyAgICBjbGFzcyBBOg0KKyAgICAgICAgcGFzcw0K
KyAgICBBLmEgPSBBDQorICAgIHByaW50ICdjbGFzcyAweCV4JyAlIGlkKEEpDQorICAgIGdj
LmNvbGxlY3QoKQ0KKyAgICBkZWwgQQ0KKyAgICBhc3NlcnQgZ2MuY29sbGVjdCgpID09IDIN
CisNCitkZWYgdGVzdF9pbnN0YW5jZSgpOg0KKyAgICBjbGFzcyBBOg0KKyAgICAgICAgcGFz
cw0KKyAgICBhID0gQSgpDQorICAgIGEuYSA9IGENCisgICAgcHJpbnQgcmVwcihhKQ0KKyAg
ICBnYy5jb2xsZWN0KCkNCisgICAgZGVsIGENCisgICAgYXNzZXJ0IGdjLmNvbGxlY3QoKSA9
PSAyDQorDQorZGVmIHRlc3RfZmluYWxpemVyKCk6DQorICAgIGNsYXNzIEE6DQorICAgICAg
ICBkZWYgX19kZWxfXyhzZWxmKTogcGFzcw0KKyAgICBjbGFzcyBCOg0KKyAgICAgICAgcGFz
cw0KKyAgICBhID0gQSgpDQorICAgIGEuYSA9IGENCisgICAgaWRfYSA9IGlkKGEpDQorICAg
IGIgPSBCKCkNCisgICAgYi5iID0gYg0KKyAgICBwcmludCAnYScsIHJlcHIoYSkNCisgICAg
cHJpbnQgJ2InLCByZXByKGIpDQorICAgIGdjLmNvbGxlY3QoKQ0KKyAgICBnYy5nYXJiYWdl
WzpdID0gW10NCisgICAgZGVsIGENCisgICAgZGVsIGINCisgICAgYXNzZXJ0IGdjLmNvbGxl
Y3QoKSA9PSA0DQorICAgIGFzc2VydCBpZChnYy5nYXJiYWdlWzBdKSA9PSBpZF9hDQorDQor
ZGVmIHRlc3RfZnVuY3Rpb24oKToNCisgICAgZCA9IHt9DQorICAgIGV4ZWMoImRlZiBmKCk6
IHBhc3NcbiIpIGluIGQNCisgICAgcHJpbnQgJ2RpY3QgMHgleCcgJSBpZChkKQ0KKyAgICBw
cmludCAnZnVuYyAweCV4JyAlIGlkKGRbJ2YnXSkNCisgICAgZ2MuY29sbGVjdCgpDQorICAg
IGRlbCBkDQorICAgIGFzc2VydCBnYy5jb2xsZWN0KCkgPT0gMg0KKw0KKw0KK2RlZiB0ZXN0
X2FsbCgpOg0KKyAgICBkZWJ1ZyA9IGdjLmdldF9kZWJ1ZygpDQorICAgIGdjLnNldF9kZWJ1
ZyhnYy5ERUJVR19MRUFLIHwgZ2MuREVCVUdfU1RBVFMpDQorICAgIHRlc3RfbGlzdCgpDQor
ICAgIHRlc3RfZGljdCgpDQorICAgIHRlc3RfdHVwbGUoKQ0KKyAgICB0ZXN0X2NsYXNzKCkN
CisgICAgdGVzdF9pbnN0YW5jZSgpDQorICAgIHRlc3RfZmluYWxpemVyKCkNCisgICAgdGVz
dF9mdW5jdGlvbigpDQorICAgIGdjLnNldF9kZWJ1ZyhkZWJ1ZykNCisNCit0ZXN0X2FsbCgp
DQotLS0gUHl0aG9uLWN2cy9QQ2J1aWxkL3B5dGhvbjE2LmRzcAlGcmkgQXByICA3IDE1OjI3
OjA0IDIwMDANCisrKyBQeXRob24tZ2MvUENidWlsZC9weXRob24xNi5kc3AJU2F0IEFwciAg
OCAwMjoyMjo0OCAyMDAwDQpAQCAtNjQ1LDYgKzY0NSwyMSBAQA0KICMgRW5kIFNvdXJjZSBG
aWxlDQ0KICMgQmVnaW4gU291cmNlIEZpbGUNDQogDQ0KK1NPVVJDRT0uLlxNb2R1bGVzXGdj
bW9kdWxlLmMNDQorDQ0KKyFJRiAgIiQoQ0ZHKSIgPT0gInB5dGhvbjE2IC0gV2luMzIgUmVs
ZWFzZSINDQorDQ0KKyFFTFNFSUYgICIkKENGRykiID09ICJweXRob24xNiAtIFdpbjMyIERl
YnVnIg0NCisNDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInB5dGhvbjE2IC0gV2luMzIgQWxw
aGEgRGVidWciDQ0KKw0NCishRUxTRUlGICAiJChDRkcpIiA9PSAicHl0aG9uMTYgLSBXaW4z
MiBBbHBoYSBSZWxlYXNlIg0NCisNDQorIUVORElGIA0NCisNDQorIyBFbmQgU291cmNlIEZp
bGUNDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0NCisNDQogU09VUkNFPS4uXFB5dGhvblxnZXRh
cmdzLmMNDQogDQ0KICFJRiAgIiQoQ0ZHKSIgPT0gInB5dGhvbjE2IC0gV2luMzIgUmVsZWFz
ZSIN