LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0IAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24KICoKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93LgogKgogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFx1bml0Ci8vLwovLy8gIVB1cnBvc2UKLy8vCi8vLyBEZWZpbml0aW9uIG9mIG1ldGhvZHMgZm9yIHVzaW5nIGEgQ0NJRCBkZXZpY2UgZHJpdmVyLgovLy8gCi8vLyAhVXNhZ2UKLy8vIAovLy8gLSMgQ0NJRERyaXZlcl9Jbml0aWFsaXplCi8vLyAtIyBDQ0lEX1JlYWQKLy8vIC0jIENDSURfV3JpdGUKLy8vIC0jIENDSURfU21hcnRDYXJkUmVxdWVzdAovLy8gLSMgQ0NJRF9JbnNlcnRpb24KLy8vIC0jIENDSURfUmVtb3ZhbAovLy8gLSMgUkRSdG9QQ0hhcmR3YXJlRXJyb3IKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZm5kZWYgQ0NJRF9EUklWRVJfSAojZGVmaW5lIENDSURfRFJJVkVSX0gKCiNpbmNsdWRlICJVU0JELmgiCgovLy8gRm9yIHJlZmVyZW5jZSwgdGhlIGFic29sdXRlIG1heGltdW0gYmxvY2sgc2l6ZSAKLy8vIGZvciBhIFRQRFUgVD0wIGJsb2NrIGlzIDI2MCBieXRlcyAoNSBieXRlcyBjb21tYW5kOyAyNTUgYnl0ZXMgZGF0YSksIG9yIAovLy8gZm9yIGEgVFBEVSBUPTEgYmxvY2sgaXMgMjU5IGJ5dGVzLCBvciAKLy8vIGZvciBhIHNob3J0IEFQRFUgVD0xIGJsb2NrIGlzIDI2MSBieXRlcywgb3IgCi8vLyBmb3IgYW4gZXh0ZW5kZWQgQVBEVSBUPTEgYmxvY2sgaXMgNjU1NDQgYnl0ZXMuCiNkZWZpbmUgQUJEQVRBX1NJWkUgMjYwCgovLy8gZGVmaW5lIHByb3RvY29sIFQ9MAojZGVmaW5lIFBST1RPQ09MX1RPIDAKLy8vIGRlZmluZSBwcm90b2NvbCBUPTEKI2RlZmluZSBQUk9UT0NPTF9UMSAxCgovLy8gZGVmaW5lIGZvciBkd0ZlYXR1cmVzIHNlZSBUYWJsZSA1LjEtMSBTbWFydCBDYXJkIERldmljZSBDbGFzcyBEZXNjcmlwdG9ycwovLy8gTm8gc3BlY2lhbCBjaGFyYWN0ZXJpc3RpY3MKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX05BREEgICAgICAgMHgwMDAwMDAwMAovLy8gQXV0b21hdGljIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIGJhc2VkIG9uIEFUUiBkYXRhCiNkZWZpbmUgQ0NJRF9GRUFUVVJFU19BVVRPX1BDT05GIDB4MDAwMDAwMDIKLy8vIEF1dG9tYXRpYyBhY3RpdmF0aW9uIG9mIElDQyBvbiBpbnNlcnRpbmcKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0FVVE9fQUNUSVYgMHgwMDAwMDAwNCAKLy8vIEF1dG9tYXRpYyBJQ0Mgdm9sdGFnZSBzZWxlY3Rpb24KI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0FVVE9fVk9MVCAgMHgwMDAwMDAwOCAKLy8vIEF1dG9tYXRpYyBJQ0MgY2xvY2sgZnJlcXVlbmN5IGNoYW5nZSBhY2NvcmRpbmcgdG8gYWN0aXZlIHBhcmFtZXRlcnMgcHJvdmlkZWQgCi8vLyBieSB0aGUgSG9zdCBvciBzZWxmIGRldGVybWluZWQKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0FVVE9fQ0xPQ0sgMHgwMDAwMDAxMCAKLy8vIEF1dG9tYXRpYyBiYXVkIHJhdGUgY2hhbmdlIGFjY29yZGluZyB0byBhY3RpdmUgcGFyYW1ldGVycyBwcm92aWRlZCBieSB0aGUgCi8vLyBIb3N0IG9yIHNlbGYgZGV0ZXJtaW5lZAojZGVmaW5lIENDSURfRkVBVFVSRVNfQVVUT19CQVVEICAweDAwMDAwMDIwIAovLy8gQXV0b21hdGljIHBhcmFtZXRlcnMgbmVnb3RpYXRpb24gbWFkZSBieSB0aGUgQ0NJRCAodXNlIG9mIHdhcm0gb3IgY29sZCAKLy8vIHJlc2V0cyBvciBQUFMgYWNjb3JkaW5nIHRvIGEgbWFudWZhY3R1cmVyIHByb3ByaWV0YXJ5IGFsZ29yaXRobSB0byBzZWxlY3QgCi8vLyB0aGUgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzIHdpdGggdGhlIElDQykKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0FVVE9fUE5FR08gMHgwMDAwMDA0MCAKLy8vIEF1dG9tYXRpYyBQUFMgbWFkZSBieSB0aGUgQ0NJRCBhY2NvcmRpbmcgdG8gdGhlIGFjdGl2ZSBwYXJhbWV0ZXJzCiNkZWZpbmUgQ0NJRF9GRUFUVVJFU19BVVRPX1BQUyAgIDB4MDAwMDAwODAgCi8vLyBDQ0lEIGNhbiBzZXQgSUNDIGluIGNsb2NrIHN0b3AgbW9kZQojZGVmaW5lIENDSURfRkVBVFVSRVNfSUNDU1RPUCAgICAweDAwMDAwMTAwIAovLy8gTkFEIHZhbHVlIG90aGVyIHRoYW4gMDAgYWNjZXB0ZWQgKFQ9MSBwcm90b2NvbCBpbiB1c2UpCiNkZWZpbmUgQ0NJRF9GRUFUVVJFU19OQUQgICAgICAgIDB4MDAwMDAyMDAgCi8vLyBBdXRvbWF0aWMgSUZTRCBleGNoYW5nZSBhcyBmaXJzdCBleGNoYW5nZSAoVD0xIHByb3RvY29sIGluIHVzZSkKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0FVVE9fSUZTRCAgMHgwMDAwMDQwMCAKLy8vIFRQRFUgbGV2ZWwgZXhjaGFuZ2VzIHdpdGggQ0NJRAojZGVmaW5lIENDSURfRkVBVFVSRVNfRVhDX1RQRFUgICAweDAwMDEwMDAwIAovLy8gU2hvcnQgQVBEVSBsZXZlbCBleGNoYW5nZSB3aXRoIENDSUQKI2RlZmluZSBDQ0lEX0ZFQVRVUkVTX0VYQ19TQVBEVSAgMHgwMDAyMDAwMCAKLy8vIFNob3J0IGFuZCBFeHRlbmRlZCBBUERVIGxldmVsIGV4Y2hhbmdlIHdpdGggQ0NJRAojZGVmaW5lIENDSURfRkVBVFVSRVNfRVhDX0FQRFUgICAweDAwMDQwMDAwIAovLy8gVVNCIFdha2UgdXAgc2lnbmFsaW5nIHN1cHBvcnRlZCBvbiBjYXJkIGluc2VydGlvbiBhbmQgcmVtb3ZhbAojZGVmaW5lIENDSURfRkVBVFVSRVNfV0FLRVVQICAgICAweDAwMTAwMDAwIAoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICBUeXBlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8vIEJ1bGsgQ0NJRCBNZXNzYWdlIGhlYWRlciBzdHJ1Y3R1cmUKdHlwZWRlZiBzdHJ1Y3QKewogICB1bnNpZ25lZCBjaGFyIGJNZXNzYWdlVHlwZTsKICAgLy8vIE1lc3NhZ2Utc3BlY2lmaWMgZGF0YSBsZW5ndGgKICAgdW5zaWduZWQgbG9uZyB3TGVuZ3RoOwogICAvLy8gSWRlbnRpZmllcyB0aGUgc2xvdCBudW1iZXIgZm9yIHRoaXMgY29tbWFuZAogICB1bnNpZ25lZCBjaGFyIGJTbG90OwogICAvLy8gU2VxdWVuY2UgbnVtYmVyIGZvciBjb21tYW5kLgogICB1bnNpZ25lZCBjaGFyIGJTZXE7CiAgIC8vLyBTbG90IHN0YXR1cyByZWdpc3RlcgogICB1bnNpZ25lZCBjaGFyIGJTdGF0dXM7CiAgIC8vLyBTbG90IGVycm9yCiAgIHVuc2lnbmVkIGNoYXIgYkVycm9yOwogICAvLy8gc3BlY2lmaWMgcmVnaXN0ZXIKICAgdW5zaWduZWQgY2hhciBiU3BlY2lmaWM7CiAgIC8vLyBEYXRhIGJsb2NrIHNlbnQgdG8gdGhlIENDSUQuCiAgIHVuc2lnbmVkIGNoYXIgYWJEYXRhW0FCREFUQV9TSVpFXTsKICAgdW5zaWduZWQgY2hhciBiU2l6ZVRvU2VuZDsKfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgU19jY2lkX2J1bGtfaW5faGVhZGVyOwoKLy8vIDYuMSBCdWxrIFRyYW5zZmVycwp0eXBlZGVmIHN0cnVjdAp7CiAgIHVuc2lnbmVkIGNoYXIgYk1lc3NhZ2VUeXBlOwogICAvLy8gTWVzc2FnZS1zcGVjaWZpYyBkYXRhIGxlbmd0aAogICB1bnNpZ25lZCBsb25nIHdMZW5ndGg7CiAgIC8vLyBJZGVudGlmaWVzIHRoZSBzbG90IG51bWJlciBmb3IgdGhpcyBjb21tYW5kCiAgIHVuc2lnbmVkIGNoYXIgYlNsb3Q7CiAgIC8vLyBTZXF1ZW5jZSBudW1iZXIgZm9yIGNvbW1hbmQuCiAgIHVuc2lnbmVkIGNoYXIgYlNlcTsKICAgLy8vIHNwZWNpZmljIHJlZ2lzdGVyCiAgIHVuc2lnbmVkIGNoYXIgYlNwZWNpZmljXzA7CiAgIHVuc2lnbmVkIGNoYXIgYlNwZWNpZmljXzE7CiAgIHVuc2lnbmVkIGNoYXIgYlNwZWNpZmljXzI7CiAgIC8vLyBBcHBsaWNhdGlvbiBQcm90b2NvbCBEYXRhIFVuaXQKICAgdW5zaWduZWQgY2hhciBBUERVW0FCREFUQV9TSVpFXTsKfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgU19jY2lkX2J1bGtfb3V0X2hlYWRlcjsKCgovLy8gNi4xLjExLjIgUElOIFZlcmlmaWNhdGlvbiBEYXRhIFN0cnVjdHVyZQp0eXBlZGVmIHN0cnVjdAp7CgkvLy8gTnVtYmVyIG9mIHNlY29uZHMuCgl1bnNpZ25lZCBjaGFyIGJUaW1lck91dDsKCS8vLyBTZXZlcmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBQSU4gZm9ybWF0IG9wdGlvbnMKCXVuc2lnbmVkIGNoYXIgYm1Gb3JtYXRTdHJpbmc7CgkvLy8gRGVmaW5lIHRoZSBsZW5ndGggb2YgdGhlIFBJTiB0byBwcmVzZW50IGluIHRoZSBBUERVIGNvbW1hbmQKCXVuc2lnbmVkIGNoYXIgYm1QSU5CbG9ja1N0cmluZzsKCS8vLyBBbGxvd3MgdGhlIGxlbmd0aCBQSU4gaW5zZXJ0aW9uIGluIHRoZSBBUERVIGNvbW1hbmQKCXVuc2lnbmVkIGNoYXIgYm1QSU5MZW5ndGhGb3JtYXQ7CgkvLy8gTWluaW11bSBQSU4gc2l6ZSBpbiBkaWdpdCBhbmQgTWF4aW11bSBQSU4gc2l6ZSBpbiBkaWdpdAoJdW5zaWduZWQgY2hhciB3UElOTWF4RXh0cmFEaWdpdDsKCS8vLyBUaGUgdmFsdWUgaXMgYSBiaXQgd2lzZSBPUiBvcGVyYXRpb24uCgl1bnNpZ25lZCBjaGFyIGJFbnRyeVZhbGlkYXRpb25Db25kaXRpb247CgkvLy8gTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGRpc3BsYXkgZm9yIHRoZSBQSU4gbW9kaWZ5IGNvbW1hbmQKCXVuc2lnbmVkIGNoYXIgYk51bWJlck1lc3NhZ2U7CgkvLy8gTGFuZ3VhZ2UgdXNlZCB0byBkaXNwbGF5IHRoZSBtZXNzYWdlcy4KCXVuc2lnbmVkIGNoYXIgd0xhbmdJZDsKCS8vLyBNZXNzYWdlIGluZGV4IGluIHRoZSBSZWFkZXIgbWVzc2FnZSB0YWJsZQoJdW5zaWduZWQgY2hhciBiTXNnSW5kZXg7CgkvLy8gVD0xIEktYmxvY2sgcHJvbG9ndWUgZmllbGQgdG8gdXNlCgl1bnNpZ25lZCBjaGFyIGJUZW9Qcm9sb2d1ZVszXTsKCS8vLyBBUERVIHRvIHNlbmQgdG8gdGhlIElDQwoJdW5zaWduZWQgY2hhciBhYlBJTkFwZHVbMjU1XTsKfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBTX2NjaWRfUElOX1ZlcmlmaWNhdGlvbjsKCgovLy8gNi4xLjExLjcgUElOIE1vZGlmaWNhdGlvbiBEYXRhIFN0cnVjdHVyZQp0eXBlZGVmIHN0cnVjdAp7CgkvLy8gTnVtYmVyIG9mIHNlY29uZHMuIElmIDAwaCB0aGVuIENDSUQgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkLgoJdW5zaWduZWQgY2hhciBiVGltZU91dDsKCS8vLyBTZXZlcmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBQSU4gZm9ybWF0IG9wdGlvbnMgKGRlZmluZWQgaW4gpyA2LjEuMTEuNCkKCXVuc2lnbmVkIGNoYXIgYm1Gb3JtYXRTdHJpbmc0OwoJLy8vIERlZmluZSB0aGUgbGVuZ3RoIG9mIHRoZSBQSU4gdG8gcHJlc2VudCBpbiB0aGUgQVBEVSBjb21tYW5kCgl1bnNpZ25lZCBjaGFyIGJtUElOQmxvY2tTdHJpbmc7CgkvLy8gQWxsb3dzIHRoZSBsZW5ndGggUElOIGluc2VydGlvbiBpbiB0aGUgQVBEVSBjb21tYW5kIChkZWZpbmVkIGluIKcgNi4xLjExLjYpCgl1bnNpZ25lZCBjaGFyIGJtUGluTGVuZ3RoRm9ybWF0OwoJLy8vIEluc2VydGlvbiBwb3NpdGlvbiBvZmZzZXQgaW4gYnl0ZSBmb3IgdGhlIGN1cnJlbnQgUElOCgl1bnNpZ25lZCBjaGFyIGJJbnNlcnRpb25PZmZzZXRPbGQ7CgkvLy8gSW5zZXJ0aW9uIHBvc2l0aW9uIG9mZnNldCBpbiBieXRlIGZvciB0aGUgbmV3IFBJTgoJdW5zaWduZWQgY2hhciBiSW5zZXJ0aW9uT2Zmc2V0TmV3OwoJLy8vIFhYWVloCgkvLy8gWFg6IE1pbmltdW0gUElOIHNpemUgaW4gZGlnaXQKCS8vLyBZWTogTWF4aW11bSBQSU4gc2l6ZSBpbiBkaWdpdAoJdW5zaWduZWQgY2hhciB3UElOTWF4RXh0cmFEaWdpdDsKCS8vLyAwMGgsMDFoLDAyaCwwM2gKCS8vLyBJbmRpY2F0ZXMgaWYgYSBjb25maXJtYXRpb24gaXMgcmVxdWVzdGVkIGJlZm9yZSBhY2NlcHRhbmNlIG9mIGEgbmV3IFBJTiAobWVhbmluZyB0aGF0IHRoZSB1c2VyIGhhcyB0byBlbnRlciB0aGlzIG5ldyBQSU4gdHdpY2UgYmVmb3JlIGl0IGlzIGFjY2VwdGVkKQoJLy8vIEluZGljYXRlcyBpZiB0aGUgY3VycmVudCBQSU4gbXVzdCBiZSBlbnRlcmVkIGFuZCBzZXQgaW4gdGhlIHNhbWUgQVBEVSBmaWVsZCBvZiBub3QuCgl1bnNpZ25lZCBjaGFyIGJDb25maXJtUElOOwoJLy8vIFRoZSB2YWx1ZSBpcyBhIGJpdCB3aXNlIE9SIG9wZXJhdGlvbi4KCS8vLyAwMWggTWF4IHNpemUgcmVhY2hlZAoJLy8vIDAyaCBWYWxpZGF0aW9uIGtleSBwcmVzc2VkCgkvLy8gMDRoIFRpbWVvdXQgb2NjdXJyZWQKCXVuc2lnbmVkIGNoYXIgYkVudHJ5VmFsaWRhdGlvbkNvbmRpdGlvbjsKCS8vLyAwMGgsMDFoLDAyaCwwM2gsb3IgRkZoCgkvLy8gTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGRpc3BsYXkgZm9yIHRoZSBQSU4gbW9kaWZ5IGNvbW1hbmQuCgl1bnNpZ25lZCBjaGFyIGJOdW1iZXJNZXNzYWdlOwoJLy8vIExhbmd1YWdlIHVzZWQgdG8gZGlzcGxheSB0aGUgbWVzc2FnZXMuIFRoZSAxNiBiaXQKCXVuc2lnbmVkIGNoYXIgd0xhbmdJZDsKCS8vLyBNZXNzYWdlIGluZGV4IGluIHRoZSBSZWFkZXIgbWVzc2FnZSB0YWJsZSAoc2hvdWxkIGJlIDAwaCBvciAwMWgpLgoJdW5zaWduZWQgY2hhciBiTXNnSW5kZXgxOwoJLy8vIE1lc3NhZ2UgaW5kZXggaW4gdGhlIFJlYWRlciBtZXNzYWdlIHRhYmxlIChzaG91bGQgYmUgMDFoIG9yIDAyaCkuCgl1bnNpZ25lZCBjaGFyIGJNc2dJbmRleDI7CgkvLy8gTWVzc2FnZSBpbmRleCBpbiB0aGUgUmVhZGVyIG1lc3NhZ2UgdGFibGUgKHNob3VsZCBiZSAwMmgpLgoJdW5zaWduZWQgY2hhciBiTXNnSW5kZXgzOwoJLy8vIFQ9MSBJLWJsb2NrIHByb2xvZ3VlIGZpZWxkIHRvIHVzZS4gU2lnbmlmaWNhbnQgb25seSBpZiBwcm90b2NvbCBpbiB1c2UgaXMgVD0xLgoJdW5zaWduZWQgY2hhciBiVGVvUHJvbG9ndWVbM107CgkvLy8gQnl0ZSBhcnJheSBBUERVIHRvIHNlbmQgdG8gdGhlIElDQwoJdW5zaWduZWQgY2hhciBhYlBJTkFwZHVbMjU1XTsKfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBTX2NjaWRfUElOX01vZGlmaWNhdGlvbjsKCi8vLyBQcm90b2NvbCBEYXRhIFN0cnVjdHVyZSBmb3IgUHJvdG9jb2wgVD0wIChiUHJvdG9jb2xOdW09MCwgZHdMZW5ndGg9MDAwMDAwMDVoKQp0eXBlZGVmIHN0cnVjdAp7CgkvLy8gQjctNCCWIEZJIJYgSW5kZXggaW50byB0aGUgdGFibGUgNyBpbiBJU08vSUVDIDc4MTYtMzoxOTk3IHNlbGVjdGluZyBhIAoJLy8vIGNsb2NrIHJhdGUgY29udmVyc2lvbiBmYWN0b3IKCS8vLyBCMy0wIJYgREkgLSBJbmRleCBpbnRvIHRoZSB0YWJsZSA4IGluIElTTy9JRUMgNzgxNi0zOjE5OTcgc2VsZWN0aW5nIGEgCgkvLy8gYmF1ZCByYXRlIGNvbnZlcnNpb24gZmFjdG9yCgl1bnNpZ25lZCBjaGFyIGJtRmluZGV4RGluZGV4OwoJLy8vIEZvciBUPTAgLEIwIJYgMGIsIEI3LTIgliAwMDAwMDBiCgkvLy8gQjEgliBDb252ZW50aW9uIHVzZWQgKGIxPTAgZm9yIGRpcmVjdCwgYjE9MSBmb3IgaW52ZXJzZSkKCXVuc2lnbmVkIGNoYXIgYm1UQ0NLU1QwOyAgICAgICAgIC8vIDAgdG8gMgoJLy8vIEV4dHJhIEd1YXJkdGltZSBiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzLiBBZGQgMCB0byAyNTQgZXR1IHRvIHRoZSBub3JtYWwgCgkvLy8gZ3VhcmR0aW1lIG9mIDEyZXR1LiBGRmggaXMgdGhlIHNhbWUgYXMgMDBoLgoJdW5zaWduZWQgY2hhciBiR3VhcmRUaW1lVDA7ICAgICAgLy8gMCB0byBGRgoJLy8vIFdJIGZvciBUPTAgdXNlZCB0byBkZWZpbmUgV1dUCgl1bnNpZ25lZCBjaGFyIGJXYWl0aW5nSW50ZWdlclQwOyAvLyAwIHRvIEZGCgkvLy8gSUNDIENsb2NrIFN0b3AgU3VwcG9ydAoJLy8vIDAwID0gU3RvcHBpbmcgdGhlIENsb2NrIGlzIG5vdCBhbGxvd2VkCgkvLy8gMDEgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIExvdwoJLy8vIDAyID0gU3RvcCB3aXRoIENsb2NrIHNpZ25hbCBIaWdoCgkvLy8gMDMgPSBTdG9wIHdpdGggQ2xvY2sgZWl0aGVyIEhpZ2ggb3IgTG93Cgl1bnNpZ25lZCBjaGFyIGJDbG9ja1N0b3A7ICAgICAgICAvLyAwIHRvIDMKfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgU19jY2lkX3Byb3RvY29sX3QwOwoKCi8vLyBQcm90b2NvbCBEYXRhIFN0cnVjdHVyZSBmb3IgUHJvdG9jb2wgVD0xIChiUHJvdG9jb2xOdW09MSwgZHdMZW5ndGg9MDAwMDAwMDdoKQp0eXBlZGVmIHN0cnVjdAp7CgkvLy8gQjctNCCWIEZJIJYgSW5kZXggaW50byB0aGUgdGFibGUgNyBpbiBJU08vSUVDIDc4MTYtMzoxOTk3IHNlbGVjdGluZyBhIAoJLy8vIGNsb2NrIHJhdGUgY29udmVyc2lvbiBmYWN0b3IKCS8vLyBCMy0wIJYgREkgLSBJbmRleCBpbnRvIHRoZSB0YWJsZSA4IGluIElTTy9JRUMgNzgxNi0zOjE5OTcgc2VsZWN0aW5nIGEgCgkvLy8gYmF1ZCByYXRlIGNvbnZlcnNpb24gZmFjdG9yCgl1bnNpZ25lZCBjaGFyIGJtRmluZGV4RGluZGV4OwoJLy8vIEZvciBUPTEsIEI3LTIgliAwMDAxMDBiCgkvLy8gQjAgliBDaGVja3N1bSB0eXBlIChiMD0wIGZvciBMUkMsIGIwPTEgZm9yIENSQwoJLy8vIEIxIJYgQ29udmVudGlvbiB1c2VkIChiMT0wIGZvciBkaXJlY3QsIGIxPTEgZm9yIGludmVyc2UpCgl1bnNpZ25lZCBjaGFyIGJtVENDS1NUMTsgICAgICAgICAgIC8vIDEwaCwgMTFoLCAxMmgsIDEzaAoJLy8vIEV4dHJhIEd1YXJkdGltZSAoMCB0byAyNTQgZXR1IGJldHdlZW4gdHdvIGNoYXJhY3RlcnMpLiAKCS8vLyBJZiB2YWx1ZSBpcyBGRmgsIHRoZW4gZ3VhcmR0aW1lIGlzIHJlZHVjZWQgYnkgMS4KCXVuc2lnbmVkIGNoYXIgYkd1YXJkVGltZVQxOyAgICAgICAgLy8gMCB0byBGRgoJLy8vIEI3LTQgPSBCV0kKCS8vLyBCMy0wID0gQ1dJCgl1bnNpZ25lZCBjaGFyIGJtV2FpdGluZ0ludGVnZXJzVDE7IC8vIDAgdG8gOQoJLy8vIElDQyBDbG9jayBTdG9wIFN1cHBvcnQKCS8vLyAwMCA9IFN0b3BwaW5nIHRoZSBDbG9jayBpcyBub3QgYWxsb3dlZAoJLy8vIDAxID0gU3RvcCB3aXRoIENsb2NrIHNpZ25hbCBMb3cKCS8vLyAwMiA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgSGlnaAoJLy8vIDAzID0gU3RvcCB3aXRoIENsb2NrIGVpdGhlciBIaWdoIG9yIExvdwoJdW5zaWduZWQgY2hhciBiQ2xvY2tTdG9wOyAgICAgICAgICAvLyAwIHRvIDMKCS8vLyBTaXplIG9mIG5lZ290aWF0ZWQgSUZTQwoJdW5zaWduZWQgY2hhciBiSUZTQzsgICAgICAgICAgICAgICAvLyAwIHRvIEZFCgkvLy8gTmFkIHZhbHVlIHVzZWQgYnkgQ0NJRAoJdW5zaWduZWQgY2hhciBiTmFkVmFsdWU7ICAgICAgICAgICAvLyAwIHRvIEZGCn0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIFNfY2NpZF9wcm90b2NvbF90MTsKCgovLy8gSWRlbnRpZmllcyB0aGUgbGVuZ3RoIG9mIHR5cGUgb2Ygc3Vib3JkaW5hdGUgZGVzY3JpcHRvcnMgb2YgYSBDQ0lEIGRldmljZQovLy8gVGFibGUgNS4xLTEgU21hcnQgQ2FyZCBEZXZpY2UgQ2xhc3MgZGVzY3JpcHRvcnMKdHlwZWRlZiBzdHJ1Y3QKewogICAvLy8gU2l6ZSBvZiB0aGlzIGRlc2NyaXB0b3IsIGluIGJ5dGVzLgogICB1bnNpZ25lZCBjaGFyICBiTGVuZ3RoOwogICAvLy8gRnVuY3Rpb25hbCBEZXNjcmlwdG9yIHR5cGUKICAgdW5zaWduZWQgY2hhciAgYkRlc2NyaXB0b3JUeXBlOwogICAvLy8gSW50ZWdyYXRlZCBDaXJjdWl0KHMpIENhcmRzIEludGVyZmFjZSBEZXZpY2VzIChDQ0lEKSBTcGVjaWZpY2F0aW9uIAogICAvLy8gUmVsZWFzZSBOdW1iZXIKICAgdW5zaWduZWQgc2hvcnQgYmNkQ0NJRDsKICAgLy8vIEluZGV4IG9mIHRoZSBoaWdoZXN0IGF2YWlsYWJsZSBzbG90LiBBbiBVU0ItSUNDIGlzIHJlZ2FyZGVkIGFzIGEgc2luZ2xlCiAgIC8vLyBzbG90IENDSUQuCiAgIHVuc2lnbmVkIGNoYXIgIGJNYXhTbG90SW5kZXg7CiAgIC8vLyBUaGlzIHZhbHVlIGluZGljYXRlcyB3aGF0IHZvbHRhZ2VzIHRoZSBDQ0lEIGNhbiBzdXBwbHkgdG8gaXRzIHNsb3RzLgogICAvLy8gSXQgaXMgYSBiaXR3aXNlIE9SIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgIC8vLyAtIDAxaCA1LjBWCiAgIC8vLyAtIDAyaCAzLjBWCiAgIC8vLyAtIDA0aCAxLjhWCiAgIC8vLyBPdGhlciBiaXRzIGFyZSBSRlUuCiAgIHVuc2lnbmVkIGNoYXIgIGJWb2x0YWdlU3VwcG9ydDsKICAgLy8vIFJSUlIgllVwcGVyIFdvcmQtIGlzIFJGVSA9IDAwMDBoCiAgIC8vLyBQUFBQIJZMb3dlciBXb3JkLSBFbmNvZGVzIHRoZSBzdXBwb3J0ZWQgcHJvdG9jb2wgdHlwZXMuIEEgkTGSIGluIGEgZ2l2ZW4KICAgLy8vIGJpdCBwb3NpdGlvbiBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdGhlIGFzc29jaWF0ZWQgSVNPIHByb3RvY29sLgogICAvLy8gMDAwMWggPSBQcm90b2NvbCBUPTAKICAgLy8vIDAwMDJoID0gUHJvdG9jb2wgVD0xCiAgIC8vLyBBbGwgb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQgYW5kIG11c3QgYmUgc2V0IHRvIHplcm8uIFRoZSBmaWVsZCBpcyAKICAgLy8vIGludGVuZGVkIHRvIGNvcnJlc3BvbmQgdG8gdGhlIFBDU0Mgc3BlY2lmaWNhdGlvbiBkZWZpbml0aW9ucy4gCiAgIHVuc2lnbmVkIGxvbmcgIGR3UHJvdG9jb2xzOwogICAvLy8gRGVmYXVsdCBJQ0MgY2xvY2sgZnJlcXVlbmN5IGluIEtIei4gVGhpcyBpcyBhbiBpbnRlZ2VyIHZhbHVlLgogICB1bnNpZ25lZCBsb25nICBkd0RlZmF1bHRDbG9jazsKICAgLy8vIE1heGltdW0gc3VwcG9ydGVkIElDQyBjbG9jayBmcmVxdWVuY3kgaW4gS0h6LiBUaGlzIGlzIGFuIGludGVnZXIgdmFsdWUuCiAgIHVuc2lnbmVkIGxvbmcgIGR3TWF4aW11bUNsb2NrOwogICAvLy8gVGhlIG51bWJlciBvZiBjbG9jayBmcmVxdWVuY2llcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIENDSUQuIElmIHRoZSAKICAgLy8vIHZhbHVlIGlzIDAwaCwgdGhlIHN1cHBvcnRlZCBjbG9jayBmcmVxdWVuY2llcyBhcmUgYXNzdW1lZCB0byBiZSB0aGUgCiAgIC8vLyBkZWZhdWx0IGNsb2NrIGZyZXF1ZW5jeSBkZWZpbmVkIGJ5IGR3RGVmYXVsdENsb2NrIGFuZCB0aGUgbWF4aW11bSBjbG9jayAKICAgLy8vIGZyZXF1ZW5jeSBkZWZpbmVkIGJ5IGR3TWF4aW11bUNsb2NrLgogICB1bnNpZ25lZCBjaGFyICBiTnVtQ2xvY2tTdXBwb3J0ZWQ7CiAgIC8vLyBEZWZhdWx0IElDQyBJL08gZGF0YSByYXRlIGluIGJwcy4gVGhpcyBpcyBhbiBpbnRlZ2VyIHZhbHVlCiAgIHVuc2lnbmVkIGxvbmcgIGR3RGF0YVJhdGU7CiAgIC8vLyBNYXhpbXVtIHN1cHBvcnRlZCBJQ0MgSS9PIGRhdGEgcmF0ZSBpbiBicHMKICAgdW5zaWduZWQgbG9uZyAgZHdNYXhEYXRhUmF0ZTsKICAgLy8vIFRoZSBudW1iZXIgb2YgZGF0YSByYXRlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIENDSUQuCiAgIHVuc2lnbmVkIGNoYXIgIGJOdW1EYXRhUmF0ZXNTdXBwb3J0ZWQ7CiAgIC8vLyBJbmRpY2F0ZXMgdGhlIG1heGltdW0gSUZTRCBzdXBwb3J0ZWQgYnkgQ0NJRCBmb3IgcHJvdG9jb2wgVD0xLgogICB1bnNpZ25lZCBsb25nICBkd01heElGU0Q7CiAgIC8vLyAtIFJSUlItVXBwZXIgV29yZC0gaXMgUkZVID0gMDAwMGgKICAgLy8vIC0gUFBQUC1Mb3dlciBXb3JkLSBlbmNvZGVzIHRoZSBzdXBwb3J0ZWQgcHJvdG9jb2wgdHlwZXMuIEEgkTGSIGluIGEgZ2l2ZW4KICAgLy8vICAgYml0IHBvc2l0aW9uIGluZGljYXRlcyBzdXBwb3J0IGZvciB0aGUgYXNzb2NpYXRlZCBwcm90b2NvbC4KICAgLy8vICAgMDAwMWggaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHRoZSAyLXdpcmUgcHJvdG9jb2wgMQogICAvLy8gICAwMDAyaCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdGhlIDMtd2lyZSBwcm90b2NvbCAxCiAgIC8vLyAgIDAwMDRoIGluZGljYXRlcyBzdXBwb3J0IGZvciB0aGUgSTJDIHByb3RvY29sIDEKICAgLy8vIEFsbCBvdGhlciB2YWx1ZXMgYXJlIG91dHNpZGUgb2YgdGhpcyBzcGVjaWZpY2F0aW9uLCBhbmQgbXVzdCBiZSBoYW5kbGVkIAogICAvLy8gYnkgdmVuZG9yLXN1cHBsaWVkIGRyaXZlcnMuCiAgIHVuc2lnbmVkIGxvbmcgIGR3U3luY2hQcm90b2NvbHM7CiAgIC8vLyBUaGUgdmFsdWUgaXMgYSBiaXR3aXNlIE9SIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgIC8vLyAtIDAwMDAwMDAwaCBObyBzcGVjaWFsIGNoYXJhY3RlcmlzdGljcwogICAvLy8gLSAwMDAwMDAwMWggQ2FyZCBhY2NlcHQgbWVjaGFuaXNtIDIKICAgLy8vIC0gMDAwMDAwMDJoIENhcmQgZWplY3Rpb24gbWVjaGFuaXNtIDIKICAgLy8vIC0gMDAwMDAwMDRoIENhcmQgY2FwdHVyZSBtZWNoYW5pc20gMgogICAvLy8gLSAwMDAwMDAwOGggQ2FyZCBsb2NrL3VubG9jayBtZWNoYW5pc20KICAgdW5zaWduZWQgbG9uZyAgZHdNZWNoYW5pY2FsOwogICAvLy8gVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgd2hhdCBpbnRlbGxpZ2VudCBmZWF0dXJlcyB0aGUgQ0NJRCBoYXMuCiAgIHVuc2lnbmVkIGxvbmcgIGR3RmVhdHVyZXM7CiAgIC8vLyBGb3IgZXh0ZW5kZWQgQVBEVSBsZXZlbCB0aGUgdmFsdWUgc2hhbGwgYmUgYmV0d2VlbiAyNjEgKyAxMCAoaGVhZGVyKSBhbmQgCiAgIC8vLyA2NTU0NCArMTAsIG90aGVyd2lzZSB0aGUgbWluaW11bSB2YWx1ZSBpcyB0aGUgd01heFBhY2tldFNpemUgb2YgdGhlIAogICAvLy8gQnVsay1PVVQgZW5kcG9pbnQuCiAgIHVuc2lnbmVkIGxvbmcgIGR3TWF4Q0NJRE1lc3NhZ2VMZW5ndGg7CiAgIC8vLyBTaWduaWZpY2FudCBvbmx5IGZvciBDQ0lEIHRoYXQgb2ZmZXJzIGFuIEFQRFUgbGV2ZWwgZm9yIGV4Y2hhbmdlcy4KICAgdW5zaWduZWQgY2hhciAgYkNsYXNzR2V0UmVzcG9uc2U7CiAgIC8vLyBTaWduaWZpY2FudCBvbmx5IGZvciBDQ0lEIHRoYXQgb2ZmZXJzIGFuIGV4dGVuZGVkIEFQRFUgbGV2ZWwgZm9yIGV4Y2hhbmdlcy4KICAgdW5zaWduZWQgY2hhciAgYkNsYXNzRW52ZWxvcGU7CiAgIC8vLyBOdW1iZXIgb2YgbGluZXMgYW5kIGNoYXJhY3RlcnMgZm9yIHRoZSBMQ0QgZGlzcGxheSB1c2VkIHRvIHNlbmQgbWVzc2FnZXMgZm9yIFBJTiBlbnRyeS4KICAgdW5zaWduZWQgc2hvcnQgd0xjZExheW91dDsKICAgLy8vIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHdoYXQgUElOIHN1cHBvcnQgZmVhdHVyZXMgdGhlIENDSUQgaGFzLgogICB1bnNpZ25lZCBjaGFyICBiUElOU3VwcG9ydDsKICAgLy8vIE1heGltdW0gbnVtYmVyIG9mIHNsb3RzIHdoaWNoIGNhbiBiZSBzaW11bHRhbmVvdXNseSBidXN5LgogICB1bnNpZ25lZCBjaGFyICBiTWF4Q0NJREJ1c3lTbG90czsKCn0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIENDSUREZXNjcmlwdG9yOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICBFeHBvcnRlZCBmdW5jdGlvbnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmV4dGVybiB1bnNpZ25lZCBjaGFyIFJEUnRvUENIYXJkd2FyZUVycm9yKCB1bnNpZ25lZCBjaGFyIGJTbG90LCAKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYlNlcSwgCgkJCQkJICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJIYXJkd2FyZUVycm9yQ29kZSApOwoKLyoKI2lmICFkZWZpbmVkKE5PQVVUT0NBTExCQUNLKQpleHRlcm4gdm9pZCBVU0JEQ2FsbGJhY2tzX1JlcXVlc3RSZWNlaXZlZChjb25zdCBVU0JHZW5lcmljUmVxdWVzdCAqcmVxdWVzdCk7CiNlbmRpZgoqLwpleHRlcm4gdm9pZCBDQ0lEX1NtYXJ0Q2FyZFJlcXVlc3QoIHZvaWQgKTsKZXh0ZXJuIHZvaWQgQ0NJRERyaXZlcl9Jbml0aWFsaXplKCB2b2lkICk7CmV4dGVybiB1bnNpZ25lZCBjaGFyIENDSURfUmVhZCh2b2lkICpwQnVmZmVyLAoJCQkJCSAgICAgICAgICAgdW5zaWduZWQgaW50IGRMZW5ndGgsCgkJCQkJICAgICAgICAgICBUcmFuc2ZlckNhbGxiYWNrIGZDYWxsYmFjaywKCQkJCQkgICAgICAgICAgIHZvaWQgKnBBcmd1bWVudCk7CmV4dGVybiB1bnNpZ25lZCBjaGFyIENDSURfV3JpdGUodm9pZCAqcEJ1ZmZlciwKCQkJCQkgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZExlbmd0aCwKCQkJCQkgICAgICAgICAgICBUcmFuc2ZlckNhbGxiYWNrIGZDYWxsYmFjaywKCQkJCQkgICAgICAgICAgICB2b2lkICpwQXJndW1lbnQpOwpleHRlcm4gdW5zaWduZWQgY2hhciBDQ0lEX0luc2VydGlvbiggdm9pZCApOwpleHRlcm4gdW5zaWduZWQgY2hhciBDQ0lEX1JlbW92YWwoIHZvaWQgKTsKCiNlbmRpZiAvLyNpZm5kZWYgQ0NJRF9EUklWRVJfSAoK