LyoKICogTkRBIEFORCBORUVELVRPLUtOT1cgUkVRVUlSRUQKICoKICogQ29weXJpZ2h0IKkgMjAxMy0yMDE4IFN5bmFwdGljcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiB0aGF0IGlzIHByb3ByaWV0YXJ5IHRvIFN5bmFwdGljcwogKiBJbmNvcnBvcmF0ZWQgKCJTeW5hcHRpY3MiKS4gVGhlIGhvbGRlciBvZiB0aGlzIGZpbGUgc2hhbGwgdHJlYXQgYWxsCiAqIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gYXMgY29uZmlkZW50aWFsLCBzaGFsbCB1c2UgdGhlCiAqIGluZm9ybWF0aW9uIG9ubHkgZm9yIGl0cyBpbnRlbmRlZCBwdXJwb3NlLCBhbmQgc2hhbGwgbm90IGR1cGxpY2F0ZSwKICogZGlzY2xvc2UsIG9yIGRpc3NlbWluYXRlIGFueSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGFueSBtYW5uZXIKICogdW5sZXNzIFN5bmFwdGljcyBoYXMgb3RoZXJ3aXNlIHByb3ZpZGVkIGV4cHJlc3MsIHdyaXR0ZW4KICogcGVybWlzc2lvbi4KICoKICogVXNlIG9mIHRoZSBtYXRlcmlhbHMgbWF5IHJlcXVpcmUgYSBsaWNlbnNlIG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eQogKiBmcm9tIGEgdGhpcmQgcGFydHkgb3IgZnJvbSBTeW5hcHRpY3MuIFRoaXMgZmlsZSBjb252ZXlzIG5vIGV4cHJlc3MKICogb3IgaW1wbGllZCBsaWNlbnNlcyB0byBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBiZWxvbmdpbmcKICogdG8gU3luYXB0aWNzLgogKgogKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSU4gVEhJUyBET0NVTUVOVCBJUyBQUk9WSURFRCAiQVMtSVMsIiBBTkQKICogU1lOQVBUSUNTIEVYUFJFU1NMWSBESVNDTEFJTVMgQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUywKICogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIEFOWSBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQgT0YgQU5ZCiAqIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFNZTkFQVElDUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBQVU5JVElWRSwgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFCiAqIE9GIFRIRSBJTkZPUk1BVElPTiBDT05UQUlORUQgSU4gVEhJUyBET0NVTUVOVCwgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIEJBU0VEIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKICogTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFORCBFVkVOIElGIFNZTkFQVElDUyBXQVMKICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIElGIEEgVFJJQlVOQUwgT0YKICogQ09NUEVURU5UIEpVUklTRElDVElPTiBET0VTIE5PVCBQRVJNSVQgVEhFIERJU0NMQUlNRVIgT0YgRElSRUNUCiAqIERBTUFHRVMgT1IgQU5ZIE9USEVSIERBTUFHRVMsIFNZTkFQVElDUycgVE9UQUwgQ1VNVUxBVElWRSBMSUFCSUxJVFkKICogVE8gQU5ZIFBBUlRZIFNIQUxMIE5PVCBFWENFRUQgT05FIEhVTkRSRUQgVS5TLiBET0xMQVJTLgogKi8KCi8vIEVYVF9DU0QKI2RlZmluZSBFUkFTRV9HUk9VUF9ERUYJCQkJCQkxNzUKI2RlZmluZSBCT09UX0JVU19XSURUSF9NTUNfRVhUX0NTRF9PRkZTRVQJMTc3CiNkZWZpbmUgUEFSVElUSU9OX0NPTkZJR19NTUNfRVhUX0NTRF9PRkZTRVQJMTc5CiNkZWZpbmUgQlVTX1dJRFRIX01NQ19FWFRfQ1NEX09GRlNFVAkJMTgzCiNkZWZpbmUgSFNfVElNSU5HX01NQ19FWFRfQ1NEX09GRlNFVAkJMTg1CiNkZWZpbmUgRVhUX0NTRF9BQ0NFU1NfQ01EX1NFVAkJCQkwCiNkZWZpbmUgRVhUX0NTRF9BQ0NFU1NfU0VUX0JJVFMJCQkJMQojZGVmaW5lIEVYVF9DU0RfQUNDRVNTX0NMRUFSX0JJVFMJCQkyCiNkZWZpbmUgRVhUX0NTRF9BQ0NFU1NfV1JJVEVfQllURQkJCTMKI2RlZmluZSBQQVJUSVRJT05fQUNDRVNTX0JJVFMJCQkJMHg3CgoKLy8gTU1DIENNRCA2IFJlbGF0ZWQKdHlwZWRlZiBzdHJ1Y3QKewoJdW5zaWduZWQgaW50CUNtZFNldCAJCQkJOjM7Cgl1bnNpZ25lZCBpbnQJUmVzZXJ2ZWQwIAkJCTo1OwoJdW5zaWduZWQgaW50ICAgCVZhbHVlCQkJCTo4OwoJdW5zaWduZWQgaW50ICAgCUluZGV4CQkJCTo4OwoJdW5zaWduZWQgaW50ICAgCUFjY2VzcwkJCQk6MjsKCXVuc2lnbmVkIGludAlSZXNlcnZlZDEgCQkJOjY7Cn0gTU1DX0NNRDZfTEFZT1VUOwoKdHlwZWRlZiB1bmlvbgp7CglVSU5UX1QJCQkJTU1DX0NNRDZfQml0czsKCU1NQ19DTUQ2X0xBWU9VVAkJTU1DX0NNRDZfTGF5b3V0Owp9IE1NQ19DTUQ2X09WRVJMQVk7CgoKCnZvaWQgRU1NQ19JU1IoKTsKCgo=