[Patches] Patch 200%+ speedup of threads on Win32

Alan Klietz Alan Klietz" <alank@algintech.com
Sat, 13 May 2000 02:11:24 -0500


This is a multi-part message in MIME format.

------=_NextPart_000_000F_01BFBC80.8A0914F0
Content-Type: text/plain;
	charset="Windows-1252"
Content-Transfer-Encoding: 7bit

I was all set to send you a cool patch to thread_nt.h that eliminates the
round-trip into the kernel when acquiring an unclaimed lock on Windows
NT/9x.  The script runs in 25 seconds under the old method; under the new
method it runs in 9 seconds.  This was measured on a 450Mhz Pentium III.
Basically, the patch greatly speeds up the interpreter lock.

And now I find you guys did the same thing 7 days earlier!   Drat.

Well, my version doesn't depend on InterlockedCompareExchange(), which is
not available on Win95.  It also runs a bit faster (IMHO)  :-)

Alan Klietz
Algin Technology
alank@algintech.com

----------------------------------------------------------------------------
----
#include <stddisclaimer>

I confirm that, to the best of my knowledge and belief, this
contribution is free of any claims of third parties under
copyright, patent or other rights or interests ("claims").  To
the extent that I have any such claims, I hereby grant to CNRI a
nonexclusive, irrevocable, royalty-free, worldwide license to
reproduce, distribute, perform and/or display publicly, prepare
derivative versions, and otherwise use this contribution as part
of the Python software and its related documentation, or any
derivative versions thereof, at no cost to CNRI or its licensed
users, and to authorize others to do so.

I acknowledge that CNRI may, at its sole discretion, decide
whether or not to incorporate this contribution in the Python
software and its related documentation.  I further grant CNRI
permission to use my name and other identifying information
provided to CNRI by me for use in connection with the Python
software and its related documentation.


----------------------------------------------------------------------------
----


------=_NextPart_000_000F_01BFBC80.8A0914F0
Content-Type: application/x-tar;
	name="thread_nt.tar"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
	filename="thread_nt.tar"

Li8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc3NyAAMDAwMDAx
IAAwMDAwMDIgADAwMDAwMDAwMDAwIDA3MTA3MTcxNzM0IDAwNDY3MyAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu
L3RocmVhZF9jcHUucHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAxNzc3IAAwMDAwMDEg
ADAwMDAwMiAAMDAwMDAwMDIxMDAgMDcxMDcxNzE1NjIgMDA3MzY0IAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMN
CiMgVGVzdCB0aGUgQ1BVIG92ZXJoZWFkIG9mIHRoZSBpbnRlcnByZXRlciBsb2NrLg0KIyBXZSBj
cmVhdGUgYSBzaW5nbGUgdGhyZWFkIHRoYXQgYnVybnMgQ1BVIHdoaWxlIHRoZSBtYWluIHRocmVh
ZCB3YWl0cy4NCiMNCiMgRXhlY3V0aW9uIHRpbWUgd2l0aG91dCB0aGUgSW50ZWwgc3BpbmxvY2s6
IDI1IHNlYw0KIyBFeGVjdXRpb24gdGltZSB3aXRoIHRoZSBJbnRlbCBzcGlubG9jazogOSBzZWMN
CiMNCiMgU2VlIHRocmVhZF9udC5oLlBBVENIDQojDQojIFRpbWVzIG1lYXN1cmVkIG9uIGEgNDUw
TWh6IFBlbnRpdW0gSUlJDQojIDEyIE1heSAwMCBhbGFua0BhbGdpbnRlY2guY29tIA0KIw0KDQpp
bXBvcnQgdGhyZWFkLHN5cw0KDQpudW10YXNrcyA9IDENCnJ1bm5pbmcgPSAwDQoNCm11dGV4ID0g
dGhyZWFkLmFsbG9jYXRlX2xvY2soKQ0KZG9uZSA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkNCmRv
bmUuYWNxdWlyZSgpDQoNCmRlZiB0YXNrKGlkZW50KToNCglnbG9iYWwgcnVubmluZw0KCXByaW50
ICdSdW5uaW5nIHRhc2sgJWQnICUgaWRlbnQNCglhID0gMQ0KCWZvciB4IGluIHhyYW5nZSgxLDUw
MDAwMDApOg0KCQlhID0gYSArIDINCg0KCXByaW50ICdUYXNrICVkIGRvbmUnICUgaWRlbnQNCg0K
CW11dGV4LmFjcXVpcmUoKQ0KCXJ1bm5pbmcgPSBydW5uaW5nIC0gMQ0KCWlmIHJ1bm5pbmcgPT0g
MDoNCgkJZG9uZS5yZWxlYXNlKCkNCgltdXRleC5yZWxlYXNlKCkNCg0KbmV4dF9pZGVudCA9IDAN
CmRlZiBuZXd0YXNrKCk6DQoJZ2xvYmFsIG5leHRfaWRlbnQsIHJ1bm5pbmcNCgltdXRleC5hY3F1
aXJlKCkNCgluZXh0X2lkZW50ID0gbmV4dF9pZGVudCArIDENCglwcmludCAnY3JlYXRpbmcgdGFz
aycsIG5leHRfaWRlbnQNCgl0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCh0YXNrLCAobmV4dF9pZGVu
dCwpKQ0KCXJ1bm5pbmcgPSBydW5uaW5nICsgMQ0KCW11dGV4LnJlbGVhc2UoKQ0KDQpmb3IgaSBp
biByYW5nZShudW10YXNrcyk6DQoJbmV3dGFzaygpDQoNCnByaW50ICd3YWl0aW5nIGZvciBhbGwg
dGFza3MgdG8gY29tcGxldGUnDQpkb25lLmFjcXVpcmUoKQ0KcHJpbnQgJ2FsbCB0YXNrcyBkb25l
Jw0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4vdGhy
ZWFkX250LmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDE3NzcgADAwMDAwMSAAMDAw
MDAyIAAwMDAwMDAyNzY1MCAwNzEwNzE3NzA1MiAwMDcwMzYgAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQpD
b3B5cmlnaHQgMTk5MS0xOTk1IGJ5IFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bSwgQW1z
dGVyZGFtLA0KVGhlIE5ldGhlcmxhbmRzLg0KDQogICAgICAgICAgICAgICAgICAgICAgICBBbGwg
UmlnaHRzIFJlc2VydmVkDQoNClBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBk
aXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cw0KZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1
cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLA0KcHJvdmlkZWQgdGhhdCB0
aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdA0K
Ym90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBw
ZWFyIGluDQpzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBT
dGljaHRpbmcgTWF0aGVtYXRpc2NoDQpDZW50cnVtIG9yIENXSSBvciBDb3Jwb3JhdGlvbiBmb3Ig
TmF0aW9uYWwgUmVzZWFyY2ggSW5pdGlhdGl2ZXMgb3INCkNOUkkgbm90IGJlIHVzZWQgaW4gYWR2
ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8NCmRpc3RyaWJ1dGlvbiBvZiB0aGUg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcg0KcGVybWlzc2lvbi4NCg0K
V2hpbGUgQ1dJIGlzIHRoZSBpbml0aWFsIHNvdXJjZSBmb3IgdGhpcyBzb2Z0d2FyZSwgYSBtb2Rp
ZmllZCB2ZXJzaW9uDQppcyBtYWRlIGF2YWlsYWJsZSBieSB0aGUgQ29ycG9yYXRpb24gZm9yIE5h
dGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzDQooQ05SSSkgYXQgdGhlIEludGVybmV0IGFkZHJl

c3MgZnRwOi8vZnRwLnB5dGhvbi5vcmcuDQoNClNUSUNIVElORyBNQVRIRU1BVElTQ0ggQ0VOVFJV
TSBBTkQgQ05SSSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIDQpSRUdBUkQgVE8gVEhJUyBT
T0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YNCk1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgU1RJQ0hUSU5HIE1BVEhFTUFUSVND
SA0KQ0VOVFJVTSBPUiBDTlJJIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9S
IENPTlNFUVVFTlRJQUwNCkRBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJ
TkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUg0KUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJ
T04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVINClRPUlRJT1VTIEFDVElPTiwgQVJJ
U0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INClBFUkZPUk1BTkNF
IE9GIFRISVMgU09GVFdBUkUuDQoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogT3JpZ2luYWwgdmVyc2lvbiBi
eSBEYWcuR3J1bmVhdUBlbHNhLnByZXNlY28uY29tbS5zZS4gKi8NCi8qIFVwZGF0ZWQgZm9yIGZh
c3RlciBsb2NraW5nIGJ5IGFsYW5rQGFsZ2ludGVjaC5jb20gMTIgTWF5IDAwLiAqLw0KDQojZGVm
aW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gLyogZXhjbHVkZSByYXJlbHkgdXNlZCBpbmNsdWRlIGZp
bGVzICovDQojaW5jbHVkZSA8d2luZG93cy5oPg0KI2luY2x1ZGUgPGxpbWl0cy5oPg0KI2luY2x1
ZGUgPHByb2Nlc3MuaD4NCg0KI2luY2x1ZGUgIm15bWFsbG9jLmgiIC8qIGZvciBQeU1lbV9ORVco
KSBhbmQgUHlNZW1fREVMKCkgKi8NCg0KLyojZGVmaW5lIFBZX0RFQlVHX05UX1RIUkVBRFMqLw0K
DQojaWZkZWYgUFlfREVCVUdfTlRfVEhSRUFEUw0KIyB1bmRlZiBkcHJpbnRmDQojIGRlZmluZSBk
cHJpbnRmKGFyZ3MpIChwcmludGYgYXJncykNCiMgaWZuZGVmIFB5X0RFQlVHDQojICBkZWZpbmUg
UHlfREVCVUcNCiMgZW5kaWYNCiNlbmRpZg0KDQoNCmxvbmcgUHlUaHJlYWRfZ2V0X3RocmVhZF9p
ZGVudCh2b2lkKTsNCg0KLyoNCiAqIENoYW5nZSBhbGwgaGVhZGVycyB0byBwdXJlIEFOU0kgYXMg
bm8gb25lIHdpbGwgdXNlIEsmUiBzdHlsZSBvbiBhbg0KICogTlQNCiAqLw0KDQovKg0KICogSW5p
dGlhbGl6YXRpb24gb2YgdGhlIEMgcGFja2FnZSwgc2hvdWxkIG5vdCBiZSBuZWVkZWQuDQogKi8N
CnN0YXRpYyB2b2lkIFB5VGhyZWFkX19pbml0X3RocmVhZCh2b2lkKQ0Kew0KfQ0KDQovKg0KICog
VGhyZWFkIHN1cHBvcnQuDQogKi8NCmludCBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQg
KCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpDQp7DQoJbG9uZyBydjsNCglpbnQgc3VjY2VzcyA9
IDA7DQoNCglkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxu
IiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7DQoJaWYgKCFpbml0aWFsaXplZCkNCgkJ
UHlUaHJlYWRfaW5pdF90aHJlYWQoKTsNCg0KCXJ2ID0gX2JlZ2ludGhyZWFkKGZ1bmMsIDAsIGFy
Zyk7IC8qIHVzZSBkZWZhdWx0IHN0YWNrIHNpemUgKi8NCiANCglpZiAocnYgIT0gLTEpIHsNCgkJ
c3VjY2VzcyA9IDE7DQoJCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQg
c3VjY2VlZGVkOiAlbGRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgcnYpKTsNCgl9
DQoNCglyZXR1cm4gc3VjY2VzczsNCn0NCg0KLyoNCiAqIFJldHVybiB0aGUgdGhyZWFkIElkIGlu
c3RlYWQgb2YgYW4gaGFuZGxlLiBUaGUgSWQgaXMgc2FpZCB0byB1bmlxdWVseSBpZGVudGlmeSB0
aGUNCiAqIHRocmVhZCBpbiB0aGUgc3lzdGVtDQogKi8NCmxvbmcgUHlUaHJlYWRfZ2V0X3RocmVh
ZF9pZGVudCh2b2lkKQ0Kew0KCWlmICghaW5pdGlhbGl6ZWQpDQoJCVB5VGhyZWFkX2luaXRfdGhy
ZWFkKCk7DQogICAgICAgIA0KCXJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsNCn0NCg0Kc3Rh
dGljIHZvaWQgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoaW50IG5vX2NsZWFudXApDQp7DQoJZHBy
aW50ZigoIiVsZDogUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRf
dGhyZWFkX2lkZW50KCkpKTsNCglpZiAoIWluaXRpYWxpemVkKQ0KCQlpZiAobm9fY2xlYW51cCkN
CgkJCV9leGl0KDApOw0KCQllbHNlDQoJCQlleGl0KDApOw0KCV9lbmR0aHJlYWQoKTsNCn0NCg0K
dm9pZCBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKQ0Kew0KCWRvX1B5VGhyZWFkX2V4aXRfdGhy
ZWFkKDApOw0KfQ0KDQp2b2lkIFB5VGhyZWFkX19leGl0X3RocmVhZCh2b2lkKQ0Kew0KCWRvX1B5
VGhyZWFkX2V4aXRfdGhyZWFkKDEpOw0KfQ0KDQojaWZuZGVmIE5PX0VYSVRfUFJPRw0Kc3RhdGlj
IHZvaWQgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMsIGludCBub19jbGVhbnVwKQ0K
ew0KCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7
DQoJaWYgKCFpbml0aWFsaXplZCkNCgkJaWYgKG5vX2NsZWFudXApDQoJCQlfZXhpdChzdGF0dXMp
Ow0KCQllbHNlDQoJCQlleGl0KHN0YXR1cyk7DQp9DQoNCnZvaWQgUHlUaHJlYWRfZXhpdF9wcm9n
KGludCBzdGF0dXMpDQp7DQoJZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7DQp9DQoN
CnZvaWQgUHlUaHJlYWRfX2V4aXRfcHJvZyBfUDEoaW50IHN0YXR1cykNCnsNCglkb19QeVRocmVh
ZF9leGl0X3Byb2coc3RhdHVzLCAxKTsNCn0NCiNlbmRpZiAvKiBOT19FWElUX1BST0cgKi8NCg0K
LyoNCiAqIFdpbjMyIGxvY2sgc3VwcG9ydC4NCiAqIA0KICogSW1wbGVtZW50IHVzaW5nIENQVSBz
cGluIGxvY2tzIGluc3RlYWQgb2Yga2VybmVsIGNhbGxzLA0KICogZm9yIHNwZWVkLg0KICoNCiAq
IDEyIE1heSAwMCBhbGFua0BhbGdpbnRlY2guY29tDQogKi8NCg0KLyogSW5saW5lIG9uIEludGVs
IHByb2Nlc3NvcnMgKi8NCiNpZmRlZiBfTV9JWDg2DQojIGRlZmluZSBJbnRlcmxvY2tlZEV4Y2hh
bmdlIEludGVybG9ja2VkRXhjaGFuZ2UzODYNCl9pbmxpbmUgTE9ORyBJbnRlcmxvY2tlZEV4Y2hh
bmdlMzg2KFBMT05HIHBsVGFyZ2V0LCBMT05HIGxWYWwpDQp7DQoJCV9fYXNtIG1vdiBlYXgsIGxW
YWwNCgkJX19hc20gbW92IGVieCwgW3BsVGFyZ2V0XQ0KCQlfX2FzbSBsb2NrIHhjaGcgZWF4LCBb
ZWJ4XSAgIC8qIEJhbSEgKi8NCgkJX19hc20gbW92IGxWYWwsIGVheA0KCQlyZXR1cm4gbFZhbDsN
Cn0NCiNlbmRpZiAvKiBfTV9JWDg2ICovDQoNCi8qIEdyYWIgdGhlIHNwaW4gbG9jaywgeWllbGRp
bmcgdGhlIENQVSBpZiBidXN5ICovDQovKiBPbiBvZGQtbnVtYmVyZWQgYXR0ZW1wdHMgMCw8MT4s
Miw8Mz4sLi4gZXhwbGljaXRseSB5aWVsZCBmb3IgaHlzdGVyZXNpcyAqLw0KLyogcGVyIEJpbGwg
VHV0dCAqLw0KI2RlZmluZSBQWUdSQUJXMzJMT0NLKHB3MzIsIGN1cnRocmVhZCwgbGFiZWwpIFwN
CmxhYmVsOiBsQnVzeSA9IEludGVybG9ja2VkRXhjaGFuZ2UoKFBMT05HKSYocHczMiktPm1fbEJ1
c3ksIChjdXJ0aHJlYWQpKTsgXA0KCWlmIChsQnVzeSAhPSAwKSB7IFNsZWVwKGR3U2xlZXApOyBk
d1NsZWVwID0gIWR3U2xlZXA7IGdvdG8gbGFiZWw7IH0NCg0KLyogRnJlZSB0aGUgc3BpbiBsb2Nr
ICovDQojZGVmaW5lIFBZUkVMRUFTRVczMkxPQ0socHczMikgXA0KCUludGVybG9ja2VkRXhjaGFu
Z2UoKFBMT05HKSYocHczMiktPm1fbEJ1c3ksIDApOw0KDQoNCiNkZWZpbmUgUFlfVzMyX0xPQ0tf
TUFHSUMgMHhBNUI2REVGRQ0KDQovKiBXaW4zMiBsb2NrIHN0cnVjdHVyZSAqLw0KdHlwZWRlZiBz
dHJ1Y3Qgew0KCURXT1JEIG1fZHdNYWdpYzsgLyogUGFyYW5vaWEgdG8gcHJldmVudCBoZWFwIHRy
YXNoaW5nICovDQoJdm9sYXRpbGUgTE9ORyBtX2xCdXN5OyAvKiBQeVdpbjMyTG9jayBpcyBpbiB1
c2UgKi8NCgl2b2xhdGlsZSBMT05HIG1fbExvY2tlZDsgLyogTWFpbiBsb2NrICovDQoJdm9sYXRp
bGUgTE9ORyBtX25XYWl0aW5nOyAvKiAjIG9mIHRocmVhZHMgd2FpdGluZyBvbiBsb2NrICovDQoJ
SEFORExFIG1faFNlbWFwaG9yZTsgLyogRm9yIHdhaXRpbmcgdGhyZWFkcyAqLw0KfSBQeVdpbjMy
TG9jazsNCg0KDQoNClB5VGhyZWFkX3R5cGVfbG9jayBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZv
aWQpDQp7DQoJUHlXaW4zMkxvY2sqIHBXaW4zMkxvY2s7DQoNCglpZiAoIWluaXRpYWxpemVkKQ0K
CQlQeVRocmVhZF9pbml0X3RocmVhZCgpOw0KDQoJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUg
dGhlIFdpbjMyIGxvY2sgKi8NCg0KCXBXaW4zMkxvY2sgPSBQeU1lbV9ORVcoUHlXaW4zMkxvY2ss
IDEpOw0KCXBXaW4zMkxvY2stPm1fZHdNYWdpYyA9IFBZX1czMl9MT0NLX01BR0lDOw0KCXBXaW4z
MkxvY2stPm1fbEJ1c3kgPSAwOw0KCXBXaW4zMkxvY2stPm1fbExvY2tlZCA9IDA7DQoJcFdpbjMy
TG9jay0+bV9uV2FpdGluZyA9IDA7DQoJcFdpbjMyTG9jay0+bV9oU2VtYXBob3JlID0gQ3JlYXRl
U2VtYXBob3JlKE5VTEwsDQoJCQkJMSwgLyogaW5pdGlhbCB2YWx1ZSAqLyANCgkJCQkxLCAvKiBt
YXggdmFsdWUgKi8NCgkJCQlOVUxMKTsNCg0KCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FsbG9j
YXRlX2xvY2soKSAtPiAlbHhcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgKGxvbmcp
cFdpbjMyTG9jaykpOw0KDQoJcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIHBXaW4zMkxvY2s7
DQp9DQoNCg0Kdm9pZCBQeVRocmVhZF9mcmVlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGFMb2Nr
KQ0Kew0KCVB5V2luMzJMb2NrKiBwV2luMzJMb2NrOw0KDQoJZHByaW50ZigoIiVsZDogUHlUaHJl
YWRfZnJlZV9sb2NrKCVseCkgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCks
KGxvbmcpYUxvY2spKTsNCg0KCXBXaW4zMkxvY2sgPSAoUHlXaW4zMkxvY2sqKWFMb2NrOw0KDQoJ
LyogQXNzZXJ0OiB0aGUgbG9jayBpcyBub3QgYWxyZWFkeSBmcmVlZCAqLw0KCWlmIChwV2luMzJM
b2NrLT5tX2R3TWFnaWMgIT0gUFlfVzMyX0xPQ0tfTUFHSUMpIHsNCgkJZHByaW50ZigoIiVsZDog
UHlUaHJlYWRfZnJlZV9sb2NrKCVseCkgdHJpZWQgdG8gZnJlZSBhIGZyZWVkIGxvY2shXG4iLCBQ
eVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksKGxvbmcpYUxvY2spKTsNCgkJcmV0dXJuOw0KCX0N
Cg0KCS8qIEFzc2VydDogdGhlIGxvY2sgaXMgbm90IGluIHVzZSAqLw0KCWlmIChwV2luMzJMb2Nr
LT5tX2xMb2NrZWQgIT0gMCkgew0KCQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9mcmVlX2xvY2so
JWx4KSB0cmllZCB0byBmcmVlIGEgYnVzeSBsb2NrIG93bmVkIGJ5ICVsZCFcbiIsIFB5VGhyZWFk
X2dldF90aHJlYWRfaWRlbnQoKSwobG9uZylhTG9jaywgcFdpbjMyTG9jay0+bV9sTG9ja2VkKSk7
DQoJCS8qIEZhbGwgdGhyb3VnaCBhbmQga2lsbCB0aGUgbG9jayAqLw0KCX0NCg0KCXBXaW4zMkxv
Y2stPm1fZHdNYWdpYyA9IDA7DQoJQ2xvc2VIYW5kbGUocFdpbjMyTG9jay0+bV9oU2VtYXBob3Jl
KTsNCglwV2luMzJMb2NrLT5tX2hTZW1hcGhvcmUgPSBOVUxMOw0KCVB5TWVtX0RFTChwV2luMzJM
b2NrKTsNCn0NCg0KDQovKg0KICogUmV0dXJuIDEgb24gc3VjY2VzcyBpZiB0aGUgbG9jayB3YXMg
YWNxdWlyZWQNCiAqIGFuZCAwIGlmIHRoZSBsb2NrIHdhcyBub3QgYWNxdWlyZWQuIElmIHRoZSBs
b2NrIGlzIGFscmVhZHkNCiAqIGFjcXVpcmVkIGJ5IG91ciB0aHJlYWQsIHJldHVybiAwLiAgVGhl
IGNhbGxlcnMgYXNzdW1lIHNlbWFudGljcw0KICogdGhhdCByZWN1cnNpdmUgbG9ja3MgYnkgdGhl
IHNhbWUgdGhyZWFkIHNob3VsZCBibG9jaywNCiAqIGkuZS4sIHRoZXkgYXNzdW1lIGl0IGFjdHMg
bGlrZSBhIHNlbWFwaG9yZSwgbm90IGxpa2UgYSBjcml0aWNhbCBzZWN0aW9uLg0KICoNCiAqIDEy
IE1heSAwMCBhbGFua0BhbGdpbnRlY2guY29tDQogKi8NCmludCBQeVRocmVhZF9hY3F1aXJlX2xv
Y2soUHlUaHJlYWRfdHlwZV9sb2NrIGFMb2NrLCBpbnQgd2FpdGZsYWcpDQp7DQoJUHlXaW4zMkxv
Y2sqIHBXaW4zMkxvY2s7DQoJTE9ORyBsQnVzeTsNCglEV09SRCBkd1NsZWVwID0gMDsNCglpbnQg
c3VjY2VzcyA9IDE7DQojaWZkZWYgUHlfREVCVUcNCglMT05HIGxDdXJyZW50VGhyZWFkSWQgPSBQ
eVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7DQojZW5kaWYNCg0KCWRwcmludGYoKCIlbGQ6IFB5
VGhyZWFkX2FjcXVpcmVfbG9jayglbHgsICVkKSBjYWxsZWRcbiIsIGxDdXJyZW50VGhyZWFkSWQs
IChsb25nKWFMb2NrLCB3YWl0ZmxhZykpOw0KDQoJcFdpbjMyTG9jayA9IChQeVdpbjMyTG9jayop
YUxvY2s7DQoNCgkvKiBBc3NlcnQ6IHRoZSBsb2NrIGlzIG5vdCBmcmVlZCAqLw0KCWlmIChwV2lu
MzJMb2NrLT5tX2R3TWFnaWMgIT0gUFlfVzMyX0xPQ0tfTUFHSUMpIHsNCgkJZHByaW50ZigoIiVs
ZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVseCkgdHJpZWQgdG8gYWNxdWlyZSBhIGZyZWVkIGxv
Y2shXG4iLCBsQ3VycmVudFRocmVhZElkLCAobG9uZylhTG9jaykpOw0KCQlyZXR1cm4gMDsNCgl9
DQoNCmFnYWluOiANCgkvKiBTcGluIG9uIHRoZSBwV2luMzJMb2NrIHN0cnVjdCAqLw0KCVBZR1JB
QlczMkxPQ0socFdpbjMyTG9jaywgMSwgbG9jazEpOw0KDQoJaWYgKCFwV2luMzJMb2NrLT5tX2xM
b2NrZWQpIHsgLyogV2UgZ290IGl0ISAqLw0KCQkvKiBHcmFiIHRoZSBsb2NrICovDQoJCXBXaW4z
MkxvY2stPm1fbExvY2tlZCA9IDE7IC8qIHZvbGF0aWxlICovDQoJCVBZUkVMRUFTRVczMkxPQ0so
cFdpbjMyTG9jayk7DQoJfSBlbHNlIHsgLyogQWxyZWFkeSBsb2NrZWQgKi8NCgkJaWYgKCF3YWl0
ZmxhZykgeyAvKiBQb2xsIGZhaWxlZCwgYmFpbCAqLw0KCQkJUFlSRUxFQVNFVzMyTE9DSyhwV2lu
MzJMb2NrKTsNCgkJCXN1Y2Nlc3MgPSAwOw0KCQl9IGVsc2UgeyAvKiBEcmF0LCB3ZSBuZWVkIHRv
IGJsb2NrICovDQoJCQlEV09SRCBkd1dhaXRSZXN1bHQ7DQoNCgkJCS8qIFRlbGwgdGhlIGxvY2sg
aG9sZGVyIHRvIFJlbGVhc2VTZW1hcGhvcmUoKSAqLw0KCQkJKysocFdpbjMyTG9jay0+bV9uV2Fp
dGluZyk7IC8qIHZvbGF0aWxlICovDQoJCQlQWVJFTEVBU0VXMzJMT0NLKHBXaW4zMkxvY2spOw0K
DQoJCQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hY3F1aXJlX2xvY2soJWx4KSBibG9ja2luZyBv
biBsb2NrIGhlbGQgYnkgJWxkXG4iLCBsQ3VycmVudFRocmVhZElkLCBhTG9jaywgcFdpbjMyTG9j
ay0+bV9sTG9ja2VkKSk7DQoNCgkJCS8qIEJsb2NrIHVudGlsIFJlbGVhc2VTZW1hcGhvcmUoKSAq
Lw0KCQkJZHdXYWl0UmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdChwV2luMzJMb2NrLT5tX2hT
ZW1hcGhvcmUsDQoJCQkJSU5GSU5JVEUpOw0KDQoJCQkvKiBUdXJuIG9mZiBSZWxlYXNlU2VtYXBo
b3JlKCkuICBNdXN0IGJlDQoJCQkgICBkb25lIGNhcmVmdWxseSB0byBhdm9pZCByYWNlcy4gKi8N
CgkJCVBZR1JBQlczMkxPQ0socFdpbjMyTG9jaywgMSwgbG9jazIpOw0KCQkJLS0ocFdpbjMyTG9j
ay0+bV9uV2FpdGluZyk7IC8qIHZvbGF0aWxlICovDQoJCQlQWVJFTEVBU0VXMzJMT0NLKHBXaW4z
MkxvY2spOw0KDQoJCQlpZiAoZHdXYWl0UmVzdWx0ICE9IFdBSVRfT0JKRUNUXzApIHsNCgkJCQlz
dWNjZXNzID0gMDsgLyogU2VtYXBob3JlIGNsb3NlZCwgYmFpbCAqLw0KCQkJfSBlbHNlIHsNCgkJ
CQlnb3RvIGFnYWluOyAvKiBGaWdodCBmb3IgdGhlIGxvY2sgYWdhaW4gKi8NCgkJCX0NCgkJfQ0K
CX0NCg0KCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FjcXVpcmVfbG9jayglbHgsICVkKSAtPiAl
ZFxuIiwNCgkJCWxDdXJyZW50VGhyZWFkSWQsKGxvbmcpYUxvY2ssIHdhaXRmbGFnLCBzdWNjZXNz
KSk7DQoNCglyZXR1cm4gc3VjY2VzczsNCn0NCg0KDQovKg0KICogUmVsZWFzZSB0aGUgbG9jay4g
IENhbGwgUmVsZWFzZVNlbWFwaG9yZSgpIGlmIGFuZCBvbmx5IGlmIGFub3RoZXIgdGhyZWFkDQog
KiBpcyB3YWl0aW5nLg0KICogDQogKiAxMiBNYXkgMDAgYWxhbmtAYWxnaW50ZWNoLmNvbQ0KICov
DQp2b2lkIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgYUxvY2spDQp7
DQoJUHlXaW4zMkxvY2sqIHBXaW4zMkxvY2s7DQoJTE9ORyBsQnVzeTsNCglEV09SRCBkd1NsZWVw
ID0gMDsNCiNpZmRlZiBQeV9ERUJVRw0KCUxPTkcgbEN1cnJlbnRUaHJlYWRJZCA9IFB5VGhyZWFk
X2dldF90aHJlYWRfaWRlbnQoKTsNCiNlbmRpZg0KDQoJZHByaW50ZigoIiVsZDogUHlUaHJlYWRf
cmVsZWFzZV9sb2NrKCVseCkgY2FsbGVkXG4iLCBsQ3VycmVudFRocmVhZElkLCAobG9uZylhTG9j
aykpOw0KDQoJcFdpbjMyTG9jayA9IChQeVdpbjMyTG9jayopYUxvY2s7DQoNCgkvKiBBc3NlcnQ6
IHRoZSBsb2NrIGlzIG5vdCBmcmVlZCAqLw0KCWlmIChwV2luMzJMb2NrLT5tX2R3TWFnaWMgIT0g
UFlfVzMyX0xPQ0tfTUFHSUMpIHsNCgkJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfcmVsZWFzZV9s
b2NrKCVseCkgdHJpZWQgdG8gcmVsZWFzZSBhIGZyZWVkIGxvY2shXG4iLCBsQ3VycmVudFRocmVh
ZElkLCAobG9uZylhTG9jaykpOw0KCQlyZXR1cm47DQoJfQ0KDQoJUFlHUkFCVzMyTE9DSyhwV2lu
MzJMb2NrLCAxLCBsb2NrMSk7DQoNCglpZiAoIXBXaW4zMkxvY2stPm1fbExvY2tlZCkgew0KCSAg
ICAJLyogVGhlIGxvY2sgd2FzIG5vdCBhY3F1aXJlZCBpbiB0aGUgZmlyc3QgcGxhY2UsIGh1bW0u
LiAqLw0KCQlQWVJFTEVBU0VXMzJMT0NLKHBXaW4zMkxvY2spOw0KCQlkcHJpbnRmKCgiJWxkOiBQ
eVRocmVhZF9yZWxlYXNlX2xvY2soJWx4KSB0cmllZCB0byByZWxlYXNlIGEgbG9jayB0aGF0IHdh
cyBub3QgYWNxdWlyZWQhXG4iLCBsQ3VycmVudFRocmVhZElkLCAobG9uZylhTG9jaykpOw0KCX0g
ZWxzZSB7DQoJCS8qIFJlbGVhc2UgdGhlIGxvY2sgKi8NCgkJcFdpbjMyTG9jay0+bV9sTG9ja2Vk
ID0gMDsgLyogdm9sYXRpbGUgKi8NCg0KCQlpZiAocFdpbjMyTG9jay0+bV9uV2FpdGluZykgeyAv
KiBJZiB0aHJlYWRzIGFyZSB3YWl0aW5nICovDQoJCQlQWVJFTEVBU0VXMzJMT0NLKHBXaW4zMkxv
Y2spOw0KCQkJLyogVW5ibG9jayBvbmUgd2FpdGluZyB0aHJlYWQgKi8NCgkJCVJlbGVhc2VTZW1h
cGhvcmUocFdpbjMyTG9jay0+bV9oU2VtYXBob3JlLCAxLCBOVUxMKTsNCgkJfSBlbHNlIHsNCgkJ
CVBZUkVMRUFTRVczMkxPQ0socFdpbjMyTG9jayk7DQoJCX0NCgl9DQoJcmV0dXJuOw0KfQ0KDQoN
Ci8qDQogKiBTZW1hcGhvcmUgc3VwcG9ydCAobm90IGN1cnJlbnRseSB1c2VkKS4NCiAqLw0KUHlU
aHJlYWRfdHlwZV9zZW1hIFB5VGhyZWFkX2FsbG9jYXRlX3NlbWEoaW50IHZhbHVlKQ0Kew0KCUhB
TkRMRSBhU2VtYXBob3JlOw0KDQoJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWxsb2NhdGVfc2Vt
YSBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOw0KCWlmICghaW5pdGlh
bGl6ZWQpDQoJCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7DQoNCglhU2VtYXBob3JlID0gQ3JlYXRl
U2VtYXBob3JlKCBOVUxMLCAgICAgICAgICAgLyogU2VjdXJpdHkgYXR0cmlidXRlcyAgICAgICAg
ICAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAgICAgICAgICAv
KiBJbml0aWFsIHZhbHVlICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgSU5UX01BWCwgICAgICAgIC8qIE1heGltdW0gdmFsdWUgICAgICAgICAgICAg
ICAgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAgICAg
LyogTmFtZSBvZiBzZW1hcGhvcmUgICAgICAgICAgICAqLw0KDQoJZHByaW50ZigoIiVsZDogUHlU
aHJlYWRfYWxsb2NhdGVfc2VtYSgpIC0+ICVseFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVu
dCgpLCAobG9uZylhU2VtYXBob3JlKSk7DQoNCglyZXR1cm4gKFB5VGhyZWFkX3R5cGVfc2VtYSkg
YVNlbWFwaG9yZTsNCn0NCg0Kdm9pZCBQeVRocmVhZF9mcmVlX3NlbWEoUHlUaHJlYWRfdHlwZV9z
ZW1hIGFTZW1hcGhvcmUpDQp7DQoJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZnJlZV9zZW1hKCVs
eCkgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIChsb25nKWFTZW1hcGhv
cmUpKTsNCg0KCUNsb3NlSGFuZGxlKChIQU5ETEUpIGFTZW1hcGhvcmUpOw0KfQ0KDQovKg0KICBY
WFggbXVzdCBkbyBzb21ldGhpbmcgYWJvdXQgd2FpdGZsYWcNCiAqLw0KaW50IFB5VGhyZWFkX2Rv
d25fc2VtYShQeVRocmVhZF90eXBlX3NlbWEgYVNlbWFwaG9yZSwgaW50IHdhaXRmbGFnKQ0Kew0K
CURXT1JEIHdhaXRSZXN1bHQ7DQoNCglkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9kb3duX3NlbWEo
JWx4KSBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgKGxvbmcpYVNlbWFw
aG9yZSkpOw0KDQoJd2FpdFJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QoIChIQU5ETEUpIGFT
ZW1hcGhvcmUsIElORklOSVRFKTsNCg0KCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2Rvd25fc2Vt
YSglbHgpIHJldHVybjogJWxcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwobG9uZykg
YVNlbWFwaG9yZSwgd2FpdFJlc3VsdCkpOw0KCXJldHVybiAwOw0KfQ0KDQp2b2lkIFB5VGhyZWFk
X3VwX3NlbWEoUHlUaHJlYWRfdHlwZV9zZW1hIGFTZW1hcGhvcmUpDQp7DQoJUmVsZWFzZVNlbWFw
aG9yZSgNCiAgICAgICAgICAgICAgICAoSEFORExFKSBhU2VtYXBob3JlLCAgICAgICAgICAgIC8q
IEhhbmRsZSBvZiBzZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAg
ICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNyZW1lbnQgY291
bnQgYnkgb25lICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIE5VTEwp
OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGludGVyZXN0ZWQgaW4gcHJldmlvdXMg
Y291bnQgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIA0KCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3VwX3NlbWEoJWx4KVxuIiwg
UHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCAobG9uZylhU2VtYXBob3JlKSk7DQp9DQoAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi90aHJlYWRfbnQuaC5PTEQAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADAwMTc3NyAAMDAwMDAxIAAwMDAwMDIgADAwMDAwMDE3MTM1IDA3MTA3MTQx
MDQ2IDAwNzQ0MiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCkNvcHlyaWdodCAxOTkxLTE5OTUgYnkgU3Rp
Y2h0aW5nIE1hdGhlbWF0aXNjaCBDZW50cnVtLCBBbXN0ZXJkYW0sDQpUaGUgTmV0aGVybGFuZHMu
DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQNCg0KUGVybWlz
c2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBh
bmQgaXRzDQpkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMg
aGVyZWJ5IGdyYW50ZWQsDQpwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNl
IGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0DQpib3RoIHRoYXQgY29weXJpZ2h0IG5vdGlj
ZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4NCnN1cHBvcnRpbmcgZG9jdW1l
bnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIFN0aWNodGluZyBNYXRoZW1hdGlzY2gNCkNl
bnRydW0gb3IgQ1dJIG9yIENvcnBvcmF0aW9uIGZvciBOYXRpb25hbCBSZXNlYXJjaCBJbml0aWF0
aXZlcyBvcg0KQ05SSSBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVy
dGFpbmluZyB0bw0KZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
LCB3cml0dGVuIHByaW9yDQpwZXJtaXNzaW9uLg0KDQpXaGlsZSBDV0kgaXMgdGhlIGluaXRpYWwg
c291cmNlIGZvciB0aGlzIHNvZnR3YXJlLCBhIG1vZGlmaWVkIHZlcnNpb24NCmlzIG1hZGUgYXZh
aWxhYmxlIGJ5IHRoZSBDb3Jwb3JhdGlvbiBmb3IgTmF0aW9uYWwgUmVzZWFyY2ggSW5pdGlhdGl2
ZXMNCihDTlJJKSBhdCB0aGUgSW50ZXJuZXQgYWRkcmVzcyBmdHA6Ly9mdHAucHl0aG9uLm9yZy4N
Cg0KU1RJQ0hUSU5HIE1BVEhFTUFUSVNDSCBDRU5UUlVNIEFORCBDTlJJIERJU0NMQUlNIEFMTCBX
QVJSQU5USUVTIFdJVEgNClJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElN
UExJRUQgV0FSUkFOVElFUyBPRg0KTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBF
VkVOVCBTSEFMTCBTVElDSFRJTkcgTUFUSEVNQVRJU0NIDQpDRU5UUlVNIE9SIENOUkkgQkUgTElB
QkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTA0KREFNQUdFUyBP
UiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRB
IE9SDQpQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5D
RSBPUiBPVEhFUg0KVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNU
SU9OIFdJVEggVEhFIFVTRSBPUg0KUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCg0KKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqLw0KDQovKiBUaGlzIGNvZGUgaW1wbGVtZW50ZWQgYnkgRGFnLkdydW5lYXVAZWxzYS5w
cmVzZWNvLmNvbW0uc2UgKi8NCg0KI2luY2x1ZGUgPHdpbmRvd3MuaD4NCiNpbmNsdWRlIDxsaW1p
dHMuaD4NCiNpbmNsdWRlIDxwcm9jZXNzLmg+DQoNCmxvbmcgUHlUaHJlYWRfZ2V0X3RocmVhZF9p
ZGVudCh2b2lkKTsNCg0KLyoNCiAqIENoYW5nZSBhbGwgaGVhZGVycyB0byBwdXJlIEFOU0kgYXMg
bm8gb25lIHdpbGwgdXNlIEsmUiBzdHlsZSBvbiBhbg0KICogTlQNCiAqLw0KDQovKg0KICogSW5p
dGlhbGl6YXRpb24gb2YgdGhlIEMgcGFja2FnZSwgc2hvdWxkIG5vdCBiZSBuZWVkZWQuDQogKi8N
CnN0YXRpYyB2b2lkIFB5VGhyZWFkX19pbml0X3RocmVhZCh2b2lkKQ0Kew0KfQ0KDQovKg0KICog
VGhyZWFkIHN1cHBvcnQuDQogKi8NCmludCBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQg
KCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpDQp7DQoJbG9uZyBydjsNCglpbnQgc3VjY2VzcyA9
IDA7DQoNCglkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxu
IiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7DQoJaWYgKCFpbml0aWFsaXplZCkNCgkJ
UHlUaHJlYWRfaW5pdF90aHJlYWQoKTsNCg0KCXJ2ID0gX2JlZ2ludGhyZWFkKGZ1bmMsIDAsIGFy
Zyk7IC8qIHVzZSBkZWZhdWx0IHN0YWNrIHNpemUgKi8NCiANCglpZiAocnYgIT0gLTEpIHsNCgkJ
c3VjY2VzcyA9IDE7DQoJCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQg
c3VjY2VlZGVkOiAlbGRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgcnYpKTsNCgl9
DQoNCglyZXR1cm4gc3VjY2VzczsNCn0NCg0KLyoNCiAqIFJldHVybiB0aGUgdGhyZWFkIElkIGlu
c3RlYWQgb2YgYW4gaGFuZGxlLiBUaGUgSWQgaXMgc2FpZCB0byB1bmlxdWVseSBpZGVudGlmeSB0
aGUNCiAqIHRocmVhZCBpbiB0aGUgc3lzdGVtDQogKi8NCmxvbmcgUHlUaHJlYWRfZ2V0X3RocmVh
ZF9pZGVudCh2b2lkKQ0Kew0KCWlmICghaW5pdGlhbGl6ZWQpDQoJCVB5VGhyZWFkX2luaXRfdGhy
ZWFkKCk7DQogICAgICAgIA0KCXJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsNCn0NCg0Kc3Rh
dGljIHZvaWQgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoaW50IG5vX2NsZWFudXApDQp7DQoJZHBy
aW50ZigoIiVsZDogUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRf
dGhyZWFkX2lkZW50KCkpKTsNCglpZiAoIWluaXRpYWxpemVkKQ0KCQlpZiAobm9fY2xlYW51cCkN
CgkJCV9leGl0KDApOw0KCQllbHNlDQoJCQlleGl0KDApOw0KCV9lbmR0aHJlYWQoKTsNCn0NCg0K
dm9pZCBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKQ0Kew0KCWRvX1B5VGhyZWFkX2V4aXRfdGhy
ZWFkKDApOw0KfQ0KDQp2b2lkIFB5VGhyZWFkX19leGl0X3RocmVhZCh2b2lkKQ0Kew0KCWRvX1B5
VGhyZWFkX2V4aXRfdGhyZWFkKDEpOw0KfQ0KDQojaWZuZGVmIE5PX0VYSVRfUFJPRw0Kc3RhdGlj
IHZvaWQgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMsIGludCBub19jbGVhbnVwKQ0K
ew0KCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7
DQoJaWYgKCFpbml0aWFsaXplZCkNCgkJaWYgKG5vX2NsZWFudXApDQoJCQlfZXhpdChzdGF0dXMp
Ow0KCQllbHNlDQoJCQlleGl0KHN0YXR1cyk7DQp9DQoNCnZvaWQgUHlUaHJlYWRfZXhpdF9wcm9n
KGludCBzdGF0dXMpDQp7DQoJZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7DQp9DQoN
CnZvaWQgUHlUaHJlYWRfX2V4aXRfcHJvZyBfUDEoaW50IHN0YXR1cykNCnsNCglkb19QeVRocmVh
ZF9leGl0X3Byb2coc3RhdHVzLCAxKTsNCn0NCiNlbmRpZiAvKiBOT19FWElUX1BST0cgKi8NCg0K
LyoNCiAqIExvY2sgc3VwcG9ydC4gSXQgaGFzIHRvbyBiZSBpbXBsZW1lbnRlZCBhcyBzZW1hcGhv
cmVzLg0KICogSSBbRGFnXSB0cmllZCB0byBpbXBsZW1lbnQgaXQgd2l0aCBtdXRleCBidXQgSSBj
b3VsZCBmaW5kIGEgd2F5IHRvDQogKiB0ZWxsIHdoZXRoZXIgYSB0aHJlYWQgYWxyZWFkeSBvd24g
dGhlIGxvY2sgb3Igbm90Lg0KICovDQpQeVRocmVhZF90eXBlX2xvY2sgUHlUaHJlYWRfYWxsb2Nh
dGVfbG9jayh2b2lkKQ0Kew0KCUhBTkRMRSBhTG9jazsNCg0KCWRwcmludGYoKCJQeVRocmVhZF9h
bGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOw0KCWlmICghaW5pdGlhbGl6ZWQpDQoJCVB5VGhyZWFk
X2luaXRfdGhyZWFkKCk7DQoNCgkJYUxvY2sgPSBDcmVhdGVTZW1hcGhvcmUoTlVMTCwgICAgICAg
ICAgIC8qIFNlY3VyaXR5IGF0dHJpYnV0ZXMgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAg
ICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWwgdmFsdWUgICAgICAgICAg
ICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAg
IC8qIE1heGltdW0gdmFsdWUgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAg
ICAgICBOVUxMKTsgICAgICAgDQogIC8qIE5hbWUgb2Ygc2VtYXBob3JlICAgICAgICAgICAgKi8N
Cg0KCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlbHhcbiIsIFB5
VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgKGxvbmcpYUxvY2spKTsNCg0KCXJldHVybiAoUHlU
aHJlYWRfdHlwZV9sb2NrKSBhTG9jazsNCn0NCg0Kdm9pZCBQeVRocmVhZF9mcmVlX2xvY2soUHlU
aHJlYWRfdHlwZV9sb2NrIGFMb2NrKQ0Kew0KCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2ZyZWVf
bG9jayglbHgpIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLChsb25nKWFM
b2NrKSk7DQoNCglDbG9zZUhhbmRsZSgoSEFORExFKSBhTG9jayk7DQp9DQoNCi8qDQogKiBSZXR1
cm4gMSBvbiBzdWNjZXNzIGlmIHRoZSBsb2NrIHdhcyBhY3F1aXJlZA0KICoNCiAqIGFuZCAwIGlm
IHRoZSBsb2NrIHdhcyBub3QgYWNxdWlyZWQuIFRoaXMgbWVhbnMgYSAwIGlzIHJldHVybmVkDQog
KiBpZiB0aGUgbG9jayBoYXMgYWxyZWFkeSBiZWVuIGFjcXVpcmVkIGJ5IHRoaXMgdGhyZWFkIQ0K
ICovDQppbnQgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBhTG9jaywg
aW50IHdhaXRmbGFnKQ0Kew0KCWludCBzdWNjZXNzID0gMTsNCglEV09SRCB3YWl0UmVzdWx0Ow0K
DQoJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVseCwgJWQpIGNhbGxlZFxu
IiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLChsb25nKWFMb2NrLCB3YWl0ZmxhZykpOw0K
DQoJd2FpdFJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QoKEhBTkRMRSkgYUxvY2ssICh3YWl0
ZmxhZyA9PSAxID8gSU5GSU5JVEUgOiAwKSk7DQoNCglpZiAod2FpdFJlc3VsdCAhPSBXQUlUX09C
SkVDVF8wKSB7DQoJCXN1Y2Nlc3MgPSAwOyAgICAvKiBXZSBmYWlsZWQgKi8NCgl9DQoNCglkcHJp
bnRmKCgiJWxkOiBQeVRocmVhZF9hY3F1aXJlX2xvY2soJWx4LCAlZCkgLT4gJWRcbiIsIFB5VGhy
ZWFkX2dldF90aHJlYWRfaWRlbnQoKSwobG9uZylhTG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsN
Cg0KCXJldHVybiBzdWNjZXNzOw0KfQ0KDQp2b2lkIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRo
cmVhZF90eXBlX2xvY2sgYUxvY2spDQp7DQoJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfcmVsZWFz
ZV9sb2NrKCVseCkgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksKGxvbmcp
YUxvY2spKTsNCg0KCWlmICghUmVsZWFzZVNlbWFwaG9yZSgNCiAgICAgICAgICAgICAgICAgICAg
ICAgIChIQU5ETEUpIGFMb2NrLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgb2Yg
c2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAg
ICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluY3JlbWVu
dCBjb3VudCBieSBvbmUgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAg
ICAgICAgICBOVUxMKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGlu
dGVyZXN0ZWQgaW4gcHJldmlvdXMgY291bnQgICAgICAgICAgICAgKi8NCgkJew0KCQlkcHJpbnRm
KCgiJWxkOiBDb3VsZCBub3QgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVseCkgZXJyb3I6ICVsXG4i
LCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIChsb25nKWFMb2NrLCBHZXRMYXN0RXJyb3Io
KSkpOw0KCQl9DQp9DQoNCi8qDQogKiBTZW1hcGhvcmUgc3VwcG9ydC4NCiAqLw0KUHlUaHJlYWRf
dHlwZV9zZW1hIFB5VGhyZWFkX2FsbG9jYXRlX3NlbWEoaW50IHZhbHVlKQ0Kew0KCUhBTkRMRSBh
U2VtYXBob3JlOw0KDQoJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWxsb2NhdGVfc2VtYSBjYWxs
ZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOw0KCWlmICghaW5pdGlhbGl6ZWQp
DQoJCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7DQoNCglhU2VtYXBob3JlID0gQ3JlYXRlU2VtYXBo
b3JlKCBOVUxMLCAgICAgICAgICAgLyogU2VjdXJpdHkgYXR0cmlidXRlcyAgICAgICAgICAqLw0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAgICAgICAgICAvKiBJbml0
aWFsIHZhbHVlICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgSU5UX01BWCwgICAgICAgIC8qIE1heGltdW0gdmFsdWUgICAgICAgICAgICAgICAgKi8N
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAgICAgLyogTmFt
ZSBvZiBzZW1hcGhvcmUgICAgICAgICAgICAqLw0KDQoJZHByaW50ZigoIiVsZDogUHlUaHJlYWRf
YWxsb2NhdGVfc2VtYSgpIC0+ICVseFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCAo
bG9uZylhU2VtYXBob3JlKSk7DQoNCglyZXR1cm4gKFB5VGhyZWFkX3R5cGVfc2VtYSkgYVNlbWFw
aG9yZTsNCn0NCg0Kdm9pZCBQeVRocmVhZF9mcmVlX3NlbWEoUHlUaHJlYWRfdHlwZV9zZW1hIGFT
ZW1hcGhvcmUpDQp7DQoJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZnJlZV9zZW1hKCVseCkgY2Fs
bGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIChsb25nKWFTZW1hcGhvcmUpKTsN
Cg0KCUNsb3NlSGFuZGxlKChIQU5ETEUpIGFTZW1hcGhvcmUpOw0KfQ0KDQovKg0KICBYWFggbXVz
dCBkbyBzb21ldGhpbmcgYWJvdXQgd2FpdGZsYWcNCiAqLw0KaW50IFB5VGhyZWFkX2Rvd25fc2Vt
YShQeVRocmVhZF90eXBlX3NlbWEgYVNlbWFwaG9yZSwgaW50IHdhaXRmbGFnKQ0Kew0KCURXT1JE
IHdhaXRSZXN1bHQ7DQoNCglkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9kb3duX3NlbWEoJWx4KSBj
YWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgKGxvbmcpYVNlbWFwaG9yZSkp
Ow0KDQoJd2FpdFJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QoIChIQU5ETEUpIGFTZW1hcGhv
cmUsIElORklOSVRFKTsNCg0KCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2Rvd25fc2VtYSglbHgp
IHJldHVybjogJWxcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwobG9uZykgYVNlbWFw
aG9yZSwgd2FpdFJlc3VsdCkpOw0KCXJldHVybiAwOw0KfQ0KDQp2b2lkIFB5VGhyZWFkX3VwX3Nl
bWEoUHlUaHJlYWRfdHlwZV9zZW1hIGFTZW1hcGhvcmUpDQp7DQoJUmVsZWFzZVNlbWFwaG9yZSgN
CiAgICAgICAgICAgICAgICAoSEFORExFKSBhU2VtYXBob3JlLCAgICAgICAgICAgIC8qIEhhbmRs
ZSBvZiBzZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAg
ICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNyZW1lbnQgY291bnQgYnkg
b25lICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIE5VTEwpOyAgICAg
ICAgICAgICAgICAgICAgICAgICAgLyogbm90IGludGVyZXN0ZWQgaW4gcHJldmlvdXMgY291bnQg
ICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIA0KCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3VwX3NlbWEoJWx4KVxuIiwgUHlUaHJl
YWRfZ2V0X3RocmVhZF9pZGVudCgpLCAobG9uZylhU2VtYXBob3JlKSk7DQp9DQoAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAC4vdGhyZWFkX250LmguUEFUQ0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDE3
NzcgADAwMDAwMSAAMDAwMDAyIAAwMDAwMDAyNTE1NSAwNzEwNzE3NzQ1MiAwMDc2NzYgAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAKioqIHRocmVhZF9udC5oLk9MRAlTYXQgTWF5IDEzIDAyOjQ3OjAwIDIwMDANCi0t
LSB0aHJlYWRfbnQuaAlTYXQgTWF5IDEzIDA3OjAzOjA1IDIwMDANCioqKioqKioqKioqKioqKg0K
KioqIDI5LDQwICoqKioNCiAgDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiAgDQohIC8qIFRoaXMgY29kZSBpbXBs
ZW1lbnRlZCBieSBEYWcuR3J1bmVhdUBlbHNhLnByZXNlY28uY29tbS5zZSAqLw0KICANCiAgI2lu
Y2x1ZGUgPHdpbmRvd3MuaD4NCiAgI2luY2x1ZGUgPGxpbWl0cy5oPg0KICAjaW5jbHVkZSA8cHJv
Y2Vzcy5oPg0KICANCiAgbG9uZyBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KHZvaWQpOw0KICAN
CiAgLyoNCi0tLSAyOSw1NSAtLS0tDQogIA0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogIA0KISAvKiBPcmlnaW5h
bCB2ZXJzaW9uIGJ5IERhZy5HcnVuZWF1QGVsc2EucHJlc2Vjby5jb21tLnNlLiAqLw0KISAvKiBV
cGRhdGVkIGZvciBmYXN0ZXIgbG9ja2luZyBieSBhbGFua0BhbGdpbnRlY2guY29tIDEyIE1heSAw
MC4gKi8NCiAgDQorICNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAvKiBleGNsdWRlIHJhcmVs
eSB1c2VkIGluY2x1ZGUgZmlsZXMgKi8NCiAgI2luY2x1ZGUgPHdpbmRvd3MuaD4NCiAgI2luY2x1
ZGUgPGxpbWl0cy5oPg0KICAjaW5jbHVkZSA8cHJvY2Vzcy5oPg0KICANCisgI2luY2x1ZGUgIm15
bWFsbG9jLmgiIC8qIGZvciBQeU1lbV9ORVcoKSBhbmQgUHlNZW1fREVMKCkgKi8NCisgDQorIC8q
I2RlZmluZSBQWV9ERUJVR19OVF9USFJFQURTKi8NCisgDQorICNpZmRlZiBQWV9ERUJVR19OVF9U
SFJFQURTDQorICMgdW5kZWYgZHByaW50Zg0KKyAjIGRlZmluZSBkcHJpbnRmKGFyZ3MpIChwcmlu
dGYgYXJncykNCisgIyBpZm5kZWYgUHlfREVCVUcNCisgIyAgZGVmaW5lIFB5X0RFQlVHDQorICMg
ZW5kaWYNCisgI2VuZGlmDQorIA0KKyANCiAgbG9uZyBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50
KHZvaWQpOw0KICANCiAgLyoNCioqKioqKioqKioqKioqKg0KKioqIDEyNywyMDEgKioqKg0KICAj
ZW5kaWYgLyogTk9fRVhJVF9QUk9HICovDQogIA0KICAvKg0KISAgKiBMb2NrIHN1cHBvcnQuIEl0
IGhhcyB0b28gYmUgaW1wbGVtZW50ZWQgYXMgc2VtYXBob3Jlcy4NCiEgICogSSBbRGFnXSB0cmll
ZCB0byBpbXBsZW1lbnQgaXQgd2l0aCBtdXRleCBidXQgSSBjb3VsZCBmaW5kIGEgd2F5IHRvDQoh
ICAqIHRlbGwgd2hldGhlciBhIHRocmVhZCBhbHJlYWR5IG93biB0aGUgbG9jayBvciBub3QuDQog
ICAqLw0KICBQeVRocmVhZF90eXBlX2xvY2sgUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQ0K
ICB7DQohIAlIQU5ETEUgYUxvY2s7DQogIA0KLSAJZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRl
X2xvY2sgY2FsbGVkXG4iKSk7DQogIAlpZiAoIWluaXRpYWxpemVkKQ0KICAJCVB5VGhyZWFkX2lu
aXRfdGhyZWFkKCk7DQogIA0KISAJCWFMb2NrID0gQ3JlYXRlU2VtYXBob3JlKE5VTEwsICAgICAg
ICAgICAvKiBTZWN1cml0eSBhdHRyaWJ1dGVzICAgICAgICAgICovDQohICAgICAgICAgICAgICAg
ICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWwgdmFsdWUgICAgICAg
ICAgICAgICAgKi8NCiEgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAg
ICAgICAgLyogTWF4aW11bSB2YWx1ZSAgICAgICAgICAgICAgICAqLw0KISAgICAgICAgICAgICAg
ICAgICAgICAgICAgTlVMTCk7ICAgICAgIA0KISAgIC8qIE5hbWUgb2Ygc2VtYXBob3JlICAgICAg
ICAgICAgKi8NCiAgDQohIAlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkg
LT4gJWx4XG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIChsb25nKWFMb2NrKSk7DQog
IA0KISAJcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGFMb2NrOw0KICB9DQogIA0KICB2b2lk
IFB5VGhyZWFkX2ZyZWVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgYUxvY2spDQogIHsNCiAgCWRw
cmludGYoKCIlbGQ6IFB5VGhyZWFkX2ZyZWVfbG9jayglbHgpIGNhbGxlZFxuIiwgUHlUaHJlYWRf
Z2V0X3RocmVhZF9pZGVudCgpLChsb25nKWFMb2NrKSk7DQogIA0KISAJQ2xvc2VIYW5kbGUoKEhB
TkRMRSkgYUxvY2spOw0KICB9DQogIA0KICAvKg0KICAgKiBSZXR1cm4gMSBvbiBzdWNjZXNzIGlm
IHRoZSBsb2NrIHdhcyBhY3F1aXJlZA0KICAgKg0KISAgKiBhbmQgMCBpZiB0aGUgbG9jayB3YXMg
bm90IGFjcXVpcmVkLiBUaGlzIG1lYW5zIGEgMCBpcyByZXR1cm5lZA0KISAgKiBpZiB0aGUgbG9j
ayBoYXMgYWxyZWFkeSBiZWVuIGFjcXVpcmVkIGJ5IHRoaXMgdGhyZWFkIQ0KICAgKi8NCiAgaW50
IFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgYUxvY2ssIGludCB3YWl0
ZmxhZykNCiAgew0KICAJaW50IHN1Y2Nlc3MgPSAxOw0KISAJRFdPUkQgd2FpdFJlc3VsdDsNCiEg
DQohIAlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hY3F1aXJlX2xvY2soJWx4LCAlZCkgY2FsbGVk
XG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksKGxvbmcpYUxvY2ssIHdhaXRmbGFnKSk7
DQohIA0KISAJd2FpdFJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QoKEhBTkRMRSkgYUxvY2ss
ICh3YWl0ZmxhZyA9PSAxID8gSU5GSU5JVEUgOiAwKSk7DQogIA0KISAJaWYgKHdhaXRSZXN1bHQg
IT0gV0FJVF9PQkpFQ1RfMCkgew0KISAJCXN1Y2Nlc3MgPSAwOyAgICAvKiBXZSBmYWlsZWQgKi8N
CiAgCX0NCiAgDQohIAlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hY3F1aXJlX2xvY2soJWx4LCAl
ZCkgLT4gJWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwobG9uZylhTG9jaywgd2Fp
dGZsYWcsIHN1Y2Nlc3MpKTsNCiAgDQogIAlyZXR1cm4gc3VjY2VzczsNCiAgfQ0KICANCiAgdm9p
ZCBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGFMb2NrKQ0KICB7DQoh
IAlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9yZWxlYXNlX2xvY2soJWx4KSBjYWxsZWRcbiIsIFB5
VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwobG9uZylhTG9jaykpOw0KICANCiEgCWlmICghUmVs
ZWFzZVNlbWFwaG9yZSgNCiEgICAgICAgICAgICAgICAgICAgICAgICAgKEhBTkRMRSkgYUxvY2ss
ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhbmRsZSBvZiBzZW1hcGhvcmUgICAgICAgICAg
ICAgICAgICAgICAgICAgICovDQohICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNyZW1lbnQgY291bnQgYnkgb25lICAg
ICAgICAgICAgICAgICAgICAgICAqLw0KISAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGludGVyZXN0ZWQgaW4gcHJl
dmlvdXMgY291bnQgICAgICAgICAgICAgKi8NCiEgCQl7DQohIAkJZHByaW50ZigoIiVsZDogQ291
bGQgbm90IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglbHgpIGVycm9yOiAlbFxuIiwgUHlUaHJlYWRf
Z2V0X3RocmVhZF9pZGVudCgpLCAobG9uZylhTG9jaywgR2V0TGFzdEVycm9yKCkpKTsNCiAgCQl9
DQogIH0NCiAgDQogIC8qDQohICAqIFNlbWFwaG9yZSBzdXBwb3J0Lg0KICAgKi8NCiAgUHlUaHJl
YWRfdHlwZV9zZW1hIFB5VGhyZWFkX2FsbG9jYXRlX3NlbWEoaW50IHZhbHVlKQ0KICB7DQotLS0g
MTQyLDM2OSAtLS0tDQogICNlbmRpZiAvKiBOT19FWElUX1BST0cgKi8NCiAgDQogIC8qDQohICAq
IFdpbjMyIGxvY2sgc3VwcG9ydC4NCiEgICogDQohICAqIEltcGxlbWVudCB1c2luZyBDUFUgc3Bp
biBsb2NrcyBpbnN0ZWFkIG9mIGtlcm5lbCBjYWxscywNCiEgICogZm9yIHNwZWVkLg0KISAgKg0K
ISAgKiAxMiBNYXkgMDAgYWxhbmtAYWxnaW50ZWNoLmNvbQ0KICAgKi8NCisgDQorIC8qIElubGlu
ZSBvbiBJbnRlbCBwcm9jZXNzb3JzICovDQorICNpZmRlZiBfTV9JWDg2DQorICMgZGVmaW5lIElu
dGVybG9ja2VkRXhjaGFuZ2UgSW50ZXJsb2NrZWRFeGNoYW5nZTM4Ng0KKyBfaW5saW5lIExPTkcg
SW50ZXJsb2NrZWRFeGNoYW5nZTM4NihQTE9ORyBwbFRhcmdldCwgTE9ORyBsVmFsKQ0KKyB7DQor
IAkJX19hc20gbW92IGVheCwgbFZhbA0KKyAJCV9fYXNtIG1vdiBlYngsIFtwbFRhcmdldF0NCisg
CQlfX2FzbSBsb2NrIHhjaGcgZWF4LCBbZWJ4XSAgIC8qIEJhbSEgKi8NCisgCQlfX2FzbSBtb3Yg
bFZhbCwgZWF4DQorIAkJcmV0dXJuIGxWYWw7DQorIH0NCisgI2VuZGlmIC8qIF9NX0lYODYgKi8N
CisgDQorIC8qIEdyYWIgdGhlIHNwaW4gbG9jaywgeWllbGRpbmcgdGhlIENQVSBpZiBidXN5ICov
DQorIC8qIE9uIG9kZC1udW1iZXJlZCBhdHRlbXB0cyAwLDwxPiwyLDwzPiwuLiBleHBsaWNpdGx5
IHlpZWxkIGZvciBoeXN0ZXJlc2lzICovDQorIC8qIHBlciBCaWxsIFR1dHQgKi8NCisgI2RlZmlu
ZSBQWUdSQUJXMzJMT0NLKHB3MzIsIGN1cnRocmVhZCwgbGFiZWwpIFwNCisgbGFiZWw6IGxCdXN5
ID0gSW50ZXJsb2NrZWRFeGNoYW5nZSgoUExPTkcpJihwdzMyKS0+bV9sQnVzeSwgKGN1cnRocmVh
ZCkpOyBcDQorIAlpZiAobEJ1c3kgIT0gMCkgeyBTbGVlcChkd1NsZWVwKTsgZHdTbGVlcCA9ICFk
d1NsZWVwOyBnb3RvIGxhYmVsOyB9DQorIA0KKyAvKiBGcmVlIHRoZSBzcGluIGxvY2sgKi8NCisg
I2RlZmluZSBQWVJFTEVBU0VXMzJMT0NLKHB3MzIpIFwNCisgCUludGVybG9ja2VkRXhjaGFuZ2Uo
KFBMT05HKSYocHczMiktPm1fbEJ1c3ksIDApOw0KKyANCisgDQorICNkZWZpbmUgUFlfVzMyX0xP
Q0tfTUFHSUMgMHhBNUI2REVGRQ0KKyANCisgLyogV2luMzIgbG9jayBzdHJ1Y3R1cmUgKi8NCisg
dHlwZWRlZiBzdHJ1Y3Qgew0KKyAJRFdPUkQgbV9kd01hZ2ljOyAvKiBQYXJhbm9pYSB0byBwcmV2
ZW50IGhlYXAgdHJhc2hpbmcgKi8NCisgCXZvbGF0aWxlIExPTkcgbV9sQnVzeTsgLyogUHlXaW4z
MkxvY2sgaXMgaW4gdXNlICovDQorIAl2b2xhdGlsZSBMT05HIG1fbExvY2tlZDsgLyogTWFpbiBs
b2NrICovDQorIAl2b2xhdGlsZSBMT05HIG1fbldhaXRpbmc7IC8qICMgb2YgdGhyZWFkcyB3YWl0
aW5nIG9uIGxvY2sgKi8NCisgCUhBTkRMRSBtX2hTZW1hcGhvcmU7IC8qIEZvciB3YWl0aW5nIHRo
cmVhZHMgKi8NCisgfSBQeVdpbjMyTG9jazsNCisgDQorIA0KKyANCiAgUHlUaHJlYWRfdHlwZV9s
b2NrIFB5VGhyZWFkX2FsbG9jYXRlX2xvY2sodm9pZCkNCiAgew0KISAJUHlXaW4zMkxvY2sqIHBX
aW4zMkxvY2s7DQogIA0KICAJaWYgKCFpbml0aWFsaXplZCkNCiAgCQlQeVRocmVhZF9pbml0X3Ro
cmVhZCgpOw0KICANCiEgCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBXaW4zMiBsb2Nr
ICovDQohIA0KISAJcFdpbjMyTG9jayA9IFB5TWVtX05FVyhQeVdpbjMyTG9jaywgMSk7DQohIAlw
V2luMzJMb2NrLT5tX2R3TWFnaWMgPSBQWV9XMzJfTE9DS19NQUdJQzsNCiEgCXBXaW4zMkxvY2st
Pm1fbEJ1c3kgPSAwOw0KISAJcFdpbjMyTG9jay0+bV9sTG9ja2VkID0gMDsNCiEgCXBXaW4zMkxv
Y2stPm1fbldhaXRpbmcgPSAwOw0KISAJcFdpbjMyTG9jay0+bV9oU2VtYXBob3JlID0gQ3JlYXRl
U2VtYXBob3JlKE5VTEwsDQohIAkJCQkxLCAvKiBpbml0aWFsIHZhbHVlICovIA0KISAJCQkJMSwg
LyogbWF4IHZhbHVlICovDQohIAkJCQlOVUxMKTsNCiAgDQohIAlkcHJpbnRmKCgiJWxkOiBQeVRo
cmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJWx4XG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50
KCksIChsb25nKXBXaW4zMkxvY2spKTsNCiAgDQohIAlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9j
aykgcFdpbjMyTG9jazsNCiAgfQ0KICANCisgDQogIHZvaWQgUHlUaHJlYWRfZnJlZV9sb2NrKFB5
VGhyZWFkX3R5cGVfbG9jayBhTG9jaykNCiAgew0KKyAJUHlXaW4zMkxvY2sqIHBXaW4zMkxvY2s7
DQorIA0KICAJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZnJlZV9sb2NrKCVseCkgY2FsbGVkXG4i
LCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksKGxvbmcpYUxvY2spKTsNCiAgDQohIAlwV2lu
MzJMb2NrID0gKFB5V2luMzJMb2NrKilhTG9jazsNCiEgDQohIAkvKiBBc3NlcnQ6IHRoZSBsb2Nr
IGlzIG5vdCBhbHJlYWR5IGZyZWVkICovDQohIAlpZiAocFdpbjMyTG9jay0+bV9kd01hZ2ljICE9
IFBZX1czMl9MT0NLX01BR0lDKSB7DQohIAkJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZnJlZV9s
b2NrKCVseCkgdHJpZWQgdG8gZnJlZSBhIGZyZWVkIGxvY2shXG4iLCBQeVRocmVhZF9nZXRfdGhy
ZWFkX2lkZW50KCksKGxvbmcpYUxvY2spKTsNCiEgCQlyZXR1cm47DQohIAl9DQohIA0KISAJLyog
QXNzZXJ0OiB0aGUgbG9jayBpcyBub3QgaW4gdXNlICovDQohIAlpZiAocFdpbjMyTG9jay0+bV9s
TG9ja2VkICE9IDApIHsNCiEgCQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9mcmVlX2xvY2soJWx4
KSB0cmllZCB0byBmcmVlIGEgYnVzeSBsb2NrIG93bmVkIGJ5ICVsZCFcbiIsIFB5VGhyZWFkX2dl
dF90aHJlYWRfaWRlbnQoKSwobG9uZylhTG9jaywgcFdpbjMyTG9jay0+bV9sTG9ja2VkKSk7DQoh
IAkJLyogRmFsbCB0aHJvdWdoIGFuZCBraWxsIHRoZSBsb2NrICovDQohIAl9DQohIA0KISAJcFdp
bjMyTG9jay0+bV9kd01hZ2ljID0gMDsNCiEgCUNsb3NlSGFuZGxlKHBXaW4zMkxvY2stPm1faFNl
bWFwaG9yZSk7DQohIAlwV2luMzJMb2NrLT5tX2hTZW1hcGhvcmUgPSBOVUxMOw0KISAJUHlNZW1f
REVMKHBXaW4zMkxvY2spOw0KICB9DQogIA0KKyANCiAgLyoNCiAgICogUmV0dXJuIDEgb24gc3Vj
Y2VzcyBpZiB0aGUgbG9jayB3YXMgYWNxdWlyZWQNCisgICogYW5kIDAgaWYgdGhlIGxvY2sgd2Fz
IG5vdCBhY3F1aXJlZC4gSWYgdGhlIGxvY2sgaXMgYWxyZWFkeQ0KKyAgKiBhY3F1aXJlZCBieSBv
dXIgdGhyZWFkLCByZXR1cm4gMC4gIFRoZSBjYWxsZXJzIGFzc3VtZSBzZW1hbnRpY3MNCisgICog
dGhhdCByZWN1cnNpdmUgbG9ja3MgYnkgdGhlIHNhbWUgdGhyZWFkIHNob3VsZCBibG9jaywNCisg
ICogaS5lLiwgdGhleSBhc3N1bWUgaXQgYWN0cyBsaWtlIGEgc2VtYXBob3JlLCBub3QgbGlrZSBh
IGNyaXRpY2FsIHNlY3Rpb24uDQogICAqDQohICAqIDEyIE1heSAwMCBhbGFua0BhbGdpbnRlY2gu
Y29tDQogICAqLw0KICBpbnQgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9j
ayBhTG9jaywgaW50IHdhaXRmbGFnKQ0KICB7DQorIAlQeVdpbjMyTG9jayogcFdpbjMyTG9jazsN
CisgCUxPTkcgbEJ1c3k7DQorIAlEV09SRCBkd1NsZWVwID0gMDsNCiAgCWludCBzdWNjZXNzID0g
MTsNCiEgI2lmZGVmIFB5X0RFQlVHDQohIAlMT05HIGxDdXJyZW50VGhyZWFkSWQgPSBQeVRocmVh
ZF9nZXRfdGhyZWFkX2lkZW50KCk7DQohICNlbmRpZg0KISANCiEgCWRwcmludGYoKCIlbGQ6IFB5
VGhyZWFkX2FjcXVpcmVfbG9jayglbHgsICVkKSBjYWxsZWRcbiIsIGxDdXJyZW50VGhyZWFkSWQs
IChsb25nKWFMb2NrLCB3YWl0ZmxhZykpOw0KISANCiEgCXBXaW4zMkxvY2sgPSAoUHlXaW4zMkxv
Y2sqKWFMb2NrOw0KISANCiEgCS8qIEFzc2VydDogdGhlIGxvY2sgaXMgbm90IGZyZWVkICovDQoh
IAlpZiAocFdpbjMyTG9jay0+bV9kd01hZ2ljICE9IFBZX1czMl9MT0NLX01BR0lDKSB7DQohIAkJ
ZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVseCkgdHJpZWQgdG8gYWNxdWly
ZSBhIGZyZWVkIGxvY2shXG4iLCBsQ3VycmVudFRocmVhZElkLCAobG9uZylhTG9jaykpOw0KISAJ
CXJldHVybiAwOw0KISAJfQ0KICANCiEgYWdhaW46IA0KISAJLyogU3BpbiBvbiB0aGUgcFdpbjMy
TG9jayBzdHJ1Y3QgKi8NCiEgCVBZR1JBQlczMkxPQ0socFdpbjMyTG9jaywgMSwgbG9jazEpOw0K
ISANCiEgCWlmICghcFdpbjMyTG9jay0+bV9sTG9ja2VkKSB7IC8qIFdlIGdvdCBpdCEgKi8NCiEg
CQkvKiBHcmFiIHRoZSBsb2NrICovDQohIAkJcFdpbjMyTG9jay0+bV9sTG9ja2VkID0gMTsgLyog
dm9sYXRpbGUgKi8NCiEgCQlQWVJFTEVBU0VXMzJMT0NLKHBXaW4zMkxvY2spOw0KISAJfSBlbHNl
IHsgLyogQWxyZWFkeSBsb2NrZWQgKi8NCiEgCQlpZiAoIXdhaXRmbGFnKSB7IC8qIFBvbGwgZmFp
bGVkLCBiYWlsICovDQohIAkJCVBZUkVMRUFTRVczMkxPQ0socFdpbjMyTG9jayk7DQohIAkJCXN1
Y2Nlc3MgPSAwOw0KISAJCX0gZWxzZSB7IC8qIERyYXQsIHdlIG5lZWQgdG8gYmxvY2sgKi8NCiEg
CQkJRFdPUkQgZHdXYWl0UmVzdWx0Ow0KISANCiEgCQkJLyogVGVsbCB0aGUgbG9jayBob2xkZXIg
dG8gUmVsZWFzZVNlbWFwaG9yZSgpICovDQohIAkJCSsrKHBXaW4zMkxvY2stPm1fbldhaXRpbmcp
OyAvKiB2b2xhdGlsZSAqLw0KISAJCQlQWVJFTEVBU0VXMzJMT0NLKHBXaW4zMkxvY2spOw0KISAN
CiEgCQkJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVseCkgYmxvY2tpbmcg
b24gbG9jayBoZWxkIGJ5ICVsZFxuIiwgbEN1cnJlbnRUaHJlYWRJZCwgYUxvY2ssIHBXaW4zMkxv
Y2stPm1fbExvY2tlZCkpOw0KISANCiEgCQkJLyogQmxvY2sgdW50aWwgUmVsZWFzZVNlbWFwaG9y
ZSgpICovDQohIAkJCWR3V2FpdFJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QocFdpbjMyTG9j
ay0+bV9oU2VtYXBob3JlLA0KISAJCQkJSU5GSU5JVEUpOw0KISANCiEgCQkJLyogVHVybiBvZmYg
UmVsZWFzZVNlbWFwaG9yZSgpLiAgTXVzdCBiZQ0KISAJCQkgICBkb25lIGNhcmVmdWxseSB0byBh
dm9pZCByYWNlcy4gKi8NCiEgCQkJUFlHUkFCVzMyTE9DSyhwV2luMzJMb2NrLCAxLCBsb2NrMik7
DQohIAkJCS0tKHBXaW4zMkxvY2stPm1fbldhaXRpbmcpOyAvKiB2b2xhdGlsZSAqLw0KISAJCQlQ
WVJFTEVBU0VXMzJMT0NLKHBXaW4zMkxvY2spOw0KISANCiEgCQkJaWYgKGR3V2FpdFJlc3VsdCAh
PSBXQUlUX09CSkVDVF8wKSB7DQohIAkJCQlzdWNjZXNzID0gMDsgLyogU2VtYXBob3JlIGNsb3Nl
ZCwgYmFpbCAqLw0KISAJCQl9IGVsc2Ugew0KISAJCQkJZ290byBhZ2FpbjsgLyogRmlnaHQgZm9y
IHRoZSBsb2NrIGFnYWluICovDQohIAkJCX0NCiEgCQl9DQogIAl9DQogIA0KISAJZHByaW50Zigo
IiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVseCwgJWQpIC0+ICVkXG4iLA0KISAJCQlsQ3Vy
cmVudFRocmVhZElkLChsb25nKWFMb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOw0KICANCiAgCXJl
dHVybiBzdWNjZXNzOw0KICB9DQogIA0KKyANCisgLyoNCisgICogUmVsZWFzZSB0aGUgbG9jay4g
IENhbGwgUmVsZWFzZVNlbWFwaG9yZSgpIGlmIGFuZCBvbmx5IGlmIGFub3RoZXIgdGhyZWFkDQor
ICAqIGlzIHdhaXRpbmcuDQorICAqIA0KKyAgKiAxMiBNYXkgMDAgYWxhbmtAYWxnaW50ZWNoLmNv
bQ0KKyAgKi8NCiAgdm9pZCBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2Nr
IGFMb2NrKQ0KICB7DQohIAlQeVdpbjMyTG9jayogcFdpbjMyTG9jazsNCiEgCUxPTkcgbEJ1c3k7
DQohIAlEV09SRCBkd1NsZWVwID0gMDsNCiEgI2lmZGVmIFB5X0RFQlVHDQohIAlMT05HIGxDdXJy
ZW50VGhyZWFkSWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7DQohICNlbmRpZg0KISAN
CiEgCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglbHgpIGNhbGxlZFxuIiwg
bEN1cnJlbnRUaHJlYWRJZCwgKGxvbmcpYUxvY2spKTsNCiEgDQohIAlwV2luMzJMb2NrID0gKFB5
V2luMzJMb2NrKilhTG9jazsNCiEgDQohIAkvKiBBc3NlcnQ6IHRoZSBsb2NrIGlzIG5vdCBmcmVl
ZCAqLw0KISAJaWYgKHBXaW4zMkxvY2stPm1fZHdNYWdpYyAhPSBQWV9XMzJfTE9DS19NQUdJQykg
ew0KISAJCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglbHgpIHRyaWVkIHRv
IHJlbGVhc2UgYSBmcmVlZCBsb2NrIVxuIiwgbEN1cnJlbnRUaHJlYWRJZCwgKGxvbmcpYUxvY2sp
KTsNCiEgCQlyZXR1cm47DQohIAl9DQogIA0KISAJUFlHUkFCVzMyTE9DSyhwV2luMzJMb2NrLCAx
LCBsb2NrMSk7DQohIA0KISAJaWYgKCFwV2luMzJMb2NrLT5tX2xMb2NrZWQpIHsNCiEgCSAgICAJ
LyogVGhlIGxvY2sgd2FzIG5vdCBhY3F1aXJlZCBpbiB0aGUgZmlyc3QgcGxhY2UsIGh1bW0uLiAq
Lw0KISAJCVBZUkVMRUFTRVczMkxPQ0socFdpbjMyTG9jayk7DQohIAkJZHByaW50ZigoIiVsZDog
UHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVseCkgdHJpZWQgdG8gcmVsZWFzZSBhIGxvY2sgdGhhdCB3
YXMgbm90IGFjcXVpcmVkIVxuIiwgbEN1cnJlbnRUaHJlYWRJZCwgKGxvbmcpYUxvY2spKTsNCiEg
CX0gZWxzZSB7DQohIAkJLyogUmVsZWFzZSB0aGUgbG9jayAqLw0KISAJCXBXaW4zMkxvY2stPm1f
bExvY2tlZCA9IDA7IC8qIHZvbGF0aWxlICovDQohIA0KISAJCWlmIChwV2luMzJMb2NrLT5tX25X
YWl0aW5nKSB7IC8qIElmIHRocmVhZHMgYXJlIHdhaXRpbmcgKi8NCiEgCQkJUFlSRUxFQVNFVzMy
TE9DSyhwV2luMzJMb2NrKTsNCiEgCQkJLyogVW5ibG9jayBvbmUgd2FpdGluZyB0aHJlYWQgKi8N
CiEgCQkJUmVsZWFzZVNlbWFwaG9yZShwV2luMzJMb2NrLT5tX2hTZW1hcGhvcmUsIDEsIE5VTEwp
Ow0KISAJCX0gZWxzZSB7DQohIAkJCVBZUkVMRUFTRVczMkxPQ0socFdpbjMyTG9jayk7DQogIAkJ
fQ0KKyAJfQ0KKyAJcmV0dXJuOw0KICB9DQogIA0KKyANCiAgLyoNCiEgICogU2VtYXBob3JlIHN1
cHBvcnQgKG5vdCBjdXJyZW50bHkgdXNlZCkuDQogICAqLw0KICBQeVRocmVhZF90eXBlX3NlbWEg
UHlUaHJlYWRfYWxsb2NhdGVfc2VtYShpbnQgdmFsdWUpDQogIHsNCgAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==

------=_NextPart_000_000F_01BFBC80.8A0914F0--